Weft

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.

On embeddings: recency, backlinks, and co-access surfacing work fully in the prebuilt binary. Semantic neighbors require building from source with 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.

The cloud holds only ciphertext. The vault key never leaves your devices, and your cloud credentials decrypt nothing. Sync is file-level, not CRDT, so the HTML stays clean. Concurrent edits are detected by version vectors and become a conflict-copy — never a silent overwrite, never data loss. Deletions go to a .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.

Native GUI apps are macOS and iOS only. Linux and Windows get the CLI, the daemon, and the desktop web app — everything but a native window. There is no App Store or Play Store: macOS is a signed local build, iOS goes through Xcode or TestFlight.
# 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.