Tracy is a small self-hosted working-time tracker. It keeps exact daily check-in, check-out, break, and note data in a database, while deriving invoice-friendly quarter-hour totals and Germany-aware target hours.
- Daily check-in/check-out with an optional next-day checkout
- Breaks as either a duration or a start/end range
- Exact and configurable rounded billable time
- Week, month, and year statistics
- CSV export for the selected statistics period
- German national and selectable state-wide public holidays
- Personal days off that reduce required target hours
- Passwordless account access and passkey management through FastPasskey
- SQLite locally, with PostgreSQL support through SQLAlchemy
- FastAPI, SQLAlchemy, Alembic, vanilla JavaScript, pytest, and Invoke
- GitHub Actions releases with amd64/arm64 images on GHCR
./.codex/setup.sh
.venv/bin/inv startOpen http://localhost:8000. Create an account with a passkey on the login screen. Existing tracker data is assigned to the first account created after upgrading.
Run all checks with:
.venv/bin/inv verifyEvery pushed branch runs separate formatting, lint, Python, and JavaScript jobs. Successful commits
publish an immutable multi-architecture image as ghcr.io/malaber/tracy:sha-<commit>.
Successful main CI runs create the next patch release, publish matching version and latest
container tags, and create a Git tag and GitHub Release. Deploy the current release with:
docker compose pull
docker compose up -dDeployment guides:
The working-day calculation includes national holidays and whole-state public holidays for the selected German federal state. Municipal holidays such as Augsburg Peace Festival, Bavaria's municipality-dependent Assumption Day, and local Corpus Christi rules in Saxony/Thuringia are not treated as state-wide days off.