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
Story Timer · Jamo Codes