Recently Written · git

ideamine

An idea inbox for Claude Code: /idea saves ideas at zero tokens; Claude triages them and routes each to the cheapest model that can build it.

git clone https://github.com/equwal/ideamine

Log | Files | Refs


README.md (25519 bytes)

1 # ideamine
2 
3 **An idea inbox for Claude Code.** Save ideas as fast as you have them. Claude sorts them out later.
4 
5 ```
6 > /idea let the scroller pause when the mouse hovers over a link
7   ๐Ÿ’ก Saved #43 ยท let the scroller pause when the mouse hovers over a link  (6 in inbox)
8 ```
9 
10 That line did not call the model. A hook answers `/idea` on your machine before any request goes to Claude, so saving an idea:
11 
12 - **costs 0 tokens.** `claude -p "/idea โ€ฆ"` reports 0 turns, 0 input tokens, 0 output tokens, $0.
13 - **does not interrupt the current task.** Claude never sees the idea, so it cannot get distracted by it.
14 - **works on any model, in any session, and when you are out of usage.** Nothing is sent, so there is nothing to rate-limit.
15 
16 Every session writes to one archive, `~/.ideamine/ideas.json`, whatever project or model it uses. The archive is a queue. Claude triages new ideas to put the queue in order: it decides which ideas are worth doing and picks the **cheapest model that can build each one**: Haiku for a typo, Sonnet for a feature, Opus for a redesign. Fable is only for the hardest problems. `/ideas-go` takes the idea that fits your chat, else the first one, and builds it.
17 
18 ## Install
19 
20 In Claude Code (CLI, desktop, or IDE):
21 
22 ```bash
23 claude plugin marketplace add equwal/ideamine
24 ```
25 
26 ```bash
27 claude plugin install ideamine@ideamine
28 ```
29 
30 Or from inside a session: `/plugin marketplace add equwal/ideamine`, then `/plugin install ideamine@ideamine`. Start a new session to load it. Requires Node.js 18 or later. There are no dependencies to install. Tested on Claude Code 2.1.224 (CLI) and 2.1.275 (desktop app) on Windows.
31 
32 Marketplaces you add yourself do not auto-update. To upgrade, run `claude plugin marketplace update ideamine`, then `claude plugin update ideamine@ideamine`.
33 
34 ## Commands
35 
36 | Command | What it does | Calls the model? |
37 |---|---|---|
38 | `/idea <text>` | Add an idea. A pasted bulleted list adds one idea per bullet. `#tags` are recorded. | **No** |
39 | `/ideas` | Show the queue: doing, do (best first), maybe, inbox | **No** |
40 | `/ideas-ls done` ยท `-a` ยท `here` | List one lane, every lane, or only this project | **No** |
41 | `/ideas-cat 12` | Show idea #12 in full: brief, model, notes | **No** |
42 | `/ideas-rm 12 14` | Delete ideas for good | **No** |
43 | `/ideas-done 12 shipped it` | Mark an idea done, with a note | **No** |
44 | `/ideas-reopen 12` | Put an idea back in the queue, for example one that the triage skipped | **No** |
45 | `/ideas-find sync subtitles` | Search every lane by meaning, not only by the words. See [Search by meaning](#search-by-meaning-and-groups). | **No** |
46 | `/ideas-groups` ยท `done` ยท `-a` | Show the ideas grouped by meaning | **No** |
47 | `/ideas-web` ยท `off` | Start the dashboard with a button for each command on this PC, and show its address. See [Buttons](#buttons). | **No** |
48 | `/ideas-sync <url>` ยท `off` | Share one archive between all your machines through an ideamine server. See [One archive for every machine](#one-archive-for-every-machine). | **No** |
49 | `/ideas-go [12]` | Build the idea that fits this chat, else the first in the queue, or #12, on its recommended model. New ideas are triaged first. | Yes, this is the build |
50 | `/ideas-all` | Claude reads every idea, takes the ones that fit this chat out of the queue, and does them. The others stay in the queue. | Yes, this is the build |
51 | `/ideas-sort` | Triage the inbox now and show the queue. You do not have to: `/ideas-go` triages when it must. | Yes, briefly |
52 | `/ideas-watch [off]` | Turn on the watcher: Haiku triages each new idea and pairs it with its project, in the background. With no argument, it also shows what the watcher did. | Haiku, only for new ideas |
53 | `/ideas <question>` | Ask about your ideas, e.g. "which ones fit in an hour?" | Yes, briefly |
54 
55 Each command has its own name, so the slash menu shows all of them when you type `/idea`. The plugin menu also shows them as `/ideamine:ideas-go` and so on. Both forms work.
56 
57 `/ideas-go` does not ask questions. The queue puts the best `do` ideas first, then the best `maybe` ideas. Ideas that the triage marks `skip` stay out of the queue until you reopen or delete them.
58 
59 You save ideas from any session, so the folder that ideamine records is only the folder you were in. That can be the scratch folder of another chat. For this reason, the triage pairs each idea with the project that it is about (see [The watcher](#the-watcher)), and `/ideas-go` and `/ideas-all` let Claude judge by the text which ideas fit the current chat, and where to build each one. `/ideas-go` builds in the current project when the idea fits it. Else it uses the recorded folder if that folder exists, or finds the project that the idea is about. If it cannot find the project, it stops and tells you.
60 
61 Claude can also save ideas by itself. If you write "idea: dark mode for the popup" or "save that for later", it calls the `idea_add` tool and continues the current task.
62 
63 ## The watcher
64 
65 ```
66 > /ideas-watch
67   ideamine watch: on since 2026-09-21 14:02. haiku triages new ideas and pairs each one with its project.
68 ```
69 
70 Run `/ideas-watch` once. After that, a few seconds after you save an idea, Haiku (the cheapest model) triages it and pairs it with its project. The triage chooses from the folders of your ideas and the projects that Claude Code knows (`~/.claude.json`), and it reads the first line of each README. If no project fits, for example for an idea for a new product, the idea stays where you saved it. The first pass also triages again the open ideas from before 0.4.0, so that they get a project too.
71 
72 The watcher is not a process that stays alive, because a process like that can stop: a crash, a reboot, a full context, or a usage limit. Instead, the ideamine hook starts a short background pass when you send a prompt and there is work. Thus the watcher keeps going while you use Claude Code, and it costs nothing while no new ideas come in. A failed call gets 2 more tries in the same pass. After a failed pass, the watcher waits 10 minutes before it tries again. `/ideas-watch` shows the last passes, and `/ideas-watch off` turns the watcher off. In a terminal, `ideamine watch` does the same. The log is `~/.ideamine/watch.log`.
73 
74 ## Search by meaning and groups
75 
76 ```
77 > /ideas-find make money
78   ideas like "make money", by meaning
79     53% done    #4   sonnet S  โ–ฒ3  Research monetization models for device-hacking utility apps
80 ```
81 
82 `/ideas-find` finds ideas that mean the same thing as your words, also when they use other words. `/ideas-groups` puts ideas that are about the same thing in one group, for example all the ideas for one app. Both come from embeddings: an embedding model turns each idea into a vector, and ideas with similar meaning get similar vectors. The default model is [nomic-embed-text](https://huggingface.co/nomic-ai/nomic-embed-text-v1.5). The design follows [memstate](https://github.com/map588/memstate): the `search_document:` and `search_query:` task prefixes of nomic, one cached vector for each idea that ideamine computes again when the idea changes, cosine similarity with a threshold, and word search when the embedding server does not answer. The groups and the related ideas come from the same vectors, so ideamine needs no graph database.
83 
84 ideamine sends the text of each new or changed idea to an embedding server that has an OpenAI-compatible `/v1/embeddings` endpoint. Two servers work:
85 
86 - [Ollama](https://ollama.com) on your machine: `ollama pull nomic-embed-text`. This is the default (`http://127.0.0.1:11434/v1`).
87 - The [llama.cpp](https://github.com/ggml-org/llama.cpp) server on another machine, for example a small VPS. The model file is [`nomic-embed-text-v1.5.Q8_0.gguf`](https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF) (146 MB). With `-c 512` the server uses about 20 MB of memory plus the model file, which the kernel can page out:
88 
89   ```bash
90   llama-server -m nomic-embed-text-v1.5.Q8_0.gguf --embeddings --pooling mean -c 512 -b 512 -ub 512 --alias nomic-embed-text --host 127.0.0.1 --port 8081
91   ```
92 
93 Then tell ideamine where the server is:
94 
95 ```bash
96 ideamine config embed_url http://10.66.0.1/v1
97 ```
98 
99 ```bash
100 ideamine embed
101 ```
102 
103 `ideamine embed` embeds the ideas that have no vector yet. It also shows the similarity of each idea to its nearest neighbour, like `memstated embed status`. Use these numbers to set the thresholds for a new model. With nomic-embed-text, a search result must have a similarity of 0.5 or more (`search_threshold`), and the ideas in a group must have a mean similarity of 0.65 or more (`group_threshold`). A group gets a label from the words that its ideas share and other ideas do not use. If the server does not answer, `/ideas-find` searches by words and tells you why, and `/ideas-groups` tells you that it needs the server. The vectors are in `~/.ideamine/vectors.json`. When you delete an idea, its vector goes too.
104 
105 Claude can search by meaning with `idea_list` and `semantic: true`, and group with `groups: true`.
106 
107 ## Dashboard
108 
109 `ideamine publish` makes a web page of your ideas: a board with a ticket for each idea, a timeline (a Gantt chart) of how long each idea waited and how long the work took, the groups, and search by meaning. A ticket opens a preview with the brief, the notes, and the related ideas. The page is one static file, `index.html`, and it reads a snapshot, `data.json`. It loads nothing from the internet.
110 
111 ```bash
112 ideamine publish http://10.66.0.1/
113 ```
114 
115 This uploads both files with HTTP PUT. It also saves the address, so the ideamine hook publishes again in the background after each change, at no model cost. `ideamine publish off` stops that. `ideamine publish --dir <folder>` writes the two files to a folder instead. The timeline uses the time when an idea went to `doing`. ideamine records that time from 0.5.0 on, so for older ideas the timeline shows an estimated bar.
116 
117 The snapshot contains the full text of your ideas. Serve it only where only you can open it. For example, this nginx site answers only on the address of a WireGuard interface, and it accepts uploads only from one peer:
118 
119 ```nginx
120 server {
121     listen 10.66.0.1:80;           # the WireGuard address of the server
122     allow 10.66.0.0/24;            # WireGuard peers only
123     deny all;
124     root /var/www/ideamine;
125     location ~ ^/(index\.html|data\.json)$ {
126         limit_except GET HEAD { allow 10.66.0.2; deny all; }   # only your PC uploads
127         dav_methods PUT;
128         client_max_body_size 16m;
129     }
130     location /v1/ { proxy_pass http://127.0.0.1:8081; }        # the llama.cpp server, for search on the page
131 }
132 ```
133 
134 `data.json` has `version` (1), `generated`, `embed` (model, query prefix, thresholds, and whether vectors are present), `counts`, `ideas`, and `groups`. Each idea has its ticket key (`IDEA-12`), lane, rank in the queue, triage, times (`created`, `triaged`, `started`, `closed`), timeline `phases`, notes, `group`, `related` ideas with their similarity, and `vec`, the vector as base64 of little-endian float32. The `data.json` of `ideamine serve` also has `live` (see below).
135 
136 ### Buttons
137 
138 ```
139 > /ideas-web
140   ideamine web: http://127.0.0.1:4332/ (started)
141 ```
142 
143 `/ideas-web` starts `ideamine serve` in the background and shows its address. That page is the same dashboard, with a button for each command:
144 
145 | Button | Command |
146 |---|---|
147 | **+ Idea** | `/idea`. A bulleted list adds one idea for each bullet. |
148 | **Triage inbox** | `/ideas-sort` |
149 | **Build next**, and **Build with Claude** on a ticket | `/ideas-go`, `/ideas-go N`. New ideas are triaged first. Then a new terminal window opens Claude Code on the recommended model, in the project of the idea. Windows only. |
150 | **Ask** | `/ideas <question>`. Claude answers from the whole archive, and each `#12` in the answer opens that ticket. |
151 | **Watcher** | `/ideas-watch`, `/ideas-watch off` |
152 | **Start**, **Done**, **Drop**, **Reopen**, **Delete** on a ticket | `ideamine start`, `/ideas-done`, `ideamine drop`, `/ideas-reopen`, `/ideas-rm` |
153 | **Add note**, **Build model** on a ticket | `ideamine note`, `ideamine model` |
154 
155 The board, the timeline, the groups, and the search show `/ideas`, `/ideas-ls`, `/ideas-cat`, `/ideas-groups`, and `/ideas-find`. `/ideas-all` has no button, because it needs the chat that it works in.
156 
157 Triage, Build, Ask, and the watcher need the Claude Code login, so they show only where Claude Code runs. The commands run on your PC, because your Claude Code login is there. Thus the server listens on `127.0.0.1` only, and it takes commands only from its own page: each command must be JSON from the same origin, and the Host header must name the server. Another web page in your browser cannot send commands to it, and no other page can show it in a frame. After a change, the server uploads the dashboard again when `publish_url` is set, so the copy on your dashboard server stays current. That copy has no buttons: it shows "Read-only copy". `/ideas-web off` stops the server. In a terminal, `ideamine serve` runs it in the foreground. To use another port, run `ideamine config serve_port 5000`. The log is `~/.ideamine/serve.log`.
158 
159 ## One archive for every machine
160 
161 ```
162 > /ideas-sync http://10.66.0.1/
163   ideamine sync: http://10.66.0.1/
164   last sync 2026-09-21 19:24, revision 212.
165 ```
166 
167 Without sync, each machine has its own archive. With sync, an ideamine server holds one archive, and every Claude on every machine reads and changes it. The server is `ideamine serve` on a machine that all your machines can reach, for example a small VPS on a WireGuard network. Its page is the same dashboard for every machine.
168 
169 Each machine keeps a copy of the archive, so that `/ideas` and the other reads stay fast. A change goes into an outbox on the machine first, and then to the server. If the server does not answer, for example because the tunnel is down, the change waits in the outbox and goes with the next sync. Thus no idea is lost. `/idea` then says "Saved here", and `/ideas` says that it shows the copy on this machine. The server applies each change only once, also when a machine sends it twice. A background sync after your prompts sends what waits, and it gets the changes of the other machines at most once a minute. Prompts for the prompt log go at most every 20 seconds, so that a prompt does not start a process each time. The first `/ideas-sync` saves the archive that was on the machine as `ideas.before-sync-<date>.json`, because the archive of the server takes its place.
170 
171 On the server, sync stays off. It serves the archive, and nginx gives it the address of the WireGuard interface:
172 
173 ```bash
174 IDEAMINE_HOME=/var/lib/ideamine IDEAMINE_SERVE_HOSTS=10.66.0.1 ideamine serve --port 4332
175 ```
176 
177 ```nginx
178 server {
179     listen 10.66.0.1:80;
180     allow 10.66.0.0/24;
181     deny all;
182     location / { proxy_pass http://127.0.0.1:4332; proxy_set_header Host $host; client_max_body_size 2m; }
183     location /v1/ { proxy_pass http://127.0.0.1:8081; }   # the embedding server
184 }
185 ```
186 
187 `serve_hosts` names the Host that nginx sends. Without it, the server refuses the request, so a DNS rebinding page cannot reach the archive. The server does not ask who you are: the network decides who can reach it. Put it only on a private network like WireGuard.
188 
189 ### Prompts and Memory
190 
191 The dashboard can also show what your Claudes did:
192 
193 - **Prompts**: each prompt that you typed, on every machine, as a timeline of sessions. `ideamine config prompt_log on` sends each prompt to the ideamine server in the background. The full text goes, without the notes that Claude Code puts into a prompt; a paste longer than 100,000 characters is cut. `ideamine prompts import` sends the prompts of your older chats from the Claude Code transcripts.
194 - **Memory**: the memories of a [memstate](https://github.com/map588/memstate) daemon: a timeline of the writes of each project, the latest writes, and each memory with its versions. Set `memstate_url` on the server, for example `http://127.0.0.1:8765`. The dashboard only reads memstate.
195 
196 ## Model routing
197 
198 The triage gives each idea a verdict (`do`, `maybe`, `skip`), an impact from 1 to 5, a size from `xs` to `xl`, a one-line reason, and a short brief that an agent can act on without the original chat. It also picks the cheapest model that is likely to finish the idea in one pass. If a weaker model fails and has to retry, that costs more than using the right model once.
199 
200 | Model | $ in / out per 1M tokens | Gets ideas like |
201 |---|---|---|
202 | `haiku` (Haiku 4.5) | $1 / $5 | mechanical, fully specified, local work: typos, renames, config tweaks, boilerplate, small scripts |
203 | `sonnet` (Sonnet 5) | $2 / $10 | the default: ordinary features, bug fixes with a clear repro, tests, docs, contained refactors |
204 | `opus` (Opus 5) | $5 / $25 | ambiguous or cross-cutting work: architecture, hard debugging, performance, security |
205 | `fable` (Fable 5.1) | $10 / $50 | only the hardest long-horizon or research-grade problems |
206 
207 The triage does not run on your session's model. `/ideas-go` and `/ideas-sort` make one tool call, and the MCP server hands the work to a separate, minimal `claude -p` run on Sonnet (see below). Only new ideas are triaged, once each. A session on Opus or Fable therefore pays the same few cents as a session on Haiku. If that CLI is not available, Claude does the triage itself.
208 
209 Recommendations are stored as aliases, so they stay valid when a newer model ships under the same name. `/ideas-go` gives the build to a subagent on the recommended model. The subagent starts with a clean context, so the build does not also re-read your whole conversation. To override a recommendation, run `ideamine model 12 opus` or ask Claude.
210 
211 ## Headless triage
212 
213 ```bash
214 ideamine sort
215 ```
216 
217 `/ideas-go` and `/ideas-sort` use this same engine. It is one `claude -p` call on your normal Claude Code login, with no tools, no MCP servers, no settings, a two-line system prompt, and a JSON schema for the output. Four ideas take about 1,700 input tokens, roughly two cents on Sonnet. A normal model turn in a setup with a few MCP servers can re-read tens of thousands of tokens. To keep the inbox sorted while you sleep, schedule the command with cron or Task Scheduler. `--model haiku` makes it cheaper, and `--dry-run` shows the exact prompt.
218 
219 ## Command line
220 
221 ```bash
222 npm install -g github:equwal/ideamine
223 ```
224 
225 ```
226 ideamine add "support vim keys in the popup"      # "-" reads stdin
227 ideamine ls [inbox|do|maybe|skip|doing|done|-a] [here]
228 ideamine cat 12
229 ideamine rm 12                                    # delete for good
230 ideamine done 12 "shipped in v1.4"                # also: drop, start, reopen, note
231 ideamine next                                     # what to build next
232 ideamine go 12                                    # opens Claude Code on the right model, in the idea's project
233 ideamine sort                                     # headless triage (see above)
234 ideamine watch [off]                              # the watcher (see above)
235 ideamine find sync subtitles                      # search by meaning
236 ideamine groups [-a]                              # ideas grouped by meaning
237 ideamine embed                                    # embed new ideas, show the similarity numbers
238 ideamine publish [url|off] [--dir folder]         # the dashboard (see above)
239 ideamine serve [--port 4332]                      # the dashboard with buttons, on 127.0.0.1
240 ideamine sync [url|off]                           # one archive for every machine (see above)
241 ideamine prompts import                           # the prompts of older chats, for the Prompts tab
242 ideamine config [key [value]]                     # show or change a setting
243 ideamine export IDEAS.md                          # Markdown copy of everything
244 ```
245 
246 ## Other MCP clients
247 
248 The MCP server works without the plugin. For Claude Desktop, Cursor, or any stdio MCP client:
249 
250 ```json
251 {
252   "mcpServers": {
253     "ideamine": { "command": "npx", "args": ["-y", "github:equwal/ideamine", "mcp"] }
254   }
255 }
256 ```
257 
258 Tools: `idea_add`, `idea_list`, `idea_triage`, `idea_update`, `idea_next`, `idea_remove`. Outside the plugin, the slash commands are MCP prompts. Without the hook, saving goes through the model, which costs a few tokens.
259 
260 ## Where your ideas live
261 
262 `~/.ideamine/ideas.json` is plain, readable JSON. Set `IDEAMINE_HOME` to move it, for example into a synced folder. Each write takes a lock and then replaces the file in one step, so many sessions can write at the same time without losing an idea. The previous version is kept as `ideas.json.bak`. If the file becomes damaged, ideamine stops and does not overwrite it. Nothing leaves your machine, except in these cases: triage and builds go through Claude as usual; search by meaning and groups send the text of your ideas to the embedding server that you set; `ideamine publish` uploads a snapshot to the dashboard server that you set; with sync on, the archive is on the ideamine server, and with the prompt log on, your prompts go there too. So that it can pair ideas with projects, the triage also sends the paths of your project folders and the first line of each README.
263 
264 `ideamine config` shows each setting and where its value comes from. `ideamine config <key> <value>` saves a setting in `~/.ideamine/config.json`, and an empty value restores the default. An environment variable wins over the file.
265 
266 | Variable | Setting | Default | Purpose |
267 |---|---|---|---|
268 | `IDEAMINE_HOME` | | `~/.ideamine` | archive location |
269 | `IDEAMINE_TRIAGE_MODEL` | | `sonnet` | model for the headless triage |
270 | `IDEAMINE_CLAUDE_BIN` | | `claude` | Claude Code executable |
271 | `IDEAMINE_SETTING_SOURCES` | | *(empty)* | set to `user` if your login needs `settings.json` (e.g. `apiKeyHelper`) |
272 | `IDEAMINE_EMBED_URL` | `embed_url` | `http://127.0.0.1:11434/v1` | OpenAI-compatible embeddings API (Ollama, llama.cpp server) |
273 | `IDEAMINE_EMBED_MODEL` | `embed_model` | `nomic-embed-text` | embedding model; nomic models get their task prefixes |
274 | `IDEAMINE_SEARCH_THRESHOLD` | `search_threshold` | `0.5` | lowest similarity of a search result |
275 | `IDEAMINE_GROUP_THRESHOLD` | `group_threshold` | `0.65` | lowest mean similarity in a group, and of a related idea |
276 | `IDEAMINE_PUBLISH_URL` | `publish_url` | *(off)* | dashboard server for `ideamine publish` |
277 | `IDEAMINE_SERVE_PORT` | `serve_port` | `4332` | port of `ideamine serve` and `/ideas-web` |
278 | `IDEAMINE_SERVE_HOSTS` | `serve_hosts` | *(none)* | more Host names that `ideamine serve` answers, for a server behind nginx |
279 | `IDEAMINE_SYNC_URL` | `sync_url` | *(off)* | the ideamine server that holds the archive of every machine |
280 | `IDEAMINE_PROMPT_LOG` | `prompt_log` | `off` | `on` sends each prompt to the ideamine server |
281 | `IDEAMINE_MEMSTATE_URL` | `memstate_url` | *(off)* | the memstated daemon for the Memory tab |
282 
283 ## How it works
284 
285 ```
286 /idea โ€ฆ          โ”€โ”€โ–บ UserPromptSubmit hook โ”€โ”€โ–บ ~/.ideamine/ideas.json โ”€โ”€โ–บ "๐Ÿ’ก Saved #43"   (model never called)
287 /ideas, /ideas-ls, -cat, -rm, -done โ”€โ”€โ–บ same hook, answers locally
288 
289 /ideas-go        โ”€โ”€โ–บ Claude โ”€โ”€โ–บ MCP idea_next โ”€โ”€โ–บ claude -p (Sonnet, minimal context), for new ideas only
290                                               โ”€โ”€โ–บ verdict ยท impact ยท size ยท cheapest capable model ยท brief
291                             โ”€โ”€โ–บ subagent on that model โ”€โ”€โ–บ builds it โ”€โ”€โ–บ idea_update: done
292 /ideas-all       โ”€โ”€โ–บ Claude โ”€โ”€โ–บ MCP idea_list (full) โ”€โ”€โ–บ idea_remove for the ideas that fit this chat โ”€โ”€โ–บ builds them
293 
294 watcher on: any prompt โ”€โ”€โ–บ hook โ”€โ”€โ–บ background pass โ”€โ”€โ–บ claude -p (Haiku) โ”€โ”€โ–บ verdicts + a project for each idea
295 
296 /ideas-find, /ideas-groups โ”€โ”€โ–บ hook โ”€โ”€โ–บ embedding server (new ideas only) โ”€โ”€โ–บ cosine similarity โ”€โ”€โ–บ answer
297 publish on: any prompt after a change โ”€โ”€โ–บ hook โ”€โ”€โ–บ background publish โ”€โ”€โ–บ PUT index.html + data.json
298 
299 /ideas-web       โ”€โ”€โ–บ hook โ”€โ”€โ–บ ideamine serve on 127.0.0.1 โ”€โ”€โ–บ the buttons on the page โ”€โ”€โ–บ the same archive
300 
301 sync on: each change โ”€โ”€โ–บ outbox โ”€โ”€โ–บ ideamine server โ”€โ”€โ–บ the archive of every machine โ”€โ”€โ–บ copy here
302 prompt log on: any prompt โ”€โ”€โ–บ hook โ”€โ”€โ–บ prompt outbox โ”€โ”€โ–บ background sync โ”€โ”€โ–บ the Prompts tab
303 ```
304 
305 The plugin contains a Node MCP server with no dependencies, fifteen skills (the slash commands), and one hook. The hook answers `/idea`, `/ideas`, and the local `/ideas-*` commands before any API call, and it lets every other prompt through. The hook runs directly, not through a shell, and takes about 130 ms per prompt on Windows. The skills are user-only, so their descriptions add no tokens to your sessions. If the archive cannot be read, the hook lets the prompt through, so the `/idea` skill can still save it with the MCP tool. Your text is never dropped.
306 
307 ## Development
308 
309 ```bash
310 npm install
311 ```
312 
313 ```bash
314 npm test
315 ```
316 
317 The tests use `node:test`, and [fast-check](https://fast-check.dev) for the property tests. fast-check is a development dependency only: the plugin itself installs nothing. The tests cover the store, including concurrent writers from several processes, the hook, the MCP protocol, headless triage with pairing, the watcher, embeddings and groups, and the dashboard upload. Triage runs against a stand-in `claude`, and embeddings and uploads run against a stand-in server, so the tests spend no tokens and need no network.
318 
319 ## License
320 
321 MIT