A manual for using this personal knowledge wiki. Covers all workflows, conventions, and tooling.
This repo is a personal knowledge base in Zettelkasten style. It works as:
- A git repo of markdown files (the source of truth)
- An Obsidian vault (for browsing, graph view, and local editing)
- An LLM-maintained wiki (Claude handles the bookkeeping)
Open the repo folder in Obsidian as a vault. That's it.
til/
_docs/ # Project documentation
requirements.md # What the wiki should do
architecture.md # How it's built, decisions
guide.md # This file (usage manual)
changelog.md # Chronological operations log
_inbox/ # Raw captures land here (Obsidian Clipper)
_templates/ # Obsidian templates for new notes
assets/ # Images and attachments
ai/ # Topic folder
ai-tooling/ # Topic folder
claude-code/ # Topic folder
... # More topic folders
CLAUDE.md # Schema: tells Claude how the wiki works
README.md # Auto-generated index of all notes
.gitignore # Ignores Obsidian local config
There are three ways to get notes into the wiki:
For saving articles, blog posts, or web pages you're reading.
- Install the Obsidian Web Clipper browser extension
- Configure it to save to the
_inbox/folder in this vault - Set up the Clipper template (see below)
- When you find something worth saving, clip it
- The raw note lands in
_inbox/with frontmatter from the template - Later, ask Claude to "process inbox" to refine and file the notes
Recommended Clipper template:
In Obsidian Clipper settings, set the note template to:
---
title: "{{title}}"
date: {{date}}
captured: {{date}}T{{time}}
tags: []
source: "{{url}}"
aliases: []
status: raw
---
{{content}}
This ensures raw captures arrive with status: raw and the source URL pre-filled, so Claude knows where the content came from during processing.
For capturing learning moments during coding sessions.
# Claude will create the note, pick the right folder, add links
claude "capture this as a note: [describe what you learned]"
# Or use the knowledge-capture skill
claude "/learned"Claude creates the note directly in the correct topic folder with proper frontmatter and wikilinks. No inbox step needed.
For capturing insights during research/discussion sessions.
Use the knowledge-capture skill to push notes to GitHub via the MCP Worker. Notes arrive already refined in the correct topic folder.
- Navigate to the right topic folder
- Create a new note using one of the templates in
_templates/:- Atomic Note (default): for concepts with context and insight
- TIL: for quick facts and gotchas
- Article: for deep dives and debugging journeys
- Definition: for reference cards
- Fill in the frontmatter and content
- Add a
## Relatedsection with[[wikilinks]]to connected notes
Every note has YAML frontmatter:
---
title: "lowercase with selective Capitalization"
date: 2026-04-13
captured: 2026-04-13T10:30:00Z
tags: ["topic", "subtopic"]
source: "where this came from"
aliases: ["alternate name"]
status: refined
---| Status | Meaning | Where it lives |
|---|---|---|
raw |
Just captured, unprocessed | _inbox/ |
refined |
Has frontmatter, correct folder, has links | Topic folder |
evergreen |
Mature, well-linked, updated over time | Topic folder |
| Type | When to use | Length |
|---|---|---|
| TIL | Pure gotcha, config flag, no investigation | < 200 words |
| Atomic Note | Single concept with nuance (default) | 200-500 words |
| Article | Multi-concept discovery, debugging journey | 500+ words |
| Definition | "What is X" concept lookup | 100-300 words |
This wiki uses Obsidian-compatible [[wikilinks]] for connections.
## Related
- [[note-filename-without-extension]] - brief explanation of the connection
- [[another-note]] - why this is related- Use
[[filename]]without folder path (Obsidian resolves it) - Every refined note should have a
## Relatedsection at the bottom - Link to concepts, not just list related files
- 2-4 links per note is ideal; don't force connections
- Cross-folder links are encouraged (e.g., diaspora note linking to wealth note)
- Add the old filename to the
aliasesarray in frontmatter - Search for
[[old-name]]across all notes and update references - Or ask Claude to handle it: "I renamed X to Y, update all backlinks"
Notes arrive from three environments, each with different compilation behavior:
| Source | Compilation? | What happens |
|---|---|---|
| Claude Code (terminal) | Full, automatic | Reads CLAUDE.md, runs all 5 compilation steps |
| Claude.ai (web skill) | None | Pushes note to GitHub via MCP Worker, no backlinks/README/log |
| Obsidian Clipper | None | Raw dump to _inbox/, needs manual "process inbox" |
The two-step workflow for Claude.ai notes:
- Use the knowledge-capture skill on Claude.ai to push the note to GitHub (it arrives in the right folder with frontmatter, but no compilation)
- Next time you open Claude Code in this repo, it will automatically detect uncompiled additions and offer to run the compilation step (backlinks, README update, synthesis page check, log entry)
You don't need to remember to do step 2. Claude Code checks for uncompiled notes at session start.
When _inbox/ has raw captures waiting:
process inbox
Claude will: add/fix frontmatter, determine the correct topic folder, restructure content to match templates, add wikilinks, move the note out of inbox, set status to refined.
Ask Claude to reorganize when the wiki feels messy:
reorganize the wiki
Claude will: check for orphan notes, suggest folder merges/splits, update all backlinks after moves, commit changes separately from content.
Periodic health check:
lint the wiki
Claude will check for: orphan notes (no links in or out), broken wikilinks, notes still in raw status, stale notes, clusters missing synthesis pages, contradictions between notes.
When a conversation produces a useful synthesis or analysis:
file that answer as a wiki page
Claude will create a note from the conversation output, properly linked and filed. This is how explorations compound into the knowledge base.
- Check existing folders first (
lsor browse in Obsidian) - Organize by domain, not by tool (YouTube extraction goes in
youtube/, notnodejs/) - Never use date-based paths
- When in doubt, ask Claude; it knows the existing structure
| Folder | Domain | Notes |
|---|---|---|
ai/ |
AI concepts, memory systems, agent patterns | 7 |
ai-tooling/ |
AI tool evaluations, dev stack analysis | 8 |
claude-code/ |
Claude Code hooks, skills, workflows | 5 |
cs/ |
Computer science fundamentals | 1 |
devtools/ |
Developer tools and config | 2 |
diaspora/ |
Vietnamese/Asian diaspora analysis | 6 |
dwarves-kit/ |
Dwarves Kit architecture and design | 9 |
geopolitics/ |
Geopolitical analysis | 3 |
health/ |
Health and wellness | 1 |
history/ |
Historical analysis (China, civilizations) | 5 |
investing/ |
Personal finance and investing | 1 |
mcp/ |
Model Context Protocol | 2 |
patterns/ |
Software patterns and anti-patterns | 1 |
pkm/ |
Personal knowledge management meta | 2 |
wealth/ |
Trust-building, business relationships | 5 |
youtube/ |
YouTube-related tooling | 1 |
These settings should be configured when first opening the vault:
- Settings > Files and links > New link format: "Shortest path when possible"
- Settings > Files and links > Use [[Wikilinks]]: ON
- Settings > Files and links > Default location for new attachments: "In the folder specified below" ->
assets - Settings > Templates > Template folder location:
_templates
After clipping a web article with images:
- Settings > Hotkeys > search "Download" > bind "Download all images" to
Ctrl+Shift+D(orCmd+Shift+Don Mac) - After clipping an article, press the hotkey to download all images to
assets/ - This makes images local so they survive broken URLs and the LLM can view them directly
Note: LLMs can't read markdown with inline images in one pass. The workaround is to have the LLM read the text first, then view referenced images separately.
| Plugin | Purpose |
|---|---|
| Linter | Enforces frontmatter format, heading style, trailing spaces |
| Obsidian Clipper | Web capture to _inbox/ |
| Dataview | Query notes by tags, date, status, type |
| Graph Analysis | Visualize connections, find orphans and clusters |
| Consistent Attachments and Links | Fix broken links when moving notes |
| Templates | Use files from _templates/ for new notes |
List all raw notes waiting for processing:
TABLE date, source
FROM "_inbox"
WHERE status = "raw"
SORT date DESC
List orphan candidates (notes with no outgoing links):
TABLE date, tags
FROM "" AND -"_inbox" AND -"_templates"
WHERE !contains(file.outlinks, "")
SORT date DESC
List all notes by topic:
TABLE length(file.outlinks) as "Links out", length(file.inlinks) as "Links in"
FROM "" AND -"_inbox" AND -"_templates"
SORT file.folder ASC
- Use Graph View (
Ctrl/Cmd + G) to see the full wiki structure - Color-code by folder to see topic clusters
- Orphan notes (disconnected dots) need attention
- Hub notes (many connections) are candidates for synthesis pages
| Type | Format | Example |
|---|---|---|
| New note | learned: <title> |
learned: LLM memory systems three competitive battlegrounds |
| Delete | delete: <path> |
delete: old-folder/stale-note.md |
| Index update | docs: update note index |
|
| Reorganize | refactor: <description> |
refactor: merge predictive-history into history |
| Link updates | docs: update backlinks |
|
| Meta changes | chore: <description> |
chore: add frontmatter fields to all notes |
- Note content changes and new notes: commit individually
- Bulk operations (frontmatter updates, link passes): commit as a batch
- Folder moves + backlink updates: commit together
_docs/changelog.md tracks all wiki operations chronologically. Format:
## [YYYY-MM-DD] operation | description
What happened and why. Decisions made. Files affected.Operations: ingest, refactor, lint, synthesis, query.
Update the log after any significant wiki operation. Claude will do this automatically when processing inbox or reorganizing.
This wiki follows a hybrid approach:
- Zettelkasten: atomic notes, wikilinks, note maturity lifecycle, emergence through connections
- LLM Wiki (Karpathy pattern): LLM handles bookkeeping (linking, filing, cross-referencing, linting)
- Human in the loop: you do the thinking and decide what's worth capturing; Claude does the grunt work
The human's job: curate sources, direct analysis, ask good questions, think about what it means. The LLM's job: summarizing, cross-referencing, filing, bookkeeping, maintenance.
Key principle: writing is load-bearing for learning. Don't just have Claude generate synthesis pages silently. Discuss topics with Claude, form your own thesis, then ask Claude to write it up. A wiki you never read is just a database.