Skip to content

Repository files navigation

Contrarian

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.


The corpus

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.


Features

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.

Design

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.


Stack

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.

Install

  1. Clone this repo
  2. Open chrome://extensions in Chrome
  3. Enable Developer mode (top right)
  4. Click Load unpacked and select this directory
  5. Open a new tab

Credits

Built by ohm.

About

one paul graham quote per day

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages