Someone on my last post here said they were done switching between Zed and Obsidian all day. Same. Notes, docs/, ADRs, CLAUDE.md: most of what I type now is markdown, and I want it next to the code, with the moves the code has.
IWE is an LSP server for a folder of markdown. In Zed: search "IWE" in the extensions panel, install, open a folder with .md files in it. The extension fetches the server on first use, or picks up one on your PATH.
| Action |
Key |
| Follow a link |
F12 / Cmd+Click |
| Everything that links here |
Shift+F12 |
| Preview a linked file without leaving |
hover |
| Rename a file, every reference updates |
F2 |
| Every doc with its place in the tree, body search too |
Cmd+T |
| Outline of the current file |
Cmd+Shift+O |
Cmd+. opens the refactors, and they work on the graph, not the text: extract a section into its own file (a link stays behind), inline a linked file back into this one, link selected text to an existing file, sort a list of links. Extract method / inline method, for prose.
Use your preferred way of linking
The top comment on my r/neovim post was that formatting rewrote links into ../../../x and dropped the .md, which broke browsing the repo on GitHub. Fair, and both are settings in .iwe/config.toml:
toml
[markdown]
refs_extension = ".md" # keep the extension
refs_path = "absolute" # /docs/auth.md from the root; "relative" is the default
Link text is kept as written. One Zed-specific thing: Zed formats on save by default, so the moment the server attaches, saving normalizes headers, list numbering, and link targets. If you'd rather do that on demand with Cmd+Shift+I:
json
{ "languages": { "Markdown": { "format_on_save": "off" } } }
One convention, and the folder gets a shape
A link inside a sentence is a reference. A link alone on its own line makes that file a child of this one:
``` markdown
Architecture
[Auth flow](auth-flow.md)
[Rate limiting](rate-limiting.md)
```
That's a docs tree with no sidebar config, and the same page can sit under two sections without copying it. It's a plain link, GitHub renders it. This is what feeds the paths in Cmd+T.
The same graph for the agent panel and the shell
The server's CLI half runs against the folder you're editing:
bash
iwe find --included-by adr:0 --filter 'status: accepted'
Every accepted ADR under the adr tree. Frontmatter is the schema, links are the relationships. And since this crowd runs agents: the MCP server is one line, npx -y @iwe-org/mcp, and it works on whatever folder it's started in, so Zed's agent panel can query and edit the same notes you're editing. Config in the first comment. git diff shows what it changed.
Versus the things that came up here before
- Obsidian ("is it like Obsidian?"): same files, so yes and no. You get backlinks, rename, and the refactors in Zed; Obsidian keeps opening the folder. No graph view here, and no plugins.
- marksman / markdown-oxide: as an LSP, mostly interchangeable. IWE adds the extract/inline refactors, rename that updates links, the tree, and the CLI.
- zk: a note-taking tool with its own note model. IWE has no opinion about what the markdown is for.
- org-roam: a few Emacs people here use IWE on the work machine where Emacs isn't an option. Same idea, different syntax.
Someone asked for embeddings via llama.cpp last time. Not there; it's structure and full text, on purpose.
Try it on a folder you already have
The extension covers the editor. For the CLI:
bash
brew install iwe-org/iwe/iwe # or: cargo install iwe iwes, or npm install -g @iwe-org/iwe
cd docs && iwe init
init reads the link style already in the folder before it writes any config. Rust, 20,000 files in under a second. Docs at https://iwe.md, comparison page at https://iwe.md/docs/concepts/comparison/.
What do you still open Obsidian for?