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/htmlfor title and body extraction - Interactive search:
charmbracelet/bubbleteawithsahilm/fuzzyfor abm searchTUI - CLI scaffolding:
spf13/cobrawith auto-generated shell completions for bash, zsh, fish
Scope for v1
bm add <url> [tag...]— fetch title and excerpt in the background, store in SQLitebm search <query>— FTS5 query ranked by relevance, results printed to stdoutbm open <id>— open URL in the default browser viaxdg-openoropenbm rm <id>— delete a bookmarkbm tag <id> <tag...>— add or replace tags on an existing entry- Config file at
~/.config/bm/config.tomlfor 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.