@clauderecallhq/cli 0.0.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +543 -3
  3. package/README.public.md +523 -0
  4. package/dist/cli.js +362 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/activate.js +69 -0
  7. package/dist/commands/activate.js.map +1 -0
  8. package/dist/commands/audit-secrets.js +103 -0
  9. package/dist/commands/audit-secrets.js.map +1 -0
  10. package/dist/commands/blame.js +35 -0
  11. package/dist/commands/blame.js.map +1 -0
  12. package/dist/commands/config-verification.js +18 -0
  13. package/dist/commands/config-verification.js.map +1 -0
  14. package/dist/commands/context.js +144 -0
  15. package/dist/commands/context.js.map +1 -0
  16. package/dist/commands/correlate.js +70 -0
  17. package/dist/commands/correlate.js.map +1 -0
  18. package/dist/commands/digest.js +78 -0
  19. package/dist/commands/digest.js.map +1 -0
  20. package/dist/commands/health.js +62 -0
  21. package/dist/commands/health.js.map +1 -0
  22. package/dist/commands/index.js +247 -0
  23. package/dist/commands/index.js.map +1 -0
  24. package/dist/commands/install-extension.js +138 -0
  25. package/dist/commands/install-extension.js.map +1 -0
  26. package/dist/commands/installs.js +128 -0
  27. package/dist/commands/installs.js.map +1 -0
  28. package/dist/commands/license.js +39 -0
  29. package/dist/commands/license.js.map +1 -0
  30. package/dist/commands/list.js +47 -0
  31. package/dist/commands/list.js.map +1 -0
  32. package/dist/commands/mcp.js +29 -0
  33. package/dist/commands/mcp.js.map +1 -0
  34. package/dist/commands/open.js +28 -0
  35. package/dist/commands/open.js.map +1 -0
  36. package/dist/commands/paste.js +154 -0
  37. package/dist/commands/paste.js.map +1 -0
  38. package/dist/commands/projects.js +36 -0
  39. package/dist/commands/projects.js.map +1 -0
  40. package/dist/commands/search.js +67 -0
  41. package/dist/commands/search.js.map +1 -0
  42. package/dist/commands/semantic.js +173 -0
  43. package/dist/commands/semantic.js.map +1 -0
  44. package/dist/commands/show.js +121 -0
  45. package/dist/commands/show.js.map +1 -0
  46. package/dist/commands/start.js +47 -0
  47. package/dist/commands/start.js.map +1 -0
  48. package/dist/commands/stats.js +133 -0
  49. package/dist/commands/stats.js.map +1 -0
  50. package/dist/commands/status.js +45 -0
  51. package/dist/commands/status.js.map +1 -0
  52. package/dist/commands/stop.js +29 -0
  53. package/dist/commands/stop.js.map +1 -0
  54. package/dist/commands/thread.js +396 -0
  55. package/dist/commands/thread.js.map +1 -0
  56. package/dist/context/formatter.js +103 -0
  57. package/dist/context/formatter.js.map +1 -0
  58. package/dist/daemon/auto-tag-config.js +103 -0
  59. package/dist/daemon/auto-tag-config.js.map +1 -0
  60. package/dist/daemon/auto-tag-config.test.js +72 -0
  61. package/dist/daemon/auto-tag-config.test.js.map +1 -0
  62. package/dist/daemon/auto-title-config.js +70 -0
  63. package/dist/daemon/auto-title-config.js.map +1 -0
  64. package/dist/daemon/bulk-title-jobs.js +170 -0
  65. package/dist/daemon/bulk-title-jobs.js.map +1 -0
  66. package/dist/daemon/correlator.js +320 -0
  67. package/dist/daemon/correlator.js.map +1 -0
  68. package/dist/daemon/discover.js +316 -0
  69. package/dist/daemon/discover.js.map +1 -0
  70. package/dist/daemon/editor-detection.js +186 -0
  71. package/dist/daemon/editor-detection.js.map +1 -0
  72. package/dist/daemon/entrypoint.js +55 -0
  73. package/dist/daemon/entrypoint.js.map +1 -0
  74. package/dist/daemon/git-correlator.js +256 -0
  75. package/dist/daemon/git-correlator.js.map +1 -0
  76. package/dist/daemon/mcp-installer.js +108 -0
  77. package/dist/daemon/mcp-installer.js.map +1 -0
  78. package/dist/daemon/onboarding-state.js +140 -0
  79. package/dist/daemon/onboarding-state.js.map +1 -0
  80. package/dist/daemon/pidfile.js +57 -0
  81. package/dist/daemon/pidfile.js.map +1 -0
  82. package/dist/daemon/ports.js +48 -0
  83. package/dist/daemon/ports.js.map +1 -0
  84. package/dist/daemon/scanProgressRegistry.js +62 -0
  85. package/dist/daemon/scanProgressRegistry.js.map +1 -0
  86. package/dist/daemon/server.js +2010 -0
  87. package/dist/daemon/server.js.map +1 -0
  88. package/dist/daemon/tag-scanner/anthropic-client.js +40 -0
  89. package/dist/daemon/tag-scanner/anthropic-client.js.map +1 -0
  90. package/dist/daemon/tag-scanner/autopilot.js +131 -0
  91. package/dist/daemon/tag-scanner/autopilot.js.map +1 -0
  92. package/dist/daemon/tag-scanner/claude-cli-driver.js +250 -0
  93. package/dist/daemon/tag-scanner/claude-cli-driver.js.map +1 -0
  94. package/dist/daemon/tag-scanner/orchestrator.js +88 -0
  95. package/dist/daemon/tag-scanner/orchestrator.js.map +1 -0
  96. package/dist/daemon/tag-scanner/prompt.js +46 -0
  97. package/dist/daemon/tag-scanner/prompt.js.map +1 -0
  98. package/dist/daemon/tag-scanner/prompt.test.js +48 -0
  99. package/dist/daemon/tag-scanner/prompt.test.js.map +1 -0
  100. package/dist/daemon/tag-scanner/scan-state.js +49 -0
  101. package/dist/daemon/tag-scanner/scan-state.js.map +1 -0
  102. package/dist/daemon/tag-scanner/session-fetcher.js +82 -0
  103. package/dist/daemon/tag-scanner/session-fetcher.js.map +1 -0
  104. package/dist/daemon/tag-scanner/session-fetcher.test.js +34 -0
  105. package/dist/daemon/tag-scanner/session-fetcher.test.js.map +1 -0
  106. package/dist/daemon/tag-scanner/validator.js +50 -0
  107. package/dist/daemon/tag-scanner/validator.js.map +1 -0
  108. package/dist/daemon/tag-scanner/validator.test.js +41 -0
  109. package/dist/daemon/tag-scanner/validator.test.js.map +1 -0
  110. package/dist/daemon/terminal-registry.js +443 -0
  111. package/dist/daemon/terminal-registry.js.map +1 -0
  112. package/dist/daemon/ui.js +64 -0
  113. package/dist/daemon/ui.js.map +1 -0
  114. package/dist/daemon/watcher.js +256 -0
  115. package/dist/daemon/watcher.js.map +1 -0
  116. package/dist/db/client.js +22 -0
  117. package/dist/db/client.js.map +1 -0
  118. package/dist/db/schema.js +496 -0
  119. package/dist/db/schema.js.map +1 -0
  120. package/dist/license/api-base.js +13 -0
  121. package/dist/license/api-base.js.map +1 -0
  122. package/dist/license/manager.js +43 -0
  123. package/dist/license/manager.js.map +1 -0
  124. package/dist/license/public-key.js +19 -0
  125. package/dist/license/public-key.js.map +1 -0
  126. package/dist/license/storage.js +27 -0
  127. package/dist/license/storage.js.map +1 -0
  128. package/dist/license/verify.js +23 -0
  129. package/dist/license/verify.js.map +1 -0
  130. package/dist/mcp/audit.js +126 -0
  131. package/dist/mcp/audit.js.map +1 -0
  132. package/dist/mcp/prompts.js +180 -0
  133. package/dist/mcp/prompts.js.map +1 -0
  134. package/dist/mcp/server.js +502 -0
  135. package/dist/mcp/server.js.map +1 -0
  136. package/dist/mcp/thread-tools.js +363 -0
  137. package/dist/mcp/thread-tools.js.map +1 -0
  138. package/dist/mcp/write-tools.js +239 -0
  139. package/dist/mcp/write-tools.js.map +1 -0
  140. package/dist/parser/jsonl.js +150 -0
  141. package/dist/parser/jsonl.js.map +1 -0
  142. package/dist/semantic/chunker.js +47 -0
  143. package/dist/semantic/chunker.js.map +1 -0
  144. package/dist/semantic/config.js +74 -0
  145. package/dist/semantic/config.js.map +1 -0
  146. package/dist/semantic/embedder.js +54 -0
  147. package/dist/semantic/embedder.js.map +1 -0
  148. package/dist/semantic/fusion.js +38 -0
  149. package/dist/semantic/fusion.js.map +1 -0
  150. package/dist/semantic/model-download.js +69 -0
  151. package/dist/semantic/model-download.js.map +1 -0
  152. package/dist/semantic/pipeline.js +375 -0
  153. package/dist/semantic/pipeline.js.map +1 -0
  154. package/dist/semantic/query.js +42 -0
  155. package/dist/semantic/query.js.map +1 -0
  156. package/dist/semantic/worker.js +78 -0
  157. package/dist/semantic/worker.js.map +1 -0
  158. package/dist/stats/backfill.js +151 -0
  159. package/dist/stats/backfill.js.map +1 -0
  160. package/dist/stats/health.js +102 -0
  161. package/dist/stats/health.js.map +1 -0
  162. package/dist/stats/query.js +385 -0
  163. package/dist/stats/query.js.map +1 -0
  164. package/dist/utils/aliases.js +107 -0
  165. package/dist/utils/aliases.js.map +1 -0
  166. package/dist/utils/autoCollections.js +635 -0
  167. package/dist/utils/autoCollections.js.map +1 -0
  168. package/dist/utils/autoTitle.js +348 -0
  169. package/dist/utils/autoTitle.js.map +1 -0
  170. package/dist/utils/collections.js +446 -0
  171. package/dist/utils/collections.js.map +1 -0
  172. package/dist/utils/format.js +46 -0
  173. package/dist/utils/format.js.map +1 -0
  174. package/dist/utils/notes.js +270 -0
  175. package/dist/utils/notes.js.map +1 -0
  176. package/dist/utils/paths.js +50 -0
  177. package/dist/utils/paths.js.map +1 -0
  178. package/dist/utils/pricing.js +257 -0
  179. package/dist/utils/pricing.js.map +1 -0
  180. package/dist/utils/secret-scanner.js +166 -0
  181. package/dist/utils/secret-scanner.js.map +1 -0
  182. package/dist/utils/sessionLabel.js +64 -0
  183. package/dist/utils/sessionLabel.js.map +1 -0
  184. package/dist/utils/tags.js +97 -0
  185. package/dist/utils/tags.js.map +1 -0
  186. package/dist/utils/thread-context.js +129 -0
  187. package/dist/utils/thread-context.js.map +1 -0
  188. package/dist/utils/threadFilter.js +18 -0
  189. package/dist/utils/threadFilter.js.map +1 -0
  190. package/dist/utils/threads-titler.js +298 -0
  191. package/dist/utils/threads-titler.js.map +1 -0
  192. package/dist/utils/threads.js +383 -0
  193. package/dist/utils/threads.js.map +1 -0
  194. package/dist/utils/usage.js +76 -0
  195. package/dist/utils/usage.js.map +1 -0
  196. package/dist/verification/compute.js +88 -0
  197. package/dist/verification/compute.js.map +1 -0
  198. package/dist/verification/config.js +34 -0
  199. package/dist/verification/config.js.map +1 -0
  200. package/dist/web/assets/index-CIr6J4Fw.js +1201 -0
  201. package/dist/web/assets/index-Ctc8g9Jw.css +1 -0
  202. package/dist/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  203. package/dist/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  204. package/dist/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  205. package/dist/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  206. package/dist/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  207. package/dist/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  208. package/dist/web/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  209. package/dist/web/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  210. package/dist/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  211. package/dist/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  212. package/dist/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  213. package/dist/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  214. package/dist/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  215. package/dist/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  216. package/dist/web/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  217. package/dist/web/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  218. package/dist/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  219. package/dist/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  220. package/dist/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  221. package/dist/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  222. package/dist/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  223. package/dist/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  224. package/dist/web/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  225. package/dist/web/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  226. package/dist/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  227. package/dist/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  228. package/dist/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  229. package/dist/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  230. package/dist/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  231. package/dist/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  232. package/dist/web/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  233. package/dist/web/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  234. package/dist/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  235. package/dist/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  236. package/dist/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  237. package/dist/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  238. package/dist/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  239. package/dist/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  240. package/dist/web/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  241. package/dist/web/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  242. package/dist/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  243. package/dist/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  244. package/dist/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  245. package/dist/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  246. package/dist/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  247. package/dist/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  248. package/dist/web/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  249. package/dist/web/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  250. package/dist/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  251. package/dist/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  252. package/dist/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  253. package/dist/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  254. package/dist/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  255. package/dist/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  256. package/dist/web/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  257. package/dist/web/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  258. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  259. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  260. package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
  261. package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
  262. package/dist/web/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  263. package/dist/web/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  264. package/dist/web/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
  265. package/dist/web/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
  266. package/dist/web/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  267. package/dist/web/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  268. package/dist/web/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  269. package/dist/web/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  270. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  271. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  272. package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
  273. package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
  274. package/dist/web/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  275. package/dist/web/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
  276. package/dist/web/favicon.svg +9 -0
  277. package/dist/web/index.html +15 -0
  278. package/package.json +80 -9
  279. package/bin/cli.js +0 -12
