DEV Community

David Christian Liedle
David Christian Liedle

Posted on

Chrome Extension: Aftermark

Every bookmark you've ever saved was a moment where past-you thought "I should come back to this." You never did. I built a Chrome extension to fix that.

I have 8,383 bookmarks. I know this because I counted them — or rather, Aftermark counted them for me.

Most bookmark managers want to help you organize links. That's not the problem. The problem is that bookmarks aren't links. They're compressed intentions. Every time you hit Ctrl+D, you were in the middle of something — researching a purchase, learning a framework, comparing options, saving evidence for a decision you hadn't made yet. The bookmark captured the URL but lost the why.
Six months later, you open your bookmarks folder and see 3,000 links with no context. You feel guilty. You close the folder. The intentions stay buried.

What Aftermark does
Aftermark is a Chrome extension that treats your bookmarks as breadcrumbs, not passive links. It imports your entire bookmark library into a local IndexedDB database and immediately starts analyzing — no AI, no cloud, no API key required.
Here's what it does out of the box:

  • Classifies every bookmark into 17 content types — GitHub repos, articles, videos, documentation, shopping, academic papers, real estate, news, and more. It uses URL pattern matching and domain mappings, not machine learning.
  • Detects duplicates two ways — exact matches through smart URL normalization (strips www, protocol, trailing slashes, sorts query parameters), and fuzzy near-duplicates using word-token similarity within the same domain.
  • Scores every bookmark's health from 0 to 100 — factoring in age, whether you've ever revisited it, dead link status, duplicate status, and whether it could be classified. A bookmark you saved 3 years ago, never revisited, and can't be reached anymore scores very differently from one you saved last week.
  • Clusters your saves into browsing sessions — by walking your bookmarks chronologically and grouping saves that happened within 30-minute windows. Suddenly you can see: "Oh, that Tuesday night I was researching standing desks for two hours."
  • Gives you a bookmark personality — Developer, Researcher, Explorer, Shopper, or Generalist, based on what you actually save. The full tab UI has seven views: Dashboard, All Bookmarks, Clusters, Sessions, Review, Timeline, and Insights. You can search, filter, sort, save filter combinations, and export clusters as markdown reading lists or HTML bookmark files.

How I built it

My workflow is unusual: I use Claude Desktop for architecture and thinking, Claude Code for execution, and I orchestrate between the two. I call it "prompt then race" — I write a detailed milestone prompt, hand it to Claude Code, and go race GT7 on my PS5 while the code gets built. When I come back, the milestone is done and I review it.

Aftermark went from idea to Chrome Web Store in about 48 hours:
Day 1 — I was talking with Claude Desktop about a Chrome extension idea. We started with the thesis: a bookmark is a compressed intention, not a passive link. We brainstormed names. ChatGPT and I landed on "Aftermark" — what comes after you mark something. Claude Desktop helped me write the scaffold prompt, and Claude Code built Milestone 1 in under 15 minutes: full bookmark import, IndexedDB storage, basic popup showing 8,383 bookmarks indexed.
The popup initially said "Loading..." and nothing else. Classic MV3 service worker messaging bug — the popup was sending a message before the service worker had the count ready. We debugged it by checking both the popup console and the service worker console separately. Once we found the file path mismatch in the esbuild output, it was a one-line fix.

Milestone 2 added the local analysis layer — content type classification, duplicate detection, health scoring, and deterministic clustering. No AI calls, just heuristics. This is where the thesis proved itself: you don't need AI to make bookmarks useful. Pattern matching and timestamps get you 80% of the way there.
Milestone 3 was the full tab UI — seven views, dark theme, favicons, search, filters, saved filter combinations, bulk actions, export. Claude Code built each view from a detailed spec.
The architecture stayed clean throughout because we designed it in three layers from the start: capture/index (local, deterministic), inference (AI, selective, future), and action (user-facing). The LLM is never the source of truth. Local code owns structure, AI provides interpretation, the user provides correction.

The tech
Chrome MV3, TypeScript, IndexedDB via the idb library, esbuild for bundling. No frameworks. Zero external services. The entire extension runs locally in your browser.

I chose TypeScript over JavaScript for the type safety during rapid iteration. I chose IndexedDB over chrome.storage because I needed to store and query 8,000+ records efficiently. I chose esbuild because webpack is overkill for an extension this focused.

The privacy model is simple: your bookmarks never leave your machine. No telemetry, no backend, no account required. Future AI features will use bring-your-own-key — your API key stays in chrome.storage.local and goes directly to the provider you chose.

What I learned
Ship before the AI layer. The biggest risk with any "AI-powered" tool is that it's useless without the AI. Aftermark is genuinely useful at v0.3.0 with zero inference calls. The health scores, duplicate detection, session reconstruction, and personality analysis all run on pure heuristics. When AI enrichment comes in Milestone 4, it will add depth to a tool that already works — not rescue a tool that doesn't.

The prompt is the product decision. In the Claude Desktop + Claude Code workflow, the quality of the output depends entirely on the quality of the prompt. A vague prompt produces vague code. A prompt that specifies the data model, the UI behavior, the edge cases, and the architecture constraints produces code that works on the first try. Writing prompts is product management.

Bookmarks are personal archaeology. The most surprising thing Aftermark showed me was browsing sessions I'd completely forgotten. Three hours of real estate research on a Tuesday. A weekend deep-dive into Rust TUI frameworks. A shopping comparison session for standing desks that I never finished. These weren't just links — they were snapshots of who I was at specific moments. The tool I built to organize bookmarks accidentally became a tool for self-reflection.

Try it
Aftermark is free, open source (MIT), and in the Chrome Web Store right now:

Chrome Web Store
Product Hunt
View the source on GitHub

Your bookmarks are breadcrumbs. Aftermark helps you follow the trail.

Top comments (0)