by lucasrosati
Up to 71.5x fewer tokens per session on Claude Code with Obsidian + Graphify. Persistent memory, codebase knowledge graphs, and chat import pipeline. π§π· PT-BR included.
# Add to your Claude Code skills
git clone https://github.com/lucasrosati/claude-code-memory-setup71.5x fewer tokens per session with Graphify + permanent memory across sessions with Obsidian Zettelkasten.
A complete setup to turn Claude Code into an agent with long-term memory and full codebase awareness β without wasting tokens re-reading files.
π§π· Leia em PortuguΓͺs
When working with Claude Code, two problems silently eat your tokens:
Problem 1 β Amnesia between sessions. Every time you open a new session, you have to re-explain your project: stack, past decisions, current bugs, what's left to do. Claude Code remembers nothing from the previous session.
Problem 2 β Codebase re-reading. Claude Code re-reads all your project files every session to understand the structure. A project with ~40 files burns ~20,000 tokens just for Claude to orient itself β before you even ask a question. If you run 10 sessions a day, that's 200,000 wasted tokens.
Two complementary systems, each solving a different problem:
| Layer | Tool | Problem Solved | Cost |
|-------|------|---------------|------|
| Project memory | Obsidian Zettelkasten | Amnesia between sessions | Free |
| Code map | Graphify | Codebase re-reading | Free (AST mode) |
| Conversation history | Import pipeline | Lost chat insights | Free |
| Continuity | /resume and /save commands | Picking up where you left off | Free |
Obsidian handles what was decided (declarative memory). Graphify handles how the code is structured (structural map). Together, Claude Code starts every session knowing everything β without re-reading anything.
A single, centralized Obsidian vault acts as Claude Code's "second brain." It stores decisions, context, progress, and knowledge for all your projects. Notes follow the Zettelkasten method: atomic (one idea per note), densely interlinked, with standardized metadata.
Claude Code accesses the vault through CLAUDE.md and custom skills.
~/vault/ # SINGLE vault for all projects
βββ CLAUDE.md # global instructions for Claude Code
βββ permanent/ # consolidated atomic notes
βββ inbox/ # raw capture (ideas, drafts)
βββ fleeting/ # quick temporary notes
βββ templates/ # note templates
βββ logs/ # global session logs
βββ references/ # reference material
βββ my-project/ # MOCs and notes for project X
β βββ architecture/ # architecture, decisions, conventions
β βββ pipeline/ # data flows, APIs
β βββ data/ # schema, data model
β βββ features/ # planned/implemented features
β βββ logs/ # project session logs
βββ another-project/ # MOCs and notes for project Y
β βββ ...
βββ chats/ # imported Claude chats
β βββ code/ # from Claude Code
β βββ web/ # from Claude Web/App
βββ graphify/ # codebase knowledge graphs
βββ my-project/ # graph notes for project X
βββ another-project/ # graph notes for project Y
Why a single vault? Having one vault per project fragments knowledge. With a single vault, a note about "Supabase Auth" links to both project A and B. The graph view reveals cross-project connections you didn't expect.
Prerequisites:
1. Create the vault:
Obsidian β "Create new vault" β choose a name and location.
2. Create the folder structure:
cd ~/vault # adjust to your path
mkdir -p permanent inbox fleeting templates logs references
mkdir -p my-project/{architecture,pipeline,data,features,logs}
3. Create the CLAUDE.md:
This is the file Claude Code reads automatically. Create CLAUDE.md at the vault root:
# Vault β Instructions for Claude Code
## What is this vault
Centralized knowledge base for all projects.
Persistent memory across sessions.
## Project stacks
- Project X: React + Supabase
- Project Y: Python + FastAPI
(adapt to your projects)
## Zettelkasten Rules
### Note creation
- Use wikilinks: [[note-name]] (not markdown links)
- Mandatory YAML frontmatter on every note
- Filenames in kebab-case: `auth-flow.md`, not `Auth Flow.md`
- 1 concept per permanent note (atomicity)
- Minimum 2 wikilinks per note (dense linking)
### Standard frontmatter
---
title: Note Name
tags: [project, topic]
created: YYYY-MM-DD
updated: YYYY-MM-DD
status: active
type: permanent
---
### Never do
- Don't delete notes without asking
- Don't use markdown links for internal notes (use wikilinks)
- Don't create notes without frontmatter
- Don't change folder structure without documenting it
## Session Commands
### /resume
When you receive this command:
1. Read the 3 most recent session logs in logs/
2. Read architecture/decisions.md for the current project
3. Summarize current state and what's left to do
### /save
When you receive this command:
1. Create a session log in logs/YYYY-MM-DD-description.md
2. Record: what was done, decisions made, pending items
3. Add wikilinks to created/modified notes
4. Run git commit + push if in a repository
4. Create a note template:
cat > templates/default-note.md << 'EOF'
---
title: {{title}}
tags: []
created: {{date}}
updated: {{date}}
status: draft
type: permanent
---
# {{title}}
## Context
## Details
## Related links
EOF
5. Recommended Obsidian plugins:
| Plugin | Purpose | Install method | |--------|---------|----------------| | BRAT | Install beta plugins | Community Plugins β Browse | | 3D Graph | 3D vault visualization | Via BRAT (v2.4.1) | | Folders to Graph | Folders as graph nodes | Community Plugins β Browse | | Calendar | Daily note navigation | Community Plugins β Browse |
Your Claude chats (both Code and Web) contain valuable decisions, insights, and context that get lost in the history. This pipeline exports, processes, and imports those conversations as vault notes β with frontmatter, automatic tags, and wikilinks to existing notes.
~/scripts/
βββ claude_to_obsidian.py # processor (frontmatter, tags, wikilinks)
βββ sync_claude_obsidian.sh # automation (export + process)
~/claude-exports/ # temporary staging area (outside vault)
βββ code/ # Claude Code exports
βββ web/ # Claude Web exports
1. Install the Claude Code extractor:
pip install claude-conversation-extractor
2. Create staging directories:
mkdir -p ~/claude-exports/code ~/claude-exports/web
3. Create the post-processing script (~/scripts/claude_to_obsidian.py):
The script should:
.md file[[wikilinks]] for notes that already exist in the vaultchats/code/ or chats/web/ inside the vaultExample keyword-to-tag mapping:
KEYWORD_TAG_MAP = {
"python": "python",
"react": "react",
"supabase": "supabase",
"deploy": "deploy",
"bug": "debugging",
"refactor": "refactoring",
# add your own
}
4. Create the automation script (~/scripts/sync_claude_obsidian.sh):
#!/bin/bash
EXPORT_DIR="$HOME/claude-exports"
VAULT_DIR="$HOME/vault" # adjust to your path
SCRIPT_DIR="$HOME/scripts"
LOG="$SCRIPT_DIR/sync.log"
echo "[$(date)] Sync started" >> "$LOG"
# Export Claude Code chats
claude-extract --all --output "$EXPORT_DIR/code" 2>> "$LOG"
# Process and send to vault
python3 "$SCRIPT_DIR/claude_to_obsidian.py" \
--export-dir "$EXPORT_DIR" \
--vault-dir "$VAULT_DIR" \
--move 2>> "$LOG"
echo "[$(date)] Sync completed" >> "$LOG"
5. Schedule automatic execution:
chmod +x ~/scripts/sync_claude_obsidian.sh
# Run daily at 10 PM
(crontab -l 2>/dev/null; echo "0 22 * * * $HOME/scripts/sync_claude_obsidian.sh") | crontab -
6. For Claude Web chats:
Install the "Export Claude Chat to Markdown" browser extension for Chrome/Edge. Do periodic bulk exports, save the .md files to ~/claude-exports/web/, and the cron job handles the rest.
7. Add a section to the vault's CLAUDE.md:
## Chat Import Pipeline
### Structure
- `chats/code/` β imported Claude Code conversations
- `chats/web/` β imported Claude Web/App conversations
- All chats get frontmatter with `type: chat` and `chat-import` tag
### Filter in Graph View
- `tag:chat-import` β chats only
- `-path:chats` β hide chats
Graphify transforms your codebase into a queryable knowledge graph. Instead of Claude Code re-reading every file, it queries the graph β which is persistent across sessions and costs a fracti
No comments yet. Be the first to share your thoughts!