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

  1. Установите Obsidian (бесплатно, macOS/Windows/Linux)
  2. Откройте → «Create new vault» → задайте имя и расположение
  3. Запомните путь: он понадобится дальше

Шаг 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 Graph3D-визуализация 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 -l

macOS: если 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 --version

Windows (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.json172 KB
Сгенерировано заметок Obsidian456
Снижение токенов на запрос499× (лучший сценарий)
Стоимость LLM для генерации0 токенов (AST-режим)
Импортировано чатов в vault137
Накоплено постоянных заметок65+
Всего заметок в vault780+

Важное примечание: 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')"; done

Unknown 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