A calm, keyboard-friendly focus timer with to-dos, habits, goals and session history. Runs as a web app or as a browser extension, and keeps every bit of data in your own browser.
- Focus timer with pause, resume, breaks, extend-on-complete and goal history (press ↑/↓ in the goal field).
- Notifications when a focus session or break runs out. The app asks for permission with Chrome's own prompt the first time you open it; Menu → Settings → Notifications shows the current state and asks again if you dismissed the prompt. If nothing appears, allow notifications for your browser in your system settings and turn off Do Not Disturb / Focus.
- Sound themes: Classic (default), Glass, Wood, Singing bowl, Soft or Silent, each covering start, finish, break, back to work, pause, resume and button taps. Preview and pick them in Menu → Settings → Sounds. All sounds are synthesized in the browser.
- Pixel-art progress animations — a coffee cup that fills, a battery that charges, a rocket that lifts off — plus an auto-shuffle option.
- To-dos with time estimates, notes, drag-and-drop ordering, a backlog and archive; start a focus session straight from a to-do.
- Habits with 7- and 30-day grids and notes per day.
- Goals with target dates, comments and archive.
- Focus summary: daily focus chart, metrics, week-over-week comparison, time by tag and an editable session log.
- Boost: a private feed of notes, links, images and videos to keep yourself motivated.
- Configurable keyboard shortcuts for every main action, with an in-app editor (Ctrl+/).
- No account, no server, no tracking. Everything is stored in
localStorageon the device you use.
| Choose an animation | Plan the day | See your progress |
|---|---|---|
![]() |
![]() |
![]() |
Requirements: Node.js 24 or newer (see .nvmrc) and npm.
git clone https://github.com/ttncode/boost-focus-timer.git
cd boost-focus-timer
npm ci
npm run devOpen http://localhost:3000. To serve an optimized build instead, run npm run build && npm start.
The extension is the same app packaged for Chromium-based browsers (Chrome, Edge, Brave, Opera).
npm run build:extensionThis writes an unpacked extension to dist/extension/ and a zip to dist/boost-focus-timer-extension-<version>.zip.
- Open
chrome://extensions(oredge://extensions) and turn on Developer mode. - Click Load unpacked and select
dist/extension. - Click the toolbar icon to open the timer in a 400 × 600 popup (a compact layout of the same app). Use the ⤢ button in its top bar, or Alt+Enter, to open the full page in a tab; an existing tab is focused instead of opening a second one.
- Optional: assign a global shortcut for Open Boost Focus Timer at
chrome://extensions/shortcuts.
A session keeps running when the popup closes: reopening it continues the countdown, and the extension shows the "Focus session complete" / "Break is over" notification even while the popup is closed (the end chime only plays if the app is open). Popup and full page share the same data, which lives in the extension's own storage, separate from the web app's. Firefox is not supported yet.
Press Ctrl+/ to open the shortcut list. Click a key to change it, press the new combination, Esc to cancel or Backspace to remove it. Reset All to Default restores everything. Assigning a combination that is already in use moves it to the new action.
| Group | Action | Default |
|---|---|---|
| Navigate | Focus · To-Dos · Habits · Goals · Boost | Alt+1 … Alt+5 |
| Focus summary | Alt+H | |
| About Me · Tags | Alt+P · Alt+T | |
| Open / close menu | Alt+M | |
| Back (Tags page) | Alt+Shift+B | |
| Focus timer | Start / pause / resume | Alt+S |
| Switch focus / break | Alt+B | |
| End or complete session | Alt+X | |
| Edit focus goal · Choose animation | Alt+G · Alt+A | |
| Add tag | Alt+Shift+T | |
| Reset session · Extend finished session | Alt+R · Alt+Shift+E | |
| Edit minutes | Alt+I | |
| Auto-shuffle animations on/off · Next animation | Alt+Shift+A · Alt+Shift+C | |
| Lists | New item on the current page | Alt+N |
| Post to Boost · Attach media | Ctrl+Enter · Alt+U | |
| Public / private post | Alt+Shift+V | |
| Show / hide archived · Show / hide backlog | Alt+Shift+H · Alt+Shift+K | |
| Switch 7 / 30 days (Habits) | Alt+Shift+D | |
| Previous · next period | Alt+Shift+← · Alt+Shift+→ | |
| Next chart range (Focus summary) | Alt+Shift+P | |
| App | Edit display name | Alt+Shift+N |
| Save page (About Me) | Ctrl+S | |
| Sounds · Notifications | Alt+Shift+S · Alt+Shift+O | |
| Show or hide the shortcut list | Ctrl+/ |
Shortcuts without Ctrl, Alt or Meta are ignored while you type in a field. Hover a button to see its current shortcut. On Linux, Chrome reserves Alt+1…8 for switching tabs; rebind those if they clash.
All records — sessions, tags, to-dos, habits, goals, posts and settings — are kept in this browser's localStorage under keys starting with bft:.
- Nothing is uploaded, and there is no sync between browsers or devices.
- Clearing site data for the app (or removing the extension) deletes everything.
- Images or videos attached to Boost posts are shown for the current session only; after a reload the post keeps its text.
| Command | What it does |
|---|---|
npm run dev |
Start the dev server on port 3000 |
npm run lint |
ESLint |
npm run typecheck |
TypeScript, no emit |
npm test |
Unit tests with Node's built-in test runner (tests/) |
npm run build |
Production build (standalone server output) |
npm run build:extension |
Static export packaged as a Manifest V3 extension |
npm run icons |
Regenerate the app and extension icons from the pixel grid in scripts/generate-icons.mjs |
npm run check |
Lint, typecheck, test and build — the same gate CI runs |
Project layout:
src/app/ Next.js routes, root layout, icons and web manifest
src/components/ The app: shell, focus timer, pages, Boost feed, hotkeys
src/components/lib/ localStorage data layer (local-db) and session helpers
extension/ Extension service worker
scripts/ Icon generator and extension build
tests/ Unit tests
Built with Next.js 16, React 19, TypeScript, Tailwind CSS 4, dnd-kit and Recharts.
Personal project, used daily by its author. The coffee-cup animation frames in public/animations/coffee-cup/ are third-party artwork kept for private, personal use only; do not redistribute them. Not affiliated with any company or product of a similar name. There is no open-source license yet, so all rights are reserved; ask before reusing the code.



