Words worth sitting with.
Contrarian is a Chrome extension. It replaces your new tab with a single idea from Paul Graham's essays and the minds he reads. One quote per tab. No feed. No noise. Just a thought and its source.
125 quotes from two sources:
- Paul Graham's essays: lines from his published writing. Each line links to the source essay on paulgraham.com.
- His curated collection: quotes he gathered from others on his quotes page: Feynman, Churchill, Perlis, Knuth, and more.
Every quote links to its source. Click the essay title or press O to read the full essay.
| 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, return to them, export as markdown
- Daily shuffle: the date seeds the order, so it stays the same all day and changes tomorrow
- First-time onboarding: a two-step walkthrough on install. It appears once, never 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 extension bundles the quotes, and they never leave the browser.
- Seeded shuffle: the seed is
Math.floor(Date.now() / 86400000). Everyone on the same day sees the same order, and the order changes daily without a server. - Chrome Storage API: favourites and onboarding state persist in
chrome.storage.local. - No framework: vanilla DOM, a 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.