package/LICENSE ADDED
@@ -0,0 +1,33 @@
1
+ Claude Recall — Proprietary License (pre-release)
2
+
3
+ Copyright (c) 2026 Claude Recall HQ. All rights reserved.
4
+
5
+ This software and its source code are proprietary and confidential.
6
+ No part of this software may be reproduced, distributed, modified,
7
+ sublicensed, or used for commercial purposes without the prior written
8
+ permission of the copyright holder.
9
+
10
+ Access to the source code does not grant any rights of reuse,
11
+ redistribution, or derivative work. Forking for the purpose of
12
+ personal evaluation on the forker's own machine is permitted; any
13
+ redistribution, public hosting, or resale is not.
14
+
15
+ Until a formal commercial license is published alongside the v0.6
16
+ commercialization milestone, this notice governs all use of the
17
+ software. The commercial license, once published, will supersede
18
+ this notice.
19
+
20
+ Trademarks: "Claude Recall" and the Claude Recall logo are trademarks
21
+ of Claude Recall HQ. Nothing in this notice grants any trademark
22
+ rights.
23
+
24
+ No warranty: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
25
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
26
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
27
+ AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
28
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
29
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
31
+ DEALINGS IN THE SOFTWARE.
32
+
33
+ For licensing inquiries: hello@clauderecall.com.
package/README.md CHANGED
@@ -1,5 +1,545 @@
1
- # Claude Recall
1
+ <div align="center">
2
2
 
