Releases: RafaelGB/Obsidian-ZettelFlow
Release list
3.1.0
Shinny new things
- Ask your graph — a deterministic query surface over the meaning and structure of your slip-box, never AI. Compose predicates —
state:permanent,relation:contradicts,degree>=5,orphan,unsourced,older-than:30,about:— withAND/ORto answer questions Dataview can't, like "orphaned permanents older than 30 days that contradict X". Results open on click and useful queries can be saved. Command: Ask your graph. - Cultivate — guided thinking sessions — pick your highest-leverage idea and walk real moves on it: connect an unlinked neighbour, challenge it with its contradiction, capture a question, advance its lifecycle state, add a source. Each move is a one-click operation on the note and the session refines live. Choose your own recipe of moves, and a streak plus a cultivation queue show your momentum. Offline; AI never required.
- A 3D knowledge graph — an interactive force-directed view of your whole slip-box: nodes sized by connectivity and coloured by cluster, links coloured by relation type, hub glow and cluster hulls, question/source node kinds, proximity labels. Search-to-focus, state and relation filters, pin-focus, shortest path, click-a-link, time-lapse, zoom controls, fullscreen and a right-click menu — plus a discovery lens for orphans, dead-ends and contradictions.
- Four surfaces, one front door — the former dozen sidebar views are now four surfaces with modes behind a segmented control: Home, Health, Discovery and Graph, all reachable from a single ribbon button and opening as normal main-area tabs.
- Community hub — a tabbed home for the gallery: Browse (systems, steps, actions with search plus type and difficulty filters), Contribute (share your canvas as a system, suggest an idea, report a bug with your environment pre-filled, or open Discussions — all through GitHub), Learn (curated links to the guides and manifesto) and Installed. Fully static and GitHub-backed: there is no server to run.
- Quick capture — one command opens a single title prompt and writes a fleeting note to your Inbox. The fastest path from a thought to a note, with no canvas and no wizard; Home nudges you to develop it later.
- Reasoning paths — a new Trace reasoning paths command surfaces the argument chains leaving a note (
supports→expands→example→implements), every note clickable. Read-only and offline. - Guided condition builder — compose a canvas IF condition without writing code: pick a field, an operator and a value, and a validated expression appears in the editor.
- Property hooks grow up — each hook can now be enabled or disabled without deleting it, given a human description, gated by an optional run condition (
event.newValue === 'done'), and tested against the active note with a dry run that previews the changes it would make without writing anything. - Knowledge scope — keep config, templates and tooling out of the thinking system with a simple list of excluded path prefixes. Excluded notes never enter the index, so they drop out of the graph, health, discovery, Cultivate and Home all at once.
- Home becomes opinionated — a greeting and "thinking for N days", a one-click 3D-graph teaser, a growth nudge for fleeting notes, a Cultivate on-ramp, and a prioritised "what to do next" recommendation list.
- Everywhere and for everyone — the core loop is touch-friendly on mobile and the 3D graph degrades to a navigable list (hubs first, one tap per note) instead of a blank. Surfaces are keyboard-operable: the segmented tabs are a proper ARIA tablist with arrow-key navigation, note names activate with Enter/Space, focus is always visible, and
prefers-reduced-motionquiets the graph animation.
Improvements
- Community browse polish — difficulty badges on gallery systems plus a difficulty filter, linkable authors, an i18n'd gallery, and richer per-difficulty systems (including a ZettelFlow tour that teaches the whole workflow while you build a real note).
- On-creation actions re-run after indexing — knowledge actions that need the index now run once the note is indexed, so their frontmatter lands even on a cold start. On by default, bounded by a silent timeout and guarded against re-entrancy.
- AI guardrails — caps, explicit consent, prompt-injection hardening and endpoint safety; AI never fires automatically inside automations.
- Performance — revision-guarded recomputes, allocation-free adjacency with O(1) edge lookups, de-quadratic hot paths, a lite mode for the graph, and the hidden graph is paused instead of rendering off-screen.
- Views open as main-area tabs and the ribbon is a single all-in-one button.
- Canvas integration is defensive — the canvas patcher degrades gracefully when Obsidian's internals change instead of breaking the plugin.
No longer broken
- Adding a property hook wiped the hooks panel until settings were reopened — the shared search component was calling Obsidian's
createElon the document, which throws and unmounts the React tree. Fixed, with per-row error boundaries so a single bad row can never blank the rest. - The 3D graph could render blank, had low link contrast, and its controls were invisible — fixed, and 3D is now the default Graph mode.
- The canvas empty-state panel stole pointer events from the canvas underneath.
- Excluded paths did not cover ZettelFlow's own system folders, and the resurface ("forgotten") list read every vault file directly — both now honour knowledge scope, so system notes are never indexed or cultivated.
- Community difficulty tags overlapped the card text, the type and difficulty filters stacked awkwardly, and the Contribute cards clipped their description — the section is now simply Community, with a header badge row and one tidy filter bar.
- Share your system silently did nothing without an active canvas; it now explains what to do.
- Surface views registered before components, and a view type had to be a construction-safe literal — both fixed so a single failing component can't take the plugin down.
Under the hood
- The release workflow verifies that the pushed tag equals
manifest.versionand publishes curated notes fromRELEASE_NOTES.md. - A real safety net: behavioural tests over the vault write paths plus a ratcheting coverage floor enforced in CI. 1054 tests, all blocking.
- Design by subtraction — the community backend, twelve retired view classes, eleven duplicate commands, the dead community-flow concept and orphaned i18n/CSS were all removed rather than left to rot.
- A Knowledge State projection surface and a pure KnowledgeContext seam now separate the model from the views, with guards keeping the pure layer Obsidian-free.
eslint-plugin-obsidianmdandoxlintstay clean and blocking; en/es locale parity is enforced by a test.
3.0.1
Shinny new things
- Knowledge OS — ZettelFlow is now a knowledge-transformation engine. Six dedicated views ship out of the box: Home (your daily front door, opens on startup), Discoveries (resurface notes you haven't touched in a while), Timeline, Dashboard, Projects, and Journal.
- Systems Gallery — seven ready-to-use one-click workflow systems: Zettelkasten v2, Academic Research, PARA v2, GTD, Reading, Writing, and Software Architecture KB. Install any system in one click from the community browser.
- Run any canvas as a flow — a new Run now button lets you execute any installed system or custom canvas immediately after install, without leaving the browser.
- Action selector redesign — the step builder now shows all 31 actions organised into five category tabs (✏️ Manipulation · 🔗 Relations · 🧠 Knowledge · 🔍 Research · 🤖 AI), with a compact chip grid, hover tooltips, and a Smart suggest row that recommends complementary actions based on what you've already added.
- Condition editor — click any canvas edge to open a guided CodeMirror editor pre-loaded with the current condition, live validation feedback, a vocabulary table, and insert-ready examples. Writes
if: <expr>back to the edge on save. - Empty-state guide — when a canvas has no ZettelFlow steps yet, an inline guide panel appears with a direct CTA to browse community systems.
- First-run onboarding — a welcome flow greets new users and routes them to the Systems browser. A Browse systems command is available from the command palette at any time.
- Trigger condition guided help — vocabulary reference and sanity-check validation for condition expressions, surfaced directly in the editor.
- New AI actions — Challenge Idea, Synthesize, and Suggest Connections join the AI category.
- Remove-relation action — removes a relation edge from a note, with a confirmation guard to prevent accidental deletes.
Improvements
- Script action editor is now editable — replaced the read-only Markdown preview with a live CodeMirror editor; a collapsible variables panel lists every object available in the script scope (
note,content,app,zf,context). - Error surfaces — mid-flow
WarningErrorandFatalErrorconditions now surface as Obsidian Notices instead of falling silently into the log. Fatal notices include an actionable hint to open the canvas. - Progress indicator — the note-builder wizard shows a X steps completed counter that increments monotonically as you advance (no total shown — flows have dynamic branches).
- Unified ribbon menu — a single front-door ribbon button gives access to all views.
- Community browser leads with Systems — the Systems tab is now the default, replacing the old flow list as the entry point.
- Flow hot-reload — editing a
.canvasfile on disk automatically reloads the in-memory flow; no manual refresh needed. - Managed steps in canonical frontmatter format — newly created managed steps are stored in Obsidian frontmatter, the canonical and future-proof format.
- Performance — the vault-wide resurface (Discoveries) build is now memoised; large vaults see a significant speed-up.
- i18n — all 31 action purpose strings are now routed through the i18n layer; a global locale-parity guard ensures
en.tsandes.tsstay in sync. - Get Started → Systems — the settings Get Started section now routes directly to the Systems browser.
No longer broken
- Canvas startup options were not re-applied to canvases already open when the plugin loaded — now fixed.
- Relation actions were treating any property value as a wikilink edge; only actual
[[wikilink]]values are treated as relations now. - Cognitive-action Notices were firing during headless pattern runs, producing spurious popups — suppressed.
window.setTimeout/clearTimeoutused instead of baresetTimeoutfor compatibility with Obsidian popout windows.- The logger no longer silences
log.errorcalls when debug mode is off — errors are always emitted. - Plugin components (
ZComponent) are now properly unloaded when the plugin unloads. - YAML-unsafe frontmatter values in gallery systems are now quoted, preventing parse errors on install.
- Action selector search bar no longer overlaps the category tab buttons.
Under the hood
- All
innerHTMLassignments replaced with the Obsidian DOM API (createEl/empty()) — zero remaining. - Inline
el.style.*assignments replaced with CSS class-based styling throughout. - Sentence case applied consistently across all UI strings.
- Full TDD harness: Jest + Obsidian mock, 836 tests, all blocking on CI.
eslint-plugin-obsidianmdclean (0 violations),oxlintclean — both blocking on every PR.builtin-modulesreplaced with Node.js nativenode:module— one fewer dependency.
3.0.0
Shinny new things
- Knowledge OS — ZettelFlow is now a knowledge-transformation engine. Six dedicated views ship out of the box: Home (your daily front door, opens on startup), Discoveries (resurface notes you haven't touched in a while), Timeline, Dashboard, Projects, and Journal.
- Systems Gallery — seven ready-to-use one-click workflow systems: Zettelkasten v2, Academic Research, PARA v2, GTD, Reading, Writing, and Software Architecture KB. Install any system in one click from the community browser.
- Run any canvas as a flow — a new Run now button lets you execute any installed system or custom canvas immediately after install, without leaving the browser.
- Action selector redesign — the step builder now shows all 31 actions organised into five category tabs (✏️ Manipulation · 🔗 Relations · 🧠 Knowledge · 🔍 Research · 🤖 AI), with a compact chip grid, hover tooltips, and a Smart suggest row that recommends complementary actions based on what you've already added.
- Condition editor — click any canvas edge to open a guided CodeMirror editor pre-loaded with the current condition, live validation feedback, a vocabulary table, and insert-ready examples. Writes
if: <expr>back to the edge on save. - Empty-state guide — when a canvas has no ZettelFlow steps yet, an inline guide panel appears with a direct CTA to browse community systems.
- First-run onboarding — a welcome flow greets new users and routes them to the Systems browser. A Browse systems command is available from the command palette at any time.
- Trigger condition guided help — vocabulary reference and sanity-check validation for condition expressions, surfaced directly in the editor (#235).
- New AI actions — Challenge Idea, Synthesize, and Suggest Connections join the AI category.
- Remove-relation action — removes a relation edge from a note, with a confirmation guard to prevent accidental deletes.
Improvements
- Script action editor is now editable — replaced the read-only Markdown preview with a live CodeMirror editor; a collapsible variables panel lists every object available in the script scope (
note,content,app,zf,context). - Error surfaces — mid-flow
WarningErrorandFatalErrorconditions now surface as Obsidian Notices instead of falling silently into the log. Fatal notices include an actionable hint to open the canvas. - Progress indicator — the note-builder wizard shows a X steps completed counter that increments monotonically as you advance (no total shown — flows have dynamic branches).
- Unified ribbon menu — a single front-door ribbon button gives access to all views.
- Community browser leads with Systems — the Systems tab is now the default, replacing the old flow list as the entry point.
- Flow hot-reload — editing a
.canvasfile on disk automatically reloads the in-memory flow; no manual refresh needed (#226). - Managed steps in canonical frontmatter format — newly created managed steps are stored in Obsidian frontmatter, the canonical and future-proof format (#238).
- Performance — the vault-wide resurface (Discoveries) build is now memoised; large vaults see a significant speed-up (#246).
- i18n — all 31 action purpose strings are now routed through the i18n layer; a global locale-parity guard ensures
en.tsandes.tsstay in sync. - Get Started → Systems — the settings Get Started section now routes directly to the Systems browser.
No longer broken
- Canvas startup options were not re-applied to canvases already open when the plugin loaded — now fixed (#234).
- Relation actions were treating any property value as a wikilink edge; only actual
[[wikilink]]values are treated as relations now (#181). - Cognitive-action Notices were firing during headless pattern runs, producing spurious popups — suppressed (#201).
window.setTimeout/clearTimeoutused instead of baresetTimeoutfor compatibility with Obsidian popout windows (#104).- The logger no longer silences
log.errorcalls when debug mode is off — errors are always emitted (#100). - Plugin components (
ZComponent) are now properly unloaded when the plugin unloads (#101). - YAML-unsafe frontmatter values in gallery systems are now quoted, preventing parse errors on install (#217).
Under the hood
- All
innerHTMLassignments replaced with the Obsidian DOM API (createEl/empty()) — zero remaining (#99). - Inline
el.style.*assignments replaced with CSS class-based styling throughout (#103). - Sentence case applied consistently across all UI strings (#108).
- Full TDD harness: Jest + Obsidian mock, 836 tests, all blocking on CI.
eslint-plugin-obsidianmdclean (0 violations),oxlintclean — both blocking on every PR.version-bump.mjsandversions.jsonrestored (#97).
2.11.0
Shinny new things
- You can copy paste actions between steps
- Types editor to add new properties for hooks
- shortcut to manage the properties (rename, change property type or delete them)
No longer broken
- Refactor of hooks state management. It was duplicated and sometimes does not work correctly.
- Multiple hooks triggers could affect the performance. It was fixed
- Errors inside hooks will be managed correctly now.
- Search scroll (any search) now follow the parent scrolls
2.10.0
Shiny new things
-
Deprecation of
example/folder
The oldexample/folder has been deprecated. All sample flows now live in the new Flows Catalog, accessible directly from the canvas. You can browse, select, and paste any catalog flow into your workspace in one click. -
Flows Catalog & Canvas Integration
- Browse a curated list of ready-to-use flows in the sidebar.
- Click Copy to inject the flow into the clipboard and use the new canvas button to paste it into your ZettelFlow canvas
-
Unified Markdown Download
Flows that include.mdfiles now expose a Download All button in the flow preview. Clicking it bundles all Markdown assets into your configured template folder path.
Step 1
Step 2
Step 3

2.9.1
Improvements
- Hooks (doc here)
- new response option for hooks: remove property. Array of string with the keys of the properties to remove
- new response option for hooks: trigger flow. Inform the name of your canvas flow and will be triggered once all the hooks finished.
Screen.Recording.2025-04-19.at.21.10.22.mov
No Longer Broken
- The was a bug with new nodes when you try to open them with the plugin icon instead of right click menu. It works correctly now.
2.9.0
Shinny new things
- JS autocompletion works just fine now with the code editor.
- Input/output for property hooks improved. You can check our documentation here: Documentation for hooks.
- Editor performance improved using all the CodeMirror features available.
No Longer Broken
- Visual Bugs with autocompletion for the code editor.
2.8.0
Shinny new things
🚀 Property Hooks: Customize Your Notes with Advanced Logic
With Property Hooks, you can create your own hooks that trigger exclusively for the currently opened note. Define specific behaviors that execute automatically when a property value changes. This allows you to add custom logic and enhance your workflow dynamically and efficiently.
💡 Use case: Imagine you want to trigger a specific action whenever you change the status of a task within your note. With Property Hooks, you can automate that action effortlessly.
✨ Perfect for: Automating processes, triggering custom actions, and extending your workflows with smart logic, all within your notes.
example.hook.mov
Visual Improvements
DnD was totally refactored. Now it's stable and easy to use. It was applied to:
- Action order management
- select options order management
- new feature of hooks. It can be ordered too!
2.7.0
📚 Community Templates & Resources
We’re introducing templates, action repositories, steps, and markdown snippets for the community. It’s all about making your workflows smoother and easier with plug-and-play configurations.

🌟 Massive Visual Upgrades
Get ready for a fresh new look! We’ve revamped the interface with stunning visuals and polished details to make ZettelFlow even more enjoyable to use.
🎨 Brand-New Icon
A new icon to match the vibe of ZettelFlow – modern, clean, and slick!
💻 Enhanced JS Code Editing
The code editor just got an upgrade! A sleek new interface for JavaScript editing is here to level up your experience.

🐛 Bug Fixes Galore
We’ve squashed loads of bugs to make ZettelFlow more stable than ever.
⚡ Performance Boosts
With React 19 under the hood, the app is now faster and snappier. It’s all about giving you a smoother, more efficient experience.
💡 And So Much More!
This update is packed with improvements, many inspired by your feedback. Your input has been invaluable in shaping this release.
2.6.1
hotfix: zoneKey was not saved correctly