Mac app · 2026
6 min read
PlayableThird Street Bookmarks: everything you save, in one library
X, Hacker News, YouTube, Instagram and any loose link, gathered into one categorised library you can search, read, chat with and listen to. The AI runs on the coding CLI you already have: no API key, no upload, no account.
v1.2.0 · DMG · Apple Silicon · macOS 11+ · needs Node.js 20+ · MIT
I bookmark in five places and read in none of them. A thread on X, a story on Hacker News, a playlist on YouTube, a saved post on Instagram, a link pasted into a note to myself. Each app keeps its own pile, none of them can search the others, and every pile is designed to be added to rather than read.
Third Street Bookmarks is the idea that a bookmark is a promise to come back, and the product is whatever makes you keep it. So it gathers every source into one library on your Mac, sorts it into categories, and gives you ways back in that are not scrolling: search, a chat that cites what it found, stats about your own saving habits, and an audio digest you can listen to on a walk.

How it works
Five ways in, one library, four ways back out. The dots are bookmarks moving through the app; pick any part of the chart to light its path and read what happens there.
Pick any part to see what happens there
~/.tsb
Everything lands in one folder on your Mac: a file per source and a SQLite database for read state, favourites, labels and notes. Ids are namespaced by source, so tweet 12345 and Hacker News item 12345 can never share a read state. Every bookmark is given a category here.
The library in the middle is the whole design. Every source lands in the same folder on your Mac, keyed by a namespaced id, so a tweet and a Hacker News story that happen to share the number 12345 can never share a read state. Everything on the right reads from that one place, which is why search, chat and the podcast all see every source at once.
Stage by stage
A native shell around a small local server, with the AI borrowed from tools you already pay for. Pick a stage.
Sources
X arrives through a Field Theory sync. Hacker News is browsed live and only saved when you press Save, so the front page does not flood the library. YouTube takes a pasted video, a public playlist, or a Google Takeout export; Instagram takes its official export. Any other link is pasted.

The idea underneath it
The AI part was the easy decision to get wrong. The obvious build asks for an API key and sends your library to a model. Mine assumes you already have a coding agent on your machine, because more and more people do, and uses it as the model runtime. That removes the key, the bill and the upload in one move.
It also means the app hands an agent text written by strangers, so the server is treated as an authenticated service that happens to be on localhost:
- Bound to 127.0.0.1
- Nobody on your Wi-Fi can read the collection.
- Per-launch bearer token
- Other local processes and any website you visit cannot call it. The token is generated in Rust and never touches disk.
- Origin and Host checks
- DNS rebinding and cross-site reads are refused.
- Read-only agents
- Bash, Write, Edit and WebFetch are denied. A prompt injection in a saved tweet has nothing to run.
- Search, never fetch
- A search goes to a search provider. A fetch goes to a URL the attacker chose. Only one is allowed.
Categorising taught me the other lesson. Asked cold to pick among 34 categories, the local model did worse than keyword rules. Trained on the labels my bookmarks already had, its encoder came within two points of Codex at a tenth of the time, offline, and it keeps retraining as more labels pile up. Switch the chart between the two measures:
Categorising engines
Agreement with existing labels, 300 held-out bookmarks.
Python
keyword rules, offline
24%Laya
trained on your labels, offline
40%Codex
your local CLI
42%
Laya lands within two points of Codex at a tenth of the time, offline. The labels it is scored against are themselves noisy, so read agreement as “matches what you had”, not accuracy.
Your own history is the dataset, and it is the same move I want to make in Menlo.

Where it goes next
- A proper agent harness. Persistent sessions per chat thread, timeouts, a working Stop button, and an agent pool so classifying 500 bookmarks runs in parallel.
- Providers as data. Claude Code, Codex, Goose and open-weight models as rows in a table rather than branches in the code.
- Drop Node. Port the server to Rust so the app is a single binary with no runtime to install.
Get it
Third Street Bookmarks is free and MIT licensed. The download above is the Apple
Silicon build. It needs Node.js 20 or later installed (brew install node), and
because it is unsigned, clear the quarantine flag once after dragging it into
Applications:
xattr -cr "/Applications/Third Street Bookmarks.app"Press Skip setup on first run to explore the bundled sample collection before you connect anything real.
The source, the full security model and the install guide are on my GitHub at github.com/mayanksagar26/third-street-bookmarks-macapp. There is also a browser build that opens the same library, and the rest of what I build in the open is at github.com/mayanksagar26.
It stands on Field Theory by Andrew Farah for X sync, and Laya by Nandakishor M for the local categoriser.