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