work

case study

Pomero

An installable browser Pomodoro timer with task tracking and stats

Solo project · early work

Pomero screenshot

overview

Pomero is a browser Pomodoro timer. It cycles through focus sessions, short breaks and long breaks, and it records each focus session against a task. It runs fully client-side, keeps its history in IndexedDB, and can be installed as a PWA.

problem

Simple online Pomodoro timers tend to drift or stop when the tab is in the background. They also don't show where your focus time actually went. I wanted a timer that keeps accurate time, tells me when a round ends, and shows focus time per task without needing an account.

approach

  1. 01Moved the countdown into a Web Worker so it keeps ticking while the tab is in the background.
  2. 02Save every completed focus session to IndexedDB, indexed by task, and put settings, tasks and preferences in localStorage.
  3. 03Added a web manifest and a service worker so the app can be installed and still load from cache when the network fails.
  4. 04Used the Notification API to announce the end of each round, and the Web Audio API for optional white noise that fades in and out with focus sessions.

features

Configurable cycles

Focus, short break and long break lengths can be changed, along with how many focus rounds come before a long break.

Task tracking

Users create tasks, choose the active one, and each finished focus session is logged against it.

Statistics

A stats panel shows recorded sessions over a chosen time period, with per-task pie and bar breakdowns.

Backup and restore

Session history can be exported as a JSON file and imported again later.

Small comforts

Spacebar to start or pause, the remaining time in the tab title, color themes, and a Picture-in-Picture timer in browsers that support it.

challenges

Keeping time in background tabs

Browsers throttle timers on the main thread in inactive tabs. So the tick loop runs in a dedicated worker that posts elapsed seconds back to the page.

Choosing where data lives

Small settings go in localStorage. Session records, which keep growing, go in an IndexedDB store with a task index so the stats panel can query them by task.

outcome

Pomero is live on GitHub Pages as a working timer. It was my first hands-on use of Web Workers, service workers, IndexedDB and the Notification API in one app.

stack

HTMLCSSJavaScriptWeb WorkersService WorkerIndexedDBWeb Audio APINotification API

contact

Have something worth building?

Open to freelance. Fastest response on WhatsApp ↗ — usually within the hour.

tayyabkhangk4734@gmail.com

next project

Restaurant Landing Page