Back to projects

In plain English

A browser add-on that keeps you on track. Each day you set your top three goals and they greet you on every new tab, along with a timer and a habit tracker. A small reminder follows you on every page so you don't drift off.

End-to-end · Solo build

Daily Focus

A Chrome extension that replaces your new tab with a calm, intentional dashboard. Three focuses for today, a Pomodoro timer, a 30-day habit grid, and an optional vocab card in 18 languages with AI-graded spaced repetition. A sticky pill in the corner of every webpage keeps the focus visible.

ProductDesignFrontendAI engineering
Daily Focus new-tab dashboard with focuses, Pomodoro, habit grid, and Danish card
The new tab: three focuses, Pomodoro, 30-day habit grid, weather, news, and an optional language card

Try it

Three focuses, every new tab

No accounts, no servers, no analytics. Bring your own Anthropic key for AI-graded vocab, or use the curated list.

By the numbers

Current version

v0.33.0

~35 releases shipped this month

Languages

18

Custom themed dropdown, per-card lang tag

Servers

0

Everything in chrome.storage on-device

Stack cost

Free

Anthropic key optional, BYO

Why I built this

Every productivity app eventually nags. Notifications, streak-loss anxiety, a settings menu that takes 20 minutes to tour. I wanted the opposite: something that loads fast, doesn't demand attention, and stays out of the way until I open a new tab.

Three focuses is the whole product. Pomodoro, habit grid, weather, news, language card are all helpful but optional. The sticky pill on every webpage is the secret weapon: it shows progress without me leaving the page I'm working on, and the Pomodoro timer follows me across tabs.

I added the language card because I'm learning Danish while living in Copenhagen. It grew into a generic 18-language tool with Claude-graded answers, country-aware news headlines per learning language, and Toucan-style ambient word injection on webpages. Same pattern: optional, non-nagging, BYO API key.

Tour the dashboard

One new tab, six modules. Each one optional, each one designed to not demand attention.

1

Three focuses for today

Pick three things, mark the hardest one with a frog, check them off through the day. Midnight reset zeroes the slate without erasing your streak. The frog metaphor is real: eat it first.

2

Pomodoro that follows you

Customizable 25/5/15 (work/short/long), attaches to any focus, runs as a floating bug across all tabs. Right-click the pill to reset position or hide it per-site.

3

30-day habit grid + strict streak

One cell per day for the last 30. Strict streak counter (miss a day, streak resets). No leniency mode, no streak-freezes. The strictness is the feature.

4

Sticky focus pill on every page

Top-right corner pill shows your current Pomodoro and progress. Click a focus to check it off without leaving the page. Drag to reposition (position memory is global), right-click to hide on this site or everywhere.

5

Optional language card

18 languages, 4 review directions (forward / reverse / listen / mix), long-term review bands at 7d / 30d / 90d per Ebbinghaus + Cepeda spacing. Claude grades the answer, or fall back to a built-in curated list if you don't bring a key.

6

Weather + country-aware news

Open-Meteo for local weather (one IP-derived call, no account). News headlines from a curated outlet mapped to your learning language (BBC World fallback). 11 outlets total: cphpost.dk, DW, France24, El País, ANSA, NL Times, The Portugal News, News in English Norway, Helsinki Times, Notes from Poland, BBC.

Daily Focus marquee promotional image
Marquee promo for the upcoming Chrome Web Store listing

Key features

Three focuses + frog marker

Pick three, mark the hardest with a frog, check them off. Midnight reset, no streak penalty for finishing early.

Cross-tab Pomodoro

Floating timer pill follows you across tabs, keeps state in chrome.storage so two windows stay in sync.

18-language vocab card

Spaced repetition with 4 review directions (forward / reverse / listen / mix), long-term bands at 7d / 30d / 90d, Claude grades open-ended answers.

Add-from-page tooltip

Select text on any webpage, get an instant translation tooltip with optional 'Add to deck' button. Works through a background service-worker proxy on CSP-strict sites like Gmail.

Ambient word injection

Toucan-style: foreign-language words quietly replace common English words on webpages. Hover to see the English back. Switchable per-site.

Country-aware news

Headlines from a curated English-language outlet matched to your learning language (cphpost.dk for Danish, El País English for Spanish, etc). 11 outlets, BBC fallback.

Tech stack

Extension

