Surfacing, not searching
Open a note. See what your brain would recall now.
A thousand notes, and you recall maybe forty. The rest are dormant, not gone. Weft is a folder of plain .html files you own. Open any note and it surfaces what connects to it: backlinks, semantic neighbors, co-accessed notes, this day in past years. No search bar. The connection finds you. It runs where you do — desktop, browser, terminal, and now your phone.
How surfacing works
Search makes you name what you want first; recall doesn't. Open any note and a brain panel shows the notes your memory would reach for. Ranking uses an ACT-R-style activation model: base-level activation from recency and frequency, so notes decay like memory, plus spreading activation across your links.
Backlinks
Parsed from <a href> on every save. See what points here without maintaining anything by hand.
Semantic neighbors
Notes about the same thing, even with no shared link. Built from local embeddings.
Recently co-accessed
The notes you tend to open alongside this one resurface together.
This day in past years
What you wrote on this date before, surfaced when it is relevant again.
An explain toggle shows why each note surfaced, and a tuning page lets you adjust the weights. The same connections render as a graph: nodes colored by folder, sized by activation, drawn with backlink edges and fainter semantic-similarity edges. Dormant notes rank lower but are never removed. Full-text search (SQLite FTS5) is there as a fallback, not the front door.
make build-ort, which swaps in a local CPU model (all-MiniLM-L6-v2, 384-dim) via ONNX. Local, no API.Own your files. Sync without trusting anyone.
HTML is the canonical format — never a markdown intermediate. Notes are publishable as-is, and clipping a web page is essentially a copy. The index (SQLite, FTS5, embeddings, backlinks) is derived and rebuilt on each device; it is never synced.
Plain HTML on disk
A folder you own, sub-folders allowed. Delete Weft tomorrow and every note still opens in any browser.
No accounts, no server
There is no Weft account and no hosted Weft server. One Go binary, a local daemon at localhost:7777. tryweft.app is a static site that never sees a vault or a key.
Bring your own cloud
Optional sync runs through object storage you own: Cloudflare R2, AWS S3, Backblaze B2, Google Cloud Storage, MinIO, or any S3-compatible bucket.
End-to-end encrypted
One vault key, generated on your device and never uploaded. Blobs and manifests sealed with XChaCha20-Poly1305.
.trash folder, not gone.Add a second device without retyping a passphrase: weft sync pair prints a code, weft sync pair-approve confirms it, and both screens show an 8-digit code you compare to defeat a man-in-the-middle. Lose every device and a 24-word recovery phrase rebuilds the vault. How sync works.
One daemon, many surfaces
On the desktop, every surface is a thin client over the same local Go daemon at localhost:7777, so there is one source of truth. The phone is the exception: it carries the engine with it.
Native macOS app
A SwiftUI menu-bar app and window: reader, quick capture, in-app editing, the graph in the main window, and trash. Ambient surfacing is pushed live from the daemon over SSE — related notes arrive without your asking. A Set up this Mac panel installs the CLI, runs the daemon as a launchd agent that starts at login, adds the Chrome extension and MCP server, and wires the vault into Claude as memory. Signed local build.
iPhone app
A full offline sync peer: it embeds the Go engine, holds its own vault and index, and syncs end-to-end encrypted straight to your bucket with no daemon to run. Read, capture, surface, search, edit, and trash on-device, with native Apple NLEmbedding for semantic neighbors. Capture from the share sheet, lock- and home-screen widgets, a Siri shortcut, or a weft:// link. Installed via Xcode or TestFlight — not the App Store.
Graph view
The vault as a map: nodes colored by folder cluster and sized by activation, with backlink edges and faint semantic-similarity edges from local embeddings. A legend, a minimap, hover-to-highlight a note's neighborhood, and tag and min-link filters. On desktop in the web app, and inside the macOS window.
MCP for Claude Code
weft mcp <vault> exposes the vault over stdio. Claude Code and other MCP clients can list, read, search, surface, and write notes directly. Set up MCP.
Desktop web app
Runs anywhere the daemon does. Vault browser, reader, a TipTap editor with [[wikilinks]], a / slash-command menu, a selection toolbar, daily notes, the brain panel, and the graph.
Browser extension
Chrome and Firefox (MV3): a web clipper with Readability article extraction, right-click clip-selection, a quick-capture overlay, and the brain-panel sidebar. Talks only to localhost:7777 — no third party.
CLI
Capture, clip, import, serve, run the MCP server, and sync from the terminal where you already live.
# append a thought to today's daily note
weft capture "the weft is the thread woven through the warp"
# clip a page into the vault
weft clip https://example.com/article
# pull in your old notes
weft import markdown ~/old-notes
# let Claude Code work in your vault
weft mcp ~/notes weft import brings in markdown, a Notion export, a bookmarks HTML export, or Apple Notes.
Install in one line
Prebuilt pure-Go binaries for macOS, Linux, and Windows (arm64 + amd64). No runtime dependencies.
# macOS / Linux
curl -fsSL https://tryweft.app/install.sh | sh
# then point it at a folder
weft serve ~/notes Windows: download weft-windows-amd64.exe and add it to your PATH.