Quickstart

Nothing installed, to a search page open in your browser. Five steps, every command copy-pasteable, and a picture of what you should be looking at when it works. No prior knowledge of embeddings, vectors or retrieval is assumed — and nothing here needs any.

01Install it

You need Python 3.10 or newer, on Windows, macOS or Linux. Check with python --version; if that prints 3.9 or an error, install Python first from python.org.

shell
pip install facetmark

That is the whole install. There is no separate server to run, no database to create, no account to make. Confirm it landed:

shell
facetmark --version
If the shell says “command not found”

pip installed it somewhere that is not on your PATH. python -m facetmark --version works regardless, and every command on this page can be written that way.

02Bring your bookmarks in

On Chrome, Edge, Brave, Vivaldi, Chromium or Opera you do not have to export anything. Close the browser first — it holds the file open — then:

shell
facetmark import

It finds the profile, reads the bookmarks file and prints how many it took. Firefox and Safari are not in that family, so those two need a one-off export to HTML first (how to do that) and then the path:

shell
facetmark import ~/Downloads/bookmarks.html
This never writes to your browser

Import is a one-way read: open the file, read it, close it. Nothing in facetmark writes to a browser profile, and nothing you do here can change or delete a bookmark you have.

03Point it at a model — or skip this

Searching “by meaning” needs something that turns text into numbers. You have three ways to get one, and the third is to do without.

A hosted API

Any OpenAI-compatible endpoint. Put this in ~/.facetmark/.env — the file is created for you on first run:

dotenv
FACETMARK_API_BASE=https://api.openai.com/v1
FACETMARK_API_KEY=sk-your-key
The single most common setup mistake

The base URL must end in /v1. Without it every model call returns 404, and the error surfaces as a provider error, so it reads like a bad key.

A model on your own machine

No key, nothing leaves the machine except the page fetches themselves:

dotenv
FACETMARK_EMBED_BACKEND=local

This downloads a small sentence-transformers model the first time it runs.

Neither

Skip this step entirely and you still get keyword search over titles, folders and addresses, plus the session graph — which of your bookmarks were saved in the same sitting. You lose search by meaning. You can add a model later and re-run the next step; nothing has to be redone.

04Build the index

This is the slow step, and the only slow step. It fetches each page, extracts the text, summarises it if you configured a chat model, embeds it, and works out which bookmarks were saved together.

shell
facetmark index

Wall time is dominated by fetching, not by models: facetmark honours robots.txt and rate-limits itself per site on purpose. A few thousand bookmarks is a coffee, not a second. In a hurry, or just want to see it work:

shell
facetmark index --no-fetch

That indexes titles only and finishes in seconds. Run facetmark index properly later — it is idempotent, so it picks up exactly the work that is still missing and skips everything already done.

You can stop it and start it again

Progress is written as it goes. Interrupting with Ctrl+C loses at most the page in flight, and re-running continues rather than restarting.

05Open the page

shell
facetmark serve

It prints the address. Open the second line in a browser:

shell
facetmark 1.6.1  http://127.0.0.1:8787
open the search page:     http://127.0.0.1:8787/app

That is the whole interface. Type a question the way you would say it out loud — you do not have to remember the title, and you do not have to get the words right.

the facetmark search page with a query typed and ranked results below itthe same search page in dark mode
What you should see. Results appear as you type, starting with a plain keyword match that costs nothing, then re-ranked once the model answers. This frame follows the theme of the page you are reading.

The second view answers the question everybody has at this point — did that actually work? Click Library in the header.

the facetmark library view listing bookmark, vector, session and edge countsthe same library view in dark mode
Library. If Content vectors is zero, search by meaning is not on yet: either no model is configured, or facetmark index has not finished. If Bookmarks is zero, the import did not land.
Leave it running

facetmark serve is a foreground process; the page only works while it is up. It binds 127.0.0.1, which means your machine and nothing else on the network. The browser extension, the API and MCP clients all talk to this same process — see the guide.

06Read a result

Each row says why it is there. Hovering a marker explains it in the page; this is the same thing in one table.

On the rowMeans
aboutThe page’s own text matched — by meaning, not by keyword. This is the one that finds a page whose words you do not remember.
wordsA whole word in the title, folder or address matched.
substringPart of a word matched, which is what makes half-typed and Chinese queries work.
asked asA question this page was saved to answer matched.
coldSaved long ago, never opened, and something newer looks like it replaced it. Pushed down the list, never deleted.

Below the ranked list there is sometimes a second, separate group headed saved around these. Those are not answers to your query — they are pages you saved in the same sitting as something above, which is often how you actually remember where a page was. They are kept apart on purpose and never mixed into the ranking.

Load more at the bottom fetches the next page of the same ranking rather than searching again, so the order you have already read cannot shuffle underneath you. The counter above the list says which slice you are looking at.

07When it goes wrong

The page says it needs a token

You are not reaching it over 127.0.0.1 — a LAN address, a hostname or a reverse proxy all look the same to the check. Run facetmark token, paste the value into the field once, and the browser remembers it. Why that check exists.

The page will not load at all

facetmark serve has to still be running in a terminal. If it exited with address already in use, something else has 8787: run facetmark serve --port 8788 and open that port instead.

Search finds nothing, or only exact words

Open Library. Content vectors at zero means search by meaning is not on: no model configured, or facetmark index has not run to completion. A non-empty fetch queue means indexing is still working through your library and results will keep improving.

Every model call returns 404

The base URL is missing /v1. This is the most common failure by a wide margin.

Where is my data?

One folder: ~/.facetmark on macOS and Linux, %USERPROFILE%\.facetmark on Windows. Inside it is a single SQLite file plus the pairing token. Move it, back it up, or copy it to another machine — it is the whole state. FACETMARK_DATA_DIR puts it somewhere else.

How do I delete everything?

Delete that folder. There is no uninstall step and nothing outside it — no registry keys, no browser changes, no account anywhere. pip uninstall facetmark removes the program.

Something else

facetmark stats prints what the index actually contains, which resolves most confusion, and the guide has a longer troubleshooting list. Beyond that, open an issue.