@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.
- package/LICENSE +33 -0
- package/README.md +543 -3
- package/README.public.md +523 -0
- package/dist/cli.js +362 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/activate.js +69 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/audit-secrets.js +103 -0
- package/dist/commands/audit-secrets.js.map +1 -0
- package/dist/commands/blame.js +35 -0
- package/dist/commands/blame.js.map +1 -0
- package/dist/commands/config-verification.js +18 -0
- package/dist/commands/config-verification.js.map +1 -0
- package/dist/commands/context.js +144 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/correlate.js +70 -0
- package/dist/commands/correlate.js.map +1 -0
- package/dist/commands/digest.js +78 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/health.js +62 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/index.js +247 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install-extension.js +138 -0
- package/dist/commands/install-extension.js.map +1 -0
- package/dist/commands/installs.js +128 -0
- package/dist/commands/installs.js.map +1 -0
- package/dist/commands/license.js +39 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/list.js +47 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mcp.js +29 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/open.js +28 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/paste.js +154 -0
- package/dist/commands/paste.js.map +1 -0
- package/dist/commands/projects.js +36 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/search.js +67 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/semantic.js +173 -0
- package/dist/commands/semantic.js.map +1 -0
- package/dist/commands/show.js +121 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/start.js +47 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stats.js +133 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/status.js +45 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.js +29 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/thread.js +396 -0
- package/dist/commands/thread.js.map +1 -0
- package/dist/context/formatter.js +103 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/daemon/auto-tag-config.js +103 -0
- package/dist/daemon/auto-tag-config.js.map +1 -0
- package/dist/daemon/auto-tag-config.test.js +72 -0
- package/dist/daemon/auto-tag-config.test.js.map +1 -0
- package/dist/daemon/auto-title-config.js +70 -0
- package/dist/daemon/auto-title-config.js.map +1 -0
- package/dist/daemon/bulk-title-jobs.js +170 -0
- package/dist/daemon/bulk-title-jobs.js.map +1 -0
- package/dist/daemon/correlator.js +320 -0
- package/dist/daemon/correlator.js.map +1 -0
- package/dist/daemon/discover.js +316 -0
- package/dist/daemon/discover.js.map +1 -0
- package/dist/daemon/editor-detection.js +186 -0
- package/dist/daemon/editor-detection.js.map +1 -0
- package/dist/daemon/entrypoint.js +55 -0
- package/dist/daemon/entrypoint.js.map +1 -0
- package/dist/daemon/git-correlator.js +256 -0
- package/dist/daemon/git-correlator.js.map +1 -0
- package/dist/daemon/mcp-installer.js +108 -0
- package/dist/daemon/mcp-installer.js.map +1 -0
- package/dist/daemon/onboarding-state.js +140 -0
- package/dist/daemon/onboarding-state.js.map +1 -0
- package/dist/daemon/pidfile.js +57 -0
- package/dist/daemon/pidfile.js.map +1 -0
- package/dist/daemon/ports.js +48 -0
- package/dist/daemon/ports.js.map +1 -0
- package/dist/daemon/scanProgressRegistry.js +62 -0
- package/dist/daemon/scanProgressRegistry.js.map +1 -0
- package/dist/daemon/server.js +2010 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/tag-scanner/anthropic-client.js +40 -0
- package/dist/daemon/tag-scanner/anthropic-client.js.map +1 -0
- package/dist/daemon/tag-scanner/autopilot.js +131 -0
- package/dist/daemon/tag-scanner/autopilot.js.map +1 -0
- package/dist/daemon/tag-scanner/claude-cli-driver.js +250 -0
- package/dist/daemon/tag-scanner/claude-cli-driver.js.map +1 -0
- package/dist/daemon/tag-scanner/orchestrator.js +88 -0
- package/dist/daemon/tag-scanner/orchestrator.js.map +1 -0
- package/dist/daemon/tag-scanner/prompt.js +46 -0
- package/dist/daemon/tag-scanner/prompt.js.map +1 -0
- package/dist/daemon/tag-scanner/prompt.test.js +48 -0
- package/dist/daemon/tag-scanner/prompt.test.js.map +1 -0
- package/dist/daemon/tag-scanner/scan-state.js +49 -0
- package/dist/daemon/tag-scanner/scan-state.js.map +1 -0
- package/dist/daemon/tag-scanner/session-fetcher.js +82 -0
- package/dist/daemon/tag-scanner/session-fetcher.js.map +1 -0
- package/dist/daemon/tag-scanner/session-fetcher.test.js +34 -0
- package/dist/daemon/tag-scanner/session-fetcher.test.js.map +1 -0
- package/dist/daemon/tag-scanner/validator.js +50 -0
- package/dist/daemon/tag-scanner/validator.js.map +1 -0
- package/dist/daemon/tag-scanner/validator.test.js +41 -0
- package/dist/daemon/tag-scanner/validator.test.js.map +1 -0
- package/dist/daemon/terminal-registry.js +443 -0
- package/dist/daemon/terminal-registry.js.map +1 -0
- package/dist/daemon/ui.js +64 -0
- package/dist/daemon/ui.js.map +1 -0
- package/dist/daemon/watcher.js +256 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/db/client.js +22 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/schema.js +496 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/license/api-base.js +13 -0
- package/dist/license/api-base.js.map +1 -0
- package/dist/license/manager.js +43 -0
- package/dist/license/manager.js.map +1 -0
- package/dist/license/public-key.js +19 -0
- package/dist/license/public-key.js.map +1 -0
- package/dist/license/storage.js +27 -0
- package/dist/license/storage.js.map +1 -0
- package/dist/license/verify.js +23 -0
- package/dist/license/verify.js.map +1 -0
- package/dist/mcp/audit.js +126 -0
- package/dist/mcp/audit.js.map +1 -0
- package/dist/mcp/prompts.js +180 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/server.js +502 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/thread-tools.js +363 -0
- package/dist/mcp/thread-tools.js.map +1 -0
- package/dist/mcp/write-tools.js +239 -0
- package/dist/mcp/write-tools.js.map +1 -0
- package/dist/parser/jsonl.js +150 -0
- package/dist/parser/jsonl.js.map +1 -0
- package/dist/semantic/chunker.js +47 -0
- package/dist/semantic/chunker.js.map +1 -0
- package/dist/semantic/config.js +74 -0
- package/dist/semantic/config.js.map +1 -0
- package/dist/semantic/embedder.js +54 -0
- package/dist/semantic/embedder.js.map +1 -0
- package/dist/semantic/fusion.js +38 -0
- package/dist/semantic/fusion.js.map +1 -0
- package/dist/semantic/model-download.js +69 -0
- package/dist/semantic/model-download.js.map +1 -0
- package/dist/semantic/pipeline.js +375 -0
- package/dist/semantic/pipeline.js.map +1 -0
- package/dist/semantic/query.js +42 -0
- package/dist/semantic/query.js.map +1 -0
- package/dist/semantic/worker.js +78 -0
- package/dist/semantic/worker.js.map +1 -0
- package/dist/stats/backfill.js +151 -0
- package/dist/stats/backfill.js.map +1 -0
- package/dist/stats/health.js +102 -0
- package/dist/stats/health.js.map +1 -0
- package/dist/stats/query.js +385 -0
- package/dist/stats/query.js.map +1 -0
- package/dist/utils/aliases.js +107 -0
- package/dist/utils/aliases.js.map +1 -0
- package/dist/utils/autoCollections.js +635 -0
- package/dist/utils/autoCollections.js.map +1 -0
- package/dist/utils/autoTitle.js +348 -0
- package/dist/utils/autoTitle.js.map +1 -0
- package/dist/utils/collections.js +446 -0
- package/dist/utils/collections.js.map +1 -0
- package/dist/utils/format.js +46 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/notes.js +270 -0
- package/dist/utils/notes.js.map +1 -0
- package/dist/utils/paths.js +50 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/pricing.js +257 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/secret-scanner.js +166 -0
- package/dist/utils/secret-scanner.js.map +1 -0
- package/dist/utils/sessionLabel.js +64 -0
- package/dist/utils/sessionLabel.js.map +1 -0
- package/dist/utils/tags.js +97 -0
- package/dist/utils/tags.js.map +1 -0
- package/dist/utils/thread-context.js +129 -0
- package/dist/utils/thread-context.js.map +1 -0
- package/dist/utils/threadFilter.js +18 -0
- package/dist/utils/threadFilter.js.map +1 -0
- package/dist/utils/threads-titler.js +298 -0
- package/dist/utils/threads-titler.js.map +1 -0
- package/dist/utils/threads.js +383 -0
- package/dist/utils/threads.js.map +1 -0
- package/dist/utils/usage.js +76 -0
- package/dist/utils/usage.js.map +1 -0
- package/dist/verification/compute.js +88 -0
- package/dist/verification/compute.js.map +1 -0
- package/dist/verification/config.js +34 -0
- package/dist/verification/config.js.map +1 -0
- package/dist/web/assets/index-CIr6J4Fw.js +1201 -0
- package/dist/web/assets/index-Ctc8g9Jw.css +1 -0
- package/dist/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
- package/dist/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
- package/dist/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
- package/dist/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
- package/dist/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
- package/dist/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
- package/dist/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
- package/dist/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
- package/dist/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
- package/dist/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
- package/dist/web/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
- package/dist/web/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
- package/dist/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
- package/dist/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
- package/dist/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
- package/dist/web/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
- package/dist/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
- package/dist/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
- package/dist/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
- package/dist/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
- package/dist/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
- package/dist/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
- package/dist/web/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
- package/dist/web/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
- package/dist/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
- package/dist/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
- package/dist/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
- package/dist/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
- package/dist/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
- package/dist/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
- package/dist/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
- package/dist/web/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
- package/dist/web/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
- package/dist/web/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- package/dist/web/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
- package/dist/web/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
- package/dist/web/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
- package/dist/web/favicon.svg +9 -0
- package/dist/web/index.html +15 -0
- package/package.json +80 -9
- 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
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
9
|
+
### The memory layer for the agent you're steering.
|
|
10
|
+
|
|
11
|
+
[](https://github.com/clauderecallhq/clauderecall/actions/workflows/site-ci.yml)
|
|
12
|
+
[](https://github.com/clauderecallhq/clauderecall/actions/workflows/deploy-site.yml)
|
|
13
|
+
[](https://nodejs.org)
|
|
14
|
+
[](https://www.typescriptlang.org/)
|
|
15
|
+
[](#the-never-delete-data-invariant)
|
|
16
|
+
[](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.
|