Skip to content
← Back to work
Personal

Story Timer

Developer · 2026

A local-first Windows system-tray app that tracks time against Azure DevOps work items — start, stop, and switch timers, then sync logged hours back to ADO. Built with Electron, React, and SQLite.

  • TypeScript
  • Electron
  • React
  • SQLite
  • Playwright

The problem

Logging hours against ADO stories after the fact is tedious and inaccurate — time gets reconstructed from memory at the end of the week instead of captured as it happens.

The approach

An Electron tray app with atomic timer state transitions, an offline-first SQLite cache of stories and sprint data, periodic checkpoints for crash recovery, and a personal access token encrypted with Windows DPAPI. Unit-tested with Jest and gated by Playwright end-to-end runs against the packaged app.

The result

A packaged, daily-driver desktop tool: timers survive crashes and offline stretches, and tracked time syncs back to Azure DevOps when a connection returns.

Screenshots

Main window: a running timer on story #4325, the sprint story list with start/stop/switch controls, and the Time Breakdown table showing pending and synced sessions
Main window: a running timer on story #4325, the sprint story list with start/stop/switch controls, and the Time Breakdown table showing pending and synced sessions

Want something like this?

Tell me what you're building and I'll get back to you within 1–2 business days.

Start a conversation
Story Timer · Jamo Codes