CLAUDE.md
Schema for LLM wiki maintenance. Obsidian is the IDE; Claude is the programmer; this vault is the codebase.
What This Repo Is
Obsidian personal knowledge base ("second brain") backed by Git. Not software project — no build steps, tests, package managers. Content in Markdown, synced to GitHub via Obsidian Git plugin (auto timestamped backup commits).
Remote: git@github.com:vatsal30/Obsidian_backup.git
Content Organization
Top-level dirs map to technical domains:
| Directory | Purpose |
|---|---|
AI & ML/ | LLMs, Langchain, MCP notes |
DSA/ | Data structures, algorithms, interview prep |
SQL/ | SQL interview prep — joins, window functions, CTEs, indexes |
FrontEnd/ | JavaScript, React |
Python/ | Core Python, libraries |
System Design/ | Backend patterns, architecture diagrams |
Go/ | Go language docs |
AWS/ | Cloud services |
Work/ | Work-related learning (WebdriverIO, etc.) |
Private/ | Personal roadmap, investments, interview prep (not synced publicly) |
Site Content/ | Homepage content for "Vatsal's Notebook" |
Uncategorized/ | Notes not yet categorized |
Private/ Sub-structure
Private/Project_2026/ — active personal tracking:
Daily Tracker/— daily notes/logsWeekly Tracker/— weekly review notesMonthly Tracker/— monthly review notesPersonal/— investment tracker, personal goalsWork/Projects/— work project notes (e.g., Personal Portfolio)
Private/Archive/ — old task lists, roadmaps, completed sprint notes moved here when superseded.
File Conventions
Frontmatter — all notes use YAML frontmatter:
---
title: "Title"
category: "Category"
date: "YYYY-MM-DD"
tags: ["tag1", "tag2"]
---
Naming — Title Case or PascalCase (e.g., Dynamic Programming.md, JavaScript.md). Diagrams use Excalidraw format (.excalidraw.md).
.gitignore excludes .obsidian/workspace.json, .obsidian/workspace-mobile.json, .trash/, .DS_Store.
Git Workflow
- Obsidian Git auto-commits with messages like
vault backup: YYYY-MM-DD HH:MM:SS - Manual commits:
chore: ...,feat: ... - Don't amend automated backup commits
Mermaid Diagrams
- Use
<br/>for line breaks inside node labels — never\n - Example:
Node[Line 1<br/>Line 2]✅ —Node[Line 1\nLine 2]❌
Installed Community Plugins
- obsidian-tasks-plugin — tasks use
- [ ]syntax with due dates (📅 YYYY-MM-DD) - obsidian-excalidraw-plugin — diagrams as
.excalidraw.mdfiles - obsidian-local-rest-api — vault via local HTTP API (port 27123 default)
- calendar — daily/weekly notes integration
- table-editor-obsidian — GFM table editing
- obsidian-importer — import from other formats; no ongoing structural impact
- vscode-editor — VS Code keybindings in Obsidian
- obsidian-style-settings — theme customization; no content impact
Three-Layer Wiki Architecture
Layer 1 — Raw Sources (raw/): Immutable. Web clips, articles, papers, PDFs. LLM reads, never modifies. Frontmatter: source_url, date_clipped, ingested: true/false.
Layer 2 — Wiki (domain dirs + synthesis/): LLM-owned. Domain notes (Go/, DSA/, etc.) + cross-domain synthesis pages. LLM creates and updates. Human reads.
Layer 3 — Schema (this file): Conventions + workflows. Human + LLM co-evolve over time.
Navigation files (always update):
index.md— catalog of all pages, one-line summary per page. Read first when querying.log.md— append-only operation history. Format:## [YYYY-MM-DD] action | description.
Operations
Ingest
When user drops a source in raw/ and says "process this":
- Read source file
- Discuss key takeaways with user
- Write summary page in appropriate domain dir (or
synthesis/if cross-domain) - Update relevant existing pages (add cross-refs, update synthesis pages)
- Set
ingested: truein source frontmatter - Update
index.md— add new page, incrementpage_count - Append to
log.md:## [date] ingest | Source Title
One source may touch 5–15 wiki pages. That's expected.
Query
When user asks a question against the wiki:
- Read
index.mdfirst — find relevant pages - Read those pages
- Synthesize answer with
[[page]]citations - If answer is valuable (comparison, analysis, new connection) → file it as new wiki page
- Update
index.mdif new page created - Append to
log.md:## [date] query | Question summary
Lint
When user says "lint the wiki" or "health check": Check for:
- Orphan pages (no inbound
[[links]]) - Stale claims superseded by newer content
- Concepts mentioned across pages but lacking own page
- Missing cross-references between related pages
- DSA/SD gaps vs job switch plan milestones
- Synthesis pages that need updating from new domain content
Append to log.md: ## [date] lint | Issues found: N
Wiki Page Frontmatter
Domain pages (Go/, DSA/, etc.):
---
title: "Title"
category: "Category"
date: "YYYY-MM-DD"
tags: ["tag1", "tag2"]
---
Synthesis pages (synthesis/):
---
title: "Title"
type: "synthesis"
category: "synthesis"
date: "YYYY-MM-DD"
last_updated: "YYYY-MM-DD"
tags: ["synthesis", "topic1", "topic2"]
source_count: N
---
Raw sources (raw/):
---
title: "Article Title"
type: "source"
source_url: "https://..."
source_type: "article|paper|podcast|video"
date_clipped: "YYYY-MM-DD"
ingested: false
wiki_pages_updated: []
---
Directory Map (updated)
| Directory | Owner | Purpose |
|---|---|---|
raw/ | Human adds, LLM reads | Immutable source documents |
raw/assets/ | Auto (Obsidian) | Downloaded images from clipped articles |
synthesis/ | LLM | Cross-domain synthesis pages |
AI & ML/ | LLM | LLMs, Langchain, MCP notes |
DSA/ | LLM | Data structures, algorithms, interview prep |
SQL/ | LLM | SQL interview prep — joins, window functions, CTEs, indexes |
FrontEnd/ | LLM | JavaScript, React |
Python/ | LLM | Core Python, libraries |
System Design/ | LLM | Backend patterns, architecture diagrams |
Go/ | LLM | Go language docs |
AWS/ | LLM | Cloud services |
Work/ | LLM | Work-related learning (WebdriverIO, etc.) |
Uncategorized/ | Human drops, LLM files | Notes not yet categorized |
Private/ | Human | Personal trackers, private goals (not LLM-maintained) |
Site Content/ | Human | Homepage content for vectorbuilds.dev |
Synthesis Pages
LLM-maintained cross-domain pages. Update when domain content changes.
| Page | When to update |
|---|---|
synthesis/Job Switch Hub.md | New DSA pattern, SD problem, weekly review done |
synthesis/Interview Prep Hub.md | DSA progress, new SD problem, behavioral stories |
synthesis/Tech Stack Overview.md | New skill added, cert achieved, project shipped |
synthesis/Concurrency Deep Dive.md | New Go/Python concurrency notes |
synthesis/LLM & AI Stack.md | New AI/ML content, work experience notes |
LLM Ownership Rules
LLM owns: synthesis/, domain dirs (Go/, DSA/, System Design/, etc.), index.md updates, log.md appends.
Human owns: Private/, raw/ (source selection), this CLAUDE.md schema.
LLM never modifies: Files in raw/ (except setting ingested: true), Private/ content, .obsidian/, .gitignore.
On every write — MANDATORY, NO EXCEPTIONS:
- Append to
log.md:## [YYYY-MM-DD] action | description— do this LAST, after all other writes - Check if
index.mdneeds updating (new page → add entry + incrementpage_count) - Check if any synthesis pages need updating
Exemptions (no log required): writes to log.md itself, CLAUDE.md, raw/, Private/.
Enforcement: A PostToolUse hook fires after every Edit/Write and blocks with a reminder if log.md was not updated. Do not finish a task without logging.