v4.0 · the editor where agents live
Agents in SoloMD
SoloMD v4.0 turns the workspace into a place where agents work continuously, not just on-demand. Five pillars, all on top of plain markdown files you already own. Every autonomous write goes through an AutoGit branch sandbox you accept or reject before it lands.
1. Inline Agent Panel
A right-side panel, peer to Outline / Backlinks. Streamed
chat-with-vault, routed through the in-process MCP tools and the
existing 14-provider AI stack. Citations resolve to
[[wikilink]] chips that open the cited note in a new
tab. Tool-call cards (Cursor-style) show every read and write
inline — expand a card to see the full args and result.
Run history persists as plain markdown in
<workspace>/.solomd/agent-runs/<ts>.md.
Grep-able. Git-trackable. The opposite of a black box.
- Open with
⌘⇧Aor the right-rail toggle - Active note toggle injects the current document into the system prompt — opt-in, off by default
- Allow write toggle gates
write_noteandappend_to_noteper chat session - 10 in-process agent tools — same surface as the bundled MCP server
2. Scheduled Recipes
A recipe is one YAML file under
<workspace>/.solomd/agents/*.yml. No build step,
no plugin manifest. Edit, save, run. Five trigger modes:
| Trigger | Fires when |
|---|---|
schedule | cron expression matches the current UTC minute |
on-save | a markdown file matching match: is saved (debounced 800ms) |
on-commit | an AutoGit commit lands and touches match: |
on-tag-add | a note gets #tag added that matches tag: |
manual | you click Run now in Settings → Recipes |
Example recipe:
name: Weekly review
trigger: schedule
schedule: "0 18 * * SUN" # cron, UTC
match: "daily/**/*.md"
prompt: |
Read this week's daily/ notes.
Write weekly/{{date:YYYY-WW}}.md: themes / decisions / open threads.
allow-write: true
write-cap: 5
provider: claude
Triggers compose with the safety model below — every run begins on
its own AutoGit branch agent/<recipe>/<run-id>,
and writes are reviewable, not magical.
3. Trace view + replay
Every run (Panel chat or Recipe) emits
<workspace>/.solomd/agent-runs/<run-id>/trace.jsonl
— line-delimited so you can tail -f a long run while
it's still going. Schema: one JSON object per step, with kinds
run_started · prompt ·
model_call · tool_call ·
tool_result · git_commit ·
run_ended. Fields include timestamps, tool args,
truncated results (≤ 2048 chars), token counts, cost estimate.
The UI renders these as collapsible step cards:
- Inline in the Panel after the chat
- Settings → Recipes → History (one entry per run)
- Step-detail drawer for the full result body
- Replay-from-step N mints a new run that re-uses every line up to step N and then re-runs the model. Useful when the model took a bad turn at step 7 and you want to retry the decision with a different prompt.
-
New
read_agent_trace(run_id)MCP tool — agents can now read their own traces, opening the door to self-correcting recipes.
4. Workspace Federation
The bundled solomd-mcp grew a multi-workspace mode in
v4. Pass any number of --workspace flags to bridge
multiple vaults in a single MCP session:
solomd-mcp \
--workspace ~/Vaults/personal \
--workspace ~/Vaults/work \
--workspace ~/Vaults/research
Tool signatures gain an optional workspace param.
Default = first-passed (back-compat). AutoGit branches stay
isolated per workspace. Settings → Integrations adds named
MCP profiles — workspace bundles you can
one-click copy a Claude Desktop config block out of.
Today users open multiple Claude Code sessions to bridge two vaults. v4 makes one session enough.
5. Ollama first-class
We don't bundle a local LLM runtime. Ollama is already in our 14-provider list and does this well — re-implementing it would violate principle #7 (write less code we maintain forever). Instead, v4 polishes the integration:
- Auto-detect Ollama at
localhost:11434with a green status indicator in Settings → AI. - Install Ollama button if it's not detected (links to ollama.com — we don't proxy the download).
/api/tagslists installed models inline; empty list → Pull recommended (qwen2.5:1.5b, ~1 GB) button.- 3 built-in presets: rewrite (qwen2.5:7b) · quick (qwen2.5:1.5b) · CJK-friendly (qwen2.5:14b).
- Recipes can specify
provider: localas a default → cheap autonomous loops on-device.
11 starter recipes
Open Settings → Recipes → Browse cookbook to
install any of these. The YAML copies to
.solomd/agents/ and opens for editing. Re-installable
with auto-suffixed names.
01-weekly-review.yml— Sunday 18:00 UTC, summarizesdaily/*.mdintoweekly/YYYY-WW.md02-todo-extract.yml— on-save scans for- [ ]items, accumulates intotodo.md03-translate-zh-to-en.yml— manual; round-trip translate the active note04-cjk-proofread.yml— on-save Chinese / Japanese / Korean grammar pass via Ollama (provider: local)05-citation-cleanup.yml— on-commit normalizes@citekeyformatting06-meeting-notes-summary.yml— on-tag-add#meetingextracts decisions + action items07-link-suggester.yml— read-only, suggests[[wikilinks]]in the trace view (no writes)08-daily-summary.yml— every night 22:00, write a TL;DR into today's daily note09-orphan-notes.yml— weekly scan for notes with zero backlinks, list them inorphans.md10-on-commit-changelog.yml— on-commit appends a one-line summary toCHANGELOG.md11-tag-classifier.yml— on-save suggests#tagsbased on note content (read-only)
Safety model — the AutoGit sandbox
Every recipe run begins by:
- Creating a fresh AutoGit branch
agent/<recipe-slug>/<run-id>off the current HEAD. - Running the prompt + tool loop. All
write_note/append_to_notecalls land on this branch. - On success the run goes into Pending review with three buttons: View diff, Accept (fast-forward into
main), Reject (delete the branch entirely).
A rejected run vanishes — no merge, no leftover commits in your
history. An accepted run shows up in git log like any
other commit.
The write-cap is enforced before dispatch, so
a model that asks to write 100 files when the cap is 5 will get
refusals starting at the 6th call, with no half-applied state.
Default 5; hard upper bound 50.
Write your own
The full schema, every variable ({{path}},
{{date:YYYY-MM-DD}}, {{files}},
...), every tool the agent can call, and the patterns that
actually work in production live in
docs/agents.md in the repo:
Schema is the source of truth in
app/src-tauri/src/recipes.rs — Rust types, not a paper spec.