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. Get the code
git clone https://github.com/transparent-ai-businesses/glasstrack.git && cd glasstrack - 2. Create .env with random secrets, then set
APP_URLandSMTP_URLin it.sh scripts/init-env.sh - 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.
| Variable | Needed | What it does |
|---|---|---|
APP_URL | Required | The public address people use, e.g. https://tracker.example.com. With https, cookies are marked Secure. |
APP_SECRET | Required | 32 or more random characters. Signs file links and sign-in state. init-env.sh fills it in. |
POSTGRES_PASSWORD | Required | Password for the bundled Postgres container. Filled in by init-env.sh. |
DB_APP_PASSWORD, DB_SYSTEM_PASSWORD | Required | Passwords for the two database roles the app creates on boot. Filled in by init-env.sh. |
DATABASE_URL | Optional | Use your own Postgres 15 or newer (RDS, Neon, Hetzner...) instead of the bundled container. |
SMTP_URL, EMAIL_FROM | Recommended | Any SMTP server for sign-in links and notifications. Unset, emails are written to the log. |
STORAGE_DRIVER, S3_* | Optional | local (default, the app volume) or s3 for AWS S3, MinIO, R2 or any S3-compatible store. |
GOOGLE_CLIENT_ID/SECRET, GITHUB_CLIENT_ID/SECRET | Optional | Sign in with Google or GitHub. Email links always work. |
BACKUP_ENABLED, BACKUP_CRON | Optional | Daily pg_dump to your storage under backups/. |
DOMAIN | Optional | With --profile tls, Caddy gets an HTTPS certificate for this domain automatically. |
HOST_PORT | Optional | Port on the host (default 3000). |
MIGRATE_ON_BOOT, WORKER_MODE | Optional | Migrations run on start by default; background jobs run in the same process unless you split them. |
INBOUND_EMAIL_DOMAIN, INBOUND_EMAIL_SECRET | Optional | Email to issue (see docs/EMAIL-TO-ISSUE.md). |
STATUS_PAGE_URL | Optional | Link the /status page to an external status page. |
BILLING_ENABLED | Leave off | Hosted-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.jsOne-off backup:
docker compose exec app node dist/backup.jsUpgrades
Pull the new code and rebuild. Database migrations run automatically when the container starts.
git pull
docker compose up -d --buildHealth 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.