You read more than ever. You remember less.
The feed trained you to consume — finish the tab, close the article, move on.
You track pages, count books, mark them read. The feeling of catching up is its own kind of forgetting.
Reading without responding is passive reception dressed up as productivity.
The margin is where thinking happens. Minds Eye puts it back.
A Chrome extension that brings the marginalia tradition to the web. Select any text on any page, press a shortcut, and leave a note — categorised, colour-coded, and waiting for you when you return.
Your annotations live locally in your browser. No account, no server, no surveillance.
Annotation
- Select text anywhere, press
Alt+A(configurable) to open the editor - Six categories — Insight, Key, Affirm, Refute, Query, Clarify — each with its own colour
- Slash commands (
/ins,/key,/ref…) to set categories without lifting your hands - Optional markdown support with a Write / Preview toggle
- Smart editor placement: floats beside the selection, flips automatically when near a viewport edge
Highlights
- Pending highlight (brand gray) appears the moment the editor opens — before you even type
- Saves with the category colour; updates live when you re-categorise
- Toggle all highlights on/off from the drawer without losing them
- Highlight style choice: background fill or underline
Drawer
- Right-side or left-side drawer lists every annotation on the current page
- Click any card in the drawer or popup to scroll directly to the highlight
Popup
- Click the toolbar icon to see all annotations for the current page at a glance
Settings
- Auto-saved as you change them — no Save button
- Typography: font family and size for the editor and cards
- Trigger key, max selection length, default category, editor style, placement, drawer side (left / right), highlight style, URL normalisation, markdown toggle
Export
- Download all annotations as JSON (complete, including anchor metadata) or CSV (one row per annotation, flattened for spreadsheet use)
- Statistics summary on the Settings page: total annotations, pages annotated, category breakdown, and date range
- Exports download directly to your device — nothing is transmitted externally
The extension is not yet on the Chrome Web Store. Load it unpacked:
- Clone this repository.
- Run
npm installthennpm run build. - Open
chrome://extensions, enable Developer mode (top-right toggle). - Click Load unpacked and select the
dist/folder.
To watch for changes during development:
npm run dev # rebuilds on every saveAfter each rebuild, click the reload icon on the chrome://extensions card.
src/
background/ service worker (storage, message routing)
components/ React UI — editor, drawer, panels, toast
content/ content script entry, highlight engine, anchor utilities
landing/ static marketing page (separate Vite build)
options/ settings page
popup/ toolbar popup
types/ shared TypeScript types
utils/ anchor building/resolving, markdown, storage, URL helpers
public/
icons/ extension icons (16, 32, 48, 128 px)
manifest.json
vite.landing.config.ts
| Layer | Choice |
|---|---|
| Framework | React 19 |
| Language | TypeScript |
| Build | Vite + vite-plugin-web-extension |
| Isolation | Closed Shadow DOM (content script UI never leaks into page styles) |
| Storage | chrome.storage.local (annotations) · chrome.storage.sync (settings) via background service worker |
| Tests | Vitest 4 + jsdom — covers url, markdown, anchor, highlighter, storage, service worker, keyboard shield |
| Include | Exclude |
|---|---|
src/ |
node_modules/ |
public/ |
dist/ (generated) |
manifest.json |
dist-landing/ (generated) |
package.json + package-lock.json |
coverage/ (generated) |
tsconfig.json + tsconfig.test.json |
.DS_Store |
vite.config.ts + vitest.config.ts |
.env* |
vite.landing.config.ts |
.vite/ |
.gitignore |
|
README.md |
dist/ and dist-landing/ are intentionally excluded. Anyone cloning builds fresh with npm run build or npm run build:landing. This keeps the repository clean and avoids committing binary build artefacts.
- Chrome Web Store release
- Cross-device sync (optional, user-controlled)
- Firefox support
"A book you truly read reads you back. It leaves marks. That is precisely the point."