Selfhosted · Open Source · Flask

ATHLOTES

$

A lightweight, self-hosted note-taking app with file tree navigation, habit tracking, and trash management.

localhost:5000 — your notes, your server one python file, zero databases docker · systemd · railway ready habit tracking · split view · zen mode localhost:5000 — your notes, your server one python file, zero databases
FlaskBackend
Single UserAuth
File-BasedStorage
Docker ReadyDeploy

// Features

Everything you need, nothing you don't.

01
Note Editor

Write and organize plain-text notes in a hierarchical file tree. Create, rename, nest freely.

02
Habit Tracker

Track daily habits with persistent JSON storage. Simple, no-frills, effective.

03
Trash & Restore

Deleted notes land in a time-stamped trash bin. Restore or purge at any time.

04
Auth & Session

Single-user login with Flask sessions. No database — credentials live in app.py.

05
Theme & Background

Persisted config for accent colors and up to 5 custom background images.

06
Self-Hosted

Runs anywhere Python runs. Docker-ready with /app/data mount.

// Themes

Five moods. One is yours.

Glass
Matrix
Blood
Ocean
Amber

// Stack

Built with.

Python 3 Flask Vanilla JS HTML / CSS JSON Storage File System Docker systemd

// Project Structure

Simple by design.

athlotes/
├── app.py  Flask backend
├── requirements.txt
├── templates/
│   ├── index.html  Main UI
│   └── login.html
├── static/
│   ├── background1.webp  required
│   └── background2–5.webp  optional
└── data/  auto-created
    ├── config.json
    ├── habits.json
    ├── notes/
    └── trash/
Background Images — ATHLOTES expects up to 5 images in static/, named background1.webp through background5.webp. Only the first is required. Use .webp — aim for 1920×1080.
Tip: Convert images with Squoosh or ImageMagick.

// Setup

Up and running in minutes.

01
Clone & Install
# Clone
$ git clone https://github.com/Niko-GitGet/ATHLOTES-Selfhosted-NoteWebApp
$ cd ATHLOTES-Selfhosted-NoteWebApp

# Virtual environment
$ python -m venv venv
$ source venv/bin/activate

$ pip install -r requirements.txt
02
Set Credentials

Open app.py and update:

$ vim app.py

USERNAME = "your_username_here"
PIN      = "your_pin_here"
03
Run
$ python app.py

Open http://localhost:5000

Keep the repo private. Credentials are plain text in app.py.
01
Create Dockerfile
$ cat > Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN mkdir -p /app/data/notes /app/data/trash
EXPOSE 5000
CMD ["python", "app.py"]
$ ^D
02
Build & Run
$ docker build -t athlotes .

$ docker run -d \
  -p 5000:5000 \
  -v athlotes_data:/app/data \
  --name athlotes \
  athlotes
03
Commands
$ docker logs athlotes   # Logs
$ docker stop athlotes   # Stop
$ docker start athlotes  # Start
01
Run on Server

Follow the Local steps. Binds to 0.0.0.0 automatically.

02
Find LAN IP
# Linux / macOS
$ ip a | grep "inet "

# Windows
$ ipconfig

Access at http://<SERVER_IP>:5000

03
systemd
$ sudo tee /etc/systemd/system/athlotes.service << EOF
[Unit]
Description=ATHLOTES App
After=network.target

[Service]
WorkingDirectory=/home/YOUR_USER/athlotes
ExecStart=/home/YOUR_USER/athlotes/venv/bin/python app.py
Restart=always

[Install]
WantedBy=multi-user.target
EOF
$ sudo systemctl enable --now athlotes
Public web warning. Strong PIN, SECRET_KEY via env, private repo, HTTPS.
01
Add Procfile
$ echo "web: python app.py" > Procfile
02
Secret Key
# In app.py:
app.secret_key = os.environ.get("SECRET_KEY", "fallback")

# Generate:
$ python -c "import secrets; print(secrets.token_hex(32))"
03
Deploy

Railway auto-detects Python. Add volume at /app/data, set SECRET_KEY.

// Reference

Pick your path.

SetupURLBest For
Local Pythonlocalhost:5000Development
Local Dockerlocalhost:5000Isolated dev
LAN Server192.168.x.x:5000Home network
Railwayyour-app.up.railway.appPublic cloud

Your notes. Your server.

View Source on GitHub

// Contact

Contact Me.

N
Niko
Creator of ATHLOTES
hedtkeniko@gmail.com @Niko-GitGet Send a Message