{"id":48354438,"url":"https://github.com/kuroko1t/claude-vault","last_synced_at":"2026-04-05T10:30:46.061Z","repository":{"id":344306490,"uuid":"1180376146","full_name":"kuroko1t/claude-vault","owner":"kuroko1t","description":"Archive Claude Code conversations into SQLite with FTS5 search. Single binary, zero dependencies.","archived":false,"fork":false,"pushed_at":"2026-03-24T23:17:28.000Z","size":36,"stargazers_count":30,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-25T06:33:33.216Z","etag":null,"topics":["archive","claude-code","cli","conversation-history","fts5","rust","sqlite"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kuroko1t.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-13T01:25:23.000Z","updated_at":"2026-03-25T06:32:51.000Z","dependencies_parsed_at":"2026-03-14T14:00:57.514Z","dependency_job_id":null,"html_url":"https://github.com/kuroko1t/claude-vault","commit_stats":null,"previous_names":["kuroko1t/claude-vault"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/kuroko1t/claude-vault","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuroko1t%2Fclaude-vault","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuroko1t%2Fclaude-vault/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuroko1t%2Fclaude-vault/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuroko1t%2Fclaude-vault/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kuroko1t","download_url":"https://codeload.github.com/kuroko1t/claude-vault/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuroko1t%2Fclaude-vault/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31433044,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T08:13:15.228Z","status":"ssl_error","status_checked_at":"2026-04-05T08:13:11.839Z","response_time":75,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["archive","claude-code","cli","conversation-history","fts5","rust","sqlite"],"created_at":"2026-04-05T10:30:43.967Z","updated_at":"2026-04-05T10:30:46.053Z","avatar_url":"https://github.com/kuroko1t.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# claude-vault\n\n[![CI](https://github.com/kuroko1t/claude-vault/actions/workflows/ci.yml/badge.svg)](https://github.com/kuroko1t/claude-vault/actions/workflows/ci.yml)\n[![Crates.io](https://img.shields.io/crates/v/claude-vault.svg)](https://crates.io/crates/claude-vault)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nArchive your Claude Code conversations into a searchable SQLite database. Single binary, zero dependencies.\n\n## Why?\n\nClaude Code stores session history as JSONL files under `~/.claude/projects/`, but these files have problems:\n\n- **Files are deleted by default** — Old sessions are auto-deleted over time (`cleanupPeriodDays` setting). Even if you change this, the other issues remain.\n- **Data loss on compact** — `/compact` compresses in-memory context, and the original conversation details are lost\n- **Poor searchability** — JSONL files are scattered across directories with no cross-session search\n\nclaude-vault copies conversations into a durable SQLite database with full-text search — once archived, your history survives file deletion, compaction, and cleanup. Zero runtime dependencies, single binary.\n\n## Demo\n\n### List sessions\n\n```\n$ claude-vault list -n 5\nID         DATE                    MSGS  PROJECT                   PREVIEW\n----------------------------------------------------------------------------------------------------\n47cf1f2e   2026-03-13T14:21:48      555  user/my-project           How to auto-archive without manual steps?\na4d5aa81   2026-03-13T03:01:35      232  user/another-repo         Prepare README.md for OSS publishing\n6b4b6b21   2026-03-13T00:40:44       81  user/experiment           Search for open-source tools and compare features\n67e36ae8   2026-03-12T22:59:44      465  user/trading-bot          Implement daily strategy with backtesting\ncd9851d6   2026-03-04T04:12:25      312  org/ml-pipeline           Fix Docker build for GPU training container\n\nExport: claude-vault export \u003cID\u003e\n```\n\n### Search conversations\n\n```\n$ claude-vault search \"Docker\"\n[user] user/my-project | 84d8d116 | 2026-02-04T01:15:53Z\ndocker info | grep -A5 \"Build\"\n  buildx: Docker Buildx (Docker Inc.)\n    Version:  v0.28.0\n---\n[assistant] user/trading-bot | c86a3eec | 2026-02-09T23:40:43Z\nThe session is running inside Docker, so docker commands are not available.\nRun the following on the host:\n  docker compose -f docker-compose.safe.yml build --no-cache\n```\n\n### Database stats\n\n```\n$ claude-vault stats\nDatabase: /home/user/.local/share/claude-vault/vault.db\nSessions: 178\nMessages: 94562\n```\n\n## Features\n\n- **FTS5 full-text search** with Porter stemming (e.g. \"running\" matches \"run\")\n- **Automatic archiving** via Claude Code hooks (PreCompact + SessionEnd)\n- **Noise filtering** — strips tool results, system tags, and meta messages\n- **UUID deduplication** — safe to re-import; duplicates are skipped\n- **Session export** — Markdown, JSON, or plain text\n- **Single binary** — no Python, Node.js, or other runtime required\n\n## Install\n\n### From GitHub Releases (recommended)\n\nDownload a prebuilt binary from [Releases](https://github.com/kuroko1t/claude-vault/releases):\n\n```bash\n# Linux x86_64\ncurl -fsSL https://github.com/kuroko1t/claude-vault/releases/latest/download/claude-vault-x86_64-unknown-linux-gnu.tar.gz | tar xz\nsudo mv claude-vault /usr/local/bin/\n\n# macOS Apple Silicon\ncurl -fsSL https://github.com/kuroko1t/claude-vault/releases/latest/download/claude-vault-aarch64-apple-darwin.tar.gz | tar xz\nsudo mv claude-vault /usr/local/bin/\n```\n\n### From crates.io\n\n```bash\ncargo install claude-vault\n```\n\n### From source\n\n```bash\ncargo install --path .\n```\n\n## Quick Start\n\n1. Import all existing conversations from `~/.claude/projects/`:\n\n```bash\nclaude-vault import\n# Imported 94562 messages (0 skipped, 12847 filtered, 0 errors) from 203 files\n```\n\n2. Search your history:\n\n```bash\nclaude-vault search \"error handling\"\n```\n\n3. Browse sessions:\n\n```bash\nclaude-vault list\n```\n\n4. (Optional) Set up auto-archiving — see [Hooks Setup](#auto-archive-with-claude-code-hooks).\n\n## Using from Claude Code\n\nSearch past conversations directly from a Claude Code session:\n\n```bash\n# Keyword search\nclaude-vault search \"previous Docker configuration\"\n\n# Structured output for Claude to parse\nclaude-vault search \"auth bug\" --json\nclaude-vault list --json\n```\n\nWith [auto-archiving hooks](#auto-archive-with-claude-code-hooks) configured, Claude Code can always search your full history — even for sessions whose JSONL files have been deleted.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch2\u003eUsage\u003c/h2\u003e\u003c/summary\u003e\n\n### import\n\nImport all JSONL files from `~/.claude/projects/` recursively (including subagent directories):\n\n```bash\nclaude-vault import\n```\n\n### import-file\n\nImport a single JSONL session file:\n\n```bash\nclaude-vault import-file /path/to/session.jsonl --project my-project\n```\n\n### search\n\n```bash\nclaude-vault search \"Docker\"\nclaude-vault search \"deploy\" --project my-app\nclaude-vault search \"deploy\" --since 2024-01-01 --until 2024-06-30\nclaude-vault search '\"error handling\" AND rust'   # FTS5 syntax\nclaude-vault search \"auth bug\" --json              # machine-readable output\n```\n\n### export\n\nExport a session to Markdown, JSON, or plain text. Accepts session ID prefixes (like git short hashes):\n\n```bash\nclaude-vault export 47cf1f2e\nclaude-vault export --last                          # most recent session\nclaude-vault export --last --format markdown \u003e session.md\n```\n\n### list\n\n```bash\nclaude-vault list\nclaude-vault list --project my-app --since 2024-01-01\nclaude-vault list --json\n```\n\n### Other commands\n\n```bash\nclaude-vault delete 47cf -y                        # delete a session\nclaude-vault stats                                  # show database statistics\nclaude-vault verify                                 # check database integrity\nclaude-vault completions zsh \u003e ~/.zfunc/_claude-vault  # shell completions\nclaude-vault --db /path/to/vault.db search \"query\"  # custom database path\n```\n\n\u003c/details\u003e\n\n## Auto-archive with Claude Code Hooks\n\nAdd to `~/.claude/settings.json`:\n\n```json\n{\n  \"hooks\": {\n    \"PreCompact\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"claude-vault import \u003e/dev/null 2\u003e\u00261\"\n          }\n        ]\n      }\n    ],\n    \"SessionEnd\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"claude-vault import \u003e/dev/null 2\u003e\u00261 \u0026\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n| Hook | Timing | Mode |\n|------|--------|------|\n| **PreCompact** | Before `/compact` runs | Synchronous — captures full data before compression |\n| **SessionEnd** | When a session ends | Background — non-blocking |\n\nOnce configured, conversations are archived automatically with no manual steps.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch2\u003eHow It Works\u003c/h2\u003e\u003c/summary\u003e\n\n```\n~/.claude/projects/\u003cproject\u003e/\u003csession\u003e.jsonl\n        │\n        ▼\n    ┌─────────┐     ┌──────────┐     ┌───────────┐\n    │  Parse   │────▶│  Filter  │────▶│  SQLite   │\n    │  JSONL   │     │  \u0026 Clean │     │  + FTS5   │\n    └─────────┘     └──────────┘     └───────────┘\n```\n\n1. **Parse** — Reads each JSONL record, extracts `user` and `assistant` messages\n2. **Filter** — Removes system-injected noise (see below)\n3. **Store** — Inserts into SQLite with UUID-based dedup; FTS5 index is updated via triggers\n\n### Noise Filtering\n\n| Category | What's removed |\n|----------|---------------|\n| Tool results | All `tool_result` content (Bash output, file creation messages, web fetch results, etc.) |\n| System tags | `\u003csystem-reminder\u003e`, `\u003clocal-command-caveat\u003e`, `\u003clocal-command-stdout\u003e`, `\u003ccommand-name\u003e`, `\u003ccommand-message\u003e`, `\u003ccommand-args\u003e` |\n| Read-only tools | Read, Glob, Grep, LSP, ToolSearch, browser snapshot/navigation, TaskGet/TaskOutput/TaskList |\n| Meta messages | eval-loop iterations/commands, Stop hook feedback, empty/whitespace-only content |\n\nUser text input, assistant responses, and code-modifying tool calls (Edit, Write, Bash, etc.) are preserved.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch2\u003eSchema\u003c/h2\u003e\u003c/summary\u003e\n\n```sql\nCREATE TABLE sessions (\n    session_id  TEXT PRIMARY KEY,\n    project     TEXT NOT NULL,\n    started_at  TEXT,\n    imported_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE TABLE messages (\n    id         INTEGER PRIMARY KEY AUTOINCREMENT,\n    session_id TEXT NOT NULL REFERENCES sessions(session_id),\n    uuid       TEXT,\n    role       TEXT NOT NULL,\n    content    TEXT NOT NULL,\n    timestamp  TEXT\n);\n\nCREATE UNIQUE INDEX idx_messages_uuid ON messages(uuid) WHERE uuid IS NOT NULL;\n\nCREATE VIRTUAL TABLE messages_fts USING fts5(\n    content, content_rowid='id', content='messages',\n    tokenize='porter unicode61'\n);\n```\n\nDefault database location: `~/.local/share/claude-vault/vault.db`\n\nSQLite is configured with WAL mode and a 5-second busy timeout for safe concurrent access.\n\n\u003c/details\u003e\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuroko1t%2Fclaude-vault","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkuroko1t%2Fclaude-vault","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuroko1t%2Fclaude-vault/lists"}