{"id":51500183,"url":"https://github.com/krishpinto/grasp","last_synced_at":"2026-07-07T17:31:04.291Z","repository":{"id":367349957,"uuid":"1273941601","full_name":"krishpinto/grasp","owner":"krishpinto","description":"Passive, local, zero-API memory for AI coding agents — captures Claude Code transcripts, embeds them on-device, and shows them as a 3D memory graph. Rust + Tauri.","archived":false,"fork":false,"pushed_at":"2026-06-25T15:12:33.000Z","size":6357,"stargazers_count":1,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T17:07:12.627Z","etag":null,"topics":["ai-memory","claude","embeddings","local-first","mcp","rag","react","rust","sqlite","tauri"],"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/krishpinto.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-06-19T03:07:41.000Z","updated_at":"2026-06-25T15:12:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/krishpinto/grasp","commit_stats":null,"previous_names":["krishpinto/grasp"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/krishpinto/grasp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishpinto%2Fgrasp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishpinto%2Fgrasp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishpinto%2Fgrasp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishpinto%2Fgrasp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krishpinto","download_url":"https://codeload.github.com/krishpinto/grasp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krishpinto%2Fgrasp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35237753,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["ai-memory","claude","embeddings","local-first","mcp","rag","react","rust","sqlite","tauri"],"created_at":"2026-07-07T17:31:04.229Z","updated_at":"2026-07-07T17:31:04.282Z","avatar_url":"https://github.com/krishpinto.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Grasp\n\n[![CI](https://github.com/krishpinto/grasp/actions/workflows/ci.yml/badge.svg)](https://github.com/krishpinto/grasp/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n\u003e **Passive, local, zero-API memory for AI coding agents — and a 3D app to *see* it.**\n\nClaude Code already writes a transcript of every session to disk. **Grasp reads\nthose transcripts, keeps only the meaningful moments** — decisions, file changes,\nerror fixes, summaries — stores them as a searchable database *and* human-readable\nMarkdown, embeds them locally for semantic search, and gives you a desktop app to\nfly through your project's history as a 3D **memory graph**.\n\nThe agent never participates in the write path. No hooks, no API keys, no cloud,\nno separate database server. If the agent ran, Grasp captured it.\n\n\u003e *\"I never tell it to remember anything, and I can open a map of every decision\n\u003e my project ever made.\"*\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/graph.gif\" alt=\"Grasp 3D memory graph — flying through a project's decision history\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n---\n\n## Why it's different\n\nThe \"AI memory\" space is crowded, so Grasp is deliberate about its niche:\n\n| | Grasp | Typical memory tools |\n|---|---|---|\n| **Capture** | **Passive** — watches transcript files | Agent must call a tool / you prompt \"remember this\" |\n| **What it stores** | Your **decisions \u0026 conversation history** | Often code structure, or verbatim everything |\n| **Surface** | **3D decision graph + docs, in a desktop app** | No UI, or a raw database browser |\n| **Embeddings** | **On-device** (candle) — no API, ever | Cloud embedding APIs |\n| **Footprint** | One Rust engine, SQLite, Markdown | Python + vector DB + cloud, usually |\n\nThe wedge: **zero-friction passive capture + a visual decision graph**, entirely local.\n\n---\n\n## How it works\n\n```\n  Claude Code ──auto-writes──▶ transcripts (~/.claude/projects/*.jsonl)\n                                   │\n                                   ▼\n   ENGINE (Rust, grasp-core)\n     parse → extract signal → redact secrets → store BOTH\n          SQLite + FTS5 (fast search)   and   Markdown (human source of truth)\n       → embed locally (candle)  → hybrid search (BM25 + cosine, RRF-fused)\n                                   │\n              ┌────────────────────┼────────────────────┐\n              ▼                     ▼                     ▼\n          grasp CLI          MCP server            Tauri + React app\n        (import/search)   (agent recalls memory)   (search · 3D graph · docs)\n```\n\n1. **Capture** — a `notify` watcher reads transcripts the moment they're written. Passive; the agent does nothing.\n2. **Extract** — tolerant JSONL parser → keeps decisions (with rationale), file writes (what \u0026 why), error fixes, summaries, questions; drops plumbing (compaction summaries, IDE events, search noise).\n3. **Redact** — secrets (private keys, JWTs, `sk-…`/`ghp_…`/`AKIA…`, bearer tokens, `KEY=value`) are scrubbed *before* storage.\n4. **Store** — SQLite (`chunks` + FTS5) + per-day Markdown, SHA-256 deduped.\n5. **Embed** — candle runs `all-MiniLM-L6-v2` (384-dim) on-device; ~90 MB model, downloaded once.\n6. **Search** — BM25 keyword **and** cosine semantic, fused with Reciprocal Rank Fusion (k=60); falls back to BM25 if no vectors yet.\n\n---\n\n## The app\n\n\u003e **Download the app installer** — `Grasp-Setup.exe` on the\n\u003e [latest release](https://github.com/krishpinto/grasp/releases/latest) — or run it\n\u003e from source with `pnpm tauri dev`. The one-line install below sets up the engine\n\u003e + Claude Code memory; the app is a separate download.\n\n- **Loading splash** → **Overview**: the whole-system 3D \"brain\" of every project.\n- **Guided spotlight** the first time, pointing you to your memories.\n- **Archive**: a clean card per project.\n- **Project view**: that project's **3D graph** (orbit / zoom / pan — \"spectator mode\") + a scoped search.\n- **In-app docs**: an illustrated \"How it works\", with an animated pipeline.\n\nGraph nodes are memories (colored by type) and the **files** they touched; edges are\n**session** order, **shared file**, and **semantic similarity** — so related decisions\nconnect across days, not just within a session.\n\n---\n\n## Features\n\n- ✅ Live **passive capture** (`grasp watch` and the in-app watcher)\n- ✅ **Hybrid search** — BM25 (FTS5) + on-device semantic embeddings, RRF-fused\n- ✅ **3D memory graph** — orbitable, with file nodes + semantic edges\n- ✅ **Secret redaction** before anything is stored\n- ✅ **MCP server** — `query_memory` (auto-scoped to the current project) / `save_context` / `list_projects`\n- ✅ **Markdown source of truth** — readable, git-committable, survives the DB\n- ✅ **Retrieval eval harness** (`grasp eval`) — BM25 vs hybrid hit-rate\n\n---\n\n## Quick start (Windows)\n\n**Install the engine in one line** — downloads a prebuilt build with the\nembedding model **bundled in** (no Rust, no build, no separate download),\nregisters it with Claude Code, and imports your history:\n\n```powershell\nirm https://github.com/krishpinto/grasp/releases/latest/download/install.ps1 | iex\n```\n\nThen open a Claude Code session and ask about your past work — it'll use Grasp\nautomatically. That's it.\n\n\u003e **What the one-liner gives you:** the memory **engine** — passive capture,\n\u003e hybrid search, and the **MCP server** so Claude Code can recall your history.\n\u003e The **desktop app** (the 3D memory graph) ships separately as\n\u003e **`Grasp-Setup.exe`** on the [latest release](https://github.com/krishpinto/grasp/releases/latest).\n\n\u003cdetails\u003e\u003csummary\u003eManual steps\u003c/summary\u003e\n\nGrasp needs **Rust** and a **C compiler** (for the bundled SQLite). On Windows\nwithout Visual Studio, a portable GNU/MinGW toolchain works with no admin:\n\n```powershell\n# 1. Rust — GNU toolchain, no MSVC needed (https://rustup.rs)\nrustup default stable-x86_64-pc-windows-gnu\n# 2. A portable MinGW gcc on PATH (e.g. WinLibs UCRT), so bundled SQLite compiles.\n# 3. Node + pnpm for the UI\npnpm install\n```\n\nRun it:\n\n```powershell\npnpm tauri dev                          # desktop app (Vite + Tauri, hot reload)\n# or drive the engine headless:\ncargo run -p grasp-cli -- import       # ingest ~/.claude/projects\ncargo run -p grasp-cli -- embed        # generate vectors (semantic search)\ncargo run -p grasp-cli -- search candle toolchain\n```\n\nRegister it with Claude Code (auto-writes the MCP config):\n\n```powershell\ncargo run -p grasp-cli -- setup\n```\n\n\u003e macOS/Linux ship a C compiler by default, so only Rust + Node/pnpm are needed.\n\n\u003c/details\u003e\n\n---\n\n## CLI\n\n```\ngrasp import [--path DIR]     ingest transcripts (default ~/.claude/projects)\ngrasp embed                   generate embeddings (enables hybrid search)\ngrasp search \u003cquery…\u003e         hybrid (or keyword) search\ngrasp watch [--path DIR]      ingest live as sessions are written\ngrasp autostart [--off]       run capture in the background at every login\ngrasp eval                    run the retrieval eval set\ngrasp graph [--project SLUG]  print the memory graph as JSON\ngrasp projects | stats        registry / totals\ngrasp setup                   auto-register the MCP server with Claude Code\ngrasp mcp                     run the MCP server over stdio\ngrasp redact                  re-scrub stored memories with current secret patterns\ngrasp forget --project SLUG | grasp reset --yes\n```\n\n## Use with Claude Code (MCP)\n\n```powershell\ngrasp setup     # auto-registers the MCP server with Claude Code\n```\n\n(or manually: `claude mcp add grasp -s user -- \"C:\\path\\to\\grasp.exe\" mcp`.)\nThen, inside a session, just ask — *\"what did we decide about X?\"* — and Claude\ncalls `query_memory` automatically.\n\n---\n\n## Data \u0026 privacy\n\nGrasp captures real transcripts, which can contain secrets — so a **redaction\npass runs before anything is stored**: private keys, JWTs, provider API keys\n(`sk-…`, `ghp_…`, `AKIA…`), bearer tokens, and `KEY=value` assignments are\nreplaced with `[REDACTED]` labels. Everything stays on your machine — the SQLite\ndatabase and Markdown files live in your local data directory, and the embedding\nmodel runs on-device. Captured something before redaction improved? Run\n`grasp redact` to re-scrub the existing database and Markdown in place.\n\n## Platform support\n\nBuilt and tested on **Windows** (GNU/MinGW toolchain). The engine is written to\nbe cross-platform — paths are resolved via the `directories` crate, not hardcoded\n— so **macOS/Linux should work** with only Rust + Node/pnpm, but they aren't\nverified yet (CI builds the engine on Linux). The one-command installer is\nWindows-only for now; a `install.sh` and prebuilt release binaries are on the\nroadmap.\n\n## Tech stack\n\nRust · Tauri 2 · React + Vite + TypeScript · SQLite (`rusqlite` + FTS5) ·\n`candle` (local embeddings) · `notify` · `react-force-graph-3d` + three.js.\n\n```\ncrates/grasp-core   the engine: parser · extractor · redactor · store · embeddings · search · graph\ncrates/grasp-cli    command-line driver + MCP server\nsrc-tauri            Tauri desktop shell + live watcher\nsrc                  React UI (overview · archive · project graph · docs · note viewer)\n```\n\n## Roadmap\n\n- **More agents** — capture is Claude Code-first; Codex \u0026 others planned (the MCP read side already works with any MCP client).\n- **One-click installer** — so \"try it\" doesn't mean \"compile it\".\n- **Auto-recall** — a SessionStart hook that injects memory before you ask.\n- **Sharper retrieval** — honest eval set + tuned extraction.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrishpinto%2Fgrasp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrishpinto%2Fgrasp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrishpinto%2Fgrasp/lists"}