A lightweight, highly-visible desktop timer overlay for the Obsidian TaskNotes plugin. Sits on top of all your windows, shows a live elapsed timer, and controls TaskNotes time tracking via its HTTP API.
v2 is built with Tauri — it uses the operating system's native
webview instead of bundling a browser engine, so the installers are ~3 MB instead of
~100 MB. The previous Electron implementation is preserved under legacy/.
- Dark floating widget (227×200px) that stays above all windows
- Large green monospace clock that counts up while timing
- Pulsing dot + green glow when a timer is running
- Drop-down to pick any open/in-progress task
- START / STOP controls
- Syncs with TaskNotes — if you start/stop inside Obsidian the overlay updates automatically
- System-tray menu (Show/Hide, Settings, Quit) and a single-instance lock
- Self-hosted fonts — no network calls beyond the local TaskNotes API
- Obsidian with the TaskNotes plugin installed
- Enable the TaskNotes HTTP API: Obsidian → Settings → TaskNotes → Integrations → HTTP API → Enable (default port 8080)
- For development: Node.js (v18+) and the Rust toolchain (https://rustup.rs)
npm install # install the Tauri CLI
npm run dev # run in development with hot reload
npm run build # produce a release bundle for the current platformBuild output lands in src-tauri/target/release/bundle/ (.dmg on macOS, .exe NSIS
installer on Windows).
CI (.github/workflows/build.yml) builds macOS + Windows on a version tag (v*) or a
manual dispatch, and uploads the installers as artifacts.
Click the ⚙ button (or the tray → Settings) to open Settings:
| Setting | Default | Description |
|---|---|---|
| API Port | 8080 | Must match TaskNotes HTTP API port |
| API Token | (blank) | Only needed if you set one in TaskNotes |
| Screen Position | Top Right | Where the overlay appears |
| Always on Top | On | Float above all other windows |
| Opacity | 95% | How transparent the widget is |
| Poll Interval | 3000ms | How often to check for external timer changes |
Use Test Connection to verify the API is reachable before saving.
- The overlay polls
GET /api/time/activeto detect timers started inside Obsidian - START calls
POST /api/tasks/:id/time/start; STOP callsPOST /api/tasks/:id/time/stop - The task list comes from
POST /api/tasks/query(open + in-progress tasks) - All HTTP goes through the Rust core, pinned to IPv4
127.0.0.1to avoidlocalhostresolving to IPv6::1
Because it uses TaskNotes' own API, all session data is written directly to your vault's YAML frontmatter — exactly the same as using TaskNotes itself.
src/— frontend (plain HTML/CSS/JS):index.html(timer),settings.html, and their scripts/styles; self-hosted fonts undersrc/fonts/src-tauri/— Rust core: window management, tray, single-instance, settings persistence, and theapi_requestHTTP proxylegacy/— the original Electron app, kept as a fallback
"Cannot connect to TaskNotes API" — make sure Obsidian is running, the HTTP API is enabled, and the port matches (default 8080).
macOS "app can't be opened because it's from an unidentified developer" — right-click
the app → Open → Open, or run xattr -cr "/Applications/TaskNotes Timer.app".
Windows SmartScreen "Windows protected your PC" — the installer is unsigned; click More info → Run anyway. Requires the Edge WebView2 runtime (preinstalled on Win 10/11).