ZettelFlow

by rafaelgb
5
4
3
2
1
Score: 64/100

Description

Build guided Canvas workflows, read PDFs and EPUBs, and turn highlights into cited notes connected to your local Zettelkasten and knowledge graph.

Reviews

  • Mariano Alvarez
    Reviewed on Nov 11th, 2026
    No review text provided.
  • Rafael Gómez Bermejo
    Reviewed on Oct 6th, 2026
    No review text provided.

Stats

186
stars
28,033
downloads
13
forks
89
days
2
days
15
days
325
total PRs
3
open PRs
17
closed PRs
305
merged PRs
575
total issues
1
open issues
574
closed issues
907
commits

Latest Version

16 days ago

Changelog

An iPad release: four things that only went wrong on a tablet, fixed.

No longer broken

  • A passage underlined line by line made several thoughts — on an iPad, reading the next line before marking it took longer than the pen's few seconds, so every line became its own entry in Think. Now the next line grows the same highlight however long you took to get there. A stroke that stops a little short of a line's last words, or starts after the next line's first ones, takes them in (up to three on each side). It works the same in Page view, on a printed page. The pen and a selection grow the same highlight, whichever came first, and Undo takes back only the line you just added. A different meaning, another paragraph or a skipped line still starts a highlight of its own.
  • A finger could not select a chapter's words on an iPad — only the Pencil could highlight. A long press now selects the words and offers the four meanings, while the Pencil keeps drawing.
  • Think's card actions lost their icons on a tablet — Obsidian's tablet padding squeezed them into a shaded blob. They are icon buttons again.
  • Buttons all over the plugin grew on a tablet — Obsidian's tablet padding overrode the plugin's own, so pills, chips and tabs in the Reader, the Library, This note, Community, Cultivate, Settings, Explore and the dashboards came out too wide. Each one keeps its own box now. On desktop a few buttons look as they were always meant to: the Reader's detour pill in the accent colour, quiet links without a fill, Settings tabs with no fill at rest.

Under the hood

  • A guardrail for every button — a test compiles the stylesheet and fails if any button the plugin builds would lose its padding or fill to Obsidian's button rules, on any view.
  • iOS text selection — a test fails on a user-select: text that forgets its -webkit-user-select, which iPadOS reads and a desktop never notices.
  • main.js is 3,202.5 KB, under the 3,203 KB ceiling. No new library.

README file from

Github

Most plugins help you write. Almost none help you think.

Stop managing notes. Start managing knowledge. Obsidian is the store; ZettelFlow is the engine that makes the knowledge inside it evolve. It turns a native Canvas into a note-creation wizard, opens your notes, PDFs and EPUBs in a Reader built for thinking, and gives you a small set of practice loops that ask something of you. Every loop is offline, works with AI switched off, and writes nothing to your vault you did not decide.

🔁 What it asks of you

