I had a website blocker, a Pomodoro timer, a tab suspender, and a time tracker installed at the same time — four separate extensions, four separate settings pages, none of them talking to each other. Starting a focus session meant manually turning on the blocker, then starting the timer, and neither knew the other existed. So I built TabInsights, which does all four and actually connects them.
What it does
Website blocker — block by domain, category, or schedule, with an optional typed "unblock challenge" for the days willpower isn't enough.
Pomodoro focus timer — one click starts a 15/25/45-minute sprint, which also auto-blocks distracting categories for the duration and unblocks them automatically when it ends. This is the part that actually solves my original problem — the timer and the blocker are the same feature, not two extensions coincidentally running at once.
Memory saver — auto-suspends tabs you haven't touched in a configurable window (15–60 min), freeing roughly 50MB of RAM each via chrome.tabs.discard(). Suspended tabs stay in your tab bar and reload exactly where you left off with one click.
Automatic time tracking — logs time per domain with no manual start/stop, and shows a daily focus score.
A few implementation notes
Manifest V3 removed persistent background pages, which meant every "ongoing" feature — sprint timers, the daily summary, auto-suspend checks, license re-validation — had to be rebuilt on chrome.alarms instead of a long-lived timer. The gotcha: Chrome clamps alarm intervals to a minimum of 1 minute in packaged (published) extensions, so anything needing finer granularity has to accept that floor rather than fight it.
The blocker uses declarativeNetRequest — you hand Chrome a set of match rules and it enforces them at the browser level. The extension never actually reads the blocked request; it can't, by design, which is also the honest answer any time someone asks whether a blocker "sees" their browsing.
The bigger architectural decision was privacy: the extension makes zero external network requests during normal use. That meant bundling the UI font locally instead of pulling from Google Fonts, using Chrome's on-device favicon cache instead of a favicon API, and replacing what used to be rotating Unsplash background photos with a CSS-only gradient. None of that needed a server to begin with — it was just easier to reach for one during early development, and ended up being worth ripping out.
Where it's early
This is genuinely early — first real push toward finding users happened this week, after building it primarily for myself. If you try it and something's missing or feels like four extensions wearing a trenchcoat instead of one, I'd like to hear it.
Free, with an optional one-time $4.99 Pro upgrade (site time limits, scheduled blocking, unlimited workspaces, cloud sync) — no subscription either way.
Chrome Web Store: https://chromewebstore.google.com/detail/jfnfcaeagpcloialnbhibiecbphohebm
Top comments (0)