{"id":49319346,"url":"https://github.com/neuralpunk/yarrow","last_synced_at":"2026-04-29T02:15:19.635Z","repository":{"id":351930623,"uuid":"1212472547","full_name":"neuralpunk/yarrow","owner":"neuralpunk","description":"A writing tool that grows with your ideas. Explore every direction, connect your thoughts visually, and never lose a path you've been down, all without ever touching a single technical setting.","archived":false,"fork":false,"pushed_at":"2026-04-26T00:19:08.000Z","size":5912,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T00:24:38.165Z","etag":null,"topics":["desktop-app","git-backed","knowledge-graph","knowledge-management","local-first","markdown","markdown-editor","note-taking","notes-app","offline-first","pkm","plain-text","react","rust","second-brain","tauri","typescript","zettelkasten"],"latest_commit_sha":null,"homepage":"https://yarrow.software/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neuralpunk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-16T12:15:31.000Z","updated_at":"2026-04-26T00:18:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/neuralpunk/yarrow","commit_stats":null,"previous_names":["neuralpunk/yarrow"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/neuralpunk/yarrow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuralpunk%2Fyarrow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuralpunk%2Fyarrow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuralpunk%2Fyarrow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuralpunk%2Fyarrow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neuralpunk","download_url":"https://codeload.github.com/neuralpunk/yarrow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neuralpunk%2Fyarrow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32305039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["desktop-app","git-backed","knowledge-graph","knowledge-management","local-first","markdown","markdown-editor","note-taking","notes-app","offline-first","pkm","plain-text","react","rust","second-brain","tauri","typescript","zettelkasten"],"created_at":"2026-04-26T17:00:57.608Z","updated_at":"2026-04-26T17:00:58.305Z","avatar_url":"https://github.com/neuralpunk.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yarrow\n\n\u003e Notes that branch, evolve, and connect.\n\nYarrow is a local-first desktop note-taking app built around the way thinking\nactually works — non-linear, branching, and never lost. Your notes are plain\nmarkdown files in a folder you choose. Every change is a silent checkpoint you\ncan scrub back to. **Paths** are named lenses over your notes — collections\nyou can arrange as a tree, rooted at a designated main, so you can see at a\nglance which notes matter under which *\"if…\"*.\n\nUnder the hood, Yarrow is [git](https://git-scm.com/). At the surface, there\nis no git anywhere — no commits, no HEAD, no checkouts. Just writing, a graph\nof paths to arrange your notes by, and connections you can draw between ideas.\n\n---\n\n## Table of contents\n\n- [What it is](#what-it-is)\n- [How it works](#how-it-works)\n- [Install — prebuilt binaries](#install--prebuilt-binaries)\n  - [macOS](#macos)\n  - [Linux](#linux)\n- [Install — from source](#install--from-source)\n- [First run](#first-run)\n- [Keyboard shortcuts](#keyboard-shortcuts)\n- [Paths](#paths)\n- [Importing from Obsidian](#importing-from-obsidian)\n- [Sync](#sync)\n- [Encryption](#encryption)\n- [Principles](#principles)\n- [Built with](#built-with)\n- [License](#license)\n\n---\n\n## What it is\n\nA single-binary desktop app for the kind of thinking that doesn't fit in a\nlinear outline. Features:\n\n- **Paths as collections** — named lenses over your notes, branching off a designated root. One note can live in many paths; selecting a path never hides your other notes\n- **Forking Road map** — full-screen graph of your paths, left → right, with drag-pan, scroll-zoom, inline \"+ branch here\" on every node, and hover-highlighted lineage (ancestry + descendants)\n- **Per-path Map view** — open the connection graph filtered to any path's member notes\n- **Designated main note** per path — the anchor that shows on the path's card\n- **Silent auto-checkpointing** — every pause is a checkpoint you can scrub back through\n- **Checkpoint \u0026 restore modal** — Now / Then side-by-side with diff highlighting\n- **Typed connections** — `supports`, `challenges`, `came from`, `open question`\n- **Radial connections graph** — structured layout with arrows, legend, and an expand-to-fullscreen view\n- **`[[wikilinks]]`** with inline autocomplete, hover preview, and a per-link path-membership chip (\"applies on 3 of 5 paths\") plus a one-click \"Start a path from this note\"\n- **`![[transclusion]]`** — embed another note, a heading, or a block into any note\n- **`??` open questions** that surface in a dedicated panel\n- **Pinned notes** — anchor a handful of always-visible notes at the top of the sidebar\n- **Tags** — read from frontmatter, shown as a counted sidebar panel and filterable via `#tag` in the command palette\n- **Templates** — pick a scaffold when you create a note; ships with meeting notes, book notes, vacation planner, morning pages, project brief, and daily journal\n- **Local encryption** — per-note, opt-in ChaCha20-Poly1305 + Argon2id with a BIP39 12-word recovery phrase; frontmatter stays plaintext so graph, tags, and links keep working on locked notes\n- **Bulk select** — multi-select notes in the sidebar and delete them in one go\n- **Daily notes / journal** with a `Today` shortcut, recency sidebar, and month-grid calendar\n- **Quick capture** (`⌘⇧Space` / `Ctrl+Shift+Space`) — pop a small window, append a timestamped entry to the scratchpad\n- **Attachments** — drop images or files into the editor; inline image preview\n- **Static-site export** — turn your workspace into a shareable HTML folder with client-side search\n- **Command palette** (`⌘K` / `Ctrl+K`) and **quick note switcher** (`⌘O` / `Ctrl+O`)\n- **Full history** — scrub any note back to any past version\n- **Git-anywhere sync** — point it at GitHub, Gitea, or any bare server\n- **Editorial type** — body renders in Source Serif 4 at a reading size; UI chrome stays in Inter; metadata in JetBrains Mono\n- **Reading mode ↔ Writing mode** — toggle from the right rail (or Settings → Writing) to flip between a fully-rendered HTML view (themed code blocks, bordered tables, blockquote bars, KaTeX math, clickable wikilinks) and raw markdown for structural edits\n- **Inline math (KaTeX)** — `$x^2$` renders inline, `$$\\int_0^\\infty…$$` renders centered; click into the delimiters to edit the LaTeX\n- **Code-block syntax highlighting** — fenced ```` ```python ```` (and every other language) get keyword/string/comment colouring while editing, plus themed `\u003cpre\u003e` styling in reading mode\n- **Smart paste** — paste a URL and Yarrow auto-fetches the page title, replacing the URL with `[\u003ctitle\u003e](url)`; with text selected, the selection becomes the link label\n- **Spell-check with workspace dictionary** — wavy red underlines on misspellings outside code/wikilinks/URLs, right-click for suggestions and \"Add to dictionary\" — words live in committed `.yarrow/dictionary.txt` so the team shares vocabulary\n- **Workspace-wide find \u0026 replace** (`⌘⇧F` / `Ctrl+Shift+F`) — regex toggle, scope (workspace / current path), live previews, undoable as one checkpoint\n- **Trash** — deleted notes stash into `.yarrow/trash/` with restore + permanent-purge from a sidebar modal\n- **Auto-rename wikilink updates** — renaming a note offers to rewrite every `[[Old Title]]` and `![[Old Title]]` (incl. `[[Old|alias]]` and `[[Old#section]]`) across the workspace as one checkpoint\n- **Print / save as PDF** (`⌘P` / `Ctrl+P`) — pulldown-cmark renders the active note with print-friendly styling; save via your OS print dialog\n- **Multiple windows** — *Open new window* in the palette spawns a second window onto the same workspace; positions/sizes persist across launches\n- **Obsidian vault import** — start a new workspace from an existing Obsidian vault (preserves wikilinks, tags, frontmatter; skips `.obsidian/`)\n- **Themes** — paper \u0026 plum (light), ink \u0026 plum (dark), and auto\n- **Path decision tools** — every other path shows a `+N / −M` badge on its card vs. your current path; the path detail panel lists what you'd gain, what you'd leave behind, and what's edited differently (with optional grouping by tag); the **Decision matrix** lets you star must-have notes and read off which path satisfies them; hovering a path card highlights its members in the note list; drag any sidebar note onto a path card to add it\n- **Plain markdown forever** — no proprietary format, no lock-in\n\nRoughly ~15 MB binary. No bundled Chromium. No account required. No telemetry.\n\n## How it works\n\nYarrow is a thin desktop shell (Tauri + Rust) around a tree of markdown files\nsitting inside a real git repository.\n\n```\nyour-workspace/\n├── .yarrow/\n│   ├── config.toml              # workspace preferences (shared)\n│   ├── path-collections.toml    # your paths — a tree of note collections\n│   ├── credentials.toml         # sync tokens (per-machine, gitignored)\n│   ├── security.toml            # wrapped encryption keys (shared — opaque)\n│   ├── dictionary.txt           # workspace spell-check vocabulary (committed)\n│   ├── trash/                   # soft-deleted notes (gitignored)\n│   ├── session.json             # last-active note per window (gitignored)\n│   ├── scratchpad.md            # throwaway jotting (gitignored)\n│   ├── templates/\n│   │   ├── daily.md             # rendered into new journal entries\n│   │   ├── meeting.md\n│   │   ├── book.md\n│   │   └── …                    # your own templates live here too\n│   └── index.json               # derived link / tag cache (gitignored)\n├── notes/\n│   ├── my-first-note.md\n│   ├── another-note.md\n│   └── daily/\n│       └── 2026-04-17.md        # journal entries\n├── attachments/\n│   └── 7f2c…e1.png              # content-addressed by SHA-256 prefix\n└── .gitignore\n```\n\nEvery `.md` file has YAML frontmatter (title, timestamps, typed links, tags).\nReciprocal links are written on both sides of each connection, so your notes\nremain readable outside Yarrow in any plain-text editor.\n\n**Paths are collections of note slugs**, not separate copies of your notes.\nThey're stored as a simple TOML tree in `.yarrow/path-collections.toml` —\none note can belong to many paths, and the file is readable and editable by\nhand if you like.\n\nYarrow still uses git for **checkpoints** (every pause is a commit), **history**\n(scrub any note back to any past version), and **sync** (push/pull the whole\nworkspace to any remote you own). Those three are the remaining Yarrow-to-git\nvocabulary mappings — paths and branches are no longer the same thing.\n\n| You see… | Under the hood |\n|---|---|\n| **checkpoint** | commit |\n| **history** | `git log` for one file |\n| **sync** | `git push` + `git pull` |\n| **what were you thinking?** | optional commit message suffix |\n\nBecause the workspace is a real git repo, you can always `cd` into it and use\ngit directly — Yarrow never takes that away.\n\n---\n\n## Install — prebuilt binaries\n\nBinaries are attached to each GitHub Release. Pick the one for your platform.\n\nVisit \u003chttps://github.com/neuralpunk/yarrow/releases\u003e and download the latest.\n\n### macOS\n\nYarrow ships a universal `.dmg` and `.app.tar.gz` for both Apple Silicon and\nIntel Macs.\n\n1. Download **`Yarrow_\u003cversion\u003e_universal.dmg`** from the latest release.\n2. Open the `.dmg` and drag **Yarrow.app** to `/Applications`.\n3. First launch: right-click the app → *Open* → *Open* to bypass Gatekeeper.\n   (Until the app is notarized, macOS flags it as unsigned. This is safe and\n   Gatekeeper will remember your choice.)\n\n\u003e **Upgrading from a pre-1.0.0 build on macOS?** The 1.0.0 release changes\n\u003e the bundle identifier (the trailing `.app` conflicted with macOS's\n\u003e application-bundle extension). macOS treats the new build as a separate\n\u003e app, so before installing 1.0.0:\n\u003e\n\u003e 1. Quit Yarrow if it's running.\n\u003e 2. Drag the old **Yarrow.app** from `/Applications` to the Trash.\n\u003e 3. Install 1.0.0 from the new `.dmg`.\n\u003e\n\u003e **Your notes are safe.** Yarrow stores everything in the workspace\n\u003e folder you picked — nothing note-related lives inside the app bundle.\n\nTo uninstall: drag `Yarrow.app` to the Trash. Your workspaces live in\nwhatever folder you chose — Yarrow never writes anywhere else.\n\n### Linux\n\nThree formats are published per release. Use whichever fits your distro:\n\n| Format | Works on | Download |\n|---|---|---|\n| **AppImage** | any x86_64 distro | `Yarrow_\u003cversion\u003e_amd64.AppImage` |\n| **.deb** | Debian, Ubuntu, Mint, Pop!_OS | `yarrow_\u003cversion\u003e_amd64.deb` |\n| **.rpm** | Fedora, RHEL, openSUSE | `yarrow-\u003cversion\u003e-1.x86_64.rpm` |\n\n**AppImage** (works anywhere, no install):\n\n```bash\nchmod +x Yarrow_*.AppImage\n./Yarrow_*.AppImage\n```\n\n**.deb** (Ubuntu / Debian / derivatives):\n\n```bash\nsudo apt install ./yarrow_*_amd64.deb\n```\n\n**.rpm** (Fedora / RHEL / openSUSE):\n\n```bash\nsudo dnf install ./yarrow-*.x86_64.rpm\n# or on openSUSE:\nsudo zypper install ./yarrow-*.x86_64.rpm\n```\n\nLinux runtime depends on `webkit2gtk-4.1`. On Fedora that's\n`webkit2gtk4.1-devel`; on Debian/Ubuntu it's `libwebkit2gtk-4.1-0`. The\npackage installer pulls these in for `.deb` / `.rpm`; AppImage runs as long\nas the runtime lib is present.\n\n### Windows\n\nA `.msi` installer and a portable `.exe` are published alongside the Mac and\nLinux bundles on each release. Windows is tested on Windows 10+.\n\n---\n\n## Install — from source\n\nYou'll need:\n\n- **Node.js** 20+ (any recent LTS) and **npm** 10+\n- **Rust** stable (install via \u003chttps://rustup.rs\u003e)\n- Platform-specific Tauri prerequisites (see below)\n\n### Platform prerequisites\n\n**macOS:**\n\n```bash\nxcode-select --install\n```\n\n**Linux (Fedora):**\n\n```bash\nsudo dnf install webkit2gtk4.1-devel libsoup3-devel librsvg2-devel gtk3-devel\n```\n\n**Linux (Debian / Ubuntu):**\n\n```bash\nsudo apt install libwebkit2gtk-4.1-dev libsoup-3.0-dev librsvg2-dev \\\n                 libgtk-3-dev build-essential curl wget file\n```\n\n**Windows:**\n\n- Visual Studio Build Tools 2019+ with \"Desktop development with C++\"\n- WebView2 runtime (bundled with recent Windows 11; otherwise from\n  \u003chttps://developer.microsoft.com/microsoft-edge/webview2/\u003e)\n\n### Clone and run\n\n```bash\ngit clone https://github.com/neuralpunk/yarrow.git\ncd yarrow\nnpm install\nnpm run tauri dev\n```\n\nThat opens a dev build with hot reload. Close it when you're done — it\ndoesn't install anything on your system.\n\n### Build a local release binary\n\n```bash\nnpm run tauri build\n```\n\nThe binary appears under `src-tauri/target/release/bundle/`. On Linux you'll\nsee `appimage/`, `deb/`, and `rpm/` subfolders; on macOS a `.dmg`; on Windows\na `.msi` and `.exe`.\n\n### Other useful commands\n\n```bash\nnpm run dev           # Vite frontend only (no Tauri window)\nnpm run build         # tsc + vite build (no Tauri)\nnpm run typecheck     # tsc --noEmit\ncd src-tauri \u0026\u0026 cargo check    # validate the Rust backend\ncd src-tauri \u0026\u0026 cargo test     # run Rust tests\n```\n\n### Try it with a sample workspace\n\n```bash\n./scripts/make-sample-workspace.sh ~/yarrow-demo\nnpm run tauri dev\n# then point Yarrow at ~/yarrow-demo\n```\n\nThe sample is a two-week European-trip planning vault with a dozen notes,\ntyped connections, and a second path.\n\n---\n\n## First run\n\nOn first launch, Yarrow asks you to **create** or **open** a workspace.\n\n- **Create** opens a two-step in-app wizard:\n  1. Pick what you're starting from — a blank notebook, or an existing\n     Obsidian vault (file picker for the vault folder).\n  2. Name the workspace, pick where it lives (defaults to\n     `~/Documents/Yarrow/\u003cname\u003e`, editable, with a Browse button), choose\n     **Branch path mapping** (recommended — paths, links, the map) or\n     **Basic notes**, and for blank-mapped workspaces give the starting\n     note a name. A live \"Will create:\" preview shows the absolute path\n     forming as you type.\n\n  Yarrow creates the folder, initializes a git repo, writes\n  `.yarrow/config.toml`, and (for Obsidian imports) copies your `.md`\n  files in as a single checkpoint.\n\n- **Open** picks a folder that already has a `.yarrow/config.toml` inside.\n\nYour workspace is just a git repo. You can back it up by copying the folder,\npush it to a remote you own, or open the `.md` files in any other editor —\nYarrow will happily re-index on the next launch.\n\n---\n\n## Keyboard shortcuts\n\n| Shortcut | Action |\n|---|---|\n| `⌘K` / `Ctrl+K` | Command palette — search, jump, run anything |\n| `⌘O` / `Ctrl+O` | Quick note switcher (fuzzy title search) |\n| `⌘N` / `Ctrl+N` | New note |\n| `⌘⇧N` / `Ctrl+Shift+N` | Start a new path |\n| `⌘⇧B` / `Ctrl+Shift+B` | Branch from the current note (same dialog) |\n| `⌘T` / `Ctrl+T` | Jump to today's journal (auto-switches to main) |\n| `⌘←` / `Ctrl+←` | Previous journal entry (while a daily note is open) |\n| `⌘→` / `Ctrl+→` | Next journal entry (while a daily note is open) |\n| `⌘⇧Space` / `Ctrl+Shift+Space` | Quick capture → scratchpad |\n| `⌘⇧F` / `Ctrl+Shift+F` | Workspace-wide find \u0026amp; replace |\n| `⌘P` / `Ctrl+P` | Print or save the active note as PDF |\n| `⌘\\` / `Ctrl+\\` | Toggle focus mode |\n| `⌘L` / `Ctrl+L` | Lock encrypted notes (only when encryption is enabled) |\n| `⌘,` / `Ctrl+,` | Open Settings |\n\n---\n\n## Paths\n\nA **path** in Yarrow is a named collection of notes arranged as a branch off a\ndesignated root. The shape is a tree: the root (`main` by default) is the\ntrunk, every other path is a child of some other path, and one note can\nbelong to many paths at once. Selecting a path never changes which notes you\ncan read — it's a lens, not a view-switch.\n\nEvery path has:\n\n- **A name** — a slug like `if-seattle-job`.\n- **An `if…` condition** — the question this path is asking\n  (*\"If the Seattle job comes through\"*). Shown on the path card and on\n  the fork signpost in the graph.\n- **A parent** — every path except the root descends from another path.\n- **A main note (★)** — the anchor. Shown on the path card and in the\n  detail header. Any member note can be designated.\n- **Members** — the note slugs this path contains. Add or remove them\n  from the detail panel; the notes themselves are never copied or moved.\n\n**Starting a new path.** Press `⌘⇧B` / `Ctrl+Shift+B` (from anywhere) or click\n*Branch this* in the toolbar. You write the *\"if…\"* question; the path is\nauto-named, created as a child of the root by default (pick any other path\nfrom the chip row if you want a sub-branch), and the note you were writing\nbecomes its main note.\n\n**The Forking Road map.** Open from the right-rail *Paths* button. Left to\nright: root on the left, forks fan out to the right. Drag to pan, scroll to\nzoom, `+` on any card to branch from there, click a node to select it and\nopen the detail panel. The selection highlights the path's **ancestry**\n(what it's under) and **descendants** (what branches off it).\n\n**The per-path Map.** Every path detail panel has an *Open the map for this\npath* button. It opens the full connection graph filtered to only that\npath's member notes and their wikilinks — the fast answer to *\"what does\nthis path actually hold together?\"*\n\n**Managing paths.** In the detail panel: rename, edit the *\"if…\"*, designate\na main note, add and remove member notes, spin any member note off into its\nown child path with one click. Deleting a path never deletes its notes;\nchildren reattach to the deleted path's parent.\n\n`.yarrow/path-collections.toml` is the whole story — readable, committable,\neditable by hand. If something looks wrong, open it.\n\n### Decision tools\n\nEvery path is a question. Yarrow gives you four ways to answer *\"so what\ndoes taking this one actually mean?\"* — without writing a single side\ndocument.\n\n- **Card badges.** Each path card on the Forking Road graph shows a\n  `+N / −M` badge relative to the path you're currently on. Hover the\n  badge for a tooltip; the card you're on is labeled `YOU ARE HERE`.\n- **\"If you take this path…\"** panel in the path detail. Three groups:\n  `+` you'd gain, `~` present on both but with edited content, `−` you'd\n  leave behind. Toggle \"group by tag\" to cluster the lists under their\n  tags (\"you'd lose 3 #museum notes\").\n- **Decision matrix** — open from the command palette. Rows are notes,\n  columns are paths, cells are ✓/✗. Click a row's ☆ to star it as a\n  must-have; column headers grow a `★ N/M` score that turns red if any\n  starred row is missing. Filter by tag chip, by text, or to \"only ★\n  rows\" once you've decided what matters. Stars persist per-workspace.\n- **Hover-to-highlight** — pointing at a path card lights up its slugs\n  in the note list and dims the rest. Opening a path keeps the highlight\n  on while the detail panel is open. The two views read as one.\n- **Drag-to-add** — drag any note from the sidebar onto a path card on\n  the graph (or onto the \"In this path\" section of an open path) to add\n  it. Useful for quickly assembling a path without opening the picker.\n\n## Importing from Obsidian\n\nYarrow can read an Obsidian vault directly. Two ways in:\n\n- **From the new-workspace wizard** — when creating a workspace, pick\n  \"Import an Obsidian vault\" in step 1. The wizard pre-fills the new\n  workspace name from the vault folder, and the import runs as part of\n  workspace creation.\n- **Into an existing workspace** — `⌘K` → *Import an Obsidian vault…*,\n  pick the vault folder.\n\nWhat's preserved: every `.md` file, your `[[wikilinks]]`, your `#tags`,\nexisting YAML frontmatter (`title`, `created`, `modified`, `tags`).\n\nWhat's skipped: `.obsidian/` config, `.trash/`, anything else under a\ndotfile directory.\n\nThe whole import is one git checkpoint, so if something looks wrong you\ncan scrub back through History on any imported note. Slug collisions\nauto-suffix (`-2`, `-3`, …) and the wizard surfaces the rename list.\n\n## Sync\n\n**Sync is optional.** Yarrow works fully offline. If you want a backup or\nmulti-machine sync, point it at any git remote you own:\n\n- GitHub (public or private)\n- Gitea / Forgejo\n- any bare git server you can reach\n\n**Settings → Sync:** paste the clone URL, optionally an access token for\nHTTPS private repos, and click *Sync*. The token is stored in\n`.yarrow/credentials.toml` on this machine only — it's never committed.\n\nConflicts that arise from a pull surface through Yarrow's built-in\nside-by-side resolver (*\"your thinking diverged\"*).\n\n## Encryption\n\n**Encryption is optional and per-note.** Turn it on from\n**Settings → Security**, pick a password, and write down the 12-word recovery\nphrase Yarrow shows you once. Then mark individual notes as encrypted from\nthe command palette (*Encrypt this note*) — the rest of your workspace stays\nplain markdown.\n\nUnder the hood:\n\n- **ChaCha20-Poly1305** AEAD seals each note body with a fresh 12-byte nonce.\n- **Argon2id** (m = 64 MiB, t = 3, p = 1) derives keys from your password and\n  from the recovery phrase.\n- The workspace master key is **wrapped twice** in `.yarrow/security.toml` —\n  once by the password-derived key and once by the recovery-derived key — so\n  either can unlock without storing the other.\n- Frontmatter (title, tags, links) stays plaintext. The sidebar, tag filter,\n  and connection graph keep working on encrypted notes.\n- Your password is never persisted. The master key lives in RAM for the\n  session and is zeroed on lock, on idle timeout (configurable, default\n  15 min), and on app quit.\n- Encrypted notes are **skipped** by static-site export and full-text body\n  search. Diffs for encrypted notes in the history slider are decrypted on\n  demand against the session key.\n\nLose both your password and your recovery phrase and the encrypted notes are\ngone. There is no backdoor — that's the point.\n\n## Principles\n\n- **Nothing you write is ever lost.** Abandoned paths are an archive, not the trash.\n- **Plain text, forever.** `.md` files in a folder. Open in any editor.\n- **Local-first.** Works fully offline. Sync to a remote you own, or don't.\n- **Human vocabulary.** Paths are collections, checkpoints are commits — never git jargon in the UI.\n- **Your notes, your keys.** Encryption is opt-in and client-side. Yarrow\n  never sees your password, and there is no recovery backdoor beyond the\n  phrase you wrote down.\n\n## Built with\n\n[Tauri 2](https://tauri.app) · [Rust](https://www.rust-lang.org) ·\n[git2-rs](https://github.com/rust-lang/git2-rs) ·\n[pulldown-cmark](https://github.com/raphlinus/pulldown-cmark) ·\n[React](https://react.dev) + [TypeScript](https://www.typescriptlang.org) ·\n[CodeMirror 6](https://codemirror.net) · [D3](https://d3js.org) ·\n[Tailwind CSS](https://tailwindcss.com)\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneuralpunk%2Fyarrow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneuralpunk%2Fyarrow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneuralpunk%2Fyarrow/lists"}