Before any feature list, the things ZettelFlow asks you to do — each a small loop on your own notes, each reached where you already are (Home, Think, the Reader, a note's right-click menu):

🔁 Return a claim — say in one sentence what a note claims; later it comes back blind from Home and asks what you say about it now. The return of a claim → 📖 Look again at what you marked — your Reader highlights come back from Home a few at a time, with one question: do you still think so? A few things you marked →
📄 What survived? — at the end of a chapter you marked, the book gives you a blank leaf: your marks, what they touched, and is one worth a note? What survived → ✍️ Recall a chapter — put the chapter and your marks away, write what it argued in your own words, then look. Nothing is scored. Recall →
🎲 Collide two notes — from Think, two of your notes with nothing in common, side by side: what could they share? It never answers. Two things far apart (collision) → ⚖️ Place a wager — add what you expect to see and by when to a claim; on the day, it asks what happened before it shows your prediction. A wager →
🧠 Make a move on an idea — challenge it, reframe it, branch it, set it aside: a cognitive move, recorded as something you did. Make a move → ✨ And everything else — the Canvas wizard, the semantic graph, health, discovery, dashboards. Everything it does →

AI is one action, never the product. Every loop and every view works fully with AI disabled; when it is on it proposes, and you accept, edit or reject — the verdict is recorded, never assumed. Knowledge with purpose — starting from your own question and writing a provisional response — needs no AI, methodology or Canvas setup; see Cultivate.


📚 Read like a book — the Reader and your Library

Right-click any note → Read from here. The Reader takes the window and walks you through the note and the notes around it, one chapter at a time — no MOC needed. Your Library puts your PDFs, EPUBs and Web Clipper articles on one shelf, beside the reading paths you saved, and opens them in the same Reader. What you mark lands in Think, never in the book — where you can read it back one book at a time, in the book's order — and a PDF you marked can be handed back as a copy with your notes on it. Esc gives your workspace back exactly as it was.


⚡ How it works — draw it once, every note walks it

Your note workflow is a Canvas. A card is a step, an arrow is the order, a branch is a choice. Press Create note and ZettelFlow walks that graph with you as a short wizard — the idea, its kind, its tags, the links your vault suggests — while a live preview writes the note: frontmatter, body and file name, no template edited by hand. Then the note doesn't land alone: it arrives in your graph, already linked, in the region it belongs to — and you see the bridge it just made.

…and the wizard is only the door. Home is where you land each day: a greeting, Think's composer, where you left off and what came back today, answered in place.


🚀 Get started in 5 minutes

Install ZettelFlow from Obsidian's community plugins — or open it in Obsidian. Everything starts at the ZettelFlow ribbon button, which opens a menu.

  • See it work in one click — ribbon → Create note. While no canvas creates notes, it offers Create the example flow: a small canvas with one step, ready to run. Press Create note again and walk it.
  • Learn it, or install a ready-made system — ribbon → Community, one view with four rooms. Learn has a short tutorial for every feature. Systems has Zettelkasten, PARA, GTD, research…: walk one on its own drawing before it writes anything, then Install, with Undo right in the notice. Contribute shares your canvas as a system; Installed takes one back.
  • No canvas at all — ribbon → Think to write down a thought, or Cultivate to grow one idea.

Draw your own flow:

  1. Create a canvas (e.g. flows/Daily note.canvas), right-click it → Use this canvas to create notes → Give it the role.
  2. Open it and press Create the first step → Note — file with frontmatter. The first step starts the flow on its own.
  3. Select the step → Edit step → Add an action → Ask for text, and write its Question.
  4. Ribbon → Create note: the wizard walks your flow and creates the note.

Installing ZettelFlow: Settings → Community plugins → Browse, search ZettelFlow, Install and Enable

Stuck? Read the getting started guide or open a discussion.


🔒 Capabilities & privacy

ZettelFlow collects no telemetry and sends no personal data or vault contents anywhere. No account, no backend: the network is touched only by the opt-in paths below.

  • File system (vault). Reads canvas flow files and creates/edits notes (e.g. the Change note state command writes a single lifecycle property to the active note). All access goes through Obsidian's Vault / FrontmatterService API — never a hardcoded path. Works on desktop and mobile.
  • Vault enumeration. ZettelFlow lists every markdown file path to build the offline knowledge model that health, discovery, the graph and Cultivate all read. Paths and metadata only, all local — and you can keep folders out of it with the knowledge scope.
  • Network — two opt-in paths, nothing until you use them. The community gallery does read-only GETs of the static catalog on GitHub (no backend, no account, no uploads), and the optional AI provider sends length-bounded note content to the single https endpoint you configure. Both are off until you open the browser or enable AI.
  • Dynamic code execution. The Script action, dynamic selectors, vault hooks and workflow-event conditions run JavaScript you write, with the plugin's access to your vault — including read-only access to the whole knowledge model via zf.knowledge — so only run scripts you trust. No remote code is ever fetched or executed, and every runtime function is built in one audited module.
  • Clipboard — write only. The “copy” buttons put a step or action configuration on your clipboard as JSON. ZettelFlow never reads your clipboard. Cite's Copy puts the citation you see there, on that click only.
  • Handwriting — opt-in, per press. Reading ink sends an image of that one ink note's strokes and its passage to your AI provider, only when you press Read as text. Nothing reads ink by itself.
  • The Reader's AI moves — opt-in, per click. Six moves on a passage you selected (Why?, Challenge, Question, What's the claim, Reflect, Explain) send that passage, its paragraph and the one before, and the book and chapter titles to your AI provider, only when you click one. Nothing from your vault is sent, and nothing runs by itself. On desktop and Android, Translate sends one selected passage and the target language, on a click; Look up reads your own dictionaries on the device and makes no request at all. Listen uses only your device's own voices: no text leaves the device.
  • Network — the tutorial catalog, while Learn is open. Community's Learn room does a read-only GET of the tutorial catalog and its illustrations from GitHub — the same kind of request as the gallery, made only when Learn is shown, never at startup. No account, no upload, no telemetry.

See Capabilities & privacy for full details.


🤝 Contributing & support

Report a bug · Request a feature · Start a discussion · Contribute code

If ZettelFlow saves you time, a ⭐ helps others find it — and you can support development: