Imports every bookmark, sorts it, and makes it searchable.
Every bookmark is a node. Tags ring the middle, categories sit inside, and the lines between them are the tags each post actually carries.
Point at a node to see what it is; click to read it in full and see what else it connects to.
- Every bookmark imported. No X API, no password. Booked drives a dedicated Chrome profile you sign into yourself.
- Sorted automatically. Each post gets a headline, a category, and a few shared tags.
- Search that understands meaning.
caféfinds the corgi cafe thread,32findsesp32. Searching something you never saved returns nothing, on purpose. - A knowledge graph. Categories, topics, and posts, with the edges between them.
- Ask your library. Answers come only from what you saved, with citations that open the post.
| Node.js 22.13+ | uses node:sqlite and runs TypeScript directly |
| Google Chrome | Booked opens its own profile; your normal browsing is untouched |
| Claude Code or Codex CLI | installed and signed in. This does the sorting and the answering |
| An X account | you sign in during setup |
git clone https://github.com/Entrepenulian/Booked.git
cd booked
npm install
npm run devOpen localhost:4177. That starts two processes: the interface on 4177 and a local agent on 4179 that does the work a browser can't.
Paste this into any coding agent, from the directory where you want Booked installed.
Set up Booked, a local-first app that turns my X bookmarks into a searchable
knowledge graph. Repo: https://github.com/Entrepenulian/Booked
Do this in order, and stop and tell me if a check fails rather than working
around it:
1. Check prerequisites and report what is missing before changing anything:
- `node --version` must be 22.13 or newer. It uses `node:sqlite` and runs
TypeScript with no build step, so older versions fail at runtime, not at
install.
- Google Chrome must be installed. Booked drives its own Chrome profile to
read my bookmarks.
- Either `claude` or `codex` must be on PATH and already signed in. This is
what sorts the bookmarks and answers questions. Without one, the app
installs fine and then silently does nothing.
2. Clone into the current directory and install:
`git clone https://github.com/Entrepenulian/Booked.git && cd booked && npm install`
3. Start it with `npm run dev`. This runs two processes: the interface on port
4177 and a local agent on 4179. Both must stay running.
4. Verify before telling me it works:
- `curl -s http://127.0.0.1:4179/health` returns JSON with `"ok":true`
- `curl -s -o /dev/null -w "%{http_code}" http://localhost:4177` returns 200
If either fails, show me the output rather than guessing.
5. Tell me to open http://localhost:4177 and walk the four setup steps. A
Chrome window opens for me to sign in to X — you cannot do that part.
Notes:
- Everything is stored in `~/.booked`. Nothing is uploaded to any server.
- Sorting my bookmarks calls the CLI from step 1, so it uses my own plan.
- Do not add dependencies, change ports, or edit files. This is an install.Four steps, about a minute for a few hundred bookmarks.
- Connect. Booked opens a Chrome window. Sign in to X there.
- Confirm your account. It detects who you're signed in as.
- Pick an engine. Claude Code or Codex. Importing runs while you choose.
- You're in. The library opens once the first batch is sorted; the rest fills in behind you.
Timing. Import moves about 20 bookmarks per second. Sorting runs four model calls at a time, roughly 30 seconds per 20 bookmarks, in the background. The rail footer shows Sorting 40 of 74 while you use the app.
Usage. Sorting runs through your own CLI, so it uses the plan you already have there: a handful of short prompts per bookmark, once, never again for that bookmark. Pick the model in Settings.
Booked ships an MCP server, so any agent that speaks the protocol — Claude Code, Codex, or your own — can read your library as native tools. Booked has to be running; the tools talk to the same local agent the app does.
claude mcp add booked -- node agent/mcp.tsFor any other client, it's a standard stdio MCP server. Use an absolute path — a client that launches from its own directory can't find a relative one:
{
"mcpServers": {
"booked": {
"command": "node",
"args": ["/absolute/path/to/booked/agent/mcp.ts"]
}
}
}| Tool | What it does |
|---|---|
search_bookmarks |
keyword + meaning search. Instant, local, free |
browse_bookmarks |
filter by category, tag or type with no search term — "what did I save recently" |
get_bookmark |
one post in full, with author, tags, media and its link |
ask_bookmarks |
a synthesised answer with citations. Runs your CLI, so it costs and takes seconds |
library_overview |
counts, categories, top tags, content types |
Then: "what did I save about hardware recently?" or "find me things to do in San Francisco from my bookmarks."
Prefer search_bookmarks — it answers most questions without a model call. ask_bookmarks is for questions that need reading across several posts.
Never leaves: your bookmarks and everything built from them, including the database, search index, and graph. Embeddings are computed locally. There is no Booked server to send anything to.
Sent to your model provider: sorting a bookmark, or asking a question about one, sends that post's text through the CLI you chose, like any prompt you type into it. Nothing else.
X bookmarks ──▶ local import ──▶ sorted + tagged ──▶ search · graph · chat
Chrome + CDP your CLI all local
The interface runs in workerd, which can't spawn processes or touch a disk. The real work lives in a small Node agent: SQLite with FTS5 for keyword search, a local embedding model for meaning, and your CLI for judgement.
Booked is a V1. It reads X through the signed-in web experience, so expect maintenance when X changes.
Everything lives in ~/.booked. Delete that directory and it's gone.

