Thilko is a Chrome extension that lets you highlight text on any web page or PDF, attach private comments, and have a streaming AI conversation about the passage with Dabbis — a small scholarly assistant that lives next to your toolbar. Your highlights, notes, and AI chats are stored in a personal memory backend (Supermemory) so you can come back to them, search them, and bundle them up to share with another LLM in one click.
It's built for the way people actually read: select a sentence that struck you, ask a question, move on. The window stays out of the way of the text.
- Annotate any page or PDF. Highlights survive page reloads and reasonable article edits (W3C TextQuoteSelector + position fallbacks).
- Talk to Dabbis about what you're reading. Streaming responses, full markdown, threads attached to each highlight.
- Lazy persistence. A highlight is just a local marker until you add a note or ask a question — your memory stays clean of empty markers. Togglable in options.
- Side library. A full-tab
library.htmllists every highlight you've ever made, with semantic search across notes and threads. - "Open with Claude." Bundle a highlight, an article, or a whole topic into a markdown summary and paste it into claude.com with one click.
- PDF support. Click a
.pdflink, the extension renders it in its own viewer with the same selection toolbar. - Light, frosted UI. Polished popover, mascot in the conversation gutter, brand-purple accent for the things that matter.
┌──────────────────────────────────────────────┐
│ Chrome MV3 extension (this repo) │
│ • content script: selection toolbar + │
│ highlight render + popover + sidebar │
│ • PDF viewer page (pdfjs-dist) │
│ • library page (full tab) │
│ • options page │
│ • background service worker (RPC, │
│ health-check, op-log, chat streaming) │
└──────────────────┬───────────────────────────┘
│ HTTPS Bearer + X-Token-Slot
▼
┌──────────────────────────────────────────────┐
│ Codex+Memory proxy (NOT in this repo) │
│ POST /responses → chatgpt.com/codex │
│ POST /memory/chat → streaming SSE │
│ POST /memory/* → Supermemory CRUD │
│ Holds: PROXY_SECRET, Codex OAuth tokens, │
│ SUPERMEMORY_API_KEY │
└────────┬──────────────────────┬──────────────┘
▼ ▼
chatgpt.com/codex api.supermemory.ai
The extension never holds an API key — it talks only to your proxy, which holds the secrets and forwards to OpenAI's Codex API + Supermemory. The proxy lives in a separate repo (see Backend below). Multi-user is supported by the X-Token-Slot header — each user gets a personal "slot" namespace for their data.
Coming once the unlisted listing is approved. Link will be added here.
- Grab the latest
.zipfrom Releases. - Unzip it somewhere.
- Open
chrome://extensions, toggle Developer mode (top-right), click Load unpacked, point at the unzipped folder. - The first-run options page opens automatically. See Configure below.
git clone <this-repo>.git
cd thilko
npm install
npm run build # produces dist/Then load dist/ as an unpacked extension in chrome://extensions.
Thilko needs three things to work:
- Proxy URL — the base URL of a Codex+Memory proxy (see Backend below). Example:
https://proxy.example.com:3200. - Proxy secret — the
PROXY_SECRETthe proxy was started with. The extension sends this as a Bearer token. - Slot — your personal namespace tag. 1–32 characters, letters/digits/
-/_. Each slot's data is isolated from every other slot's.
Open the options page (auto-opens on install, or right-click the extension icon → Options), paste your three values, click Test connection. You should see a green dot. Save.
The toolbar icon's corner dot shows live connection state — green when good, red when down, amber ! when unconfigured.
The extension never holds an API key. Instead it talks to a proxy server you configure that holds your OpenAI Codex OAuth token and your Supermemory API key, and forwards inference + storage requests on your behalf.
There are two ways to get a proxy:
- Use someone else's. If somebody you trust is running a Thilko-compatible proxy, ask them for an install link. Paste it into Options and the extension configures itself. Your data is scoped to your own slot.
- Run your own. The proxy is a separate concern from the extension. The wire contract is documented in
docs/proxy-contract.md; a public open-source proxy implementation is planned for v0.2. In the meantime, anyone can build a compatible proxy in any language against the contract (reference implementation is ~400 lines of TypeScript).
Why this separation: the proxy concerns (Codex OAuth, Supermemory schema, rate-limiting, eventually-consistent caching) are independent from the browser extension and have a different deploy story. Keeping them in separate repos prevents either from constraining the other.
See PRIVACY.md. One-line summary: the extension sends the text you highlight, the comments you write, and your AI conversations to a proxy you configure, which sends them to OpenAI's Codex API and to Supermemory. Nothing else.
npm install
npm run typecheck # TypeScript strict
npm test # vitest
npm run build # production bundle to dist/For watch mode during development:
npm run build -- --watchThe build uses @crxjs/vite-plugin to assemble the MV3 manifest + content scripts + background worker + asset pipeline.
See CONTRIBUTING.md for the dev loop and code conventions.
- HTML + PDF highlighting and re-anchoring
- Per-highlight popover with comments and streaming AI threads
- Side library with semantic search
- "Open with Claude" handoff
- Lazy persistence (highlights only saved with content)
- Local telemetry ring buffer
- Reset-all-data
- v0.2 — Open-source the reference proxy (extracted into its own repo)
- Hosted backend so users don't need to deploy a proxy
- Multi-user sign-in (OAuth)
- Cross-device sync of UI preferences
- Other browsers (Firefox via MV3, Safari)
MIT. See LICENSE.
Built by a small group of people who wanted a better way to read on the web.
