Curo — Local-First Bookmark Manager
A local-first bookmark manager that imports your browser's bookmarks, merges duplicates and dead links, and organizes what's left into a searchable library with its own health score — no account, no server.
Context
Bookmarks accumulate for years across every browser a person has used, and most managers only ever add to that pile — they don't audit it. Curo set out to treat an unmanaged bookmarks bar as a data-quality problem: duplicates, dead folders and links nobody will ever find again, entirely inside the browser with no account and no server.
The Challenge
The product needed to take a raw HTML bookmarks export from any browser and turn it into something a person could trust — deduplicated, organized and scored — without ever sending that browsing history anywhere, which ruled out any server-side processing or account system.
Research
Looked at how existing bookmark managers handle duplicates and found most only catch exact-URL matches — near-duplicates, like the same article with different tracking params, went untouched, which is why fuzzy grouping became the core of the product rather than a secondary feature.
Insights
The key findings that shaped the direction.
A pile of bookmarks isn't a library — it's an unaudited data set
Users didn't need another place to save links; they needed something to tell them what was wrong with the links they'd already saved, which reframed the product from a save-tool to an audit-tool.
Exact-match duplicate detection catches maybe half the problem
Near-duplicates — the same article with different query params, or both the AMP and canonical URL bookmarked — needed fuzzy title and URL matching to actually surface, not just exact comparisons.
A single health score is what makes 'good enough' visible
Nobody was going to manually audit two thousand bookmarks; a configurable, weighted score across duplicates, organization, tags and freshness gave people a number to chase instead of an infinite backlog.
Design Strategy
How decisions were made.
Start from an import, not an empty state
Built the first-run experience around dragging in an existing HTML bookmarks export, with a live preview of what will be added, so the product proves its value against a person's real, messy library on the first screen.
Separate detection from resolution
Split duplicate handling into a detection pass — exact-URL and fuzzy-title grouping — and a resolution step, so bulk cleanup never silently merges or deletes anything without an explicit choice.
Make the score explain itself
Broke the Knowledge Health Score into five weighted, individually adjustable factors — duplicate-free, organized, tagged, well-labeled, fresh — each with its own explanation of what's dragging it down.
Treat local storage as the entire architecture
Designed every interaction — search, tagging, collections, export — around IndexedDB as the only datastore, which meant designing for what happens when a user clears their browser data, not just the happy path.
Build solo, with AI as the engineering partner
Designed and built end-to-end using Claude Code as a development partner — from the import pipeline to the scoring engine — without a dedicated engineering team, while keeping every architectural and UX decision in my hands.
Solution
A local-first bookmark manager that imports any browser's bookmarks export, detects exact and fuzzy duplicates, flags organizational gaps, and scores the whole library on a configurable Knowledge Health Score — entirely client-side.
A look at the work.

The live product at getcuro.vercel.app.

The Dashboard — bookmark growth over time alongside the Knowledge Health Score.

The Health view — five weighted factors, each adjustable and individually explained.
Design System Thinking
This project wasn't designed as a one-off — here's how it connects back to the system.
Components
A reusable score-bar component (metric, weight, explanation) shared between the Dashboard summary and the full Health report.
Tokens
A single accent-driven progress scale used consistently across health scores, duplicate groups and growth charts.
Patterns
A detect-then-resolve pattern — grouped candidates with a clear default selection — reused across Duplicates and Cleanup.
Governance
Fully client-side storage in IndexedDB — bookmarks and browsing history never leave the device, by architecture rather than policy.
Impact
Curo shipped as a genuinely free, account-less alternative to bookmark managers that ask for an email address before doing anything — turning an unmanaged bookmarks bar into a searchable, self-scoring library without a single byte leaving the browser.
Reflection
The hardest design problem wasn't the interface — it was deciding what 'good' looks like for a library nobody had audited before. The five-factor health score took several iterations before it stopped feeling arbitrary and started feeling like something a person would trust enough to act on.