Personal Obsidian vault for a builder running multiple projects in parallel. Combines two patterns:
- Operational layer — projects, ideas, meetings, people (inspired by obsidian-mind)
- Knowledge layer — raw sources → distilled wiki pages (inspired by Andrej Karpathy's LLM Wiki)
Maintained jointly by the human and Claude Code.
- Clone and open in Obsidian — point Obsidian at the repo root.
- Enable the Bases core plugin (Settings → Core plugins → Bases).
- Open
Builder/Home.md— this is your entry point. - Populate
Builder/Brain/North Star.mdwith current focus and active projects (Claude reads this at every session start). - Launch Claude Code from the repo root:
cd <repo> && claude. - Run
/standup— your first morning kickoff.
pd/
├── CLAUDE.md ← Claude Code operating manual (auto-loaded)
├── README.md ← this file
├── .gitignore
├── .claude/ ← hooks, slash commands, scripts
│ ├── settings.json
│ ├── commands/ ← 18 slash commands
│ └── scripts/ ← session-start, classify-message, validate-write, stop-reminder
├── .obsidian/ ← Obsidian config
│
└── Builder/ ← all your content
├── Home.md ← entry point with dashboard links
├── Brain/ ← Claude's operational memory
│ ├── North Star.md ← living goals document
│ ├── Memories.md ← topic index
│ ├── Patterns.md
│ ├── Gotchas.md
│ ├── Key Decisions.md
│ └── Skills.md ← slash command registry
├── Projects/
│ ├── active/<slug>/ ← index.md, decisions/, notes/, raw/, wiki/, log.md
│ ├── paused/<slug>/
│ └── archive/YYYY/<slug>/
├── Ideas/
│ ├── inbox.md ← quick-capture one-liners
│ ├── active/ ← being explored
│ ├── parked/ ← not now
│ ├── shipped/ ← promoted to a project
│ └── killed/ ← dropped with a reason
├── Meetings/
│ ├── inbox/ ← drop raw transcripts, run /meeting-intake
│ ├── 1-1/, team/, external/
├── People/<Name>.md
├── Teams/<Team>.md
├── Knowledge/ ← cross-cutting Karpathy wiki
│ ├── index.md ← TOC
│ ├── log.md ← append-only ingest record
│ ├── raw/ ← immutable sources
│ └── concepts/ ← distilled concept pages
├── Thinking/ ← scratchpads — promote then delete
├── Templates/ ← 9 note templates
└── Bases/ ← 6 dashboards
Operational layer — projects, ideas, meetings, people. What you're doing and with whom.
Knowledge layer — raw sources distilled into concept pages. What you're learning. Every project has its own raw/ + wiki/. Cross-cutting concepts live in Builder/Knowledge/.
/standup
Reads North Star, active projects, inbox counts, stale flags, open decisions. Presents concrete priorities. Read-only — no writes.
/dump <anything>
Freeform capture. Claude classifies (idea / decision / meeting / project update / person observation / gotcha) and routes to the right note with the right template.
| Situation | Command |
|---|---|
| New source document to distill | /ingest <path> |
Meeting notes piled up in Meetings/inbox/ |
/meeting-intake |
| Idea inbox crowded | /idea-triage |
| Starting a new project | /project-new <slug> |
| Structured ideation session | /brainstorm <topic> |
| Prep for a meeting | /meeting-prep <topic> |
| Prep for a 1:1 | /1-1-prep <Person> |
| Capture a meeting | /meeting-capture or /1-1-capture <Person> |
| Check project state | /project-status <slug> |
| Weekly cross-project review | /weekly |
| End of session | /wrap-up |
| Wiki health check | /wiki-lint |
| Full vault audit | /vault-audit |
| Archive completed project | /project-archive <slug> |
Full list: Builder/Brain/Skills.md.
You've been thinking about an idea long enough. Time to commit:
You: /project-new auth-refactor
Claude: [asks] Project name?
You: Auth Refactor
Claude: One-line description?
You: Replace session-token middleware with short-lived JWT + refresh flow
Claude: North star — what does done look like?
You: All auth flows migrated, legacy middleware deleted, zero prod incidents
during rollout
Claude: Collaborators? (will create missing person notes)
You: Sarah Chen, Priya Patel
Result on disk:
Builder/Projects/active/auth-refactor/
index.md ← hub with status, north star, collaborators, milestones
log.md ← "2026-04-15 — Project created. North star: ..."
decisions/ ← empty
notes/ ← empty
raw/ ← drop source docs here
wiki/ ← concept pages will land here from /ingest
Claude also links the project from Brain/North Star.md and creates People/Sarah Chen.md and People/Priya Patel.md if missing.
You just finished a call and your head is full:
You: /dump Sarah says the rate-limiter is crashing under the new JWT flow,
needs a decision on whether we roll back or forward-fix. She also
mentioned her team is hiring a staff eng. And idea: what if we move
auth entirely to edge workers instead of the app layer?
Claude splits this into 3 items and asks about each:
Routed:
- [[Projects/active/auth-refactor/decisions/rate-limiter-crash-rollback-vs-forward-fix]]
(new decision record, status: proposed)
- [[People/Sarah Chen]] ← appended under Key moments:
"2026-04-15 — her team hiring a staff eng"
- [[Ideas/inbox]] ← "2026-04-15 — move auth entirely to edge workers
instead of app layer"
Every item is linked, no note is orphaned, and decisions are tracked where they belong.
You drop a PDF into a project's raw/:
cp ~/Downloads/jwt-best-practices-2025.pdf \
Builder/Projects/active/auth-refactor/raw/
Then:
You: /ingest Builder/Projects/active/auth-refactor/raw/jwt-best-practices-2025.pdf
Claude reads the PDF and discusses before writing:
Claude: Extracted 8 key ideas from this source. Before I write anything:
1. JWT claim bloat — authors argue <1KB is the practical ceiling before
header overhead breaks proxies. Candidate for new page.
2. Refresh token rotation — there's an existing [[token-rotation]]
concept in Knowledge/. This source reinforces it + adds evidence.
3. Edge-case: clock skew between issuer and verifier. No existing page.
...
Proposed:
- Create: jwt-claim-size, clock-skew-in-jwt, jwt-vs-sessions
- Update: token-rotation (add citation), refresh-flow-patterns
- Skip: #5 (covered adequately by existing page)
Does this scope match what you want to capture?
Only after you confirm does Claude write the wiki pages, each with (source: raw/jwt-best-practices-2025.pdf) citations on every factual claim, and append to Knowledge/log.md (or the project's wiki log).
Shower thought:
You: /idea what if the rate limiter lived in a sidecar instead of middleware
One file appended. No classification, no friction:
Captured → [[Ideas/inbox]]
A week later, your inbox has 9 items. Time to triage:
You: /idea-triage
Claude: [shows idea 1/9]
"- 2026-04-10 — what if the rate limiter lived in a sidecar instead of middleware"
Active (a) / Parked (p) / Killed (k) / Ship to project (s) / Skip?
You: p
Claude: Trigger condition for revisiting?
You: when we see rate limiter memory pressure in prod
Ideas end up in one of four states — none linger untriaged.
It's 10 minutes before your 1:1 with Sarah:
You: /1-1-prep Sarah Chen
Claude reads People/Sarah Chen.md, finds the most recent 1:1 in Meetings/1-1/, scans meetings she attended since, and produces:
## 1:1 prep: Sarah Chen (2026-04-15)
**Role**: Senior Backend Engineer, Platform team
**Last 1:1**: 2026-04-01 (14 days ago)
**Open from last time**
- [ ] My commit: unblock her staging env access — DONE?
- [ ] Her commit: draft RFC on token rotation — status?
**What she's been doing**
- Projects: [[auth-refactor]] (3 meetings since last 1:1)
- Recent decision: [[rate-limiter-rollback]] — her rollback call
**Themes worth surfacing**
1. She's been leading the rate-limiter incident response — check how
she's feeling about the on-call load
2. RFC draft is overdue; is she blocked or just busy?
3. She mentioned hiring a staff eng last dump — worth asking how her
team composition is shaping up
**Suggested agenda**
1. Check-ins on open commits
2. Rate limiter — forward-fix vs rollback, her POV
3. RFC status & blockers
4. Her open questions
Present, don't write. The actual 1:1 note comes from /1-1-capture after the meeting.
You: wrapping up
Claude: [auto-invokes /wrap-up]
## Session wrap-up
**Created**: 4 files
- [[Projects/active/auth-refactor/index]]
- [[Projects/active/auth-refactor/decisions/rate-limiter-rollback]]
- [[People/Sarah Chen]]
- [[Ideas/inbox]] (1 new entry)
**Orphans fixed**: 0 (all new notes linked)
**Learnings promoted**:
- [[Brain/Key Decisions]] ← rate-limiter rollback (significant)
**Suggested North Star updates**:
- Add [[auth-refactor]] under "Active Projects" (new this session)
**Queued for next session**:
- /meeting-intake (2 inbox files)
18 commands, all in .claude/commands/:
| Category | Commands |
|---|---|
| Session | standup, wrap-up, weekly |
| Capture | dump, idea, idea-triage, brainstorm |
| Projects | project-new, project-status, project-archive |
| Meetings | meeting-prep, meeting-capture, meeting-intake, 1-1-prep, 1-1-capture |
| Knowledge | ingest, wiki-lint |
| Maintenance | vault-audit |
Each command file contains: frontmatter description, step-by-step instructions, output format, and explicit rules.
Run automatically — you don't invoke them.
| Hook | When | What it does |
|---|---|---|
SessionStart |
Session begins | Injects date, North Star focus, active projects with last-touched, inbox counts, recent changes, stale-project flags |
UserPromptSubmit |
Every message | Scans for project/person name matches and signals (decision, idea, gotcha, meeting, wrap-up) → surfaces routing hints |
PostToolUse |
After Write/Edit on .md |
Validates frontmatter (date, description, tags) and warns on missing wikilinks |
Stop |
Session ends | Nudges toward /wrap-up if ≥3 notes touched in the last hour |
All scripts: .claude/scripts/.
Nine templates, each with filled-in frontmatter and section scaffolding:
Project Hub.md— forProjects/active/<slug>/index.mdProject Note.md— forProjects/active/<slug>/notes/*.mdDecision Record.mdMeeting Note.md— team / external1-1 Note.md— for 1:1sPerson.md— forPeople/*.mdIdea.md— forIdeas/{active,parked,killed,shipped}/*.mdWiki Concept.md— Karpathy-style concept pagesThinking Note.md— scratchpads
Install the Templates core plugin (or Templater) and point it at Builder/Templates/.
Enable the Bases core plugin. Six live dashboards:
- Active Projects — status, started, last touched, days-since-touch
- Stale Projects — active projects idle >14 days
- Open Decisions —
status: proposedacross all projects - Idea Pipeline — grouped by status (inbox/active/parked/shipped/killed)
- Meetings This Week — last 7 days
- People Directory — all people, plus "haven't talked to in 30+ days" view
Click any from Home.md or embed inline with ![[Builder/Bases/Active Projects]].
- Graph-first, not folder-first. A note without links is a bug. Prefer
[[wikilinks]]over markdown links. - Every claim cites its source (Karpathy rule):
(source: raw/file.pdf). - Atomicity. One concept per note. If a note has 3+ independent sections, split it.
raw/is immutable. Never modify source documents.- Discuss before writing when ingesting sources. A 10-page PDF touching 15 wiki pages is normal — align on scope first.
- Frontmatter on every note. At minimum
date,description(~150 chars),tags. Type-specific fields inCLAUDE.md. - Zero data loss. Reorganize with
git mv. Never delete without explicit confirmation.
Durable memory lives in Builder/Brain/ topic notes (git-tracked, linked, browsable in Obsidian). The Claude Code ~/.claude/.../MEMORY.md index is just pointers — never store content there.
When you tell Claude to "remember X":
- Claude finds or creates the right
Builder/Brain/topic note. - Writes the knowledge there with a
[[wikilink]]to context. - Updates
Builder/Brain/Memories.mdif a new topic note was created.
The repo is set up for standard Git. First-time setup:
cd <repo-root>
git init
git add .
git commit -m "Initial vault"
git remote add origin <your-repo-url>
git branch -M main
git push -u origin mainDay-to-day sync is manual. Claude will not auto-commit. Use obsidian-git plugin if you want automated syncing.
The included .gitignore excludes Obsidian workspace state, OS cruft, and common attachment types you may not want to track.
Claude Code ships with a built-in Google Calendar MCP connector. Connect it once to give Claude read/write access to your calendar inside this vault.
Setup
- In Claude Code, run
/mcp. - Select claude.ai Google Calendar from the list.
- Authorize in your browser.
- Done — calendar tools (list events, create, search, update) are now available in every session.
How it's wired into vault workflows
| Command | Uses calendar for |
|---|---|
/standup |
Lists today's meetings inline with project priorities |
/meeting-prep |
Auto-detects your next meeting if no topic is given |
/1-1-prep <Person> |
Finds the upcoming 1:1 on the calendar, matches attendees to People/ notes, and times the brief to the meeting |
/weekly |
Includes next week's meeting load in the synthesis |
SessionStart hook |
Can surface "next meeting in N minutes" if within the hour (opt-in — not enabled by default) |
Example
You: /1-1-prep
Claude: Found upcoming 1:1 — "Sarah Chen / weekly" at 14:00 today (in 37 minutes).
Running /1-1-prep Sarah Chen...
[normal 1:1-prep output]
Privacy note
Calendar data is read at request time and passed into Claude's context for that session. Nothing is persisted to the vault unless you explicitly capture it (e.g., /meeting-capture after the meeting). Attendee email addresses are used only to match against People/ frontmatter — they are not written to notes.
Disconnecting
Run /mcp → select the connector → disconnect. Calendar tools disappear immediately.
Hook script not running
- Check
.claude/settings.jsonpaths are absolute and correct. - Verify scripts are executable:
ls -l .claude/scripts/— should showrwx. - Test a script manually:
bash .claude/scripts/session-start.sh.
Bases dashboard shows nothing
- Confirm the Bases core plugin is enabled.
- Queries use
Builder/prefix because Obsidian's vault root is the repo root. If you renameBuilder/, updatefile.inFolder("Builder/...")in each.basefile.
Wikilinks not resolving
- Filenames are globally unique across the vault —
[[North Star]]works from anywhere. - Path-scoped links like
[[Builder/Bases/Active Projects]]are relative to the vault root.
Frontmatter warnings after editing
- The
PostToolUsehook warns on missingdate,description,tags, or missing wikilinks. Fix and move on — warnings don't block.
- Add a slash command: drop a new
<name>.mdin.claude/commands/with frontmatterdescription:and a markdown body describing steps. Register it inBuilder/Brain/Skills.md. - Add a Base: create a
.basefile inBuilder/Bases/. Usefile.inFolder("Builder/...")for queries. Link it fromHome.md. - Add a template: drop a new
<Type>.mdinBuilder/Templates/with{{placeholder}}fields. Document it inCLAUDE.md. - Add a hook: write a script in
.claude/scripts/, register it in.claude/settings.jsonunder the appropriate event.
- Andrej Karpathy — LLM Wiki — the raw → wiki pattern, citation discipline, discuss-before-write, append-only log.
- obsidian-mind — atomic notes, graph-first thinking, slash commands, hooks, and the memory system pattern.
- Obsidian — the underlying note-taking app.
- Claude Code — the AI agent that maintains this vault alongside you.
- Obsidian Bases — the dynamic query system powering dashboards.
See CLAUDE.md for the full agent operating manual.