Claude Code с памятью: полный сетап Obsidian + Graphify
Каждый раз, когда открываете новую сессию Claude Code, он не помнит ничего: ни проект, ни решения, ни архитектуру. И каждый раз заново читает ваши файлы — десятки тысяч токенов до первого полезного ответа. Это лечится. Данное руководство — пошаговый сетап системы постоянной памяти на основе Obsidian + Graphify.
Честно о цифрах: источник этого гайда заявляет 71.5× экономию. Это синтетический сценарий, не средняя цифра. Реалистичная оценка — 2–5× в среднем, до 27× на крупных проектах. Подробный разбор: Graphify-граф-знаний-для-AI-агентов.
Что вы получите
Две проблемы, которые убивают продуктивность при работе с Claude Code:
Проблема 1 — Амнезия между сессиями. При каждом открытии нужно заново объяснять: стек, прошлые решения, текущие баги, что осталось сделать. Агент начинает с нуля.
Проблема 2 — Перечитывание кодовой базы. Claude Code перечитывает все файлы при каждой сессии чтобы понять структуру. Проект с ~40 файлами сжигает ~20 000 токенов только на ориентацию — до первого вопроса. 10 сессий в день = 200 000 потраченных токенов.
Решение — два взаимодополняющих слоя:
| Слой | Инструмент | Решает проблему | Стоимость |
|---|---|---|---|
| Память проекта | Obsidian Zettelkasten | Амнезию между сессиями | Бесплатно |
| Карта кода | Graphify | Перечитывание кодовой базы | Бесплатно (AST-режим) |
| История чатов | Конвейер импорта | Потерянные инсайты из переписок | Бесплатно |
| Непрерывность | Команды /resume и /save | «Откуда я остановился» | Бесплатно |
Obsidian хранит что было решено (декларативная память). Graphify хранит как устроен код (структурная карта). Вместе Claude Code начинает каждую сессию зная всё — не перечитывая ничего.
Часть 1 — Obsidian как персистентная память
Концепция
Один централизованный Obsidian vault становится «вторым мозгом» для Claude Code. Хранит решения, контекст, прогресс и знания для всех ваших проектов. Заметки следуют методу Zettelkasten: атомарные (одна идея на заметку), плотно связанные, со стандартизированными метаданными.
Claude Code обращается к vault через CLAUDE.md и кастомные команды.
Один vault — для всех проектов. Не создавайте отдельный vault под каждый проект — это дробит знания. Заметка о «Supabase Auth» связывается и с проектом A, и с проектом B. Граф-вьюха в Obsidian показывает кросс-проектные связи, которые вы не ожидали найти.
Структура vault
~/vault/
├── CLAUDE.md # глобальные инструкции для Claude Code
├── permanent/ # консолидированные атомарные заметки
├── inbox/ # быстрый захват (идеи, черновики)
├── fleeting/ # временные заметки
├── templates/ # шаблоны заметок
├── logs/ # глобальные логи сессий
├── references/ # справочные материалы
├── my-project/ # MOC и заметки для проекта X
│ ├── architecture/ # архитектура, решения, конвенции
│ ├── pipeline/ # потоки данных, API
│ ├── data/ # схема, модель данных
│ ├── features/ # запланированные/реализованные фичи
│ └── logs/ # логи сессий проекта
├── chats/ # импортированные чаты Claude
│ ├── code/ # из Claude Code
│ └── web/ # из Claude Web/App
└── graphify/ # knowledge graphs кодовых баз
├── my-project/ # граф для проекта X
└── another-project/ # граф для проекта Y
Шаг 1 — Создать vault
- Установите Obsidian (бесплатно, macOS/Windows/Linux)
- Откройте → «Create new vault» → задайте имя и расположение
- Запомните путь: он понадобится дальше
Шаг 2 — Создать структуру папок
Откройте терминал и выполните (замените ~/vault на ваш путь):
cd ~/vault
mkdir -p permanent inbox fleeting templates logs references
mkdir -p my-project/{architecture,pipeline,data,features,logs}
mkdir -p chats/{code,web}
mkdir -p graphifyШаг 3 — Создать CLAUDE.md
Это файл, который Claude Code читает автоматически при запуске в папке vault. Создайте CLAUDE.md в корне vault:
# 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
(адаптируйте под свои проекты)
## 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
## 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` → only chats
- `-path:chats` → hide chatsШаг 4 — Создать шаблон заметки
cat > ~/vault/templates/default-note.md << 'EOF'
---
title: {{title}}
tags: []
created: {{date}}
updated: {{date}}
status: draft
type: permanent
---
# {{title}}
## Context
## Details
## Related links
EOFШаг 5 — Рекомендуемые плагины Obsidian
| Плагин | Зачем | Установка |
|---|---|---|
| BRAT | Устанавливать beta-плагины | Community Plugins → Browse |
| 3D Graph | 3D-визуализация vault | Через BRAT (v2.4.1) |
| Folders to Graph | Папки как ноды графа | Community Plugins → Browse |
| Calendar | Навигация по дневным заметкам | Community Plugins → Browse |
| Templater | Умные шаблоны с датой/временем | Community Plugins → Browse |
Использование команд /resume и /save
Запустите claude прямо в папке vault:
cd ~/vault
claudeТеперь в начале каждой сессии:
/resume
Claude прочитает последние логи и расскажет где вы остановились.
В конце сессии:
/save
Claude создаст лог сессии в logs/ с wikilinks на изменённые заметки.
Часть 2 — Конвейер импорта чатов
Концепция
Ваши чаты с Claude (Code и Web) содержат ценные решения, инсайты и контекст, которые теряются в истории. Конвейер экспортирует, обрабатывает и импортирует эти разговоры как заметки vault — с frontmatter, автотегами и wikilinks на существующие заметки.
Структура компонентов
~/scripts/
├── claude_to_obsidian.py # процессор (frontmatter, теги, wikilinks)
└── sync_claude_obsidian.sh # автоматизация (экспорт + обработка)
~/claude-exports/ # временная зона (вне vault)
├── code/ # экспорты Claude Code
└── web/ # экспорты Claude Web
Шаг 1 — Установить экстрактор
pip install claude-conversation-extractor
mkdir -p ~/claude-exports/code ~/claude-exports/web
mkdir -p ~/scriptsШаг 2 — Создать скрипт обработки
Создайте ~/scripts/claude_to_obsidian.py. Скрипт должен:
- Читать каждый экспортированный
.mdфайл - Определять источник (Code vs Web)
- Генерировать автоматические теги по ключевым словам из содержимого
- Добавлять стандартизированный YAML frontmatter
- Вставлять
[[wikilinks]]для заметок которые уже существуют в vault - Копировать в
chats/code/илиchats/web/внутри vault
Пример маппинга ключевых слов → теги:
KEYWORD_TAG_MAP = {
"python": "python",
"react": "react",
"supabase": "supabase",
"deploy": "deploy",
"bug": "debugging",
"refactor": "refactoring",
"architecture": "architecture",
"database": "database",
# добавьте свои
}Полный шаблон скрипта:
#!/usr/bin/env python3
"""
claude_to_obsidian.py — обрабатывает экспорты чатов Claude и импортирует в Obsidian vault.
"""
import os
import re
import shutil
from datetime import datetime
from pathlib import Path
KEYWORD_TAG_MAP = {
"python": "python", "react": "react", "supabase": "supabase",
"deploy": "deploy", "bug": "debugging", "refactor": "refactoring",
"architecture": "architecture", "database": "database",
"api": "api", "auth": "auth", "typescript": "typescript",
}
def detect_tags(content: str) -> list[str]:
tags = ["chat-import"]
content_lower = content.lower()
for keyword, tag in KEYWORD_TAG_MAP.items():
if keyword in content_lower:
tags.append(tag)
return list(set(tags))
def find_wikilinks(content: str, vault_path: Path) -> str:
"""Находит существующие заметки vault и вставляет wikilinks."""
for note_file in vault_path.rglob("*.md"):
stem = note_file.stem
# заменяем упоминания имён файлов на wikilinks (упрощённо)
if stem in content and f"[[{stem}]]" not in content:
content = content.replace(stem, f"[[{stem}]]", 1)
return content
def process_export(export_dir: Path, vault_dir: Path, source_type: str):
target_dir = vault_dir / "chats" / source_type
target_dir.mkdir(parents=True, exist_ok=True)
for md_file in export_dir.glob("*.md"):
content = md_file.read_text(encoding="utf-8")
tags = detect_tags(content)
content_with_links = find_wikilinks(content, vault_dir)
date_str = datetime.now().strftime("%Y-%m-%d")
frontmatter = f"""---
title: "Chat {md_file.stem}"
type: chat
chat-import: true
source: {source_type}
date: {date_str}
tags: [{", ".join(tags)}]
---
"""
final_content = frontmatter + content_with_links
dest = target_dir / md_file.name
dest.write_text(final_content, encoding="utf-8")
print(f"Imported: {dest}")
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--export-dir", required=True)
parser.add_argument("--vault-dir", required=True)
parser.add_argument("--move", action="store_true")
args = parser.parse_args()
export_path = Path(args.export_dir)
vault_path = Path(args.vault_dir)
process_export(export_path / "code", vault_path, "code")
process_export(export_path / "web", vault_path, "web")Шаг 3 — Создать скрипт автоматизации
cat > ~/scripts/sync_claude_obsidian.sh << 'EOF'
#!/bin/bash
EXPORT_DIR="$HOME/claude-exports"
VAULT_DIR="$HOME/vault" # замените на ваш путь
SCRIPT_DIR="$HOME/scripts"
LOG="$SCRIPT_DIR/sync.log"
echo "[$(date)] Sync started" >> "$LOG"
# Экспорт чатов Claude Code
claude-extract --all --output "$EXPORT_DIR/code" 2>> "$LOG"
# Обработка и отправка в vault
python3 "$SCRIPT_DIR/claude_to_obsidian.py" \
--export-dir "$EXPORT_DIR" \
--vault-dir "$VAULT_DIR" \
--move 2>> "$LOG"
echo "[$(date)] Sync completed" >> "$LOG"
EOF
chmod +x ~/scripts/sync_claude_obsidian.shШаг 4 — Настроить cron (запуск каждый день в 22:00)
# Добавить в crontab
(crontab -l 2>/dev/null; echo "0 22 * * * $HOME/scripts/sync_claude_obsidian.sh") | crontab -
# Проверить
crontab -lmacOS: если cron не запускается, дайте Full Disk Access терминалу:
System Preferences → Privacy & Security → Full Disk Access → добавить Terminal
Шаг 5 — Для чатов Claude Web
Установите браузерное расширение «Export Claude Chat to Markdown» (Chrome/Edge). Периодически делайте bulk-экспорт, сохраняйте .md файлы в ~/claude-exports/web/ — дальше cron сам всё разберёт.
Часть 3 — Graphify: граф кодовой базы
Graphify строит структурную карту вашего кода, чтобы Claude Code не перечитывал файлы при каждой сессии. Внутреннее устройство и сравнение с альтернативами: Graphify-граф-знаний-для-AI-агентов. Здесь — только установка.
Шаг 1 — Установка
# Рекомендуется через uv (автоматически добавляет graphify в PATH)
uv tool install graphifyy
# Альтернатива
pipx install graphifyy
# Регистрация скилла в Claude Code
graphify installПроверка:
graphify --versionWindows (winget):
winget install astral-sh.uv
uv tool install graphifyy
graphify installШаг 2 — Сгенерировать граф
Есть два пути в зависимости от того, откуда вы запускаете:
А) Внутри Claude Code (рекомендуется для этого гайда):
/graphify . --obsidian --obsidian-dir ~/vault/graphify/project-name
Этот путь дополнительно создаёт заметки Obsidian по каждому модулю/функции с frontmatter и wikilinks.
Б) Из терминала (headless CLI):
cd ~/your-project
graphify extract . --out ./graphify-out
# Затем слинковать в vault
ln -s $(pwd)/graphify-out ~/vault/graphify/project-name/graphify-outВ обоих случаях получите три файла в graphify-out/:
graphify-out/
├── graph.json # queryable граф (всегда)
├── graph.html # интерактивная визуализация (skill-путь)
└── GRAPH_REPORT.md # god-ноды, связи, suggested questions
Шаг 3 — Добавить в CLAUDE.md проекта
Добавьте этот блок в CLAUDE.md вашего репозитория (не vault, а самого проекта):
## Context Navigation (Graphify)
### 3-Layer Query Rule
1. **First:** query `graphify-out/graph.json` or `graphify-out/wiki/index.md`
to understand code structure and connections
2. **Second:** query the Obsidian vault for decisions, progress, and project context
3. **Third:** only read raw code files when editing
or when the first two layers don't have the answer
### When to rebuild the graph
- After structural changes (new modules, major refactors)
- Headless: `graphify update .` (only processes modified files)
- Skill: `/graphify . --update` (same behavior, runs through the skill)
- The graph is persistent — NO need to rebuild every session
### Do NOT
- Don't manually modify files inside `graphify-out/`
- Don't re-read the entire codebase if the graph already has the informationШаг 4 — Git hook (автоперестройка)
После каждого коммита граф автоматически обновляется:
# В корне репозитория
graphify hook installХук использует только AST (tree-sitter) — API-вызовов нет, токены не тратятся.
Шаг 5 — Добавить секцию в CLAUDE.md vault
## Graphify (Codebase Maps)
### Structure
- `graphify/project-x/` → knowledge graph for project X
- Future projects get their own subfolders
- Notes are auto-generated — do NOT edit manually
### In Graph View
- Filter by `path:graphify` to see only code nodes
- Filter by `-path:graphify` to hide code nodesДобавление новых проектов
Каждый новый проект — просто подпапка. Те же два пути:
# Skill-путь (внутри Claude Code)
/graphify ~/another-project --obsidian --obsidian-dir ~/vault/graphify/another-project
# Headless-путь
cd ~/another-project
graphify extract . --out ./graphify-out
ln -s $(pwd)/graphify-out ~/vault/graphify/another-project/graphify-outОбновить .gitignore проекта
# Graphify — кэш не коммитим, граф коммитим
graphify-out/cache/
graphify-out/cost.json
# НЕ добавляйте graph.json — его коммитите для командыЧасть 4 — Полный воркфлоу
Типичная сессия
Открываете сессию Claude Code
│
├── /resume
│ └── загружает vault context:
│ последние логи, решения, прогресс по текущему проекту
│
├── Claude автоматически читает graph.json
│ └── понимает структуру кода БЕЗ перечитывания всех файлов
│
├── Работаете: фичи, баги, рефакторинг
│
├── /save
│ └── создаёт session log в vault/logs/ с wikilinks
│
└── git commit
└── хук перестраивает граф автоматически
Что теряете без каждого слоя
| Слой | Без него | С ним |
|---|---|---|
/resume | Объясняете проект заново каждую сессию | Claude уже знает контекст |
| Graphify | Перечитывает ~40 файлов (~20k токенов) | Запрашивает граф (~280 токенов) |
| Конвейер чатов | Инсайты теряются в истории | Всё проиндексировано и ищется |
/save + логи | Забываете что делали | Полная история с wikilinks |
Фильтры Graph View в Obsidian
| Фильтр | Что показывает |
|---|---|
path:permanent | Только постоянные заметки (сконсолидированные знания) |
path:graphify | Только ноды кодовой базы (функции, модули, импорты) |
tag:chat-import | Только импортированные чаты |
-path:graphify -path:chats | Только ручные заметки (чистый vault) |
Реальные результаты
Тест на React + Supabase проекте с 126 TypeScript-файлами:
| Метрика | Значение |
|---|---|
| Нод в графе | 332 |
| Рёбер (связей) | 258 |
| Сообществ (clusters) | 124 |
| Размер graph.json | 172 KB |
| Сгенерировано заметок Obsidian | 456 |
| Снижение токенов на запрос | 499× (лучший сценарий) |
| Стоимость LLM для генерации | 0 токенов (AST-режим) |
| Импортировано чатов в vault | 137 |
| Накоплено постоянных заметок | 65+ |
| Всего заметок в vault | 780+ |
Важное примечание: 499× — это per query в лучшем случае, не средняя экономия. Реалистичная цифра для большинства задач — 2–5×. Даже 2× на 10 сессиях в день = 200 тысяч токенов в месяц сэкономлено. Плюс агент точнее находит нужное с первого раза.
Troubleshooting
Заметки Graphify не появляются в Obsidian
Убедитесь, что заметки попали именно в папку vault. Obsidian не всегда указывает туда, куда вы думаете. Создайте заметку в Obsidian вручную и запустите find ~ -name "note-name.md" чтобы найти реальный путь. Переместите заметки туда → Cmd+Q → перезапустите Obsidian.
Graph View пустой с применённым фильтром
Отключите «Orphans» и «Existing files only» в настройках графа. Перезапустите Obsidian (Cmd+Q) для принудительной переиндексации.
Claude Code не использует граф
Проверьте что в CLAUDE.md проекта есть секция «Context Navigation» и что graphify-out/graph.json существует в корне репозитория.
cron не запускается на macOS
Дайте Full Disk Access вашему терминалу: System Preferences → Privacy & Security.
Graphify не генерирует wiki/
Папка wiki/ создаётся только skill-формой с флагом --wiki (запуск через /graphify . --wiki внутри Claude Code). Headless graphify extract этот флаг не поддерживает. Из терминала используйте graphify query "вопрос" против graph.json.
Файлы с круглыми скобками в имени
Graphify создаёт заметки вроде myFunction().md. Obsidian может не проиндексировать файлы с (). Переименуйте batch:
cd ~/vault/graphify/project
for f in *"("*; do mv "$f" "$(echo "$f" | sed 's/[()]//g')"; doneUnknown Command в graphify
Если graphify . выдаёт unknown command '.', вы запускаете headless CLI — он требует subcommand перед путём:
# Правильно из терминала:
graphify extract . --out ./graphify-out
# Или внутри Claude Code (через skill):
/graphify .graphify: command not found после pip install
pip устанавливает скрипты в директорию которой нет в PATH. Решение:
- macOS: добавьте
~/Library/Python/3.x/binв~/.zshrc - Linux: добавьте
~/.local/binв~/.bashrc - Или используйте
uv tool install graphifyy/pipx install graphifyy— они сами управляют PATH.
Архитектура системы
┌─────────────────────────────────────────────────────────────┐
│ OBSIDIAN VAULT (единый) │
│ │
│ permanent/ ← консолидированные знания (Zettelkasten) │
│ logs/ ← логи сессий (/save) │
│ chats/ ← импортированные разговоры (cron-конвейер) │
│ graphify/ ← knowledge graphs кодовых баз │
│ my-project/ ← MOC, решения, архитектура │
│ │
│ CLAUDE.md ← глобальные инструкции + /resume + /save │
└─────────────────────────┬───────────────────────────────────┘
│
Claude Code читает/пишет
│
┌─────────────────────────┴───────────────────────────────────┐
│ РЕПОЗИТОРИЙ ПРОЕКТА │
│ │
│ src/ ← исходный код │
│ CLAUDE.md ← инструкции проекта + Context Navigation │
│ graphify-out/ ← graph.json, graph.html, report │
│ .git/hooks/ ← post-commit перестраивает граф │
└─────────────────────────────────────────────────────────────┘
Источник: claude-code-memory-setup — GitHub
Связанное: Graphify — что это, архитектура, плюсы и минусы · LLM Wiki паттерн по методу Карпати · Бесконечная память с Pinecone