Chrome extension (Manifest V3) for website access rules: Allow, Block, or Lock with a PIN.
Single purpose: help you stay focused and protect sensitive sites by controlling which websites you can open.
Not parental control, a password manager, VPN, ad blocker, AI assistant, antivirus, or a productivity suite.
See ARCHITECTURE.md for modules, message passing, storage schema, rule engine, and scheduler.
Data model: docs/DATA_MODEL.md — canonical types, defaults, migration, future sync/auth extension points (src/storage/model/).
UX: docs/UX.md — design system, screen specs, copy deck, accessibility, dark mode.
Roadmap: docs/ROADMAP.md — incremental milestones and QA checklists.
Layout:
src/background/ service worker, enforcer, DNR, alarms, router
src/core/ rule engine, PIN, session, scheduler, messages
src/storage/ local + session persistence
src/utils/ url, id, time helpers
src/popup/ toolbar UI
src/options/ settings + schedules
src/pages/ blocked, locked, onboarding
src/content/ reserved (unused for primary enforcement)
- Run
npm install - Run
npm run build - Open
chrome://extensions - Enable Developer mode → Load unpacked → select the
distfolder
npm run package:zipCreates focuslock-v{version}.zip in the project root.
| Command | Description |
|---|---|
npm run build |
Typecheck + production build into dist/ |
npm test |
Unit tests (rules, PIN, scheduler, migration, statistics) |
npm run smoke |
Validate built dist/ artifact |
npm run package:zip |
Build and zip for store / sideload |
Rules, schedules, and PIN data stay on your device. See store/privacy-policy.md.
Chrome Web Store submission: store/cws-dashboard.md (privacy policy hosting, dashboard checklist). Production URLs and support email are in store/site-config.json: