{"slug": "show-hn-pandaclip", "title": "Show HN:PandaClip", "summary": "PandaClip, a local-first MCP server with 40 tools for clipboard history, caching, file metadata, and knowledge graphs, has been released on GitHub. The tool runs entirely on SQLite with no daemons or cloud dependencies, and includes a companion Electron app for monitoring agent activity. It is designed for developers building AI agent workflows that require persistent, private data stores.", "body_md": "One local-first MCP server + a desktop activity lens. No daemons, no cloud, SQLite everywhere.\n\n`@vektorgeist/pandaclip`\n\nis a single server with four tool families:\n\n| Family | Tools | What it does |\n|---|---|---|\n| 📋 clipboard | `clip_*` , `snippet_*` , `channel_*` |\nClipboard history (TTL classes, tag/contains filters), permanent named snippets, channel label-lanes, secret screening |\n| ⚡ cache | `cache_*` |\nNamespaced cache with TTLs, canonical hash keys, invalidation, stats |\n| 🎋 bamboo | `workspace_*` , `entry_*` , `stalk_*` , `bamboo_find` , `organize_scan` |\nContextual file organizer overlay: tags, notes, and metadata on files you already have — nothing is moved or copied |\n| 🌱 garden | `garden_*` |\nKnowledge graph: plant/grow/prune nodes, typed edges, BFS traverse, per-node history |\n\nAll data lives under `~/.panda/<area>/`\n\n(override with `PANDA_HOME`\n\n). One\nregistration, one process, 40 tools.\n\nPandaClip is a single stdio MCP server (TypeScript). Your agent's MCP client\nspawns it, it exposes the 40 tools, and every tool is a small, deterministic\noperation on a plain SQLite database — one store per family under\n`~/.panda/<area>/`\n\n, WAL mode, no background daemons, no network, no cloud.\nNothing happens unless a tool is called:\n\n**clipboard**—`clip_push`\n\nappends to history with TTL classes, tag/contains filters, and secret screening (obvious keys and tokens are refused before they are ever stored). Snippets are permanent named clips; channels are named label lanes inside the same local store, so an agent can be pointed at exactly the clip you mean.**cache**— a namespaced TTL cache with canonical hash keys, for expensive lookups an agent shouldn't repeat.** bamboo**— tags, notes, and metadata overlaid on files you already have, in place; nothing is moved or copied.** garden**— a typed knowledge graph: plant/grow/prune nodes, typed edges, BFS traversal, per-node history.\n\nThe desktop lens reads those same stores from the other side. The Electron app\nspawns a read-only watcher child on your system Node (>= 22.5 — it needs\n`node:sqlite`\n\n's WAL-aware reads), which polls the stores plus any sources you\nconfigure, diffs against the last state, and streams change events as NDJSON\nup to the live feed. The server stays the sole writer; the lens can only look.\n\n`apps/bamboo-clipboard-ui/`\n\nis an installable Electron app: a live, read-only\nfeed of what your agents are doing. Out of the box it watches PandaClip's own\nstores — the clipboard (clips, snippets, channels), cache writes, and garden\nplantings. Three more sources are **blank slots** you can point at your own\nstores in `~/.panda/config.json`\n\n:\n\n```\n{\n  \"lens\": {\n    \"notes\": { \"dir\": \"~/my-notes\", \"skipDirs\": [\"drafts\"] },\n    \"git\":   { \"dir\": \"~/code\" },\n    \"kg\":    { \"db\": \"~/.local/share/kg/facts.sqlite3\",\n               \"vectors\": \"~/.local/share/kg/vectors.sqlite3\",\n               \"groupKeys\": [\"project\"],\n               \"typeLabels\": { \"journal_entry\": \"journal written\" } }\n  }\n}\n```\n\n`notes`\n\nfeeds markdown edits, `git`\n\nfeeds new commits from repos under the\ndir, and `kg`\n\nunderstands a knowledge-graph on-disk layout (a triples DB\nplus a vector store). The optional `kg`\n\nkeys shape how vector-store records\nappear in the feed: `groupKeys`\n\n/`tagKeys`\n\npick metadata fields for the title\nand tags, and `typeLabels`\n\n/`idPrefixLabels`\n\nmap a record's type field or id\nprefix to a friendly label — unset, records show generically.\nUnconfigured slots are simply off. The watcher is strictly read-only.\nRequires a system Node.js >= 22.5. Run with\n`npm start --workspace pandaclip`\n\n.\n\nThe lens borrows its shape from Anthropic's **jacobian-lens** — companion code\nto the paper *\"Verbalizable Representations Form a Global Workspace in LMs\"* —\nwhich reads a transformer's internal activations to surface what the model is\ndisposed to say before it says it. PandaClip applies the same move one level up\nthe stack: instead of weights and gradients, it gives you a live, read-only\nwindow onto what your agents are *doing* in the moment — every clip, cache\nwrite, planted fact, note edit, and commit surfaces in the feed as it happens.\nA model lens reads the model's working state; PandaClip reads your agents'.\n\nPandaClip deliberately ships **no search engine**. Pair it with\n[magpie-search](https://github.com/xfloukiex-lab/magpie-search) ([PyPI](https://pypi.org/project/magpie-search/), `npx -y magpie-search-mcp`\n\n) and the two\ncover each other: magpie finds things (transcripts, history, deep lookup),\nPandaClip holds things (clipboard, cache, file overlay, knowledge graph).\n\nIn practice the pairing looks like this: magpie-search **finds** — it fans out\nover transcripts, local files, and the web and brings back the answer.\nPandaClip **keeps** — `cache_put`\n\nthe expensive lookup so it isn't repeated,\n`clip_push`\n\nthe excerpt that mattered, `garden_plant`\n\nthe durable fact with a\ntyped edge to what it relates to. Next session that fact is one\n`garden_search`\n\naway instead of a fresh search, and the lens shows the whole\nloop happening live.\n\nRun them side by side as separate MCP servers — there is no code coupling and neither requires the other. Without magpie, everything still works; your agent just does its lookups manually.\n\n```\nnpm install\nnpm run build\nnpm test\n```\n\nSee `examples/mcp-config.json`\n\n. Point the entry at\n`servers/pandaclip/dist/index.js`\n\n(or `npx @vektorgeist/pandaclip`\n\nonce published).\n\n- One server; the four families share only\n`@vektorgeist/panda-core`\n\n(SQLite helpers) and the`~/.panda/`\n\nhome. - Tool names are literal (\n`cache_get`\n\n, not`feed_panda`\n\n); panda theming stays in docs. - Cache is an optimization, never a source of truth.\n\n**PandaClip is built by VektorGeist LLC.**\n\nWe build local-first tools for people who run their own AI. PandaClip is the\nworking-state toolbox; our agent platform is at ** vektorgeist.com**.\n\n- Website:\n[vektorgeist.com](https://vektorgeist.com) - Contact:\n[floukie@vektorgeist.com](mailto:floukie@vektorgeist.com) - Issues & contributions: open an issue or PR on this repository.\n\nLicensed under the **Apache License 2.0** — see [LICENSE](/xfloukiex-lab/pandaclip/blob/main/LICENSE).\nCopyright © 2026 VektorGeist LLC.\n\n*\"PandaClip\" and the panda mark are trademarks of VektorGeist LLC. The code is\nopen under Apache-2.0; the brand and name are reserved.*", "url": "https://wpnews.pro/news/show-hn-pandaclip", "canonical_source": "https://github.com/xfloukiex-lab/pandaclip", "published_at": "2026-07-14 03:35:02+00:00", "updated_at": "2026-07-14 03:48:20.293269+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-infrastructure"], "entities": ["PandaClip", "SQLite", "Electron", "Anthropic", "jacobian-lens"], "alternates": {"html": "https://wpnews.pro/news/show-hn-pandaclip", "markdown": "https://wpnews.pro/news/show-hn-pandaclip.md", "text": "https://wpnews.pro/news/show-hn-pandaclip.txt", "jsonld": "https://wpnews.pro/news/show-hn-pandaclip.jsonld"}}