Words worth sitting with.
Contrarian is a Chrome extension that replaces your new tab with a single idea — drawn from Paul Graham's essays and the minds he reads. One quote per tab. No feed. No noise. Just a thought and where it came from.
125 quotes from two sources:
- Paul Graham's essays — lines extracted from his published writing, linked directly to the source essay on paulgraham.com
- PG's curated collection — quotes he gathered from others on his quotes page: Feynman, Churchill, Perlis, Knuth, and more
Every quote links back to its source. Click the essay title or press O to read the full thing.
| Key | Action |
|---|---|
Space or → |
Next quote |
← |
Previous quote |
O |
Open the source essay |
F |
Save to favourites |
L |
Open favourites sidebar |
Esc |
Close sidebar |
- Swipe left/right on mobile
- Favourites sidebar — save quotes, jump back to them, export as markdown
- Daily shuffle — seeded by date, so the order is consistent per day and different tomorrow
- First-time onboarding — two-step walkthrough on install, never shown again
Dark background. Dot grid. System sans-serif. No serifs, no gradients, no decoration — just the words and the accent.
The interface disappears. The quote stays.
Zero dependencies. No React, no build step, no bundler.
manifest.json → Chrome Extension Manifest V3
newtab.html → New tab page shell
newtab.js → All UI logic
newtab.css → All styles (dot grid, animations, sidebar)
quotes.json → Static corpus — 125 quotes with author, source, and URL
icons/ → Extension icons (16, 48, 128px)
generate-icons.html → Canvas-based icon generator utility
Key decisions:
- Static JSON corpus — no backend, no API, no tracking. The quotes are bundled with the extension and never leave the browser.
- Seeded shuffle —
Math.floor(Date.now() / 86400000)as seed ensures everyone on the same day sees the same order, and it rotates daily without any server. - Chrome Storage API — favourites and onboarding state persist via
chrome.storage.local. - No framework — vanilla DOM, single JS file, custom CSS animations.
- Clone this repo
- Open
chrome://extensionsin Chrome - Enable Developer mode (top right)
- Click Load unpacked and select this directory
- Open a new tab
Built by ohm.