Glasstrack

Self-host

Run it yourself, free

Every feature is included, under the MIT licence. No paid tiers and no licence keys. Single sign-on, time tracking, automations and the rest all work on your server.

What you need

  • A Linux server or any machine with Docker and the Compose plugin.
  • A small server is enough: 2 vCPUs and 4 GB of RAM.
  • Postgres is the only stateful dependency. It runs in the bundled container, or point it at your own Postgres 15+.
  • Optional: an SMTP server for email, and S3-compatible storage for files and backups.

Quick start

  1. 1. Get the code
    git clone https://github.com/transparent-ai-businesses/glasstrack.git && cd glasstrack
  2. 2. Create .env with random secrets, then set APP_URL and SMTP_URL in it.
    sh scripts/init-env.sh
  3. 3. Start it. The app is on http://localhost:3000.
    docker compose up -d

For HTTPS, set DOMAIN and APP_URL=https://your-domain in .env, then run docker compose --profile tls up -d.

Settings

Everything is set with environment variables in .env. Every option is documented in .env.example.

VariableNeededWhat it does
APP_URLRequiredThe public address people use, e.g. https://tracker.example.com. With https, cookies are marked Secure.
APP_SECRETRequired32 or more random characters. Signs file links and sign-in state. init-env.sh fills it in.
POSTGRES_PASSWORDRequiredPassword for the bundled Postgres container. Filled in by init-env.sh.
DB_APP_PASSWORD, DB_SYSTEM_PASSWORDRequiredPasswords for the two database roles the app creates on boot. Filled in by init-env.sh.
DATABASE_URLOptionalUse your own Postgres 15 or newer (RDS, Neon, Hetzner...) instead of the bundled container.
SMTP_URL, EMAIL_FROMRecommendedAny SMTP server for sign-in links and notifications. Unset, emails are written to the log.
STORAGE_DRIVER, S3_*Optionallocal (default, the app volume) or s3 for AWS S3, MinIO, R2 or any S3-compatible store.
GOOGLE_CLIENT_ID/SECRET, GITHUB_CLIENT_ID/SECRETOptionalSign in with Google or GitHub. Email links always work.
BACKUP_ENABLED, BACKUP_CRONOptionalDaily pg_dump to your storage under backups/.
DOMAINOptionalWith --profile tls, Caddy gets an HTTPS certificate for this domain automatically.
HOST_PORTOptionalPort on the host (default 3000).
MIGRATE_ON_BOOT, WORKER_MODEOptionalMigrations run on start by default; background jobs run in the same process unless you split them.
INBOUND_EMAIL_DOMAIN, INBOUND_EMAIL_SECRETOptionalEmail to issue (see docs/EMAIL-TO-ISSUE.md).
STATUS_PAGE_URLOptionalLink the /status page to an external status page.
BILLING_ENABLEDLeave offHosted-mode billing. Self-hosted servers don't need it; every feature works without it.

Backups

Set BACKUP_ENABLED=true to dump the database daily to backups/ in your storage. To prove the newest backup restores, run this daily from cron. It restores into a scratch database, checks it, and exits non-zero on failure:

docker compose exec app node dist/restore-verify.js

One-off backup:

docker compose exec app node dist/backup.js

Upgrades

Pull the new code and rebuild. Database migrations run automatically when the container starts.

git pull
docker compose up -d --build

Health checks: GET /health (process up) and GET /ready (database reachable, migrations current). Logs are JSON lines on stdout.

Full documentation

The README covers managed Postgres, S3 storage, email and operations. docs/DEPLOY.md describes how glasstrack.dev itself runs and how to move it between hosts, and docs/API.md documents the REST API and webhooks.