Browse / Scheduling and staffing
TimeTagger
Tag-based personal time tracker with a documented web API that mirrors the hosted timetagger.app.
TimeTagger is a lightweight time tracker for individuals and freelancers: an interactive timeline, tags instead of projects, targets, Pomodoro and PDF/CSV reports. The Python server runs from pip or Docker and is configured with TIMETAGGER_* environment variables. The Builder documents a records/settings/updates web API with API tokens, identical on self-hosted servers and the EUR 3 per month hosted edition.
- I'm a freelancer who wants a fast timeline-style tracker on my own box, with tags instead of a project hierarchy
- I want my agent to log what I worked on and pull the week's records over a small token-authenticated API
- GPL-3.0 plus a CLA granting the author rights to use contributions in the hosted service
- Built for individuals: no teams, clients or invoicing; multi-user means separate credential entries, not shared data
- Last push 2026-05-17, inside the window but the slowest cadence on this shortlist
- API tokens never expire; reports and exports are not reachable through API
Last activity May 17, 2026. Fit: adaptable 2, operable 3.
Editions
Self-hosted · Free open source
- Clone
git clone https://github.com/almarklein/timetagger - Install
pip install -U timetagger && python -m timetagger - ImageContainer
timetagger.app · €3 per month closed source
- HostedOpen the hosted app
Adaptable: what is yours to change
Make it yours
Config only11 things to edit
Everything is an environment variable or CLI flag: TIMETAGGER_BIND, TIMETAGGER_DATADIR, TIMETAGGER_CREDENTIALS (bcrypt user:hash pairs) for multi-user, TIMETAGGER_PROXY_AUTH_ENABLED, TIMETAGGER_PROXY_AUTH_TRUSTED and TIMETAGGER_PROXY_AUTH_HEADER to sit behind Authelia or similar, TIMETAGGER_PATH_PREFIX and TIMETAGGER_APP_REDIRECT. deploy/docker-compose.yml is the Docker path. For custom auth (JWT, OAuth) the libapi docs show a short Python run script overriding authenticate() and api_handler_triage().
- Env vars
TIMETAGGER_BINDTIMETAGGER_DATADIRTIMETAGGER_LOG_LEVELTIMETAGGER_CREDENTIALSTIMETAGGER_PROXY_AUTH_ENABLEDTIMETAGGER_PROXY_AUTH_TRUSTEDTIMETAGGER_PROXY_AUTH_HEADERTIMETAGGER_PATH_PREFIXTIMETAGGER_APP_REDIRECT- Config files
deploy/docker-compose.ymldeploy/docker-compose.nonroot.yml- Prompt files
- none
- Accounts you need
- timetagger.app (hosted edition only)
Source
- github.com/almarklein/timetagger
- GPL-3.0 license
- Last commit May 17, 2026
- 1,779 stars
Operable: what an agent can drive
Interface
OfficialAPIpublished by the builderremote or local
How an agent can drive an Operable Listing, in five levels: native (built for the agent as the primary interface), official (the Builder ships an agent interface), wrapped (a third party wraps the software's API), config (an agent can only drive it by editing files), gui (screen control only). An interface is official only when it is published by the same organization that ships the software. GUI-level Listings are allowed and sorted last.
Reach
Partial coverage. 6 of 9 jobs reachable through the stated interface.
| Job | Through the interface | Evidence |
|---|---|---|
| Read time records for a date range | Reachable | webapi: GET records with range and tag filters |
| Create and edit records | Reachable | webapi: PUT records accepts new or edited record objects |
| Start and stop a running timer | Reachable | webapi: records can be filtered by running state; a running record is written with PUT |
| Delete a record | Reachable | webapi: prefix the description with HIDDEN, the convention clients honour |
| Read and change settings | Reachable | webapi: GET and PUT settings |
| Sync incrementally | Reachable | webapi: GET updates since a timestamp |
| Generate PDF or CSV reports | Not reachable | webapi documents no report endpoint; reports are produced client-side from records |
| Set daily, weekly or monthly targets | Undetermined | targets live in the client; not stated whether they are in the settings object |
| Pomodoro timer | Not reachable | client-side feature |
Code stack
- Languages
- Python
- Frameworks
- asgineeruvicornitemdbPScript
- Package manager
- pip
- Database
- SQLite
- Hosting target
- dockerpypi
- Built
- Human-written (recorded, never ranked)
Evidence and confidence
| Field | Where it was seen | Confidence |
|---|---|---|
| formFactor | README: web-based time tracker served by a Python server, runs locally or on a server | 95% |
| executionModel | no model SDK or AI feature | 95% |
| operability | timetagger.readthedocs.io/en/latest/webapi/ published by the Builder; same endpoints on timetagger.app | 90% |
| effort | timetagger.readthedocs.io/en/latest/libapi/ lists TIMETAGGER_* variables; README shows credential and proxy-auth examples | 90% |
| editions | README: pip and Docker self-host under GPL-3.0; timetagger.app account EUR 3 per month | 90% |
| active | shortlist pushedAt 2026-05-17 | – |
| reach | 80% |
Open questions
- Are targets stored in the settings object and therefore reachable through PUT settings?
- Does the hosted edition expose API tokens on every plan?
Sources
- github.com/almarklein/timetagger sourcing:scheduling-staffing:curated
- timetagger.readthedocs.io/en/latest/libapi/ sourcing:scheduling-staffing:curated
- timetagger.readthedocs.io/en/latest/webapi/ analysis:scheduling-staffing