Skip to content

feat: omind setup (MCP provisioning) + serve (web UI)#2

Merged
CryptoJones merged 1 commit into
mainfrom
feat/provision-and-web
Jun 3, 2026
Merged

feat: omind setup (MCP provisioning) + serve (web UI)#2
CryptoJones merged 1 commit into
mainfrom
feat/provision-and-web

Conversation

@CryptoJones
Copy link
Copy Markdown
Owner

Closes #1.

Summary

Implements both halves of omind:

  • omind setup — idempotently provisions the OMI/Obsidian obsidian-mcp wiring for the Claude Code CLI: creates the vault's OMI/ folder, seeds the .obsidian/ config + Memory Template.md + index.md, and registers the MCP server at user scope (claude mcp add -s user). Re-runnable: skips when the registered path already matches, re-registers when it differs. Supports --vault, --folder, --server-name, --dry-run, --force.
  • omind serve — a FastAPI + Tailwind localhost web app to view, add, and edit OMI memory entries. Card-catalog aesthetic, structured-form editing with a raw-markdown fallback, client-side markdown render with clickable [[wikilinks]] and #tags. JSON API with path-traversal-safe file I/O.

Layout

  • provision.py — the setup logic (prereq checks, vault/config/seed creation, idempotent MCP registration, verify).
  • store.py — framework-free markdown note CRUD + Memory-Template parse/render + index.md maintenance + traversal guard.
  • web/app.py + web/static/ — FastAPI routes + the single-page UI.
  • seeds.py — the captured .obsidian JSON + template/index constants.
  • cli.py — argparse subcommands.

Test plan

  • ruff check . — clean
  • mypy src (--strict) — clean across 8 source files
  • pytest -v — 40 passed (store round-trip/sanitization/traversal, provision idempotency/dry-run/missing-prereq, web CRUD + traversal rejection)
  • End-to-end: omind setup against a throwaway vault → claude mcp get shows Connected; re-run idempotent; omind serve serves the UI and CRUD works
  • Wheel bundles the static UI assets (non-editable install serves the SPA)

Proudly Made in Nebraska. Go Big Red! 🌽 https://xkcd.com/2347/

Build out the two omind subcommands on top of the project skeleton.

setup: idempotently provisions the obsidian-mcp server for the Claude
Code CLI at user scope. Seeds an OMI folder (.obsidian config + Memory
Template + index), never clobbering existing files, and only
(re)registers the MCP server when the resolved path differs. Supports
--vault/--folder/--server-name/--dry-run/--force, fails fast on missing
node/npx/claude, and rejects a .obsidian path that is a file.

serve: a localhost FastAPI app exposing JSON CRUD over the OMI markdown
notes, fronted by a static card-catalog SPA (Tailwind + vanilla JS,
Fraunces/Newsreader/JetBrains Mono). store.py does framework-free file
I/O with a template parse/render round-trip, automatic index.md
maintenance, and a path-traversal guard (safe_name) that every
read/write/delete routes through.

Covered by 40 tests (parse/render round-trip, filename sanitization,
traversal rejection, provision idempotency/dry-run/prereq/bad-layout,
and web CRUD + traversal). ruff, mypy --strict, and pytest all green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@CryptoJones CryptoJones merged commit 72b6b49 into main Jun 3, 2026
3 checks passed
@CryptoJones CryptoJones deleted the feat/provision-and-web branch June 3, 2026 16:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement omind setup + serve (MCP provisioning + memory web UI)

1 participant