# Show HN: Cursor Buddy, get archived Cursor chats out of renderer RAM

> Source: <https://github.com/professorpalmer/cursor-buddy>
> Published: 2026-08-28 20:09:42+00:00

Cursor's Archive button hides chats. The rows stay in `state.vscdb`

, and Cursor Helper (Renderer) keeps paying for them.

This is a **Cursor plugin** (not a standalone MCP dump): rules, skills, commands, logo, and an MCP server that searches a local SQLite vault. You ask “when did we talk about the memory leak?”; the agent pulls **snippets**. Ask for the whole transcript and it reads that chat into **this** conversation — not back into the renderer.

Measured on one Mac, 28 Aug 2026, after export, **before prune**: renderer 1.97 GB RSS, `state.vscdb`

3.68 GB (233 archived + 79 active), vault 2.68 GB (232 chats, 13,577 searchable messages). Search is 1-10 ms. Your numbers will differ.

| You want | Plugin surface | What RAM it uses |
|---|---|---|
| Find the chats | MCP `search_archive` , `/search-archive` |
Vault SQLite. Renderer unchanged. |
| Read one chat | MCP `read_composer` |
Agent context in this thread. Still not the renderer. |
| Shrink Cursor | `/export-archived` , Quit (`Cmd+Q` ), `/prune-from-cursor` |
Deletes vaulted archived rows from `state.vscdb` . |

Nothing is copied back into Cursor's live DB. Sidebar Archive is not this.

This is not a second [Portable LLM Wiki](https://github.com/professorpalmer/portable-llm-wiki). The wiki is markdown pages, `[[wikilinks]]`

, and Karpathy ingest. Buddy is a dump-and-query archive of Cursor composers. It steals the wiki's retrieval habits (composer as page, skip hub chats, empty index stays empty), not the wiki product.

Requires Python 3 on `PATH`

(the MCP server is stdio Python shipped inside the plugin).

Cursor discovers Cursor Plugins from `~/.cursor/plugins/local`

when local plugin imports are allowed ([docs](https://cursor.com/docs/plugins)).

```
git clone https://github.com/professorpalmer/cursor-buddy.git
mkdir -p ~/.cursor/plugins/local
rsync -a --delete --exclude .git cursor-buddy/ ~/.cursor/plugins/local/cursor-buddy/
```

Then **Developer: Reload Window**. Open **Customize** and confirm:

- Plugin: Cursor Buddy
- Rule: vault-not-live-db
- Skill: archived-chats
- Commands:
`/export-archived`

,`/prune-from-cursor`

,`/search-archive`

- MCP:
`cursor-buddy`

with`list_composers`

,`search_archive`

,`read_composer`

The bundled `mcp.json`

uses `python3`

plus `${PLUGIN_ROOT}/bin/cursor-buddy`

(Agent Plugins spawn shape: interpolate `PLUGIN_ROOT`

in `args`

/`cwd`

, never in `command`

). If MCP connects with 0 tools, Cursor is still starting the server with cwd = home and not expanding `${PLUGIN_ROOT}`

. Set `args[0]`

in `~/.cursor/plugins/local/cursor-buddy/mcp.json`

to that copy's absolute `bin/cursor-buddy`

path and reload.

```
# Safe while Cursor is open
python3 ~/.cursor/plugins/local/cursor-buddy/bin/cursor-buddy export

# Requires Cmd+Q first
python3 ~/.cursor/plugins/local/cursor-buddy/bin/cursor-buddy prune          # dry-run
python3 ~/.cursor/plugins/local/cursor-buddy/bin/cursor-buddy prune --apply
```

Vault path: `~/Library/Application Support/cursor-buddy/vault.sqlite`

. Active (unarchived) chats are never exported or pruned.

Marketplace listing (after review): [cursor.com/marketplace/publish](https://cursor.com/marketplace/publish).

| Kind | Path |
|---|---|
| Manifest | `.cursor-plugin/plugin.json` |
| MCP | `mcp.json` → `bin/cursor-buddy mcp` |
| Skill | `skills/archived-chats/` |
| Rule | `rules/vault-not-live-db.mdc` |
| Commands | `commands/*.md` |
| Hooks | `hooks/hooks.json` (export on workspace/session) |
| Logo | `assets/logo.svg` |

Archive in the sidebar still does not copy or delete anything. Buddy splits the job:

**Ingest (safe while Cursor is open).**`export`

copies newly archived chats into the vault. Plugin hooks run that on`workspaceOpen`

,`sessionStart`

, and`sessionEnd`

. Unchanged chats are skipped.**Prune (only after Cursor releases** Never from a hook that runs while the app is open. Install a LaunchAgent that prunes once the DB is idle:`state.vscdb`

).

```
python3 ~/.cursor/plugins/local/cursor-buddy/bin/cursor-buddy install-automation
```

If you archive a chat tonight, the next workspace open or agent session copies it. After you Quit (`Cmd+Q`

), leave Cursor closed for a minute so prune-if-idle can delete those rows (VACUUM can take a bit on a large `state.vscdb`

). Active chats are never touched.

Manual export/prune still works.

`search_archive`

keeps distinctive tokens (length >= 3, stop list), requires every token to appear in the same composer (title or messages, not necessarily one bubble), and caps hits per composer so a 50k-bubble chat cannot fill the result. Stop-only queries return nothing. Tool bubbles with empty `text`

are not indexed; `composerData`

/ plan blobs are not dumped into FTS.

MIT
