Project Info
##
Inspiration
Every developer who juggles multiple LLM subscriptions has hit the same wall: you're deep in a Claude Code session, you've made dozens of decisions, debugged a subtle constraint, and established a clear direction — and then the session limit hits. The standard fix is asking the model to "summarize what we discussed," but that summary is generated at the worst possible moment: late, under context pressure, from a degraded view of its own history. LLMs attend well to the start and end of long contexts; the middle — often where the most important reasoning happened — gets fuzzy. The summary becomes a prediction about what probably happened, not a reliable record of what did. We built VaultMind because there is no clean, reliable way to hand off a working session from one LLM to another, and we wanted to fix that at the infrastructure level, not just paper over it. ##
What it does
VaultMind gives any LLM a persistent, structured memory that is fully transferable to any other LLM, without late-stage summarization. As a developer works in Claude Code or Codex CLI, a lightweight background watcher picks up each completed turn via Stop/SessionEnd hooks. After every turn: A Scribe Agent extracts what just happened (decisions, constraints, goals, open questions) while the content is still fresh, before any context decay sets in. A Note Creator Agent structures that extraction into a Markdown node and writes it to an Obsidian-compatible vault living directly in the project git repo. A Connector Agent links related nodes together — using both keyword heuristics and Redis vector search — building a real knowledge graph. A Fetch.AI uAgent Orchestrator coordinates the pipeline and exposes project state and handoffs over ASI:One. When the developer hits a session limit or wants to switch to Gemini (or a fresh Claude Code session), they open the VaultMind web app, review the live graph in a trust interface, and confirm. The receiving agent reads the vault's .md files directly from disk. No serialization, no synthesis, no re-summarization. It picks up with the same structured context the first agent built. Two small deterministic files anchor every handoff: VaultIndex.md (a map of the vault structure) and IntentLog.md (a running, append-only log of what the developer wants each session to accomplish, in their own words). ##
How we built it
We approached this as an infrastructure problem first, and engineered the seams before writing a single line of production code. Stack: Python — Stop/SessionEnd hooks, the agent pipeline (Scribe, Note Creator, Connector), and the single shared scanForSecrets() regex utility Claude (claude-sonnet-4-6) — structured JSON extraction via the Anthropic Messages API across all three generative agents, plus per-hunk merge-conflict recommendations Fetch.AI uAgents — the Orchestrator, published on Agentverse with the Agent Chat Protocol, usable via ASI:One; bridged to the web app through a small Flask service Redis Stack (Streams + Pub/Sub + RediSearch) — the hook-to-watcher work queue and the pipeline-to-web-app live event bus; the same instance serves vector search (RedisVL + all-MiniLM-L6-v2, 384-dim, fully offline) for semantic memory Next.js 15 (App Router) + React 19 — full-stack web app with Server-Sent Events for live graph updates, no separate Express server Custom SVG knowledge graph — a hand-built, dependency-free live visualization of nodes and their related links, with dark/light theming Arize + OpenTelemetry — tracing across all three LLM call sites (Scribe, Connector, Orchestrator) feeding one end-to-end evaluator that checks the full chain: did the extracted node accurately reflect the source turn, are the links relevant, does anything downstream drift from what's in the vault? Devin Cloud — the three backend streams (P1 ingestion, P2 extraction/writing, P3 linking + Orchestrator) ran as parallel Devin Cloud sessions against the frozen spec seams, with human checkpoint review at every bucket boundary via Devin Review. P4 (the web app) stayed human-driven throughout. ##
Challenges we ran into
The late-summarization trap is subtler than it looks. Our earliest instinct was to have agents summarize more aggressively, but every time we pulled on that thread, we ended up recreating the exact failure mode we were trying to eliminate. The insight that unlocked the design: compressing a small fresh thing well is a fundamentally easier problem than compressing a large stale thing well. Per-turn extraction from a fresh, verbatim turn is tractable; one big compression of a degraded context window is not. Claude Code's own auto-compaction. Claude Code marks a compact_boundary event in its transcript when it runs low on context. Our Scribe Agent reads from the literal transcript, not Claude Code's internal context, so compaction doesn't corrupt the vault directly. But nodes extracted from turns shortly after a compaction boundary may accurately reflect what Claude said while Claude was already working from a thinner-than-usual memory. Our solution: flag, never infer or repair. A warning: Context compacted at [timestamp] entry goes into SessionState.md, and affected nodes get a subtle marker in the trust interface. We deliberately do not try to reconstruct what Claude may have lost — that would mean asking an AI to fill another AI's memory gap, which is exactly the generative risk this architecture is designed to avoid. Secret protection had a real gap. An early version claimed secrets "always block both the commit and any handoff," but the only mechanism described was a git pre-commit hook — which by definition cannot fire on a handoff (no commit is involved). In Auto Mode specifically, a developer could hit Handoff without ever running git commit. The fix: scanForSecrets(content) is one shared regex utility called from three independent call sites — write-time, commit-time, and handoff-time. All three use the same pattern list. All three are deterministic and instant. The handoff trigger runs the check before proceeding, independent of git entirely. Orchestrator round-trip latency. An early draft had every step bouncing back through the Orchestrator after each stage, creating multiple sequential network round-trips before a single node was even visible. The fix was not collapsing Scribe, Note Creator, and Connector into one call (which would re-concentrate exactly the unverifiable judgment we split them apart to avoid). Instead, Note Creator and Connector chain directly to each other for the fast, deterministic steps; the Orchestrator is invoked to kick off the pipeline and handle cross-turn coordination, not to broker every single hop. IntentLog.md authorship. The intent log is meant to carry the developer's own words with zero hallucination risk. Allowing the AI to detect mid-session focus shifts and write to this file in Auto Mode is a real tradeoff: the developer trades the no-AI-writes guarantee for less friction. We resolved this by making it explicitly mode-dependent (consistent with the Auto/Review split that already governs the rest of the system) — and any AI-written entry is labeled ai-detected — rather than glossing over the tradeoff. ##
Accomplishments we're proud of
A handoff that actually works. A developer can be mid-session in Claude Code, hit a session limit, confirm the handoff, and have Gemini (or a fresh Claude session) pick up with full structured context — no re-explanation, no copy-pasting summaries. Honest architecture. Every design decision in VaultMind has a documented rationale and a documented tradeoff. We caught our own gaps — the secret-protection hole, the Orchestrator latency problem, the IntentLog authorship question — before they became bugs. Sponsor integrations that reinforce the product. Redis vector search is the actual semantic search feature we needed. The Orchestrator's Agentverse registration is a real secondary interface, not a token integration. Arize tracing feeds one evaluator watching the whole pipeline end-to-end, verifying the system meets its own stated bar rather than just asserting it. Devin Cloud literally built the three backend streams in parallel against the same frozen seams that make VaultMind's own architecture safe. The Devin meta-story. VaultMind's premise — careful, structured, verifiable handoff beats one big unverifiable one — is exactly the discipline that makes Devin's parallel cloud sessions safe to run unattended. The project doesn't just use Devin; it demonstrates the same principle Devin's own architecture is built on. ##
What we learned
The most durable lesson: the failure mode that makes context handoff unreliable isn't compression per se — it's one large, late, unverifiable compression of an entire degraded conversation. Replace that with many small, immediate, high-fidelity extractions from fresh single turns, and the whole character of the problem changes. A single imperfect node doesn't sink the handoff; the surrounding nodes and links still carry real signal, and the user can see and fix any node before it reaches a receiving agent. We also learned that externalizing plan and progress state to deterministic files that survive compaction (SessionState.md, IntentLog.md) is already established practice among heavy Claude Code users. VaultMind formalizes that pattern rather than inventing it from nothing — which is a feature, not a limitation. And practically: frozen byte-level contracts at every seam boundary aren't just good practice for a four-person team under time pressure — they're the literal precondition for safely handing work to autonomous parallel agents. An ambiguous spec is fine when a human can ask a clarifying question mid-build. It's a real risk when cloud sessions run unattended against a shared repo. ##
What's next
for VaultMind Dynamic VaultIndex.md — a deterministic graph traversal (breadth-first from the most recently active node) surfacing the 3–5 most connected/recent nodes, giving receiving agents a sharper entry point than a static vault map. Team support — the vault already lives in the shared repo, so multiple developers naturally contribute to the same knowledge graph. The merge-conflict UI exists; we want to polish the multi-author experience into a first-class feature. Broader CLI support — extending hooks beyond Claude Code and Codex to any tool that exposes a session transcript. Arize feedback loops — the one end-to-end evaluator we shipped covers the full pipeline; we want to use what it surfaces to drive automated prompt refinement across sessions, closing the loop between tracing and improvement systematically rather than manually.
VaultMind
Persistent, structured project memory in Obsidian-compatible Markdown. All transferable between LLM tools (Claude Code, Codex, Gemini) without needing late-stage summarization.
A multi-agent pipeline watches your Claude Code / Codex sessions and writes a git-native vault of decisions, constraints, goals, and questions as you work. A Next.js web app lets you review, approve, and hand off that vault to a receiving agent. A Fetch.AI Orchestrator uAgent sits on ASI:One so you can query project state or trigger handoff via natural language.
Architecture
Claude Code / Codex hooks
│ Stop / SessionEnd
▼
Python watcher ──(Redis Streams)──► Scribe → Note Creator → Connector
│ │
│ vault/nodes/*.md (disk)
│ │
└──────────────────(Redis pub/sub)──────────────────────────► SSE
│
Next.js app
(port 3000)
Orchestrator uAgent (Fetch.AI / ASI:One)
Stack: Python 3.11+ · Next.js 15 / React 19 · Redis (Streams + pub/sub + vector) · Fetch.AI uAgents · Arize (LLM observability)
Prerequisites
| Tool | Minimum version | Notes |
|---|---|---|
| Python | 3.11 | pipeline + hooks |
| Node.js | 18 | webapp |
| Docker | any recent | Redis via docker compose |
| Git | any | pre-commit hook for secret scanning |
Quickstart (running the product)
-
Clone and install
git clone <repo-url> cd vault_mind pip install -e . cd webapp && npm install && cd ..
The -e flag installs the Python package in editable mode, so changes you make to the source are picked up immediately without reinstalling.
-
Set environment variables
Copy the example and fill in your keys:
cp .env.example .envRequired:
ANTHROPIC_API_KEY=sk-ant-... # Scribe extraction + evaluator judge ARIZE_SPACE_KEY=... # Arize LLM observability ARIZE_API_KEY=... # Arize LLM observability REDIS_URL=redis://localhost:6379 # default; change if using external RedisOptional:
VAULTMIND_VAULT_ROOT=/path/to/vault # defaults to <repo>/vault REPO_ROOT=/path/to/repo # used by webapp conflict resolver
VAULTMIND_VAULT_ROOTis useful if you want the vault to live outside the repo — for example, inside an Obsidian vault you already have open. The app will still track it the same way.
-
Start everything
npm run vaultmind:startThis starts three processes concurrently:
- Redis on port 6379 via
docker compose up -d(RedisInsight UI on port 8001) - Python watcher (
python -m vaultmind.watcher) — pipeline consumer loop - Next.js dev server at http://localhost:3000
- Redis on port 6379 via
-
Wire the hooks
Add the hook configs so VaultMind captures your sessions:
Claude Code —
.claude/settings.json:{ "hooks": { "Stop": [{ "hooks": [{ "type": "command", "command": "python3 .vaultmind/hooks/on_stop.py", "async": true }] }], "SessionEnd": [{ "hooks": [{ "type": "command", "command": "python3 .vaultmind/hooks/on_session_end.py", "async": true }] }] } }Codex —
.codex/hooks.json:{ "hooks": { "Stop": [{ "hooks": [{ "type": "command", "command": "python3 .vaultmind/hooks/on_stop.py" }] }] } } -
Open the app at http://localhost:3000 and start a Claude Code or Codex session — nodes will appear in real time.
Developer setup
Everything above, plus:
-
Install dev dependencies
pip install -e ".[dev]" -
Install the pre-commit hook (blocks commits that contain secrets in
vault/)git config core.hooksPath .git/hooks cp .vaultmind/hooks/pre-commit .git/hooks/pre-commit chmod +x .git/hooks/pre-commit -
Run tests
pytest -
Run the webapp in isolation (without the Python pipeline)
cd webapp npm run dev -
Scan a vault node for secrets manually
python -m vaultmind.secrets vault/nodes/<node>.mdExits 0 always; prints a JSON array of matches (
[]= clean). The pre-commit hook reads this and exits 1 itself if matches are present.
Project structure
vault_mind/
├── vaultmind/ # Python package — pipeline, hooks, agents
│ ├── contracts.py # Pydantic v2 message contracts (frozen — do not edit)
│ ├── secrets.py # scanForSecrets — one implementation
│ ├── watcher.py # Redis Streams consumer loop
│ ├── scribe/ # LLM extraction agent
│ ├── notecreator/ # writes vault/nodes/*.md
│ ├── connector/ # links related nodes
│ ├── orchestrator/ # Fetch.AI uAgent (ASI:One face + handoff)
│ ├── ingest/ # hook → queue producer (P1)
│ ├── evals/ # end-to-end pipeline evaluator
│ └── hooks/ # on_stop.py, on_session_end.py, pre-commit
├── webapp/ # Next.js 15 app (TypeScript, Tailwind, App Router)
│ ├── types.ts # TS contracts mirroring contracts.py (frozen — do not edit)
│ └── src/app/
│ ├── page.tsx # vault live view (SSE)
│ ├── merge/page.tsx # conflict resolution UI
│ └── api/
│ ├── events/ # SSE endpoint → Redis pub/sub
│ └── conflicts/ # conflict list + per-node resolve
├── vault/ # the live vault (git-tracked Markdown)
│ ├── nodes/ # turn-nodes: YYYY-MM-DD-HHMM-<slug>.md
│ ├── IntentLog.md # append-only developer intent
│ ├── SessionState.md # compaction + session-end events
│ └── VaultIndex.md # static read-order map for receiving agents
├── fixtures/ # fixture transcript + fixture vault for tests
├── scripts/start.sh # starts Redis + watcher + Next.js
├── docker-compose.yml # Redis (redis-stack with RedisSearch)
├── pyproject.toml
└── package.json # root — vaultmind:start script
Key rules (enforced by the codebase)
- Disk is the source of truth. Redis events are minimal triggers; the app re-reads files on every event.
- One
scanForSecretsimplementation. Alwaysvaultmind/secrets.py— the webapp shells out to it, never reimplements it. - Node bodies are immutable after write. The Connector edits only frontmatter
related; it never touches the body. - No silent commits or handoffs. Commits are manual; a detected secret blocks both commit and handoff.
IntentLog.mdis the developer's own words. Only Auto Mode may write anai-detectedentry, and it must be labeled as such.
See SPEC.md for the full technical contracts and WORKSTREAMS.md for the build execution plan.
Analysis
View
Metric
- 46
- 34
- 29
- 11
- 9
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- Next.jsIn code
- PythonIn code
- ReactIn code
- RedisIn code
- Tailwind CSSIn code
- TypeScriptIn code
- JavaScriptClaimed
8 of 9 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig · Commits
- CodexConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
804 KB
Source files
102
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
timothyouu/vault_mind
131 files · 1.1 MB · @ f0b50e3
Structure
Interface
9 files · 7%Screens, components and styles rendered to the user.
API & routing
6 files · 5%Request entry points: routes, handlers and controllers.
Application logic
33 files · 25%Domain rules, services and shared utilities.
+10 more
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Python38%
- Markdown33%
- TypeScript29%
- Shell0%
- CSS0%
- YAML0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
vault-mind-orchestrate/requirements.txt
pypi · 42- aiohappyeyeballs
- aiohttp
- aiosignal
- annotated-types
- attrs
- bech32
- certifi
- charset-normalizer
- click
- cosmpy
- distlib
- ecdsa
- filelock
- frozenlist
- googleapis-common-protos
- grpcio
- h11
- idna
- +24 more
webapp/package.json
npm · 12- next
- react
- react-dom
- redis
- +8 more
pyproject.toml
pypi · 11- anthropic
- arize-otel
- opentelemetry-api
- opentelemetry-sdk
- pydantic
- redis
- redisvl
- sentence-transformers
- +3 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.