ideas.
June 13, 2026 3 min read desktopconsumerproductivity

Markdown knowledge graph viewer

A standalone desktop app that renders a link graph from any Markdown folder, letting you explore note connections without installing Obsidian or any other wiki tool.

The idea

Many developers and writers keep notes in a plain Markdown folder — structured with [[wiki-links]] or standard [text](file.md) links but viewed only as flat files in VS Code or a text editor. This desktop app reads that folder, parses every link between files, and renders an interactive force-directed graph where each node is a file and each edge is a link. Clicking a node opens a side panel with the file's rendered content. Fuzzy search highlights the matching node and its immediate neighbors.

The app requires no configuration, no account, and no format lock-in. It works on any Markdown folder — Obsidian vaults, Foam workspaces, plain notes/ directories, or a Jekyll _posts/ archive.

Why build this

Obsidian's built-in graph view is excellent but only available inside Obsidian. Foam and Dendron both require VS Code extensions. For developers who prefer editing in Neovim, Helix, or a bare text editor, there is no standalone graph viewer that reads their folder and gets out of the way.

The gap is not just about editor preference. Many teams maintain shared Markdown wikis in Git repositories — GitHub wikis, MkDocs sources, Docusaurus docs — that have cross-references but no built-in visualization. A desktop app that opens a folder and renders the graph in a few seconds would be immediately useful for anyone trying to understand a large documentation codebase.

Tauri's file system APIs make folder access straightforward, and Cytoscape.js renders production-quality force-directed graphs without a WebGL dependency. The combination keeps the binary small and startup fast.

Stack sketch

  • Framework: Tauri v2 with a React front end — gives native file system access and a small binary without Electron's overhead
  • File parsing: a Rust backend function that walks the folder tree with walkdir, reads each .md file, and extracts [[wiki-links]], [text](relative.md) links, and YAML frontmatter tags using a regex pass; results returned to the front end via Tauri's invoke bridge
  • Graph rendering: Cytoscape.js with the fcose compound spring embedder layout — stable, legible layouts for graphs with 50–500 nodes without manual tuning
  • Markdown preview: marked + DOMPurify in the side panel
  • Search: fuse.js for fuzzy search over file titles; results highlight matching nodes and dim everything else
  • State: Zustand — one slice for graph data, one for the selected node and side-panel visibility

Scope for v1

  • Open a local folder; parse all .md files and extract links
  • Render a force-directed graph; nodes are files, edges are links; node size scales with in-degree
  • Click a node to open a side panel with rendered Markdown content
  • Fuzzy search that highlights matching nodes and dims non-matching ones
  • Color nodes by top-level subdirectory with a legend
  • Zoom, pan, and "fit to screen" controls
  • Deliberately out of v1: live file watching, tag filtering, date filtering, exporting the graph as an image, editing files from within the app

Where it could go

A watch mode that updates the graph as you write would make the app useful during active note-taking sessions. The tauri-plugin-fs-watch plugin uses native inotify and FSEvents under the hood and fires Rust events the front end can subscribe to via listen. The graph updates incrementally — new nodes appear, removed links fade — without re-running the full layout from scratch.

The second expansion worth pursuing is filtering by YAML frontmatter tags. Most Markdown workflows use tags: [zettel, reference, project] in frontmatter. A tag picker sidebar that hides irrelevant nodes transforms the viewer from a global map into a focused exploration tool. For large vaults with hundreds of files, this feature is the difference between an interesting demo and a daily-use tool.

Watch out for

Large vaults with more than a thousand files will stress the Cytoscape.js layout engine — fcose handles around 500 nodes comfortably at interactive frame rates. Add a node count warning at that threshold and offer a cluster view that groups files by subdirectory. A layout that takes three seconds to settle and renders text too small to read does not serve the user; a coarser cluster view that loads instantly does.