Time tracking that stays out of the way: one button, or a timer started from a browser extension, filed against a project and a client. The reporting turns it into billable hours, budgets and a picture of where the time went.
Build me time tracking that replaces Toggl Track: one button, filed against a project, and reports that turn it into billable hours. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode - A browser extension, and a small desktop helper for idle detection - Caddy in front THE DATA MODEL - clients: id, name, currency, archived_at - projects: id, client_id, name, colour, is_billable, hourly_cents, budget_cents, budget_hours, archived_at - tasks: id, project_id, name, estimate_hours, archived_at - users: id, email, name, hourly_cents, internal_cost_cents, role, is_active - rates: id, scope, scope_id, user_id, hourly_cents, currency, effective_from — an entry bills at the rate in force when the work happened, always - entries: id, user_id, project_id, task_id, description, started_at, ended_at, duration_seconds, is_billable, tags_json, source, is_locked, invoice_ref, created_at - entry_revisions: id, entry_id, field, old_value, new_value, changed_by, at — append-only - Every instant UTC, every amount integer cents with a currency THE ONE BUTTON - Start and stop from anywhere: the web interface, the extension, a keyboard shortcut, the API - One running timer per user, enforced with a partial unique index rather than by hope - Starting a new timer stops the previous one and says so - The last few descriptions offered as one-tap repeats, because most tracked time is the same handful of things - An entry is two instants and the duration is derived. Never store a duration alone, or a day with a clock change will not reconcile MAKING TRACKING ACTUALLY HAPPEN, WHICH IS THE REAL PROBLEM - Nobody forgets to work; everybody forgets to start the timer. So the product is mostly about catching that - Idle detection: when the machine has been idle past a threshold, ask on return whether to keep, discard or split that time. Ask — never decide - A reminder when no timer has run for a while during working hours, at most once an hour, switchable off - A reminder at the end of the day if the tracked total is far below the expected one - Suggestions from window titles and visited pages, if the desktop helper is running: 'you spent 40 minutes in this document, track it?'. Entirely local, never uploaded, off by default, and phrased as a question - A timer left running overnight is flagged and offered for trimming to the last activity, never trimmed silently - Filling in yesterday must be as easy as tracking today, because it is what people actually do THE EXTENSION - A start button injected into the tools you already work in, carrying the item's title as the description and mapping it to a project - Per-host adapters, each a small function that reads the page into an identifier and a title, with a fixture and a test — they break when the host changes and a failing test beats a mystery - The extension talks only to your own server, with per-host permissions rather than access to every site BILLABLE AND COST - A billing rate and an internal cost per person. The gap is margin, and a tracker that knows only one of them cannot say whether the work was worth doing - Billable is a property of the entry, defaulted from the project, changeable per entry - Non-billable time tracked as carefully as billable, because that is where the week actually goes REPORTS - Group by client, project, task, person, tag, day or week, filterable by all of them - Summary, detailed and weekly views, with amounts and margin - Rounding applied at report time only. The raw seconds are the record — a tracker that rounds on save has destroyed the evidence - Export CSV, and a PDF for a client showing exactly what was done - Everything computed from rows at query time. No stored totals, ever BUDGETS - Money or hours per project, one-off or recurring monthly - Progress visible wherever the project appears, with a projection of the date it runs out - Alerts at thresholds to the project's owner, once per threshold per period LOCKING AND INVOICING - Approve a period and it locks; a locked entry cannot change without an explicit, logged unlock - Mark entries invoiced with a reference so nothing bills twice - Locking is what makes the hours usable for payroll or a client dispute, and it is what homemade trackers never build THE API - Start, stop, current, and full CRUD on entries, with tokens and scopes - Which means a shell alias, a keyboard shortcut or a status bar can drive it, and that is how tracking becomes a habit for people who live in a terminal OPERATIONS - .env: DATABASE_PATH, BASE_URL, SESSION_SECRET, SMTP_URL - Migrations on boot, each once - Nightly backup off the machine, restore script - Health endpoint WHAT MATTERS MOST Idle detection and the reminders. The tracking part is a table with two timestamps; the reason people pay is that the software notices when they forgot. Build that first, live with it for a fortnight, and tune it until it is helpful rather than nagging. Give me the repository, the extension with one adapter and its fixture, migrations, .env.example, a seed month, and a README with deploy steps behind Caddy.
What you lose
- Desktop and mobile apps with idle detection and reminders, which is what makes tracking actually happen
- Browser extensions that put a start button inside the tools you already work in
- Reports your accountant or client will accept without a conversation
- Automatic sync across devices when you start a timer on one and stop it on another
- Calendar integration that turns a meeting into a time entry
If you would rather not build
- A spreadsheet, honestly, if you are one person
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $9/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Kimai
$0Time tracking with projects, rates, invoices and exports; runs on ordinary PHP hosting.
kimai/kimaifree · open source
Why this verdict
our own opinion · changed only by a person
84/100
Verdict yes at 84: a start time, a stop time and a sum. The one real trap is computing elapsed time on the client, and the prompt names it. Only the mobile and desktop apps are genuinely missing afterwards.
History
tracked since 6 Aug 2026 · nothing is ever overwritten
Questions about Toggl Track
answered from the record above
Is Toggl Track free?
No — the plan we track is $9 a month. Starter, $9 per licence per month on either billing cycle. Premium is $14, renewing at $18 after the first year.
Can you replace Toggl Track by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 84 out of 100, build time one session. Read what you lose before you decide.
How much does Toggl Track cost?
$9 a month on Starter — $108 a year. Recorded 6 Aug 2026.
What do you lose by replacing Toggl Track?
Desktop and mobile apps with idle detection and reminders, which is what makes tracking actually happen; Browser extensions that put a start button inside the tools you already work in; Reports your accountant or client will accept without a conversation; Automatic sync across devices when you start a timer on one and stop it on another; Calendar integration that turns a meeting into a time entry. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Toggl Track?
Yes: Kimai, Traggo. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

