Nightlio logo

Nightlio

Privacy-first mood tracker and daily journal, designed for effortless self-hosting

Alternative to: daylio, day one, journey


About

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.