by weank
Connect your vault to the vcoder CLI: share selections, review proposed edits as diffs, surface broken links and note lint as diagnostics.
VCoder IDE for Obsidian
Connect an Obsidian vault to the vcoder CLI through its /ide command. Obsidian then acts as vcoder's IDE:
| Capability | What happens |
|---|---|
| Selection sync | vcoder sees which note is open and what text you selected. The prompt footer shows ⧉ N lines selected, so you can say "rewrite this paragraph". |
| Send to vcoder | Command, editor right-click, or file-menu entry. Inserts @note.md#L3-5 into the vcoder prompt. |
| Diff review | When vcoder asks permission to edit a note, a diff tab opens in Obsidian (unified or side by side, with word-level highlights). Choose Accept, Reject, or Edit proposal, then accept your edited version. |
| Note diagnostics | getDiagnostics reports unresolved [[links]] / ![[embeds]], missing #heading / #^block targets, invalid or duplicate frontmatter keys, unclosed code fences, heading level skips and duplicate headings. vcoder sees any new problems its edits introduce automatically. |
| openFile | The model can open a note and highlight a passage for you. |
Requirements
- Obsidian desktop 1.7.2 or later. Mobile is not supported.
- vcoder CLI 2.1.282 or later. vcoder is an AI coding agent for the terminal. Install it from either source:
- Native binary: weank1984/vcoder-releases
- Node.js package:
npm install -g @voyah-ai/vcoder-node
The plugin does nothing on its own. It only serves a vcoder session running on the same machine.
Install
- In Obsidian, open Settings → Community plugins → Browse and search for VCoder IDE.
- Install the plugin, then enable it.
Manual install:
- Download
main.js,manifest.jsonandstyles.cssfrom the latest release. - Put them in
<vault>/.obsidian/plugins/vcoder-ide/. - Enable the plugin.
From source (development):
- Run
npm install && npm run build. - Symlink
main.js,manifest.jsonandstyles.cssinto<vault>/.obsidian/plugins/vcoder-ide/.
Use
cd /path/to/vault
vcoder # then run /ide and pick "Obsidian"
- You must start vcoder inside the vault directory (or a subfolder). vcoder only lists IDEs whose workspace contains the current directory.
- Auto-connect: click the
vcoder ○status bar item to copy a launch command. The command includesVCODER_SSE_PORT=<port>, which makes vcoder connect to Obsidian on startup.vcoder --idealso works. - VS Code integrated terminal: if you run vcoder there, it prefers VS Code. Use the copied command with
VCODER_SSE_PORT. - Diff review:
- Closing the diff tab by hand counts as Reject.
- Answering in the terminal closes the Obsidian tab.
- The diff only opens when vcoder asks for permission. In auto-accept modes, edits are applied directly.
- To turn the diff off, set Diff tool → terminal in vcoder
/config.
- openFile needs vcoder 2.1.282 or later. Older versions do not expose this tool to the model.
Settings
| Setting | Purpose |
|---|---|
| Lockfile directory | Defaults to $VCODER_HOME/ide or ~/.vcoder/ide. If you start Obsidian from the Dock, it does not inherit shell variables. In that case, set this explicitly when you use a custom VCODER_HOME. |
| Share active note | Sends the open note even when nothing is selected. |
| Diff layout | Unified or side by side. |
| Diagnostics | Turn each of the four rule groups on or off, and set the vault scan limit. |
Relation to other plugins
Claude Code IDE connects Obsidian to Anthropic's Claude Code. This plugin connects to vcoder instead. Each CLI discovers IDEs through its own lockfile directory, so the two plugins do not interfere and can be installed side by side.
This plugin is an independent implementation. It is not a fork and shares no code. Besides selection sharing, it adds:
- in-Obsidian diff review
- note diagnostics
openFile
Network use, file system and clipboard access
- Network. The plugin runs a WebSocket server on 127.0.0.1 only. Only the vcoder CLI on the same machine connects to it. The plugin makes no outbound requests and contacts no remote services.
- Files outside the vault (Node
fs). The plugin writes one lockfile,~/.vcoder/ide/<port>.lock(or$VCODER_HOME/ide, or the Lockfile directory setting). vcoder reads this file to discover the running Obsidian instance. The plugin deletes it when it unloads. It reads or writes no other files outside the vault. - Vault enumeration. When vcoder calls
getDiagnosticswithout a file, the plugin lists the vault's Markdown notes and checks them, up to the Vault scan limit (default 5000). The results go only to the local vcoder session. - Clipboard. The plugin only writes to the clipboard, and only when you click the status bar item or run Copy vcoder launch line for this vault. It copies the launch command. It never reads the clipboard.
Security
- The WebSocket server binds to 127.0.0.1 only. It uses a random port and a per-start random token (
crypto.randomUUID). - The token is checked on every connection and stored only in an owner-only (
0600) lockfile. The lockfile is deleted on unload. - Paths outside the vault are rejected (
openDifferrors, so vcoder falls back to its terminal prompt). - The plugin never writes your notes. Accepted diffs are applied by vcoder itself.
- There is no code execution.
executeCodeis not implemented.
Protocol
The plugin implements the vcoder IDE contract:
- Lockfile:
<vcoder home>/ide/<port>.lockwith contents{workspaceFolders, pid, ideName, transport:"ws", authToken}. - Server: MCP over WebSocket, subprotocol
mcp, headerX-Claude-Code-Ide-Authorization. - Notifications to vcoder:
selection_changed,at_mentioned. - Tools:
openDiff(blocking; returnsFILE_SAVED+contents /DIFF_REJECTED/TAB_CLOSED),close_tab,closeAllDiffTabs,getDiagnostics,openFile,getWorkspaceFolders,getOpenEditors,getCurrentSelection,getLatestSelection,checkDocumentDirty,saveDocument.
Development
npm run dev # esbuild watch → main.js
npm run lint # eslint-plugin-obsidianmd (same rules as the community directory review)
npm test # vitest: lockfile, MCP server wire contract, diff, diagnostics rules
npm run build # tsc + production bundle
npm run fake-ide -- /tmp/vault # headless IDE peer (FAKE_IDE_DIFF=accept|reject|hold) for testing a real vcoder CLI
src/core/has no Obsidian imports and is fully unit tested.src/obsidian/is the adapter layer (views, editor extension, metadata cache).test-vault/contains seeded problems for every diagnostic rule. Symlink this repo totest-vault/.obsidian/plugins/vcoder-ideand open the folder as a vault.
Releasing
npm run release -- 0.1.1 # bump manifest/versions/package, lint, test, build, commit, tag
git push && git push origin 0.1.1 # push the tag on its own; CI (.github/workflows/release.yml) publishes the release
The tag must equal the manifest.json version, with no v prefix. Obsidian installs and updates the plugin from the release that matches this version. The release workflow adds GitHub build provenance attestations for main.js, manifest.json and styles.css (verify with gh attestation verify main.js -R weank1984/obsidian-vcoder-ide).
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.