Skip to content

Repository files navigation


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.


Minds Eye

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.


Features

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

Installation (developer mode)

The extension is not yet on the Chrome Web Store. Load it unpacked:

  1. Clone this repository.
  2. Run npm install then npm run build.
  3. Open chrome://extensions, enable Developer mode (top-right toggle).
  4. Click Load unpacked and select the dist/ folder.

To watch for changes during development:

npm run dev   # rebuilds on every save

After each rebuild, click the reload icon on the chrome://extensions card.


Project structure

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

Tech stack

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

What gets pushed to GitHub

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.


Roadmap

  • 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."

About

A Chrome extension that brings the marginalia tradition to the web

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages