detangle
Markdown wiki viewer · macOS, Windows, Linux

The wiki reader that untangles your links.

Mermaid, DBML, backlinks and a graph — offline, from any folder.

An LLM writes [[Attention Is All You Need]]; the file is attention-is-all-you-need.md. Detangle resolves it, tells you which rule it used, and lists every link it couldn't.

Free · Offline · No account · MIT

resolution log — samples/
[[Attention Is All You Need]]    -> entities/attention-is-all-you-need.md  normalized-name
[[getting started#What's next?]] -> wiki/getting-started.md#whats-next    case + slugified-anchor
[Setup](wiki/setup)              -> wiki/setup/index.md                   folder-index
![[diagram.png|300]]             -> assets/diagram.png  (width 300)       extension probe
[[Vaswani]]                      -> entities/vaswani.md                   note-relative path
[[Transformer]]                  -> AMBIGUOUS: concepts/…, entities/…     needs a choice
[[Dose Response]]                -> unresolved                            3 inbound
Seven links from the demo wiki. Six resolve; one of them by a rule no other viewer tries, and the last one is reported rather than hidden.
Diagrams

Mermaid and DBML, rendered offline.

No Node, no Chromium, no CDN, and no network access of any kind. Both renderers are .NET libraries running in the same process as the reader.

Mermaid

Twenty-four diagram types through a pure .NET implementation. Renders are cached beside the vault by source and theme, so re-opening a page is instant.

DBML

Parsed by a recursive-descent parser written for this app and drawn as an ER diagram. The translation is lossy, so everything it drops — defaults, notes, indexes, table groups — is listed under the picture instead.

Failures show their source

A fence that will not parse shows its text and the parser's complaint, with the line. It never renders an empty box.

Formats

It already knows what kind of wiki this is.

The conventions genuinely differ — the same link text means different things in different tools — so the folder is sniffed before it is read.

Obsidian.obsidian/
Logseqlogseq/
MkDocsmkdocs.yml
Docusaurusdocusaurus.config.*
Dendrondendron.yml
Foam.vscode/foam.json
Quartzquartz.config.ts
Hugohugo.toml
Jekyll_config.yml
mdBookbook.toml
Zettelkasten202608201200-*.md
LLM Wikiwiki/ beside raw/
Plain markdownanything else
Graph

See the shape of what the model wrote.

Node size is inbound links, colour is frontmatter type, hollow means nothing links here, and a dashed outline is a page something links to that nobody wrote.

  • Missing pages are drawn.

    In a wiki a model produced, they are the shape of the work left to do.

  • Local mode.

    The neighbourhood of the page you were reading, N hops out, walked in both directions — a page's backlinks are as much its neighbourhood as its own links.

  • It stays interactive.

    Repulsion goes through a Barnes-Hut quadtree spread across cores: about 11 ms per simulation step over a 5,000-page vault, inside a 33 ms frame. Above 1,500 nodes it folds to one node per folder, because a hairball is not a picture.

graph — 5,002 files
nodes        6,456     1,454 missing pages
edges       21,655     41,655 links resolved
layout     11.5 ms     per step, 8 cores
budget     33.0 ms     30 frames a second
fold       > 1,500     one node per folder
Demo

Try it without installing anything.

The real reader, compiled to WebAssembly, holding a small wiki written the way a model writes one. Open your browser's network tab: after the page loads, it stays empty.

Same renderer, same resolver, same diagrams. The desktop build adds search, the file watcher, editing and export. Jump straight to the Mermaid page or the DBML page.

Craft

Built like the tool it is.

Local-first is a set of decisions, not a slogan. These are the ones that cost something.

No networkZero requests, including for diagrams
13 formatsDetected, not configured
5,000 filesCold index in 3.3 seconds
0 accountsYour wiki is just files

It does not change your files.

Unless you ask: saving, applying a fix, creating a missing note, or normalizing links. Its index lives in a .detangle/ folder you can delete.

Exports keep the links.

Static site, one HTML file, PDF, or normalized markdown — all built from the resolved model, so a link found by an alias is a working link in the output.

MIT, and self-contained.

One binary with the runtime inside it. Nothing to install first, no version to match, and no dependency that can go missing.

Download

Point it at a folder.

Version 0.1.0. Free, MIT, and the same build on every platform.

macOS

Download Detangle-osx-arm64.dmg for Apple Silicon, or Detangle-osx-x64.dmg for Intel, from the latest release. Open it and drag Detangle to Applications.

The build is not notarized, so the first launch needs one extra step: right-click the app and choose Open, then confirm. Or clear the quarantine flag yourself:

$ xattr -dr com.apple.quarantine /Applications/Detangle.app

Linux

Download the AppImage from the latest release, make it executable, and run it. Nothing is installed.

$ chmod +x Detangle-linux-x64.AppImage && ./Detangle-linux-x64.AppImage

Or install the .deb, which adds a desktop entry:

$ sudo apt install ./detangle_0.1.0_amd64.deb

x64 and arm64 both build. The optional WebView diagram backend wants libwebkit2gtk-4.1-0; nothing else does.

Windows

Download Detangle-win-x64.exe from the latest release and run it. There is also a portable zip if you would rather not install anything.

The build is not signed with a paid certificate, so SmartScreen will warn you the first time. Choose More info, then Run anyway.

Every release ships SHA256SUMS, so you can check what you downloaded is what was built. Signing certificates cost money this project does not take, which is the whole reason for the warnings above — the code is right here if you would rather build it: dotnet publish src/Detangle.Desktop and nothing else.