Chrome MV3Vanilla JSShadow DOM

No framework, no build step, no bundler. newtab.html + content.js + background.js service worker + popup + side panel.

Storage + sync

chrome.storage.syncchrome.storage.local

All state lives in chrome.storage. .sync for cross-device, .local for cached translations and per-tab UI. No backend, no auth, no servers.

AI + language

Anthropic ClaudeGoogle TranslateGoogle TTS

Claude for prompt-generation and answer grading (BYO key). Google Translate as the free fallback. Google Translate TTS for pronunciation (no key needed).

External data

Open-MeteoBigDataCloud11 RSS feeds

Weather + reverse-geocode for the dashboard. Country-aware news headlines (cphpost.dk, DW, France24, El País, ANSA, NL Times, +5 more).

Under the hood

Everything you do stays on your own computer. There are no accounts and no servers collecting your data, which keeps it private and free to run.

The language cards ask the AI for phrases a real person your age would actually say in everyday situations like a cafe or the office, instead of stiff textbook lines you would never use.

Brand & creative

Marketing posters and animated creative

Two brand posters and an animated 9:16 creative generated with Pomelli, Google's AI brand toolkit.

Daily Focus manifesto poster · Reclaim your digital focusManifesto
Daily Focus privacy poster · Private habits, local dataPrivacy
Animated MP4

Common questions

Is it on the Chrome Web Store yet?+

Not yet. v0.33.0 runs perfectly via Load Unpacked in chrome://extensions. The store submission is built and ready (STORE_LISTING.md + screenshots + zip + privacy policy) but I'm holding for one more round of polish before shipping. Landing page goes live first.

Do I need an API key for the language card?+

Optional. Bring your own Anthropic API key for AI-generated phrases and AI-graded answers. Or use the built-in curated list (no key needed). Without a key the dashboard stays full-featured: only the open-ended grading and dynamic vocab generation are gated.

Where does my data live?+

On your device, in chrome.storage. .sync for the slice that travels across Chrome installs (your focuses, settings, language deck). .local for cached translations and per-tab UI state. No accounts, no servers, no analytics, no third-party tracking.

Why 18 languages? I thought this was a Danish thing.+

Started Danish, grew. The Claude prompt and the Google Translate calls were already language-agnostic; adding more was mostly building a custom themed dropdown and a per-card lang tag. Now it ships with country-aware news outlets mapped to each learning language: cphpost.dk for Danish, El País English for Spanish, etc.

What's the sticky pill for?+

Two jobs: (1) keep your three focuses visible so you don't lose them in tab clutter, (2) carry the Pomodoro timer across pages so the work session doesn't reset when you switch tabs. Right-click for reset position / hide on this site / hide everywhere.

Why no streak-freeze or leniency?+

Other apps treat streaks as gamification. I treat them as honest signal. If you miss a day, the streak resets. That's the point: a strict streak counter forces a real conversation with yourself about whether you want this in your life or not.

What I learned

  • ·Make everything optional. The timer, the news, the language card, all of it can be switched off, so the tool stays calm and still works if you only want your three focuses for the day.
  • ·Asking the AI for what a real person would actually say beats asking for generic phrases. The wording you choose for the request matters more than any clever feature.
  • ·A strict streak that resets when you miss a day is more honest than soft streak-savers. It forces a real question about whether you actually want the habit, not just a number to protect.

What's next

Honest roadmap. Things I know are gaps, in priority order.

Ship to the Chrome Web Store

Store listing copy + screenshots + zip + privacy policy are all built. Holding for one more pass on the language-card UX (a recent regression on web-page popups is still being diagnosed) before submitting.

Multi-provider AI

Anthropic-only today. OpenAI and Google Gemini auto-detection (whichever key you paste) would let users pick their preferred provider. Same pattern as Email Responder's BYO-key model.

More target languages

18 supported today via Google Translate's coverage. Lithuanian, Portuguese, Korean already work but need a few prompt tweaks. Curated phrase-list fallback needs translating per language.

Granular pill control

Per-site hide works. Per-site Pomodoro mute, per-category hide (news / weather / language card on/off independently on the pill) would let power users tune what's visible on each site.

Let's talk about this project

More projects

Chrome MV3Vanilla JSShadow DOMchrome.storageAnthropic ClaudeGoogle TranslateOpen-MeteoBigDataCloud