- TypeScript 72.2%
- CSS 11.3%
- JavaScript 6.9%
- HTML 5.4%
- Python 4.2%
| public/icons | ||
| scripts | ||
| src | ||
| tests | ||
| .gitignore | ||
| _data_sites.mjs | ||
| _lib_sites.mjs | ||
| AGENTS.md | ||
| biome.json | ||
| LICENSE | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| tsconfig.json | ||
| vitest.config.ts | ||
| wxt.config.ts | ||
GateKeeper
Friction, not force. A mindful 5-second pause before you open a distracting site.
GateKeeper is a Chrome extension that doesn't block procrastination sites — it makes you pause before opening them. When you navigate to Reddit, YouTube, Twitter/X, Instagram, TikTok, Facebook, Netflix, or any custom site you add, you'll see a full-page overlay asking "Do you really want to visit [site]?" with a 5-second countdown. After the countdown, the default action — highlighted, one click away — is Take me back. "I'm sure, let me in" is there if you mean it, but it's deliberately less prominent.
Features
- 5-second mindful pause before opening any blocked site
- 12 default sites: Reddit, Twitter/X, YouTube, Instagram, TikTok, Facebook, Netflix, Twitch, 9GAG, Imgur, Pinterest
- Custom site list — add any hostname you want
- On/off toggle — the master switch
- Interception counter — see how often you were saved from yourself
- 100% free, no premium, no paywalls — see Branding below
Branding
GateKeeper is part of the Greasy Sprocket family. Greasy Sprocket tools are always 100% free — no premium tiers, no feature limits, no paywalls. The only monetization is a voluntary "buy me a coffee" banner that appears after 2 days of use (with a 30-day cooldown between appearances), and a feedback form on uninstall pointing to https://greasysprocket.com/feedback.
Tech stack
- WXT 0.20.27 — extension build tool
- TypeScript 6.0.3 (strict)
- Biome 2.5.1 — linter + formatter
- Vitest 4.1.9 — tests
- pnpm 11.x — package manager
Project layout
gatekeeper/
├── src/
│ ├── data/sites.ts # canonical default blocklist
│ ├── lib/
│ │ ├── sites.ts # isBlocked, normalizeSite, matchingSite
│ │ └── storage.ts # Settings, Stats, chrome.storage.local helpers
│ └── entrypoints/
│ ├── background.ts # uninstall URL, message handler, coffee logic
│ ├── content.ts # full-page overlay on blocked sites
│ └── popup/ # enable toggle, site editor, stats
├── tests/sites.test.ts
├── public/icons/ # 16/32/48/96/128 px PNGs
├── scripts/generate-icons.py
├── wxt.config.ts
├── package.json
├── tsconfig.json
└── biome.json
Develop
pnpm install
pnpm dev # wxt dev — loads in a dev-mode browser
pnpm test # vitest watch
pnpm test:ci # vitest run
pnpm typecheck # tsc --noEmit
pnpm lint # biome check
pnpm validate # typecheck + lint + test
pnpm build # → .output/chrome-mv3/
pnpm zip # → .output/gatekeeper-*.zip
License
Apache-2.0. See LICENSE.