ideas.
June 26, 2026 2 min read clisolo-devproductivity

Local bookmark manager with full-text search

A single-binary CLI tool that stores bookmarks in SQLite with auto-fetched excerpts and runs instant full-text search across thousands of saved URLs — no browser, no account, no cloud.

The idea

A minimal command-line tool that stores bookmarks in a local SQLite database, automatically fetching the page title and a text excerpt at save time. A single bm search <query> command runs full-text search across titles, excerpts, and tags in under a millisecond — no browser, no web UI, no account required. You add a URL in one keystroke and find it again in one more.

Why build this

Browser bookmark managers are a mess: buried in menus, unsearchable by content, tied to a sync account, and silently broken by browser updates. Commercial options like Raindrop and Pocket require subscriptions and send every URL to a third-party server. Developers who live in the terminal want something that behaves like grep rather than a GUI app. SQLite's FTS5 extension makes full-text search across tens of thousands of bookmarks instantaneous with no index-rebuild step required; the entire database is a single file you can back up with cp.

Stack sketch

  • Language: Go — produces a single static binary with no runtime dependency
  • Storage: SQLite with FTS5 via mattn/go-sqlite3
  • HTTP fetch: net/http + golang.org/x/net/html for title and body extraction
  • Interactive search: charmbracelet/bubbletea with sahilm/fuzzy for a bm search TUI
  • CLI scaffolding: spf13/cobra with auto-generated shell completions for bash, zsh, fish

Scope for v1

  • bm add <url> [tag...] — fetch title and excerpt in the background, store in SQLite
  • bm search <query> — FTS5 query ranked by relevance, results printed to stdout
  • bm open <id> — open URL in the default browser via xdg-open or open
  • bm rm <id> — delete a bookmark
  • bm tag <id> <tag...> — add or replace tags on an existing entry
  • Config file at ~/.config/bm/config.toml for a custom database path
  • No sync, no web UI, no accounts in scope

Where it could go

The most natural next step is bm export producing a Netscape bookmark HTML file, making it importable into any browser. That single addition turns the tool from a standalone utility into a bridge between terminal and browser workflows — you curate in the terminal, import to Firefox or Chrome when needed.

A companion bm serve subcommand could expose FTS over a local HTTP API, letting browser extensions or n8n workflows query your personal bookmark index without any changes to the schema. The SQLite file is already a complete artifact; a read-only HTTP wrapper around it is a weekend's work.

Watch out for

Some sites block headless HTTP fetches with 403s or require JavaScript rendering, so the excerpt will occasionally be empty. Treat a missing excerpt as a non-fatal condition and fall back to storing just the URL and title with a manual note — don't let fetch failures prevent the bookmark from being saved.