Intention is a browser extension that puts an AI coach between you and the sites that pull you away from what you actually want to do. Instead of a hard block or a weak timer, every visit is a short conversation: why are you here, is there something you're avoiding, what would actually serve you right now? You bring your own LLM API key. Nothing leaves your machine except calls to that provider.
-
Firefox: Download on the Firefox Add-on Store
-
Chrome: Download on the Chrome Web Store
(Safari and Android versions are currently built/run from source—see details below.)
- You add sites to a blocklist (e.g.
instagram.com,twitter.com). - When you open one, the page is paused and a chat opens. Your coach — the LLM you chose — asks what's up.
- If you have a real, specific, time-bounded reason, it grants you some minutes. If the reason is hollow ("just checking"), it doesn't — it offers alternatives instead, drawn from what it knows about you.
- When the time is up, it checks back in. Further grants get exponentially harder; after the daily cap the coach can't grant more, but it'll still talk to you, help you notice the pattern, and cheer you on for closing the tab.
- Your context — who you are, what your goals are — can only be updated by talking to the coach. No text field to silently rewrite the rules in a weak moment.
- AI gatekeeper: the LLM decides whether to grant access, via a structured
grant_accesstool call — not free-text the page could spoof. - Multi-provider, bring-your-own-key: Anthropic (Claude), OpenAI, Groq, Google Gemini. You pick the provider and model.
- Context-via-chat guardrail: the system prompt ("about you") is updated only through a conversation with the coach, using an
update_contexttool. Prevents trivial self-deception. - Time awareness: the AI sees minutes spent today on this site, today across all blocked sites, and across the past week.
- Exponential difficulty: scaling skepticism per grant per day, plus a hard daily cap (3). Past the cap the chat continues for motivational support, but no more time is given out.
- Positive reinforcement tone: the system prompt pushes the AI to be warm, curious, non-judgmental — offering concrete alternatives, naming procrastination gently, celebrating the close-tab choice.
- Clone or download this repository.
- Navigate to
chrome://extensions/and enable Developer mode. - Click Load unpacked and select the
Intention Chromesubfolder. - Click the extension icon → Options (or right-click → Options) to run first-time setup.
The Intention Apple folder contains a pre-generated Xcode project that wraps the web extension for both macOS and iOS.
- Open
Intention Apple/Intention Safari.xcodeprojin Xcode. - Select a macOS or iOS target and hit Run.
- Enable Intention in Safari's Extensions settings (on iOS: Settings → Apps → Safari → Extensions).
To regenerate the wrapper from the latest Chrome sources:
xcrun safari-web-extension-converter "./Intention Chrome" --project-location . --app-name "Intention Safari"
You can install the official extension directly from the Firefox Add-on Store.
For development or manual installation:
Desktop Firefox (unsigned, temporary — for testing):
- Go to
about:debugging#/runtime/this-firefox. - Click Load Temporary Add-on… and choose
manifest.jsoninsideIntention Firefox. - The extension loads until the next restart. For permanent use, sign/distribute via addons.mozilla.org.
Firefox for Android (Nightly):
- Install Firefox Nightly from the Play Store.
- Enable the debug menu: Settings → About Firefox Nightly → tap the logo 5 times.
- Use Install extension from file (Nightly) or a custom add-on collection on AMO to load a packaged
.xpibuilt from theIntention Firefoxfolder.
On first open, the options page walks you through:
- Choose a provider (Anthropic / OpenAI / Groq / Gemini) and paste an API key.
- Tell your coach about yourself — who you are, your work, your goals, what patterns you want to stay mindful of.
- Add starter domains to the blocklist.
After that, the options page only exposes the blocklist and provider settings directly. Updating your context is done through the Talk with your coach button — the coach decides when the context has improved enough to save a new version.
- Vanilla JavaScript, Manifest V3, HTML + CSS (glassmorphic)
chrome.alarms,chrome.storage.local,chrome.tabs,chrome.runtime- LLM adapters: Anthropic Messages API, OpenAI (+ Groq) Chat Completions, Gemini generateContent
- Tool-use-based access grant and context update — no free-text commands
A Vitest suite covers the prompt composition, tracking/stats, and LLM-provider
logic (loading the unmodified source files via a node:vm loader), plus a
parity check across the three variants and a browser-based overlay dev harness.
npm install
npm testSee tests/README.md for the full guide (watch mode, the
overlay harness, and live-loading the extension in Firefox / Chrome / Safari).
All shared extension source lives in shared/. Edit there, then run scripts/sync.sh to propagate to the platform folders (platform manifests are generated from shared/manifest.base.json plus a small per-platform overlay). ./build.sh produces versioned Chrome/Firefox zips (and, with --all/--safari, the Safari .app — macOS + Xcode only) into build/; its preflight fails if any platform folder has drifted from shared/. scripts/bump-version.sh <version> syncs the version across all platforms in one command. See DEPLOYMENT.md for the full Chrome Web Store / Firefox AMO / Apple App Store submission guide, including which secrets enable auto-publishing from CI. Data handling is described in PRIVACY.md.