Nightlio
Privacy-first mood tracker and daily journal, designed for effortless self-hosting
Alternative to: daylio, day one, journey
Nightlio is a self-hosted mood tracker and journal inspired by apps like Daylio, built to avoid subscription paywalls and cross-platform lock-in. It lets you log your mood on a 5-point scale, write Markdown journal entries, and tag entries with customizable activities to discover patterns, then view your history through calendar-based analytics, streaks, and averages. It runs fully in the browser with no ads, subscriptions, or third-party tracking.
Nightlio Docker Compose example
Self-host Nightlio on your own server, homelab, or VPS starting from this Docker Compose example.
It runs Nightlio in Docker containers using the official ghcr.io/shirsakm/nightlio-api:latest, ghcr.io/shirsakm/nightlio-frontend:latest images, with persistent volumes and automatic restarts preconfigured.
Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.
services:
api:
image: ghcr.io/shirsakm/nightlio-api:latest
restart: unless-stopped
environment:
# Enables production behaviour in the API.
RAILWAY_ENVIRONMENT: "production"
# Secret used to sign sessions. Set to a long random string.
SECRET_KEY: "changeme"
# Secret used to sign JWT auth tokens. Set to a long random string (different from SECRET_KEY).
JWT_SECRET: "changeme"
# Comma-separated list of allowed browser origins (your public URL(s)).
CORS_ORIGINS: "http://localhost:5173,http://localhost:5000"
# Set to 1 to enable Google OAuth sign-in (requires the GOOGLE_* values below).
ENABLE_GOOGLE_OAUTH: "0"
# Stable user id used for the single-user self-hosted instance.
DEFAULT_SELF_HOST_ID: "selfhost_default_user"
# Path to the SQLite database file inside the data volume.
DATABASE_PATH: "/app/data/nightlio.db"
# Google OAuth client id (only needed when ENABLE_GOOGLE_OAUTH=1).
GOOGLE_CLIENT_ID: ""
# Google OAuth client secret (only needed when ENABLE_GOOGLE_OAUTH=1).
GOOGLE_CLIENT_SECRET: ""
# Google OAuth callback URL (only needed when ENABLE_GOOGLE_OAUTH=1).
GOOGLE_CALLBACK_URL: ""
# Port the API listens on inside the container.
PORT: "5000"
volumes:
- nightlio_data:/app/data
healthcheck:
test: ["CMD", "python", "-c", "import requests; requests.get('http://localhost:5000/api/')"]
interval: 30s
timeout: 10s
retries: 3
frontend:
image: ghcr.io/shirsakm/nightlio-frontend:latest
restart: unless-stopped
depends_on:
api:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/"]
interval: 30s
timeout: 3s
retries: 3
volumes:
nightlio_data:
Values set to changeme are required — replace them with your own
values before starting Nightlio.
Prefer a managed setup? WinterFlow installs, configures, and updates Nightlio for you using this same Docker Compose configuration.