What it is:

A simple Chrome browser extension that just prompts you to say what you intend to do when you open a new tab & times your session. My goal is not to block myself from using any given site but just to add enough friction that I have to be slightly more intentional about that usage.

Why I built it:

I used to use “Freedom” and its associated apps which let you place time limits on tabs, block certain sites during focus sessions, and more. It was really cool, but ultimately it was overkill, and it slowed my browser down, so after a few years of using their apps, I deleted them all in favor of good old-fashioned self-discipline.

Sometimes that breaks down, and as I’m trying to ship more, I need to push any time spent browsing into building.

Tech stack:

Component

Tool

Info

Coding agent

Codex

AI coding agent

Extension platform

Chrome Extensions Manifest V3

Chrome extension using a background service worker, content scripts, extension pages, and MV3 permissions

Language

TypeScript

Used across background tracking, content script prompt UI, storage helpers, and stats dashboard code

UI

Plain HTML + CSS + DOM APIs

Lightweight custom UI without React or a frontend framework

Website overlay

Content Script + Shadow DOM

Injects the focus prompt over normal websites while isolating styles from the page

Dashboard

Static extension page

stats.html / stats.ts display locally stored focus stats

Build

TypeScript compiler

tsc compiles src into dist; a small Node script copies static extension files

Storage

Chrome Storage API

chrome.storage.local stores completed analytics locally; chrome.storage.session stores active/pending sessions

Browser APIs

Chrome tabs, runtime, storage APIs

Tracks tab lifecycle, passes prompt messages, stores data, and closes tabs for early exits

Dependencies

TypeScript + @types/chrome

Dev-only packages for compiling and typing Chrome extension APIs

Hosting

Chrome local/unpacked extension

Built files are loaded from dist via chrome://extensions; no web hosting required

Keep reading