hansenje60 downloadsMistral Vibe integration: chat and predefined tasks for your vault.
Mistral Vibe integration for Obsidian. Drives the vibe CLI as a subprocess to add chat and predefined tasks to your vault.
Desktop only. The plugin spawns vibe, so Obsidian mobile is out of scope.
vibe --setup)Sillage is not in the community plugins store. Install by copy or symlink:
git clone https://github.com/J3F3H/sillage.git
cd sillage
npm install
npm run build
# point your vault at the build
ln -s "$PWD" "/path/to/your/vault/.obsidian/plugins/sillage"
Then in Obsidian: Settings → Community plugins → enable Sillage.
vibe --output streaming responses. Markdown-rendered, with tool-call visibility, Insert/Copy on each assistant bubble, and a Stop button to cancel runs.user-invocable: true skill under <vault>/.agents/skills/ is registered as a command. Obsidian vault events trigger a rescan when you add, edit, or remove skills; run Reload skills from the command palette if your vault doesn't index .agents/.session_id survive Obsidian reloads. Subsequent turns use vibe --resume <id> so a terminal session can't accidentally collide. If a session is aged out of ~/.vibe/logs/session/, Sillage falls back to a fresh session and tells you.meta.json, shown in the chat status line after each turn.| Command | Notes |
|---|---|
| Open chat | Opens the sidebar panel |
| Summarize current note | Appends ## Summary |
| Extract action items from current note | Appends ## Tasks in Tasks-plugin syntax |
| Rewrite selection for clarity | Replaces selection |
| Translate selection to English | |
| Translate selection to French | |
| Reload skills | Force a rescan of .agents/skills/ (fallback if vault events don't fire) |
| Skill-discovered commands | One per .agents/skills/*/SKILL.md with user-invocable: true |
Sillage ships with no default hotkeys to avoid conflicts. Assign keys in Settings → Hotkeys.
vibe (uses PATH). Set to an absolute path if Obsidian can't find it (common on macOS where ~/.local/bin isn't on Obsidian's PATH).accept-edits.[sillage] prefix. Off by default.Sillage drives vibe with --trust (so vibe doesn't prompt to trust the vault each run) and an Agent setting that controls how much of vibe's tool use is auto-approved:
| Agent | Auto-approves | Use when |
|---|---|---|
accept-edits |
File reads/writes inside the workdir | Default. Note commands and most chat. |
auto-approve |
All tools, including bash / shell | You're running a skill you trust that needs to run scripts or git commit (e.g. organize-daily if it commits). |
default |
Nothing — every tool call prompts | Effectively unusable in programmatic mode; included for completeness. |
Use auto-approve deliberately. Every chat send and every user-invocable skill discovered under .agents/skills/ will run with the configured agent. With auto-approve, vibe can execute arbitrary shell commands without confirmation — only enable it for skills you have read and trust.
Sillage's integration with the vibe CLI requires capabilities beyond the standard Obsidian plugin sandbox. The full list:
child_process.spawn). Sillage spawns the user-configured vibe binary as a subprocess. The argv is built from settings and the user's prompt; the prompt is passed as a single --prompt argument and is never interpolated into a shell command line. See How Sillage runs vibe for the exact arguments and environment. No other binary is ever launched.fs.promises). Sillage reads (never writes) $VIBE_HOME/logs/session/*/meta.json — defaults to ~/.vibe/logs/session/ — to recover the most recent session_id and per-session cost after a chat send. This is the only filesystem path outside the vault that Sillage touches. All in-vault file access goes through the Obsidian vault API.navigator.clipboard.writeText). The "Copy" button on each assistant chat bubble writes that bubble's text to the system clipboard. It only fires from an explicit user click and only copies content already visible in the chat panel.Sillage does not open network connections, install or update binaries, modify host configuration, or read the clipboard.
Sillage runs locally and never opens its own network connection. But every command shells out to vibe, and vibe sends the prompt (and any tool-read file content) to Mistral's API. Concretely:
vibe reads via its tools is sent as tool output.If you keep secrets in your vault (credentials, private journals), be deliberate about which commands you run on which notes. The Max price setting caps cost; it does not cap what data is shared.
Session metadata and full transcripts are also written locally to $VIBE_HOME/logs/session/ by vibe itself (defaults to ~/.vibe/logs/session/). Sillage reads from this directory to capture session_id and cost; it does not write there.
Sillage invokes vibe via Node's child_process.spawn. The argv is deterministic and never includes shell metacharacters from note content — the prompt is passed as a single --prompt argument, not through a shell.
Flags always passed:
--agent <setting value> — see Security.--trust — skips vibe's per-invocation "trust this folder?" prompt. The vault is implicitly trusted by being open in Obsidian.--max-turns N, --max-price $D — agent loop and cost caps from settings.--output text for one-shot note commands; --output streaming (NDJSON, one JSON message per line) for chat.--prompt "<text>" — the prompt body, including your note or selection content.--resume <session_id> for chat continuation when a prior session is still on disk; absent on the first turn or when the prior session has aged out.Subprocess behavior:
cwd is the vault root, so vibe's file tools resolve to vault paths.stdio: ["ignore", "pipe", "pipe"] — stdin is closed (vibe hangs indefinitely if left open in --prompt mode).env inherits the user's environment, with PATH augmented to include ~/.local/bin, /opt/homebrew/bin, /usr/local/bin so a bare vibe resolves on macOS even when Obsidian launches without a login-shell PATH.onunload sends SIGTERM to any still running, then SIGKILL 2 seconds later.What Sillage does NOT do:
vibe.$VIBE_HOME or vibe's config. It only reads $VIBE_HOME/logs/session/*/meta.json for session_id and cost.If vibe is missing (ENOENT), the user gets a Notice naming the configured path and pointing to settings. Non-zero exits with an unrecognized stop event surface as error bubbles in chat or error notices for note commands.
npm install
npm run dev # esbuild watch
npm run build # tsc check + production bundle
Symlink the project dir into a test vault's .obsidian/plugins/sillage/. Reload the plugin in Obsidian after each rebuild.
DevTools (Cmd/Ctrl+Opt+I) is the debugging surface — Sillage logs subprocess lifecycle, vibe stderr, skill discovery, and watcher events with the [sillage] prefix.
.agents/. Some vault configurations skip dotfolders, in which case vault events won't fire for .agents/skills/*/SKILL.md. Run Reload skills from the command palette after editing skills to force a rescan.session_id is captured by scanning $VIBE_HOME/logs/session/. If a session ages out of that directory between runs, Sillage falls back to a fresh vibe session (your visible chat history is preserved, but vibe loses its memory of the prior turns).session_cost. If you mix vibe --resume from a terminal with the chat panel, the delta can briefly look wrong on the next turn.Tag-push triggers .github/workflows/release.yml, which builds and creates a draft GitHub release with main.js, manifest.json, and styles.css attached.
# bump manifest.json and package.json versions, then:
git tag 0.2.0
git push origin 0.2.0
# review the draft on GitHub, edit notes, publish
MIT — see LICENSE.