Time tracking that
stays on your laptop.
Tickwise watches the active window, asks your browser for the exact tab URL, and classifies your work by matching project keywords against the combined text. No cloud, no inference, no monthly bill — just a fast, deterministic tray app.
Free· Open source (GPL-3.0)· $0 / month· No data leaves your machine
Tickwise Live
Capture loop running. 4 sessions classified by keyword in the last hour.
By project
Everything you need.
Nothing you don't.
Fuzzy keyword classifier
Sceneryenzo matches scenery en zo, Scenery-Enzo, SCENERY ENZO. Spacing, case and punctuation are ignored.
Tray-resident
Clock-face tray icon shows tracking / paused / focus / break states. Right-click for everything else.
Change-detection capture
Perceptual-hash diff means OCR runs only when the screen actually changes — about 2–4 times per minute, not 60.
Browser extension
Chrome MV3 + Firefox bridge pushes the exact active tab URL to the local API over WebSocket. Domain blocklist included.
Pomodoro built in
Focus / break state machine tags every session. Controls from the tray, dashboard, browser popup and your phone.
Invoicing & reports
Line-item-grouped PDFs from tracked time. Configurable HTML/CSS template. Dutch BTW/KVK/IBAN out of the box.
Calendar sync
ICS feed for Tuta, Apple Calendar and Google. CalDAV for Radicale and Nextcloud. OAuth2 for Google Calendar.
Mobile companion
Installable PWA for the timeline, today summary and remote Pomodoro. QR-code pairing, optional Cloudflare Tunnel.
4-level redaction
Strips secrets, PII, names and structure from any text before it ever lands in the local SQLite database.
Local. Deterministic.
Pay nothing.
No machine learning. No "API key required." Tickwise classifies your time with a single deterministic stage that you fully control.
Capture
Once a second, Tickwise samples the active window and the focused screen. A perceptual hash decides whether anything has actually changed — if it hasn't, the loop sleeps. OCR only runs on real change.
Combine
The window title, process name and OCR text are joined with the browser extension's exact tab URL and title. That's the haystack the matcher will search.
Match
Every active project's keyword list is normalised — lowercased, all non-alphanumerics stripped — and so is the haystack. A normalized substring match wins first; a token-set fallback handles partial matches.
Store
The matching project gets the activity. Confidence is 1.0, source is keyword_match. Nothing leaves the machine. If no project matched, the activity stays unclassified for you to assign by hand.
Type one project name.
Every variation matches.
Project keywords
Sceneryenzo sceneryenzo.com SE-website
Three lines. Each one is normalized to sceneryenzo, sceneryenzocom, sewebsite.
Haystacks → match
One file.
Double-click to run.
Tickwise ships as a self-contained tray app. No Python install required, no Node.js, no Docker. The dashboard is bundled inside the binary.
Windows
Windows 10 / 11 · x64 · ~80 MB
Download .exe AVAILABLEmacOS
Universal binary · Apple Silicon + Intel
Track progress COMING SOONLinux
AppImage · X11 + Wayland
Track progress COMING SOONOr run it from a checkout.
Python 3.12+ and Node.js 20+ is all you need. The build is reproducible and there's no external service to register with.
# Clone, install editable, build the dashboard, run the tray app git clone https://github.com/code-lodge/tickwise cd tickwise python -m venv .venv .\.venv\Scripts\pip install -e . Push-Location dashboard ; npm install ; .\node_modules\.bin\ng build ; Pop-Location Copy-Item dashboard\dist\tickwise-dashboard\browser\* tickwise\static -Recurse -Force .\.venv\Scripts\pythonw.exe -m tickwise # tray icon appears, dashboard at :19532 # Build a standalone Tickwise.exe .\.venv\Scripts\pip install pyinstaller .\.venv\Scripts\python.exe -m PyInstaller packaging\tickwise.spec --clean --noconfirm # → dist\Tickwise\Tickwise.exe