Browser noise, replaced byone focused dashboard
A Chrome extension that replaces the new-tab page with a quiet dashboard: a dot-matrix clock, a one-click Pomodoro, bookmarks you actually organise, and widgets you can switch off entirely.
Why replace the new tab at all?
2025
2026
DESIGNED SOLUTION
One quiet screen with a clock, a timer, and your own bookmarks — every widget beyond that is opt-in. Vanilla ES modules, no build step, no runtime dependencies, no account: the source is what runs.
Log 002 · What it does
one screen, six things on it
Dot-Matrix Clock
An LED-style time display built from a CSS grid of dots — no canvas, no font file, no layout thrash. Clicking it starts a Pomodoro, so the most-looked-at element is also the primary action.
One-Click Pomodoro
Configurable work and break intervals with desktop notifications. Timer state lives in the Application layer, so it survives closing the tab and resumes wherever the next new tab opens.
Categorized Bookmarks
Drag-and-drop bookmarks grouped into user-defined categories, with keyboard search over titles and URLs. Stored locally — the extension never asks for a bookmarks-sync permission it doesn't need.
Toggleable Widgets
Weather, tasks, and calendar are opt-in, not defaults. Each registers itself against the Application layer, so turning one on never touches the clock or the timer — and turning them all off leaves a blank, quiet tab.
Local-First by Construction
chrome.storage for settings, IndexedDB for bulk data, and periodic backup through the File System API. No account, no telemetry, no remote sync — there is no server to send anything to.
Zero Runtime Dependencies
Vanilla ES modules loaded straight by MV3 — no bundler, no transpile step, no node_modules in the shipped extension. What you read in the repo is byte-for-byte what runs in the browser.
Log 004 · Screen by screen
what you actually see
The extension is one page with a handful of states. Each is reachable from the new tab itself — there is no separate options window, no popup, and nothing behind a login.
The new tab
The default state: dot-matrix clock, date, and nothing else competing for attention.
Pomodoro running
Clicking the clock starts a session. The countdown replaces the time in the same spot.
Bookmarks
Bookmarks grouped into your own categories, reordered by dragging, filtered by typing.
Widgets on
Weather, tasks, and calendar switched on — the fullest the page ever gets.
Settings
Toggle each widget, retheme via CSS variables, and export or restore a backup file.
Log 003 · The layers
four layers, one job each
Dependencies point inward. Presentation and Infrastructure sit on the outside and may both reach Domain — Domain reaches nothing. That rule is what keeps a new widget from touching the clock.
Presentation
Renders the tab and nothing else — no fetching, no persistence, no rules.
Application
Orchestrates use cases. Widgets register here, which is why adding one never edits the clock.
Domain
depends on nothingEntities and value objects. Plain JavaScript — knows nothing about Chrome or the DOM.
Infrastructure
The only layer that talks to the browser. Swap it and the domain never notices.
Presentation → Application → Domain ← Infrastructure
Appendix · Roadmap
what ships next
Web Store listing
Package v0.2.0 for review so installing stops requiring Developer mode and an unpacked folder.
Widget API for third parties
The registry that widgets already use is internal. Documenting it lets someone add a widget without forking.
Firefox port
MV3 is close enough between browsers that the Infrastructure layer is the only part that should need rewriting — which is the point of putting it there.
A new tab you stop noticing.
No account, no telemetry, no build step — the whole extension is the source you can read, and the best thing it can do is get out of the way.
