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 (34153 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-pipeline [12]` | The same, through the [agent pipeline](#with-the-agent-pipeline) that ships with ideamine: research, storyboard, plan, engineers in parallel, test, validate. For big ideas. | Yes, this is the build |
51 | `/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 |
52 | `/ideas-sort` | Triage the inbox now and show the queue. You do not have to: `/ideas-go` triages when it must. | Yes, briefly |
53 | `/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 |
54 | `/ideas <question>` | Ask about your ideas, e.g. "which ones fit in an hour?" | Yes, briefly |
55 
56 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.
57 
58 `/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.
59 
60 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.
61 
62 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.
63 
64 ## The watcher
65 
66 ```
67 > /ideas-watch
68   ideamine watch: on since 2026-09-21 14:02. haiku triages new ideas and pairs each one with its project.
69 ```
70 
71 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.
72 
73 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`.
74 
75 ## Search by meaning and groups
76 
77 ```
78 > /ideas-find make money
79   ideas like "make money", by meaning
80     53% done    #4   sonnet S  โ–ฒ3  Research monetization models for device-hacking utility apps
81 ```
82 
83 `/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.
84 
85 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:
86 
87 - [Ollama](https://ollama.com) on your machine: `ollama pull nomic-embed-text`. This is the default (`http://127.0.0.1:11434/v1`).
88 - 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:
89 
90   ```bash
91   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
92   ```
93 
94 Then tell ideamine where the server is:
95 
96 ```bash
97 ideamine config embed_url http://10.66.0.1/v1
98 ```
99 
100 ```bash
101 ideamine embed
102 ```
103 
104 `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.
105 
106 Claude can search by meaning with `idea_list` and `semantic: true`, and group with `groups: true`.
107 
108 ## Dashboard
109 
110 `ideamine publish` makes a web page of your ideas. A ticket opens a preview with the brief, the notes, and the related ideas, and the search box finds ideas by meaning in every view. The page is one static file, `index.html`, and it reads a snapshot, `data.json`. It loads nothing from the internet. Skip and dropped ideas show only when you tick "Show parked".
111 
112 | View | What it shows |
113 |---|---|
114 | Board | A column for each lane (doing, do, maybe, inbox, done), a ticket for each idea, in queue order. A ticket in Doing shows its latest note. |
115 | Timeline | A Gantt chart: how long each idea waited in the inbox, waited in the queue, and was in work |
116 | Table | Every idea in one sortable table: lane, model, size, impact, project, tags, age |
117 | Projects | A row for each project and a column for each lane, so you see where the work piles up |
118 | Flow | Tiles (open, done in 7 days, median lead and cycle time, model mix) and a cumulative flow chart of the lanes over time |
119 | Matrix | Impact against size. Quick wins in the top left, ideas to avoid in the bottom right |
120 | Groups | The ideas grouped by meaning |
121 
122 ```bash
123 ideamine publish http://10.66.0.1/
124 ```
125 
126 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.
127 
128 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:
129 
130 ```nginx
131 server {
132     listen 10.66.0.1:80;           # the WireGuard address of the server
133     allow 10.66.0.0/24;            # WireGuard peers only
134     deny all;
135     root /var/www/ideamine;
136     location ~ ^/(index\.html|data\.json)$ {
137         limit_except GET HEAD { allow 10.66.0.2; deny all; }   # only your PC uploads
138         dav_methods PUT;
139         client_max_body_size 16m;
140     }
141     location /v1/ { proxy_pass http://127.0.0.1:8081; }        # the llama.cpp server, for search on the page
142 }
143 ```
144 
145 `data.json` has `version` (1), `generated`, `embed` (model, query prefix, thresholds, and whether vectors are present), `counts`, `ideas`, `groups`, `flow` (the times and the count of each lane at each time, for the cumulative flow chart), and `stats` (the tiles of the Flow view). 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).
146 
147 ### Buttons
148 
149 ```
150 > /ideas-web
151   ideamine web: http://127.0.0.1:4332/ (started)
152 ```
153 
154 `/ideas-web` starts `ideamine serve` in the background and shows its address. That page is the same dashboard, with a button for each command:
155 
156 | Button | Command |
157 |---|---|
158 | **+ Idea** | `/idea`. A bulleted list adds one idea for each bullet. |
159 | **Triage inbox** | `/ideas-sort` |
160 | **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. |
161 | **Ask** | `/ideas <question>`. Claude answers from the whole archive, and each `#12` in the answer opens that ticket. |
162 | **Watcher** | `/ideas-watch`, `/ideas-watch off` |
163 | **Start**, **Done**, **Drop**, **Reopen**, **Delete** on a ticket | `ideamine start`, `/ideas-done`, `ideamine drop`, `/ideas-reopen`, `/ideas-rm` |
164 | **Add note**, **Build model** on a ticket | `ideamine note`, `ideamine model` |
165 
166 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.
167 
168 ### Drag a card
169 
170 On the board, drag a card into another lane. The lane says what happens:
171 
172 | Lane | What the drag does |
173 |---|---|
174 | **Doing** | Where Claude Code runs, a new window opens Claude Code on the idea, like **Build with Claude**. On a page without Claude Code, the card only moves to Doing. |
175 | **Do**, **Maybe**, **Skip** | Only the verdict of the triage changes. The impact, the size, the model, and the text of the triage stay. |
176 | **Inbox** | The idea waits for a new triage. |
177 | **Done**, **Dropped** | The same as the **Done** and **Drop** buttons, but without a note. |
178 
179 A drag needs a mouse or a trackpad. On a touch screen, use the buttons on the ticket.
180 
181 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`.
182 
183 ## One archive for every machine
184 
185 ```
186 > /ideas-sync http://10.66.0.1/
187   ideamine sync: http://10.66.0.1/
188   last sync 2026-09-21 19:24, revision 212.
189 ```
190 
191 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.
192 
193 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.
194 
195 On the server, sync stays off. It serves the archive, and nginx gives it the address of the WireGuard interface:
196 
197 ```bash
198 IDEAMINE_HOME=/var/lib/ideamine IDEAMINE_SERVE_HOSTS=10.66.0.1 ideamine serve --port 4332
199 ```
200 
201 ```nginx
202 server {
203     listen 10.66.0.1:80;
204     allow 10.66.0.0/24;
205     deny all;
206     location / { proxy_pass http://127.0.0.1:4332; proxy_set_header Host $host; client_max_body_size 2m; }
207     location /v1/ { proxy_pass http://127.0.0.1:8081; }   # the embedding server
208 }
209 ```
210 
211 `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.
212 
213 ### HTTPS for a name that is only on the tunnel
214 
215 `mem.equwal.com` points to a WireGuard address, so Let's Encrypt cannot reach it over HTTP. The certificate therefore comes from a DNS challenge that the server answers itself. `deploy/acme-zone.sh` installs `nsd` with one small zone, `acme.equwal.com`, and a certbot hook that writes the token into that zone. `nsd` answers only this zone, so it is no open resolver. `deploy/tls.sh` gets the certificate and adds the HTTPS server block to nginx.
216 
217 The owner of the domain adds three records one time:
218 
219 | Type | Host | Value |
220 |---|---|---|
221 | A | `ns1` | the public address of the server |
222 | NS | `acme` | `ns1.equwal.com` |
223 | CNAME | `_acme-challenge.mem` | `mem.acme.equwal.com.` |
224 
225 The nameserver name has three labels, because Namecheap refuses a nameserver value with two labels. certbot keeps the hooks in the renewal file, so each renewal writes a new token without help. Plain HTTP stays on, because the address of the tunnel and older bookmarks use it.
226 
227 ### On your phone
228 
229 The dashboard is also an app for a phone. Open it and put it on the home screen: it gets the ideamine icon and opens without the address bar.
230 
231 - **iPhone or iPad**: open `https://mem.equwal.com` in Safari, then "Share" and "Add to Home Screen". Plain HTTP also works.
232 - **Android**: Chrome offers "Install app" on `https://mem.equwal.com`. The installed app also takes a share: send a text from another app to ideamine, and the page opens with that text in the composer.
233 - `?text=...` and `?new=1` open the composer too, so a shortcut or another app can save an idea in one step.
234 - The service worker keeps the page and its icons, so the app opens when the tunnel to the server is down. The ideas, the prompts, and the memories always come from the server: an old copy of them would say the wrong thing.
235 
236 The icons are in the repository. `node dashboard/icons.mjs` draws them again.
237 
238 `android/` holds an Android app: the same page in a window of its own, with a share button. Send a text from any app to ideamine, and the composer opens with it. See [android/README.md](android/README.md). It is not in a store, because the dashboard answers only on your private network, where a reviewer cannot reach it.
239 
240 ### Prompts, Memory, and Usage
241 
242 The dashboard can also show what your Claudes did:
243 
244 - **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.
245 - **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.
246 - **Usage**: the tokens, the models, and the price for each project. Claude Code writes a transcript for each session, and each answer in it carries the model and the token counts. ideamine adds them up for each day, project, and model, and puts the API price on them. Each machine sends its numbers with the sync, at most every 10 minutes, and the dashboard shows every machine together. `ideamine usage [days]` prints the same table in a terminal.
247 
248   The price is the price of the API (see [pricing](https://www.anthropic.com/pricing)): a cache write costs 1.25 times the input price with the 5-minute lifetime and 2 times with the 1-hour lifetime, and a cache read is much cheaper than input. **A Claude subscription does not bill for each token**, so with a subscription the price says what the same work would cost through the API. A model that the price list does not know shows 0. The price list is `PRICES` in `src/usage.js`.
249 
250 ## With the agent pipeline
251 
252 ```
253 > /ideas-pipeline 12
254   #12 sync subtitles with the audiobook โ†’ /work/app, through the agent pipeline
255 ```
256 
257 `/ideas-go` gives an idea to one subagent. For a big idea, `/ideas-pipeline` gives it to the agent pipeline instead: a researcher maps the project, a story-writer turns the idea into stories, a project manager plans tasks, engineers build them in parallel worktrees, an integrator merges, and a tester and a validator check the result. The pipeline asks you to approve the stories and the plan. `/ideas-go` points to `/ideas-pipeline` when an idea is size L or XL.
258 
259 The pipeline ships with ideamine: the seven agents are in `agents/`, and `/pipeline <request>` runs it for any request, not only for an idea. They are a copy of [map588/agents](https://github.com/map588/agents), which describes each role.
260 
261 The idea is the record of the run. The request tells the pipeline to add a note to the idea after each phase (`pipeline: research done`, `pipeline: plan approved`, `pipeline: wave 1 integrated`, ...), to mark the idea done when its tests and validation pass, and to leave it in `doing` with a note when it stops at its iteration cap. The dashboard shows the latest note on the ticket in the Doing column, and the drawer shows them all. In a terminal, `ideamine go 12 --pipeline` opens Claude Code with the same request.
262 
263 ## Model routing
264 
265 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.
266 
267 | Model | $ in / out per 1M tokens | Gets ideas like |
268 |---|---|---|
269 | `haiku` (Haiku 4.5) | $1 / $5 | mechanical, fully specified, local work: typos, renames, config tweaks, boilerplate, small scripts |
270 | `sonnet` (Sonnet 5) | $2 / $10 | the default: ordinary features, bug fixes with a clear repro, tests, docs, contained refactors |
271 | `opus` (Opus 5) | $5 / $25 | ambiguous or cross-cutting work: architecture, hard debugging, performance, security |
272 | `fable` (Fable 5.1) | $10 / $50 | only the hardest long-horizon or research-grade problems |
273 
274 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.
275 
276 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.
277 
278 ## Headless triage
279 
280 ```bash
281 ideamine sort
282 ```
283 
284 `/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.
285 
286 ## Command line
287 
288 ```bash
289 npm install -g github:equwal/ideamine
290 ```
291 
292 ```
293 ideamine add "support vim keys in the popup"      # "-" reads stdin
294 ideamine ls [inbox|do|maybe|skip|doing|done|-a] [here]
295 ideamine cat 12
296 ideamine rm 12                                    # delete for good
297 ideamine done 12 "shipped in v1.4"                # also: drop, start, reopen, note
298 ideamine next                                     # what to build next
299 ideamine go 12                                    # opens Claude Code on the right model, in the idea's project
300 ideamine go 12 --pipeline                         # the same, with the agent pipeline as the request
301 ideamine sort                                     # headless triage (see above)
302 ideamine watch [off]                              # the watcher (see above)
303 ideamine find sync subtitles                      # search by meaning
304 ideamine groups [-a]                              # ideas grouped by meaning
305 ideamine embed                                    # embed new ideas, show the similarity numbers
306 ideamine publish [url|off] [--dir folder]         # the dashboard (see above)
307 ideamine serve [--port 4332]                      # the dashboard with buttons, on 127.0.0.1
308 ideamine sync [url|off]                           # one archive for every machine (see above)
309 ideamine prompts import                           # the prompts of older chats, for the Prompts tab
310 ideamine usage [days]                             # tokens, models, and price for each project
311 ideamine config [key [value]]                     # show or change a setting
312 ideamine export IDEAS.md                          # Markdown copy of everything
313 ```
314 
315 ## Other MCP clients
316 
317 The MCP server works without the plugin. For Claude Desktop, Cursor, or any stdio MCP client:
318 
319 ```json
320 {
321   "mcpServers": {
322     "ideamine": { "command": "npx", "args": ["-y", "github:equwal/ideamine", "mcp"] }
323   }
324 }
325 ```
326 
327 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.
328 
329 ## Where your ideas live
330 
331 `~/.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.
332 
333 `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.
334 
335 | Variable | Setting | Default | Purpose |
336 |---|---|---|---|
337 | `IDEAMINE_HOME` | | `~/.ideamine` | archive location |
338 | `IDEAMINE_TRIAGE_MODEL` | | `sonnet` | model for the headless triage |
339 | `IDEAMINE_CLAUDE_BIN` | | `claude` | Claude Code executable |
340 | `IDEAMINE_SETTING_SOURCES` | | *(empty)* | set to `user` if your login needs `settings.json` (e.g. `apiKeyHelper`) |
341 | `IDEAMINE_EMBED_URL` | `embed_url` | `http://127.0.0.1:11434/v1` | OpenAI-compatible embeddings API (Ollama, llama.cpp server) |
342 | `IDEAMINE_EMBED_MODEL` | `embed_model` | `nomic-embed-text` | embedding model; nomic models get their task prefixes |
343 | `IDEAMINE_SEARCH_THRESHOLD` | `search_threshold` | `0.5` | lowest similarity of a search result |
344 | `IDEAMINE_GROUP_THRESHOLD` | `group_threshold` | `0.65` | lowest mean similarity in a group, and of a related idea |
345 | `IDEAMINE_PUBLISH_URL` | `publish_url` | *(off)* | dashboard server for `ideamine publish` |
346 | `IDEAMINE_SERVE_PORT` | `serve_port` | `4332` | port of `ideamine serve` and `/ideas-web` |
347 | `IDEAMINE_SERVE_HOSTS` | `serve_hosts` | *(none)* | more Host names that `ideamine serve` answers, for a server behind nginx |
348 | `IDEAMINE_SYNC_URL` | `sync_url` | *(off)* | the ideamine server that holds the archive of every machine |
349 | `IDEAMINE_PROMPT_LOG` | `prompt_log` | `off` | `on` sends each prompt to the ideamine server |
350 | `IDEAMINE_MEMSTATE_URL` | `memstate_url` | *(off)* | the memstated daemon for the Memory tab |
351 
352 ## How it works
353 
354 ```
355 /idea โ€ฆ          โ”€โ”€โ–บ UserPromptSubmit hook โ”€โ”€โ–บ ~/.ideamine/ideas.json โ”€โ”€โ–บ "๐Ÿ’ก Saved #43"   (model never called)
356 /ideas, /ideas-ls, -cat, -rm, -done โ”€โ”€โ–บ same hook, answers locally
357 
358 /ideas-go        โ”€โ”€โ–บ Claude โ”€โ”€โ–บ MCP idea_next โ”€โ”€โ–บ claude -p (Sonnet, minimal context), for new ideas only
359                                               โ”€โ”€โ–บ verdict ยท impact ยท size ยท cheapest capable model ยท brief
360                             โ”€โ”€โ–บ subagent on that model โ”€โ”€โ–บ builds it โ”€โ”€โ–บ idea_update: done
361 /ideas-pipeline  โ”€โ”€โ–บ Claude โ”€โ”€โ–บ MCP idea_next โ”€โ”€โ–บ the pipeline skill โ”€โ”€โ–บ seven agents, two gates โ”€โ”€โ–บ idea_update: a note after each phase
362 /ideas-all       โ”€โ”€โ–บ Claude โ”€โ”€โ–บ MCP idea_list (full) โ”€โ”€โ–บ idea_remove for the ideas that fit this chat โ”€โ”€โ–บ builds them
363 
364 watcher on: any prompt โ”€โ”€โ–บ hook โ”€โ”€โ–บ background pass โ”€โ”€โ–บ claude -p (Haiku) โ”€โ”€โ–บ verdicts + a project for each idea
365 
366 /ideas-find, /ideas-groups โ”€โ”€โ–บ hook โ”€โ”€โ–บ embedding server (new ideas only) โ”€โ”€โ–บ cosine similarity โ”€โ”€โ–บ answer
367 publish on: any prompt after a change โ”€โ”€โ–บ hook โ”€โ”€โ–บ background publish โ”€โ”€โ–บ PUT index.html + data.json
368 
369 /ideas-web       โ”€โ”€โ–บ hook โ”€โ”€โ–บ ideamine serve on 127.0.0.1 โ”€โ”€โ–บ the buttons on the page โ”€โ”€โ–บ the same archive
370 
371 sync on: each change โ”€โ”€โ–บ outbox โ”€โ”€โ–บ ideamine server โ”€โ”€โ–บ the archive of every machine โ”€โ”€โ–บ copy here
372 prompt log on: any prompt โ”€โ”€โ–บ hook โ”€โ”€โ–บ prompt outbox โ”€โ”€โ–บ background sync โ”€โ”€โ–บ the Prompts tab
373 ```
374 
375 The plugin contains a Node MCP server with no dependencies, seventeen skills (the slash commands), seven agents (the pipeline), 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.
376 
377 ## Development
378 
379 ```bash
380 npm install
381 ```
382 
383 ```bash
384 npm test
385 ```
386 
387 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.
388 
389 ## More projects
390 
391 - [SubRead](https://subread.space/): read along with an audiobook, in the browser.
392   Also [for Android](https://github.com/equwal/subread-android/releases/latest),
393   [for YouTube](https://github.com/equwal/subread-extension/releases/latest)
394   and [for KOReader](https://github.com/equwal/subread.koplugin).
395 - [SubRead Overlay](https://github.com/equwal/subread-overlay/releases/latest): subtitle lines over any Android media player.
396 - [SubRead Dictionary](https://github.com/equwal/subread-dictionary/releases/latest): a pop-up dictionary for Android that reads Yomitan dictionaries.
397 - [SubRead Anki](https://github.com/equwal/subread-anki): one tap makes an Anki card from any Android app.
398 - [Subrep](https://github.com/equwal/subrep-android/releases/latest): live captions of the sound of your phone.
399 - [Book Simulator](https://booksimulator.com/): a reading room for Aozora Bunko and Project Gutenberg books.
400 - [honjimaku.com](https://honjimaku.com/): subtitles for Japanese audiobooks.
401 - [sbm Sync](https://sbmsync.com/): your bookmarks, the same on every device,
402   with [sbm](https://github.com/equwal/sbm) for dmenu,
403   [sbm for Android](https://github.com/equwal/sbm-android/releases/latest)
404   and the [sbm add-on](https://github.com/equwal/sbm-extension/releases/latest) for Firefox and Chrome.
405 - [Rebind](https://github.com/equwal/rebind/releases): remap the hardware buttons of e-ink readers and Android,
406   with [Ink Recents](https://github.com/equwal/ink-recents/releases/latest),
407   [Ink Dim](https://github.com/equwal/ink-dim/releases/latest)
408   and [Ink Update](https://github.com/equwal/ink-update/releases/latest).
409 - [dickt.store](https://dickt.store/): language-learning tools, flashcards and web toys.
410 - [hentaibun.online](https://hentaibun.online/): learn kanbun and kobun.
411 - [Recently Written](https://recentlywritten.com/): the blog, and a list of [all projects](https://recentlywritten.com/projects.html).
412 
413 ## License
414 
415 MIT