the time everyone afterwards spends discovering it was made
The argument for writing the decision down, not for deciding faster.
architecture-notes.dev · 2 days ago
Highlight any page on the web, write down why it mattered, and find it again by searching the words you wrote. Everything lands in one SQLite file on your own machine, shared by Arc, Brave, Chrome and Edge.
macOS · Chromium browser · Node 24+
Freehold
412 highlights · 96 pages
the time everyone afterwards spends discovering it was made
The argument for writing the decision down, not for deciding faster.
architecture-notes.dev · 2 days ago
a green suite nobody has tried to break is a green suite nobody should trust
Counter to the 100% coverage argument. Use in the RFC.
testing-weekly.com · 5 days ago
private to that application, which is a feature right up until you install a second one
Exactly the problem this solves. Good framing to steal.
local-first.org · last week
How it is built
Everything lands in a single SQLite database in your Application Support folder. Not browser storage, so every Chromium browser on the machine reads the same library, and clearing browsing data does not touch it.
There is no account, no server and no telemetry. The extension asks only for the permissions it needs and makes no network request of its own. The only outbound links are the bug and feature links you click yourself.
Apache-2.0, and the database is a plain SQLite file you can open with any client. Export writes JSON to your Downloads folder; import merges it back and never overwrites what is already there.
Search
The index covers both the highlighted text and the note you wrote, ranked so the closest match comes first. The last word you type is treated as a prefix, so the list narrows while you are still typing. Filter it down by colour, by site, or by tag.
2 matches, best first.
a green suite nobody has tried to break is a green suite nobody should trust
testing-weekly.com · 5 days ago
coverage counts lines, not the question you forgot to ask
architecture-notes.dev · 3 weeks ago
Name your colours
Call yellow “use in the Q3 RFC”, and the name shows on the toolbar as you pick, on the filters, and on every entry. Up to 40 characters each. Leave one alone and it keeps its default. This sits alongside tags, it does not replace them.
What each colour means
Read later
Save a page without highlighting anything and write down why you want to come back. It gets a due date seven days out unless you pick another one, and the library will sort your pages by what is due next.
Pages
sorted by due
An Unhurried Look at SQLite’s WAL
Need this before the storage review.
sqlite-notes.dev · due in 2 days
Text anchoring without a server
Compare with how we re-anchor after edits.
local-first.org · due in 7 days
The page you are on
The popup lists what you marked on this page, tells you when a highlight no longer matches the page text, and exports just this page if that is all you want.
Freehold
Library3 highlights on this page.
the time everyone afterwards spends discovering it was made
a green suite nobody has tried to break is a green suite nobody should trust
Why not just
Install
Freehold is on the Chrome Web Store, so the extension itself is a click. Your library is not kept in the browser though, and the store cannot install the small local program that owns it — so there is a second step, and it is the one that makes the extension do anything.
One listing covers Arc, Brave, Chrome and Edge. Add it in each browser you read in — they all end up reading the same library, so nothing is duplicated by doing so.
The installer copies the host into ~/Library/Application Support/Freehold, writes one small JSON manifest into each browser profile it finds, and touches nothing else. It takes no extension ids — they are built in. Restart the browser afterwards.
./scripts/dev-install.sh --productionThat second step needs a checkout, and the repository is not public yet — so today the host is only installable if you already have the source. Without it the extension installs, opens, and answers native host unavailable on every action.
Questions
No. The database is local by design. Syncing would mean running a server, which is a different product with a different promise.
Nothing happens to your highlights. The database sits outside every browser profile, so removing the extension does not touch it — put the extension back and your library is still there.
No. The installer and the host both write to ~/Library/Application Support, which is a macOS path, so Chrome on Windows will install the extension and then find no host to talk to. macOS is the only supported system today.
Not yet. Both need different packaging — Safari in particular has to be wrapped in an Xcode project and signed.
One SQLite file at ~/Library/Application Support/Freehold/freehold.db, with abackups folder beside it. Open it with any SQLite client. Point somewhere else by setting FREEHOLD_DB.
Export writes JSON to your Downloads folder, streamed straight from the database so memory stays flat no matter how large the library is. Import merges a file back in and never overwrites: a highlight whose id is already there is skipped, and tags are added rather than replaced.
Both, and they are separate. Colours are the four you pick while highlighting, each renameable. Tags are free text, up to 24 on a highlight, and a tag nobody uses any more is cleaned up on its own. You can filter by either.
Apache-2.0.
Usually nothing, because a highlight is anchored to the words around it. If the text is deleted or rewritten past recognition the highlight orphans: it stays in your library, stops painting on the page, and the popup tells you.
Only where you highlighted. Each one wraps that text in a freehold-mark element that inherits the page’s own font and colour. Nothing else on the page is touched, and nothing is injected on pages you have never marked.
macOS · Chromium browser · Node 24+
Freehold
A web highlighter that keeps your notes in one SQLite file on your own machine, shared across every Chromium browser you use.
Newsreader and IBM Plex under the SIL Open Font License 1.1