3
- Local, searchable memory for every Claude Code session you run.
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="marketing/logos/wordmark-dark.svg">
5
+ <source media="(prefers-color-scheme: light)" srcset="marketing/logos/wordmark-light.svg">
6
+ <img src="marketing/logos/wordmark-dark.svg" alt="Claude Recall" width="360">
7
+ </picture>
4
8
 
5
- Public release coming soon. Visit [clauderecall.com](https://clauderecall.com) for updates.
9
+ ### The memory layer for the agent you're steering.
10
+
11
+ [![site-ci](https://github.com/clauderecallhq/clauderecall/actions/workflows/site-ci.yml/badge.svg)](https://github.com/clauderecallhq/clauderecall/actions/workflows/site-ci.yml)
12
+ [![deploy-site](https://github.com/clauderecallhq/clauderecall/actions/workflows/deploy-site.yml/badge.svg)](https://github.com/clauderecallhq/clauderecall/actions/workflows/deploy-site.yml)
13
+ [![Node](https://img.shields.io/badge/node-%E2%89%A522-43853d?logo=node.js&logoColor=white)](https://nodejs.org)
14
+ [![TypeScript](https://img.shields.io/badge/typescript-strict-3178c6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
15
+ [![Local-first](https://img.shields.io/badge/local--first-127.0.0.1%20only-0b0c0f)](#the-never-delete-data-invariant)
16
+ [![Site](https://img.shields.io/badge/site-clauderecall.com-f97316)](https://clauderecall.com)
17
+
18
+ </div>
19
+
20
+ ---
21
+
22
+ > **Stop re-explaining your project to Claude every morning.**
23
+ > Claude Recall indexes every session, surfaces what matters, and pipes the right context back in with one command.
24
+
25
+ 100% local-first. The daemon binds to `127.0.0.1`, your conversations never leave your machine, and the only outbound call Recall will ever make is a one-time license check when you activate a Pro key (v0.6). No cloud, no account, no telemetry.
26
+
27
+ ## Why Claude Recall
28
+
29
+ Claude Code is magic until the conversation ends. Then you're back to the same three problems.
30
+
31
+ ### 1. Context amnesia
32
+
33
+ Every new `claude` invocation starts from zero. You re-explain the project layout, re-paste the key files, re-describe the bug you already fixed yesterday. You built that context pyramid once — now you're building it again.
34
+
35
+ **Fixed by `recall context <id> | claude`** — pipe any past session into a new conversation as condensed markdown. Claude picks up where you left off instead of asking you to explain it again. Runs locally, never touches the network.
36
+
37
+ ```bash
38
+ recall context abc12345 | claude # moat: past session → new conversation
39
+ recall context abc12345 --prelude "continue this" | claude
40
+ ```
41
+
42
+ ### 2. Cost anxiety
43
+
44
+ Claude Code tells you nothing about spend after a session ends. Which session was the expensive one? Which project is quietly burning half your Anthropic bill? You're guessing.
45
+
46
+ **Fixed by the stats dashboard** (v0.10a) — tokens, dollars, primary model, a daily sparkline, and the top-10 heaviest sessions. There's a 📊 pill in every transcript header and a `recall stats` subcommand if you prefer the terminal.
47
+
48
+ ```bash
49
+ recall stats abc12345 # one session
50
+ recall stats --project Tools # one project
51
+ recall stats --days 7 # last week across everything
52
+ ```
53
+
54
+ ### 3. Org sprawl
55
+
56
+ Claude Code scatters every conversation into `~/.claude/projects/**/*.jsonl` — a write-only log with no titles, no search, no way to find the session where you finally got the auth flow right. Dozens of projects × hundreds of sessions × zero hope of finding anything manually.
57
+
58
+ **Fixed by search, tags, collections, and semantic recall** — full-text search with highlighted snippets in milliseconds, conceptual search for "the session where I debugged the worker memory leak," human-readable aliases, `#tag` tokens in the search box, hand-curated collections that cut across projects, and `Cmd+K` to jump to anything.
59
+
60
+ ```bash
61
+ recall search "zod schema" # full-text across every message
62
+ recall search "auth #auth-fix" # combine text + tag filter
63
+ recall semantic on # enable conceptual search
64
+ ```
65
+
66
+ All local. All offline. All invisible enough for vibe coders and powerful enough for engineers.
67
+
68
+ ## Install (dev)
69
+
70
+ ```bash
71
+ # 1. Install deps
72
+ npm install
73
+
74
+ # 2. Build
75
+ npm run build
76
+
77
+ # 3. Make `recall` globally available
78
+ npm link
79
+
80
+ # 4. Start the background daemon (watcher + HTTP server)
81
+ recall start
82
+
83
+ # 5. Open the web UI in your browser
84
+ recall open
85
+ ```
86
+
87
+ ## Usage
88
+
89
+ ### Terminal
90
+
91
+ ```bash
92
+ # lifecycle
93
+ recall start # start daemon (watcher + local HTTP)
94
+ recall stop # stop daemon
95
+ recall open # open web UI (starts daemon if needed)
96
+ recall status # db + daemon health
97
+
98
+ # indexing (daemon auto-indexes; manual is a fallback)
99
+ recall index # scan for new/changed session files
100
+ recall index --force # reindex everything
101
+ recall index -v # verbose
102
+
103
+ # explore
104
+ recall projects # list projects with session counts
105
+ recall list # 30 most-recent sessions
106
+ recall list -p Tools # filter by project substring
107
+ recall list -n 100 # higher limit
108
+
109
+ # read
110
+ recall show <id> # pretty transcript, auto-pages through `less` if long
111
+ recall show <id> --raw # raw JSONL
112
+ recall show <id> --no-pager # dump to stdout
113
+
114
+ # search (full-text over every message)
115
+ recall search "zod schema"
116
+ recall search "auth" -p Pest-Control
117
+ recall search bug -n 50
118
+
119
+ # context re-injection (the moat)
120
+ recall context <id> # condensed markdown to stdout
121
+ recall context <id> | pbcopy # to clipboard (macOS)
122
+ recall context <id> | claude # pipe into a new Claude Code session
123
+ recall context <id> --full # full transcript (bigger)
124
+ recall context <id> --since 2h # only last 2 hours
125
+ recall context <id> --prelude "continue this" # prepend an instruction
126
+ recall context <id> --subagents # include subagent messages
127
+
128
+ # stats (v0.10a)
129
+ recall stats <id> # tokens + dollars for one session
130
+ recall stats --project Tools # per-project rollup
131
+ recall stats --days 7 # 7-day overview
132
+ recall stats --backfill # one-shot usage backfill for older messages
133
+
134
+ # git correlation (v0.10b)
135
+ recall correlate # link sessions to commits in their cwd
136
+ recall blame <sha> # reverse lookup: commit → session
137
+
138
+ # semantic search (v0.11)
139
+ recall semantic on # enable conceptual search
140
+ recall semantic off # disable
141
+ recall semantic status # backfill progress
142
+ recall semantic backfill # run now
143
+ recall semantic pause # pause background worker
144
+ recall semantic resume # resume worker
145
+ recall semantic install # download the local embedding model
146
+ recall semantic uninstall # remove the local model
147
+ recall semantic reindex # regenerate all summaries
148
+
149
+ # similar sessions (Pro, requires vector model)
150
+ recall similar <id> # sessions related to this one
151
+ recall similar <id> -n 5 # top 5 results
152
+
153
+ # clipboard archiving (opt-in)
154
+ recall paste # archive clipboard contents
155
+ recall paste --label "zod fix" # attach a short description
156
+ recall paste --dry-run # preview without writing
157
+ recall paste --pipe # echo content to stdout after archiving
158
+ recall paste --force # skip secret-scan confirmation
159
+ recall paste --list # list archived pastes
160
+ recall paste --purge <id> # permanently delete one paste
161
+
162
+ # security scanning
163
+ recall audit-secrets # scan db for leaked secrets (read-only)
164
+ recall audit-secrets --redact # scrub hits in place (source JSONLs untouched)
165
+ recall audit-secrets -v # verbose per-session output
166
+
167
+ # rediscovery ("For you" picks)
168
+ recall digest # today's picks (rediscovered session, costliest, HEAD author)
169
+ recall digest --json # machine-readable output
170
+
171
+ # VS Code / Cursor / Windsurf extension sideloading
172
+ recall install-extension # install into all detected editors
173
+ recall install-extension --editor cursor # target one editor
174
+ recall install-extension --print-path # print .vsix path and exit
175
+
176
+ # memory health scores
177
+ recall health # all projects, worst health first
178
+ recall health "My Project" # single-project breakdown
179
+ recall health --json # machine-readable output
180
+
181
+ # verification badges (opt-in preview)
182
+ recall verify # show current status (default)
183
+ recall verify on # enable
184
+ recall verify off # disable
185
+
186
+ # Pro licensing
187
+ recall activate <license-key> # activate a Pro license (one-time)
188
+ recall license # show current tier (default: status)
189
+ recall license status # same as above
190
+ recall license deactivate # remove license from this machine
191
+
192
+ # threads (v0.15a) - intent-grouped session clusters
193
+ recall thread list # list threads (most recent first)
194
+ recall thread list --archived # include archived threads
195
+ recall thread show <id> # thread header + session tree
196
+ recall thread new "Auth refactor" # create a thread
197
+ recall thread new "Auth" --origin <sid> # create with an origin session
198
+ recall thread new "Auth" --summary "..." # create with a summary
199
+ recall thread link <sid> --thread <tid> # link a session into a thread
200
+ recall thread link <sid> --thread <tid> --parent <pid> # link as child of another session
201
+ recall thread unlink <sid> --thread <tid> # remove session from thread
202
+ recall thread set-parent <sid> --thread <tid> --parent <pid> # re-parent within thread
203
+ recall thread set-parent <sid> --thread <tid> --parent none # promote to origin
204
+ recall thread rename <id> "New name" # rename a thread
205
+ recall thread close <id> # mark work complete
206
+ recall thread reopen <id> # reopen a closed thread
207
+ recall thread archive <id> # soft-delete (hidden from list, never hard-deleted)
208
+ recall thread merge <source> --into <dest> # merge two threads
209
+ recall thread split <id> --sessions s1,s2 --name "New thread" # split sessions into new thread
210
+ ```
211
+
212
+ ### MCP server (v0.9, bidirectional v0.13)
213
+
214
+ Point any Model Context Protocol client — Claude Desktop, Claude Code, or your own — at the `claude-recall-mcp` binary and the model calls Recall as native tools.
215
+
216
+ ```bash
217
+ # Runs over stdio, never touches the network
218
+ claude-recall-mcp
219
+
220
+ # Or via the CLI shim
221
+ recall mcp
222
+
223
+ # Opt in to write tools (tag, alias, note, collection) — off by default
224
+ recall mcp --allow-writes
225
+ ```
226
+
227
+ Minimal Claude Code / Claude Desktop config:
228
+
229
+ ```json
230
+ {
231
+ "mcpServers": {
232
+ "recall": {
233
+ "command": "claude-recall-mcp"
234
+ }
235
+ }
236
+ }
237
+ ```
238
+
239
+ 13 read-only tools (always available):
240
+
241
+ | Tool | Purpose |
242
+ |---|---|
243
+ | `list_projects` | Every indexed project with session/message counts |
244
+ | `list_sessions` | Recent sessions, filterable by project / tag / date range |
245
+ | `list_tags` | Tag cloud with counts, most popular first |
246
+ | `list_sessions_to_tag` | Sessions formatted for an agent to propose tags (auto-tag must be enabled) |
247
+ | `apply_tags` | Merge-add tags to a session (auto-tag must be enabled) |
248
+ | `search` | Full-text search; supports inline `#tag-name` tokens; fuses with vector lane when available |
249
+ | `find_similar_sessions` | Vector-similarity search for related sessions (Pro) |
250
+ | `semantic_status` | Health snapshot of the semantic vector tier (Pro) |
251
+ | `get_session` | Full transcript with metadata and tags (accepts 8+-char id prefix) |
252
+ | `context_for_session` | Condensed-markdown export - the moat, callable as a tool |
253
+ | `thread_list` | All threads, newest first (excludes archived by default) |
254
+ | `thread_get` | Full thread detail with every session edge |
255
+ | `thread_for_session` | Threads containing a given session |
256
+
257
+ 18 write tools (v0.13+, require `--allow-writes`):
258
+
259
+ | Tool | Purpose |
260
+ |---|---|
261
+ | `add_tag` / `remove_tag` | Organize sessions from inside Claude |
262
+ | `set_alias` | Rename a session (archives previous name) |
263
+ | `append_note` | Append to a session's markdown note |
264
+ | `create_collection` | Make a new collection, optionally under a parent |
265
+ | `add_session_to_collection` / `remove_session_from_collection` | Curate collection memberships |
266
+ | `thread_create` | Create a new thread, optionally seeded with an origin session |
267
+ | `thread_add_session` | Attach a session to a thread (origin or child) |
268
+ | `thread_set_parent` | Change a session's parent within a thread (null to promote) |
269
+ | `thread_remove_session` | Detach a session from a thread |
270
+ | `thread_rename` | Change thread display name |
271
+ | `thread_close` / `thread_reopen` | Mark work complete or reopen |
272
+ | `thread_archive` | Soft-delete a thread (hidden, never hard-deleted) |
273
+ | `thread_merge` | Dissolve one thread into another |
274
+ | `thread_split` | Peel sessions into a new thread |
275
+ | `generate_thread_titles` | Walk the thread DAG and generate coherent titles for each session |
276
+
277
+ Every write is rate-limited (default 60/min), zod-validated, audited to `mcp_audit_events`, and scoped to Recall's own metadata layer - session content is never mutated and no file paths are accepted as input.
278
+
279
+ ### Web UI
280
+
281
+ Press **`?`** anywhere to open the Command Center — full docs with sections for Quickstart, Web UI tour, CLI commands, Keyboard shortcuts, Collections, Your data, Exporting, Security, Pro tips, MCP server, VS Code extension, Pricing, FAQ, and Troubleshooting.
282
+
283
+ Keyboard shortcuts:
284
+
285
+ | Key | Action |
286
+ |---|---|
287
+ | `/` | Focus the search box |
288
+ | `?` | Open Command Center |
289
+ | `Cmd+K` / `Ctrl+K` | Open the command palette (jump to any session, action, or setting) |
290
+ | `Esc` | Close/clear/dismiss |
291
+ | `n` / `p` | Next / previous match (during search) |
292
+ | `c` | New collection |
293
+ | `Cmd+Shift+A` | Add current session to a collection |
294
+ | `Cmd+Enter` | Save note |
295
+ | `Cmd+Click` / `Ctrl+Click` (sessions list) | Toggle row in a multi-selection |
296
+ | `Shift+Click` (sessions list) | Extend the multi-selection as a range |
297
+
298
+ ## Features
299
+
300
+ Everything the CLI and UI surface — demoted to reference material because the three pains above are the actual reason you'd install this.
301
+
302
+ - **Indexes every past session** into SQLite + FTS5 at `~/.recall/db.sqlite`
303
+ - **Full-text search** across 100,000+ messages in milliseconds with `bm25()` ranking and highlighted snippets
304
+ - **Semantic search** (v0.11) — 3-sentence summary + ~15 keywords per session via your local `claude` CLI; off by default
305
+ - **Context re-injection** (v0.4) — `recall context <id> | claude`. The moat
306
+ - **Cost analytics** (v0.10a) — per-session and per-project token + dollar totals, daily sparkline, top-10 heaviest sessions
307
+ - **Git correlation** (v0.10b) — every session links to commits authored in its `cwd` during its time window; `recall blame <sha>` reverse-maps
308
+ - **MCP server** (v0.9, bidirectional v0.13) — expose Recall to Claude Desktop / Claude Code as native tools
309
+ - **Collections** (v0.8) — hand-picked hierarchical groupings of sessions that cut across projects
310
+ - **Aliases, tags, notes, pins** — every metadata layer keeps history; UUIDs stay the immutable primary key
311
+ - **Auto-tagging** (v0.9, off by default) — propose tags via your Anthropic API key or your local `claude` CLI through MCP (zero extra cost)
312
+ - **Cmd+K command palette** (v0.12a) — jump to any session, action, or setting in one keystroke
313
+ - **Multi-select sessions** — `Cmd+Click` to toggle, `Shift+Click` for a range, then right-click for a copy-IDs menu (newline / space / comma separated) or use the inline "copy IDs" button — paste straight into a new Claude prompt
314
+ - **Cross-session diff** (v0.4.4) — split view of two transcripts with shareable `cmp=` URL
315
+ - **VS Code / Cursor / Windsurf extension** (v0.7) — auto-name sessions using the terminal tab name via process-tree matching
316
+ - **First-run onboarding** (v0.14a) — a 3-step tour that demos the moat in the first 60 seconds
317
+ - **Beautiful dark-mode web UI** — three-pane layout with virtualized transcript (10,000-message sessions open instantly)
318
+ - **Export** — condensed markdown, full markdown, self-contained dark-mode HTML, print-ready PDF
319
+
320
+ ## Architecture
321
+
322
+ ### Two surfaces — don't confuse them
323
+
324
+ Claude Recall spans two independent frontends that share the `clauderecall.com` brand:
325
+
326
+ | Surface | Stack | Lives at | Purpose |
327
+ |---|---|---|---|
328
+ | **Local product** (this repo, `src/web/`) | Vite 8 + React 19 + Tailwind, served by the Hono daemon | `http://127.0.0.1:<random-port>` on the user's machine | The actual `recall` experience — the UI the user opens when they type `recall open` |
329
+ | **Marketing / docs site** (separate deploy) | Next.js | `clauderecall.com` | Public landing, SEO, MDX docs, AI-search citability, checkout (v0.6) |
330
+
331
+ **Why Vite for the local product**: the UI is embedded in an offline CLI. No SEO, no public traffic, no SSR — a small static bundle the daemon serves from `dist/web/` is the right shape, and keeps the packaged `@clauderecallhq/cli` footprint lean.
332
+
333
+ **Why Next.js for the public site**: SEO, social previews, SSG/MDX, edge hosting — Next.js's sweet spot. It gets its own repo (or at minimum a separate `site/` directory with its own `package.json`) so the CLI install never pulls in a Next.js runtime.
334
+
335
+ ### Local product internals
336
+
337
+ ```
338
+ ~/.claude/projects/**/*.jsonl ← Claude Code's own output (read-only to us)
339
+
340
+ ▼ chokidar file watcher
341
+ ~/.recall/db.sqlite ← our indexed database
342
+
343
+ ┌─────┴─────┐
344
+ │ │
345
+ CLI HTTP server (Hono, on random localhost port)
346
+ │ │
347
+ recall … http://127.0.0.1:<port>
348
+
349
+
350
+ React + Tailwind SPA (Vite build, served from dist/web/)
351
+ ```
352
+
353
+ ### Data layout (all under `~/.recall/`)
354
+
355
+ | Path | What |
356
+ |---|---|
357
+ | `db.sqlite` | The indexed database (projects, sessions, messages, FTS5, aliases, notes, tags, collections, semantic summaries, commit links, usage rollups, audit logs) |
358
+ | `aliases.json` | Plain-text mirror of every alias with full edit history |
359
+ | `notes/<session>.md` | One markdown file per session note |
360
+ | `tags.json` | Current tag state + append-only event log of every add/remove |
361
+ | `collections.json` | Current tree state + append-only event log of every mutation |
362
+ | `semantic/<session>.json` | Per-session summary + keywords (only when semantic mode is on) |
363
+ | `daemon.pid` | Running daemon metadata |
364
+ | `daemon.port` | Port the daemon picked |
365
+ | `daemon.log` | Daemon logs |
366
+
367
+ ## The "never delete data" invariant
368
+
369
+ Every user-created write feature enforces **three independent durability layers**:
370
+
371
+ 1. **SQLite** — primary storage with history columns (`previous_aliases`, `previous_versions`, `tag_events`, `collection_events`)
372
+ 2. **Plain-text mirror on disk** — JSON or markdown files so the data is greppable, editable, and recoverable if the database is wiped
373
+ 3. **Source JSONLs are never modified** — Claude Code's own files at `~/.claude/projects/` are strictly read-only to Recall
374
+
375
+ Renaming, clearing, or removing anything is always additive — the prior value is archived, never destroyed.
376
+
377
+ ## Tech stack
378
+
379
+ ### CLI + daemon (Node, ESM)
380
+ - **TypeScript 5** strict mode, compiled with `tsc` to `dist/`
381
+ - **better-sqlite3** — synchronous SQLite with FTS5 full-text search
382
+ - **Hono** + **@hono/node-server** — HTTP server on a random ephemeral port (never a well-known dev port)
383
+ - **chokidar** — filesystem watcher
384
+ - **commander** — CLI parsing
385
+ - **@modelcontextprotocol/sdk** — MCP stdio server (v0.9 read-only, v0.13 bidirectional)
386
+ - **zod** — schema validation on every MCP write
387
+ - **chalk**, **cli-table3**, **date-fns** — terminal formatting
388
+
389
+ ### Web UI (bundled into daemon)
390
+ - **Vite 8** + **React 19** + **TypeScript**
391
+ - **Tailwind CSS 3** — dark palette matching the app brand (`#0b0c0f` / `#f97316` accent)
392
+ - **@tanstack/react-query** — data fetching with caching
393
+ - **@tanstack/react-virtual** — virtualized message list (handles 10k+ message sessions)
394
+ - **marked** + **highlight.js** + **DOMPurify** — markdown rendering with syntax highlighting and XSS hardening
395
+ - **clsx** — conditional class names
396
+ - Inter + JetBrains Mono fonts from Google Fonts
397
+
398
+ ### Storage
399
+ - SQLite with FTS5 porter/unicode61 tokenization
400
+ - `~/.recall/` as the root for everything user-generated
401
+ - `~/.claude/projects/` as the external read-only source of truth
402
+
403
+ ## Auto-tagging (v0.9)
404
+
405
+ Propose tags for your sessions with an LLM, then review before anything is written. Two backends: your Anthropic API key OR your Claude Code agent via MCP (zero extra cost). Off by default.
406
+
407
+ See [`docs/auto-tagging.md`](./docs/auto-tagging.md) for setup.
408
+
409
+ ## Roadmap
410
+
411
+ See [ROADMAP.md](./ROADMAP.md) for the full plan. Shipped so far:
412
+
413
+ - ✅ v0.1–v0.5 — CLI, daemon, web UI, context re-injection (the moat), aliases, notes, tags, cross-session diff, MCP read-only server
414
+ - ✅ v0.7 — VS Code / Cursor / Windsurf extension (process-tree tab correlation)
415
+ - ✅ v0.8 — Collections (hand-curated hierarchical groupings across projects)
416
+ - ✅ v0.9 — Auto-tagging (API key or MCP backend, off by default)
417
+ - ✅ v0.10a — Cost / token analytics (dashboard + `recall stats`)
418
+ - ✅ v0.10b — Git correlation (session ↔ commit, `recall blame`)
419
+ - ✅ v0.11 — Semantic search via local `claude` CLI
420
+ - ✅ v0.12a — `Cmd+K` command palette
421
+ - ✅ v0.13 — Bidirectional MCP write tools (opt-in, rate-limited, audited)
422
+ - ✅ v0.14a — First-60-seconds onboarding flow
423
+ - ✅ **v0.14c — Positioning rewrite (this pass)**
424
+ - ⬜ v0.6 — Commercialize: Next.js landing at `clauderecall.com` + LemonSqueezy license flow
425
+
426
+ ## Production deployment & CI/CD
427
+
428
+ The marketing / docs site at [clauderecall.com](https://clauderecall.com) is the only piece of Claude Recall with a remote deploy — the local CLI ships through npm. The deploy is fully automated through GitHub Actions and lands on a dedicated isolated user on a DigitalOcean droplet behind a Cloudflare Tunnel.
429
+
430
+ ### Pipeline
431
+
432
+ ```
433
+ push to main (touching site/** | site-ci.yml | src/web/components/HelpView.tsx)
434
+
435
+
436
+ site-ci typecheck → lint → sync:docs → unit tests → e2e (Playwright)
437
+ → build → Lighthouse → bundle size ~3 min
438
+
439
+ ▼ workflow_run on success only
440
+ deploy-site setup Node 22 → npm ci → next build → load deploy SSH key
441
+ → ssh-keyscan droplet → rsync .next/ + public/ + manifests
442
+ → npm install --omit=dev on droplet → pm2 restart
443
+ → curl 5 routes for 200 → cleanup SSH key ~1 min
444
+
445
+
446
+ clauderecall.com is live
447
+ ```
448
+
449
+ `site-ci` and `deploy-site` are decoupled — `site-ci` always runs on PRs and on `main`; `deploy-site` only runs after `site-ci` succeeds on `main` (via `workflow_run`), so a red test gate blocks the deploy automatically.
450
+
451
+ ### Manual triggers
452
+
453
+ ```bash
454
+ # Re-run the full test suite against main (e.g. after rotating a secret).
455
+ gh workflow run site-ci --ref main
456
+
457
+ # Bypass site-ci and re-deploy main as-is (useful after editing
458
+ # /opt/clauderecall/.env.production on the droplet without a code change).
459
+ gh workflow run deploy-site --ref main
460
+ ```
461
+
462
+ You can also trigger both from the Actions tab in the GitHub UI ("Run workflow" button).
463
+
464
+ ### Droplet topology
465
+
466
+ The droplet is multi-tenant, with each app fully isolated:
467
+
468
+ | Concern | Boundary |
469
+ |---|---|
470
+ | **Linux user** | Dedicated `clauderecall` user (uid 1004). No sudo, no extra groups. |
471
+ | **App path** | `/opt/clauderecall/` — owned by `clauderecall:clauderecall`. |
472
+ | **Logs** | `/var/log/clauderecall/{out,error}.log`. |
473
+ | **License DB** | `/var/lib/clauderecall/licenses.db` — SQLite, owned by `clauderecall`. |
474
+ | **Network** | Next.js bound to `127.0.0.1:3010` only. No public port; reached exclusively through the Cloudflare Tunnel. |
475
+ | **Cloudflare Tunnel** | Dedicated tunnel `clauderecall` (its own systemd unit `cloudflared-clauderecall.service`), independent of every other tenant on the box. |
476
+ | **SSH** | `clauderecall-prod` host alias backed by a dedicated ed25519 key. CI uses a separate ed25519 key (rotatable without disturbing local deploys). Key-only auth — `PasswordAuthentication no` droplet-wide. |
477
+ | **Secrets** | `.env.production` lives only on the droplet (`0600`, never in git, never in CI artifacts). Rotate via `site/scripts/admin/swap-env-var.sh`. |
478
+
479
+ ### Local deploy (escape hatch)
480
+
481
+ When CI is the wrong tool — emergency hotfix while CI is down, swapping live keys, etc. — the same script CI uses runs from a Mac:
482
+
483
+ ```bash
484
+ cd site
485
+ bash scripts/deploy/deploy-to-production.sh # full deploy
486
+ bash scripts/deploy/deploy-to-production.sh --dry-run # show plan only
487
+ bash scripts/deploy/deploy-to-production.sh --skip-build # reuse current .next/
488
+ ```
489
+
490
+ Pre-reqs: the `clauderecall-prod` SSH alias in `~/.ssh/config` and the matching ed25519 key in `~/.ssh/clauderecall_deploy`.
491
+
492
+ ### Swapping a single env var on the droplet
493
+
494
+ ```bash
495
+ # Reads value from stdin, never argv → never lands in shell history.
496
+ echo -n 'sk_live_...' | bash site/scripts/admin/swap-env-var.sh STRIPE_SECRET_KEY
497
+
498
+ # Or interactive (hidden prompt).
499
+ bash site/scripts/admin/swap-env-var.sh STRIPE_SECRET_KEY
500
+ ```
501
+
502
+ The script edits the file atomically on the droplet via Python, restarts PM2 with `--update-env` so the new value takes effect, and prints a `[set, N chars]` confirmation that never reveals the value.
503
+
504
+ ## Contributing / local development
505
+
506
+ ```bash
507
+ # Develop CLI
508
+ npm run dev # tsx runs src/cli.ts
509
+
510
+ # Develop web UI with hot reload
511
+ recall start # keep daemon running on port X
512
+ RECALL_DAEMON_PORT=X npm run dev:web # vite dev server on 5174, proxies /api → daemon
513
+
514
+ # Typecheck
515
+ npm run typecheck
516
+
517
+ # Full build
518
+ npm run build # tsc + vite
519
+ ```
520
+
521
+ Key files:
522
+ - `src/cli.ts` — CLI entry (commander)
523
+ - `src/daemon/` — background server + file watcher
524
+ - `src/db/schema.ts` — SQL schema (single source of truth, `IF NOT EXISTS` migrations)
525
+ - `src/parser/jsonl.ts` — JSONL → structured records (tool_use captured as markdown, ANSI stripped, usage counters extracted, secrets auto-redacted at ingest)
526
+ - `src/context/formatter.ts` — shared markdown formatter used by `recall context` CLI + `/api/sessions/:id/context` HTTP + MCP
527
+ - `src/utils/aliases.ts`, `notes.ts`, `tags.ts`, `collections.ts` — write features with three-layer durability
528
+ - `src/utils/pricing.ts` — static ¢/Mtok pricing table (derived, not persisted)
529
+ - `src/semantic/pipeline.ts` — Claude-CLI-backed semantic summaries
530
+ - `src/mcp/` — MCP stdio server (read-only tools + opt-in write tools + audit + rate limiter)
531
+ - `src/commands/*.ts` — individual CLI subcommands
532
+ - `src/web/App.tsx` — root React component
533
+ - `src/web/commands/` — command palette registry + built-ins
534
+ - `src/web/components/` — each pane and feature
535
+ - `src/web/hooks/` — `useHashRoute`, `usePinned`, `useAlias`, `useNotes`, `useTags`, `useOnboarding`, `useDebounced`
536
+
537
+ ## Brand, registries, and identities
538
+
539
+ See [`BRAND.md`](./BRAND.md) for the complete inventory of npm packages, VS Code / Open VSX extension listings, domain names, and social handles that make up the official Claude Recall presence — plus the outstanding defensive work and the 2026-04-23 npm-squatter incident that triggered the scoped-package pivot.
540
+
541
+ Short version: official CLI ships as **`@clauderecallhq/cli`** on npm, the canonical VS Code extension is **`clauderecallhq.clauderecall-vscode`**, and the product site lives at **[clauderecall.com](https://clauderecall.com)**. Anything else using the Claude Recall name is not us.
542
+
543
+ ## License
544
+
545
+ UNLICENSED, private until v0.6 launch.