A lightweight, privacy-first desktop time tracker built with Tauri 2 + Rust + React/TypeScript.
Tracks what you work on automatically — by watching the active window and open IDE workspaces — and lets you review, annotate, and optionally publish worklogs to Jira.
No data ever leaves your machine.
- Everything is stored in a local SQLite database (
%APPDATA%\TimeTracker\timetracker.dbon Windows). - No analytics, no telemetry, no cloud sync.
- The app works fully offline. Internet is only needed if you choose to publish worklogs to Jira — and even then, only the specific worklog you publish is sent, directly to your own Jira Cloud instance.
- Automatic session tracking — detects the focused window and active IDE project every few seconds.
- Multi-project tracking — multiple IDEs open at the same time each get their own independent session.
- Branch-aware sessions — switching git branches automatically closes the current session and starts a new one.
- Manual tracking — start a named timer for anything (code review, meetings, research) directly from the Today page.
- Background IDE detection — keeps tracking even when VS Code / Rider / Cursor / WebStorm is not the focused window.
- Git & Jira attribution — reads the current branch name and extracts the Jira issue key automatically.
- Slack Huddle tracking — optionally records call duration when you are in a Slack Huddle.
- Sleep-safe — detects system wake-up and does not mark sleeping time as idle.
- Auto-merge processor — if the app was closed or the PC slept, the previous session is resumed on restart instead of creating a fragmented one.
- Idle detection toggle — optionally disable automatic idle pausing to track uninterrupted.
- Per-session Pause / Stop / Restart — each live session card has independent Pause and Stop controls. Paused time is excluded from the recorded duration. After stopping, the card stays visible so you can start a new session for that project with one click.
- Splashscreen — a dark-themed loading screen is shown while the UI initialises; no white flash on startup.
- Global error notifications — optional toast alerts for unhandled JS errors (Settings → System → Show unexpected errors).
- System tray — minimizes to tray on close, single instance, click to restore.
- Close guard — warns when closing with active sessions and offers to stop them cleanly.
- Review page — inspect, edit, merge, and selectively publish sessions to Jira; includes a by-issue summary table.
- EN / RU localization.
Only sessions attributed to a registered project are recorded. Random software you happen to use is ignored. A session is linked to a project when any of these match:
- The active executable path is inside the project folder.
- The window title contains the project display name.
- The window title contains the project's folder name (catches IDEs that show the workspace folder in the title bar, e.g.
file.ts — myapp — Visual Studio Code).
You don't need Jira at all. Sessions are recorded and stored locally regardless.
If you're lazy enough to want automatic worklog publishing:
- Settings → Boards — toggle Enable Jira integration. The Jira page appears in the sidebar.
- Jira — enter your Jira Cloud URL, email, and an API token (generate one at Account Settings → Security → API tokens).
- Review — pick a day, inspect merged sessions, click Publish for each one you want to log.
| Section | What it controls |
|---|---|
| System | Minimize-to-tray on close; Auto-merge processor; Show unexpected errors toggle |
| Tracking | Idle detection toggle, idle threshold (default 5 min), poll interval (default 5 s) |
| Integrations | Toggle Slack Huddle tracking on/off |
| Boards | Enable / disable Jira integration; Jira key regex patterns (shown only when enabled) |
| Storage | DB file size, session count, Erase all sessions |
| Platform | Builds | UI | Window tracking | Idle detection | Huddle detection |
|---|---|---|---|---|---|
| 🪟 Windows | ✅ Tested | ✅ | ✅ | ✅ | ✅ |
| 🍎 macOS | ✅ Should compile | ✅ | 🔲 Not implemented | 🔲 Not implemented | 🔲 Not implemented |
| 🐧 Linux | ✅ Should compile | ✅ | 🔲 Not implemented | 🔲 Not implemented | 🔲 Not implemented |
On macOS and Linux the app builds and runs — sessions, Jira publishing, and the UI all work — but automatic tracking won't fire because the OS-level window/idle APIs are stubs. PRs welcome.
| Layer | Technology |
|---|---|
| UI | React 18 + TypeScript + Vite |
| Backend | Rust (Tauri 2) |
| Database | SQLite via rusqlite (bundled, no external process) |
| Windows API | windows-rs — foreground window, idle time, EnumWindows |
| Async runtime | Tokio (managed by Tauri) |
npm install
npm run tauri dev # dev build with hot-reload
npm run tauri build # release buildRequires: Rust stable toolchain, Node 18+, and the Tauri prerequisites for your OS.
| OS | Path |
|---|---|
| Windows | %APPDATA%\TimeTracker\timetracker.db |
| macOS | ~/Library/Application Support/TimeTracker/timetracker.db |
| Linux | ~/.local/share/TimeTracker/timetracker.db |
You can back up or inspect the file with any SQLite browser. Erasing sessions from Settings → Storage only deletes session rows — projects, settings, and Jira credentials are preserved.