dexterm-cli 0.2.0 → 0.2.2

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 (157) hide show
  1. package/dist/packages/agents/src/spectator.js +28 -2
  2. package/dist/packages/agents/src/tiers.js +3 -0
  3. package/dist/packages/agents/src/tools.js +3 -0
  4. package/dist/packages/autotrade/src/backtest.js +6 -2
  5. package/dist/packages/autotrade/src/chat/connector.js +5 -4
  6. package/dist/packages/autotrade/src/chat/control.js +3 -0
  7. package/dist/packages/autotrade/src/chat/hub.js +37 -2
  8. package/dist/packages/autotrade/src/chat/index.js +3 -2
  9. package/dist/packages/autotrade/src/chat/readonly.js +530 -0
  10. package/dist/packages/autotrade/src/chat/service.js +12 -1
  11. package/dist/packages/autotrade/src/engine.js +75 -29
  12. package/dist/packages/autotrade/src/fleet.js +2 -2
  13. package/dist/packages/autotrade/src/index.js +4 -0
  14. package/dist/packages/autotrade/src/rugproof-probe.js +415 -0
  15. package/dist/packages/autotrade/src/rugproof.js +231 -0
  16. package/dist/packages/autotrade/src/runner.js +203 -30
  17. package/dist/packages/autotrade/src/service-install.js +6 -4
  18. package/dist/packages/autotrade/src/sessions.js +16 -7
  19. package/dist/packages/autotrade/src/store.js +1 -1
  20. package/dist/packages/autotrade/src/strategy-stats.js +344 -0
  21. package/dist/packages/autotrade/src/strategy.js +29 -1
  22. package/dist/packages/autotrade/src/tiers.js +194 -0
  23. package/dist/packages/classifier/src/calibrate.js +138 -0
  24. package/dist/packages/classifier/src/classify.js +107 -0
  25. package/dist/packages/classifier/src/config.js +298 -0
  26. package/dist/packages/classifier/src/dossier.js +95 -0
  27. package/dist/packages/classifier/src/hardware.js +63 -0
  28. package/dist/packages/classifier/src/index.js +19 -0
  29. package/dist/packages/classifier/src/models.js +111 -0
  30. package/dist/packages/classifier/src/providers/heuristic.js +77 -0
  31. package/dist/packages/classifier/src/providers/http.js +63 -0
  32. package/dist/packages/classifier/src/providers/jev-open.js +86 -0
  33. package/dist/packages/classifier/src/providers/llm.js +89 -0
  34. package/dist/packages/classifier/src/providers/systemone-http.js +95 -0
  35. package/dist/packages/classifier/src/questions.js +97 -0
  36. package/dist/packages/classifier/src/registry.js +42 -0
  37. package/dist/packages/classifier/src/snapshot.js +31 -0
  38. package/dist/packages/classifier/src/systemone.js +88 -0
  39. package/dist/packages/classifier/src/types.js +18 -0
  40. package/dist/packages/classifier/src/win-acl.js +71 -0
  41. package/dist/packages/cli/assets/dash/dash.css +139 -0
  42. package/dist/packages/cli/assets/dash/dash.js +200 -0
  43. package/dist/packages/cli/assets/dash/icon.svg +1 -0
  44. package/dist/packages/cli/assets/dash/index.html +36 -0
  45. package/dist/packages/cli/src/app-help-gen.js +13 -1
  46. package/dist/packages/cli/src/autotrade-cmd/fleet.js +12 -3
  47. package/dist/packages/cli/src/autotrade-cmd/run.js +14 -2
  48. package/dist/packages/cli/src/autotrade-cmd/service.js +3 -1
  49. package/dist/packages/cli/src/autotrade-cmd/signal.js +2 -2
  50. package/dist/packages/cli/src/autotrade-cmd/strategies.js +1 -1
  51. package/dist/packages/cli/src/autotrade-cmd/telegram-host.js +2 -0
  52. package/dist/packages/cli/src/classifier-cmd.js +361 -0
  53. package/dist/packages/cli/src/classifier-live.js +81 -0
  54. package/dist/packages/cli/src/dash/data.js +217 -0
  55. package/dist/packages/cli/src/dash/server.js +92 -0
  56. package/dist/packages/cli/src/dash-cmd.js +113 -0
  57. package/dist/packages/cli/src/doctor.js +34 -0
  58. package/dist/packages/cli/src/live/screens/token-live.js +4 -0
  59. package/dist/packages/cli/src/live/signals.js +8 -0
  60. package/dist/packages/cli/src/main.js +98 -6
  61. package/dist/packages/cli/src/mcp-follow.js +21 -1
  62. package/dist/packages/cli/src/narratives-cmd.js +147 -0
  63. package/dist/packages/cli/src/narratives.js +114 -0
  64. package/dist/packages/cli/src/overlay/model.js +147 -0
  65. package/dist/packages/cli/src/overlay/page.js +146 -0
  66. package/dist/packages/cli/src/overlay/pnl.js +75 -0
  67. package/dist/packages/cli/src/overlay/server.js +170 -0
  68. package/dist/packages/cli/src/overlay-cmd.js +367 -0
  69. package/dist/packages/cli/src/record-cmd.js +82 -11
  70. package/dist/packages/cli/src/rules-cmd.js +2 -1
  71. package/dist/packages/cli/src/rules.js +24 -4
  72. package/dist/packages/cli/src/screens/narrative.js +154 -2
  73. package/dist/packages/cli/src/skill-eval-build.js +7 -2
  74. package/dist/packages/cli/src/state.js +1 -0
  75. package/dist/packages/cli/src/version.js +1 -1
  76. package/dist/packages/custom/src/rules.js +5 -1
  77. package/dist/packages/mcp/assets/kb/app-help/autotrade-telegram.md +1 -1
  78. package/dist/packages/mcp/assets/kb/app-help/classification-models.md +41 -0
  79. package/dist/packages/mcp/assets/kb/app-help/narratives-tracker.md +45 -0
  80. package/dist/packages/mcp/assets/kb/app-help/strategy-dashboard.md +38 -0
  81. package/dist/packages/mcp/assets/kb/app-help/streamer-overlay.md +36 -0
  82. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-confidence-tiers-experimental-unproven-paper-only.md +56 -0
  83. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-rug-proof-entries-experimental.md +52 -0
  84. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-always-on-service.md +3 -1
  85. package/dist/packages/mcp/assets/kb/docs/docs-autotrade-the-strategy-dashboard-dexterm-dash.md +37 -0
  86. package/dist/packages/mcp/assets/kb/docs/docs-autotrade.md +3 -1
  87. package/dist/packages/mcp/assets/kb/docs/docs-beginners-before-any-experimental-trading.md +2 -2
  88. package/dist/packages/mcp/assets/kb/docs/docs-beginners-copy-and-paste-without-surprises.md +0 -1
  89. package/dist/packages/mcp/assets/kb/docs/docs-beginners-if-dexterm-says-command-not-found.md +2 -2
  90. package/dist/packages/mcp/assets/kb/docs/docs-beginners-reopen-dexterm-later.md +1 -1
  91. package/dist/packages/mcp/assets/kb/docs/docs-beginners-terminal-shell-prompt-command-output-and-path.md +2 -2
  92. package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-expectations.md +1 -1
  93. package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows.md +1 -1
  94. package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat-the-ladder.md +2 -0
  95. package/dist/packages/mcp/assets/kb/docs/docs-build-a-strategy-by-chat.md +2 -0
  96. package/dist/packages/mcp/assets/kb/docs/docs-classifier-hosted-jev-with-your-own-key.md +36 -0
  97. package/dist/packages/mcp/assets/kb/docs/docs-classifier-how-they-measured-on-dexterm-s-own-history.md +52 -0
  98. package/dist/packages/mcp/assets/kb/docs/docs-classifier-set-up-kev-on-your-own-machine.md +39 -0
  99. package/dist/packages/mcp/assets/kb/docs/docs-classifier-settings.md +35 -0
  100. package/dist/packages/mcp/assets/kb/docs/docs-classifier-the-choices.md +36 -0
  101. package/dist/packages/mcp/assets/kb/docs/docs-classifier-where-it-plugs-in.md +29 -0
  102. package/dist/packages/mcp/assets/kb/docs/docs-classifier-which-model-for-which-machine.md +42 -0
  103. package/dist/packages/mcp/assets/kb/docs/docs-classifier.md +32 -0
  104. package/dist/packages/mcp/assets/kb/docs/docs-cli-invocations.md +1 -1
  105. package/dist/packages/mcp/assets/kb/docs/docs-configuration-headless-recorder-dexterm-record.md +3 -0
  106. package/dist/packages/mcp/assets/kb/docs/docs-copy-trading.md +1 -1
  107. package/dist/packages/mcp/assets/kb/docs/docs-data-sources-recorded-history-and-retention.md +1 -0
  108. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-install.md +3 -3
  109. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-requirements.md +2 -2
  110. package/dist/packages/mcp/assets/kb/docs/docs-getting-started-supported-platforms.md +2 -11
  111. package/dist/packages/mcp/assets/kb/docs/docs-getting-started.md +2 -2
  112. package/dist/packages/mcp/assets/kb/docs/docs-larp-measured-accuracy.md +2 -2
  113. package/dist/packages/mcp/assets/kb/docs/docs-larp-paste-a-coin-on-the-web.md +1 -1
  114. package/dist/packages/mcp/assets/kb/docs/docs-larp-the-larp-score.md +1 -1
  115. package/dist/packages/mcp/assets/kb/docs/docs-narratives-how-coins-are-grouped.md +39 -0
  116. package/dist/packages/mcp/assets/kb/docs/docs-narratives-limits.md +29 -0
  117. package/dist/packages/mcp/assets/kb/docs/docs-narratives-what-is-measured.md +44 -0
  118. package/dist/packages/mcp/assets/kb/docs/docs-narratives-what-testing-showed.md +43 -0
  119. package/dist/packages/mcp/assets/kb/docs/docs-narratives-where-to-find-it.md +37 -0
  120. package/dist/packages/mcp/assets/kb/docs/docs-narratives.md +29 -0
  121. package/dist/packages/mcp/assets/kb/docs/docs-overlay-before-you-start.md +33 -0
  122. package/dist/packages/mcp/assets/kb/docs/docs-overlay-limits.md +30 -0
  123. package/dist/packages/mcp/assets/kb/docs/docs-overlay-options.md +36 -0
  124. package/dist/packages/mcp/assets/kb/docs/docs-overlay-security-model.md +36 -0
  125. package/dist/packages/mcp/assets/kb/docs/docs-overlay-set-it-up-in-obs-step-by-step.md +49 -0
  126. package/dist/packages/mcp/assets/kb/docs/docs-overlay-the-pnl-scene-paper-and-live.md +34 -0
  127. package/dist/packages/mcp/assets/kb/docs/docs-overlay-the-three-scenes.md +35 -0
  128. package/dist/packages/mcp/assets/kb/docs/docs-overlay-what-is-redacted.md +31 -0
  129. package/dist/packages/mcp/assets/kb/docs/docs-overlay.md +25 -0
  130. package/dist/packages/mcp/assets/kb/docs/docs-paper-trading.md +1 -1
  131. package/dist/packages/mcp/assets/kb/docs/docs-real-mode-what-it-is.md +2 -0
  132. package/dist/packages/mcp/assets/kb/docs/docs-screens-bubble-map.md +1 -1
  133. package/dist/packages/mcp/assets/kb/docs/docs-spectator-streaming-it.md +1 -0
  134. package/dist/packages/mcp/assets/kb/docs/docs-telegram-read-only-data-check-top-and-signals-experimental.md +48 -0
  135. package/dist/packages/mcp/assets/kb/docs/docs-telegram-what-it-is.md +3 -1
  136. package/dist/packages/mcp/assets/kb/docs/docs-telegram-what-it-will-not-do.md +1 -1
  137. package/dist/packages/mcp/assets/kb/docs/docs-voice-linux-and-windows.md +2 -2
  138. package/dist/packages/mcp/assets/kb/entries/narratives-tracker.md +45 -0
  139. package/dist/packages/mcp/src/server.js +106 -1
  140. package/dist/packages/mcp/src/spectator-sink.js +27 -0
  141. package/dist/packages/narratives/src/cluster.js +193 -0
  142. package/dist/packages/narratives/src/embed.js +184 -0
  143. package/dist/packages/narratives/src/export.js +60 -0
  144. package/dist/packages/narratives/src/index.js +10 -0
  145. package/dist/packages/narratives/src/label.js +48 -0
  146. package/dist/packages/narratives/src/normalize.js +179 -0
  147. package/dist/packages/narratives/src/recorder.js +93 -0
  148. package/dist/packages/narratives/src/tracker.js +328 -0
  149. package/dist/packages/packs/src/skill-care.js +10 -2
  150. package/dist/packages/recorder/src/exit-probes.js +215 -0
  151. package/dist/packages/recorder/src/index.js +1 -0
  152. package/dist/packages/recorder/src/recorder.js +11 -1
  153. package/dist/packages/recorder/src/retention.js +4 -0
  154. package/dist/packages/recorder/src/schema.js +20 -1
  155. package/dist/packages/tui/src/keymap.js +5 -0
  156. package/package.json +3 -1
  157. package/dist/packages/mcp/assets/kb/docs/docs-beginners-windows-powershell-experimental.md +0 -39
@@ -0,0 +1,32 @@
1
+ ---
2
+ id: docs-classifier
3
+ title: Classification models
4
+ kind: docs
5
+ page: classifier
6
+ page_title: Classification models
7
+ url: https://dexterm.xyz/docs/classifier
8
+ tags:
9
+ - docs
10
+ - classifier
11
+ - classification
12
+ - models
13
+ confidence: high
14
+ owner: maintainers
15
+ origin: docs-generated
16
+ reviewed_by: generated@2026-10-16
17
+ generated_from: dexterm/site content/docs (task-1420)
18
+ sources:
19
+ - site/content/docs/classifier.md
20
+ date: 2026-10-16
21
+ ---
22
+
23
+ Pick the model that scores coins with probabilities (an open Kev model on your own machine, TypeSafe's hosted Jev with your own key, or the built-in scores), with how each one measured on dexterm's own labelled history.
24
+
25
+ **Experimental.** A classification model answers *typed questions* about one coin with a probability for every possible answer. dexterm asks two questions:
26
+
27
+ - `drain_6h`: will this coin be drained within 6 hours (liquidity pulled, or the price under a fifth of now)?
28
+ - `outcome_6h`: RUG, WIN (at least 3x on a pool that still holds $10k) or DUD over the next 6 hours.
29
+
30
+ A third set, `narrative`, sorts a coin into a narrative category (animal, AI, politics, celebrity, culture, tech, other).
31
+
32
+ Every answer is a **model estimate**: it carries the model id, the latency, the cost and a note on how its probabilities were calibrated. It is not advice and not a trade signal. Nothing here signs, trades, arms a strategy or changes a limit. The token's own text (name, symbol, description) goes through the prompt firewall first, and text that tries to steer the model (a bio that tells it what to answer) is removed before any model sees it.
@@ -36,7 +36,7 @@ $ dexterm --screen screener --replay /tmp/rec.json # the same frame, n
36
36
  $ dexterm mcp # the read-only MCP server on stdio
37
37
  $ dexterm popup --self-test # chart popup self-test
38
38
  $ dexterm x login # Login with X (your own X app; read scopes only)
39
- $ dexterm --workspace morning-hud # start in a workspace (task-1358)
39
+ $ dexterm --workspace morning-hud # start in a workspace
40
40
  $ dexterm pack verify ./some-pack # the install card for a shareable pack
41
41
  ```
42
42
 
@@ -37,10 +37,13 @@ $ dexterm record install --dry-run # print the macOS LaunchAgent it would
37
37
  $ dexterm record install --load # write it to ~/Library/LaunchAgents (no sudo) and load it
38
38
  $ dexterm record uninstall --unload # stop and remove it
39
39
  $ dexterm record run --focus-ticks --retention-mb 3000 # also sample focus coins every 5-10 s; evict old history at 3 GB
40
+ $ dexterm record run --exit-probes --focus-module ./my-focus.mjs # + a sell quote a minute for held coins; extra focus coins from your module
40
41
  ```
41
42
 
42
43
  - **Nothing turns itself on.** The collector runs only when you start it. `install` writes a user-level LaunchAgent and loads it only with `--load`. A LaunchAgent does not start before you log in.
43
44
  - **Same budgets as the app.** Every request goes through the data layer's rate limiter and health gate, and the outcome sweeps keep their own per-sweep and per-day caps. It never builds a signer, never trades and never prints an RPC key.
44
45
  - **A disk cap.** Above `--max-db-mb` (1024 by default) it pauses new observations, while labels and retention keep running, so the database cannot grow without bound. With `--retention-mb N` it never pauses: once the used space reaches N MB the oldest history goes first (the newest hour is always kept). `--retention-days D` expires snapshot rows, outcome re-checks included, after D days instead of 90.
45
46
  - **Focus ticks for autotrade backtests** (`--focus-ticks`): a sample every 5 seconds for coins you hold on paper or have open and every 10 seconds for your watchlist and autotrade candidates, plus 1-minute candles built from those samples, in DexScreener batches of 30 with a daily call ceiling. What is kept and for how long is in recorded history (https://dexterm.xyz/docs/data-sources#recorded-history-and-retention). `install` writes these flags into the LaunchAgent only when you pass them.
47
+ - **Exit probes** (`--exit-probes`, implies `--focus-ticks`): once a minute, for every coin you hold, a keyless Jupiter quote to sell $50 of it into SOL, written as the SOL out, the price impact and the hops, or the error ("no route" is a drained pool). Quotes only: nothing is built, signed or sent. At most 4 quotes a minute for all coins together and a daily ceiling, from the same Jupiter budget as the app.
48
+ - **Your own focus coins** (`--focus-module PATH`, implies `--focus-ticks`): an ES module whose `focus(now)` returns extra coins (a mint and a role: `held`, `open`, `candidate` or `watch`) for the tick lane, for coins your own tools hold outside dexterm.
46
49
  - **Recurring backtests.** 0.1.3 also ships the logic behind recurring skill backtests: a rolling held-out window, a frozen comparison set, and a gate that only *proposes* a tuning when it beats the noise. Nothing changes a skill on your machine. A tuning reaches you only through a normal release, with its measured numbers, including weak ones (see LARP detector (https://dexterm.xyz/docs/larp)).
@@ -26,6 +26,6 @@ date: 2026-10-16
26
26
 
27
27
  Follow a wallet and see its decoded swaps and PnL; turn its buys into a mirror PROPOSAL with one key; or let a capped, keypress-armed auto-mirror propose and arm them for you. Your wallet, your caps, your keys.
28
28
 
29
- Copy trading in dexterm is a **personal tool for your own wallet**. You pick the wallets, you set the caps, and the paper wallet simulates every mirror. dexterm never holds funds or keys, never signs, never copies for anyone else, never offers pooled or hosted copying, never publishes a leader list, and takes no fee on a mirrored trade. The whole feature is labelled **in progress**: it is on main and tested on fixtures and the task-1286 spike recordings, and every mirror, the auto tier included, fills through the paper executor. No mirror moves real funds.
29
+ Copy trading in dexterm is a **personal tool for your own wallet**. You pick the wallets, you set the caps, and the paper wallet simulates every mirror. dexterm never holds funds or keys, never signs, never copies for anyone else, never offers pooled or hosted copying, never publishes a leader list, and takes no fee on a mirrored trade. The whole feature is labelled **in progress**: it is on main and tested on fixtures and the wallet-intel spike recordings, and every mirror, the auto tier included, fills through the paper executor. No mirror moves real funds.
30
30
 
31
31
  It is built in three stages, each behind the previous one's gate.
@@ -32,5 +32,6 @@ What the local recorder keeps, all in your own `--db` file and never uploaded (s
32
32
  - **Snapshots**: a row per coin when its price, liquidity, holders or volume moved materially (about 5%), or every 30 minutes, while a screen listed it, plus outcome re-checks at 1 h to 72 h after it left. Raw JSON goes after 7 days, rows thin to one per coin per minute after 24 hours, and rows expire after 90 days (`--retention-days D` sets that age).
33
33
  - **Autotrade ticks** (`autotrade_ticks`, opt-in with `dexterm record run --focus-ticks`): a sample every 5 seconds for coins you hold on paper or have open, every 10 seconds for your watchlist and autotrade candidates: price, liquidity, market cap, 5-minute and 1-hour volume, buys and sells, and price change. At most 60 coins, in DexScreener batches of 30 (never one call per coin, and no Jupiter calls), queued inside the app's own limiter, skipped while DexScreener is rate-limiting, with a daily ceiling of 36,000 calls. Kept 14 days.
34
34
  - **1m candles** (`autotrade_candles_1m`): open, high, low and close per minute for the same coins, built from those samples, so a high or low is the highest or lowest sample, not every trade. Kept 90 days.
35
+ - **Exit probes** (`exit_probes`, opt-in with `dexterm record run --exit-probes`): a Jupiter sell quote of $50 a minute per held coin: SOL out, price impact, route hops or the error. Kept with the ticks; the size cap may evict them.
35
36
  - **Outcome labels**, verdicts and coin creators: kept.
36
37
  - **Size cap** (opt-in, `dexterm record run --retention-mb N`): when the database's used space reaches the cap, cached answers more than a day past their expiry are cleared first; if that is not enough, the oldest history (ticks, candles and snapshots, outcome re-checks included) is removed first until it is back under, and recording never pauses; the newest hour is always kept. Without it, the older `--max-db-mb` cap pauses new snapshots instead. SQLite reuses the freed space rather than shrinking the file.
@@ -41,10 +41,10 @@ $ dexterm doctor
41
41
  The package is named `dexterm-cli` because npm refuses the name `dexterm` as too similar to `xterm`. The command it installs is `dexterm`. The package ships compiled JavaScript, so it needs no build step. Every GitHub release carries a build-provenance attestation and `SHA256SUMS` you can verify (see the trust page (https://dexterm.xyz/trust/)).
42
42
 
43
43
  ```sh install from the release
44
- $ # download dexterm-0.2.0-src.tar.gz and SHA256SUMS from the releases page, then:
44
+ $ # download dexterm-0.2.2-src.tar.gz and SHA256SUMS from the releases page, then:
45
45
  $ shasum -a 256 -c SHA256SUMS --ignore-missing
46
- $ gh attestation verify dexterm-0.2.0-src.tar.gz --repo dexterm-xyz/dexterm
47
- $ tar -xzf dexterm-0.2.0-src.tar.gz && cd dexterm-0.2.0
46
+ $ gh attestation verify dexterm-0.2.2-src.tar.gz --repo dexterm-xyz/dexterm
47
+ $ tar -xzf dexterm-0.2.2-src.tar.gz && cd dexterm-0.2.2
48
48
  $ ./install.sh
49
49
  $ dexterm doctor
50
50
  ```
@@ -26,10 +26,10 @@ date: 2026-10-16
26
26
  | need | why | notes |
27
27
  |---|---|---|
28
28
  | Node.js 22.18 or newer | dexterm runs its TypeScript sources directly; no build step | `node -v` to check. The installer can fetch a verified Node for you. |
29
- | a terminal with 24-bit colour | the cyberspace look | iTerm2, WezTerm, Ghostty, Kitty, Alacritty, Windows Terminal. 256-colour and monochrome terminals still work, flattened. |
29
+ | a terminal with 24-bit colour | the cyberspace look | iTerm2, WezTerm, Ghostty, Kitty, Alacritty. 256-colour and monochrome terminals still work, flattened. |
30
30
  | an internet connection | all data is public and keyless | nothing goes through a dexterm server; see data sources (https://dexterm.xyz/docs/data-sources). |
31
31
  | optional: Claude Code logged in | only the analyst needs it | `claude` on your PATH, logged in with your own account. Everything else works without it. |
32
32
  | optional: a free RPC key | the ranked top-20 holder list and faster chain reads | Helius, Alchemy, QuickNode or Ankr free tier; see configuration (https://dexterm.xyz/docs/configuration). |
33
33
  | optional: Rust (`cargo`) | the native docked chart window | without it the chart popup opens in your browser; see popup chart (https://dexterm.xyz/docs/popup-chart). |
34
34
 
35
- > note: dexterm 0.2.0 is out (2026-10-25), open source under AGPL-3.0-only at github.com/dexterm-xyz/dexterm (https://github.com/dexterm-xyz/dexterm). It is early: trading is experimental and has known bugs. The release ships checksums, a build-provenance attestation and an SBOM, and its VirusTotal result (including flags we explain) is on the trust page (https://dexterm.xyz/trust/). It is also on npm as `dexterm-cli` (https://www.npmjs.com/package/dexterm-cli); the command it installs is still `dexterm`.
35
+ > note: dexterm 0.2.2 is out (2026-11-05), open source under AGPL-3.0-only at github.com/dexterm-xyz/dexterm (https://github.com/dexterm-xyz/dexterm). It is early: trading is experimental and has known bugs. The release ships checksums, a build-provenance attestation and an SBOM, and its VirusTotal result (including flags we explain) is on the trust page (https://dexterm.xyz/trust/). It is also on npm as `dexterm-cli` (https://www.npmjs.com/package/dexterm-cli); the command it installs is still `dexterm`.
@@ -24,21 +24,12 @@ sources:
24
24
  date: 2026-10-16
25
25
  ---
26
26
 
27
- This table says what each platform has actually been through, not what we expect to work. "Tested" means the typecheck, the full offline test suite and an install smoke (`npm pack`, `npm i -g` of that tarball into an empty prefix with a fresh home, then `dexterm --version` and `dexterm doctor`) have passed there.
27
+ dexterm supports **macOS and Linux**. Windows is not supported. This table says what each platform has actually been through, not what we expect to work. "Tested" means the typecheck, the full offline test suite and an install smoke (`npm pack`, `npm i -g` of that tarball into an empty prefix with a fresh home, then `dexterm --version` and `dexterm doctor`) have passed there.
28
28
 
29
29
  | platform | status | what has run on it |
30
30
  |---|---|---|
31
31
  | Linux x64, Node 22 and 24 | tested | the full suite on every push in CI (Ubuntu), and the same steps in Docker (`node:22-bookworm`, `node:24-bookworm`), including the install smoke |
32
32
  | macOS on Intel | tested | the full suite on every change, the install smoke, and a Homebrew install (slow: Homebrew builds Node from source on Intel) |
33
33
  | macOS on Apple Silicon | tested in CI (0.1.4) | the full suite on an Apple Silicon runner (`macos-14`) passed on the 0.1.4 release candidate. The manual Homebrew job (tap, trust, install, `brew test`) has not run yet |
34
- | Windows x64 | experimental, tested in CI (0.1.4) | the `windows-latest` leg runs the full suite and it passed on the 0.1.4 release candidate (a few tests that need POSIX file permissions or Unix-only tools are skipped, and ACL-based file isolation is not verified). Known gaps are listed below |
35
34
  | WSL2 | not tested separately | it is Linux, so expect the Linux behaviour |
36
-
37
- Known gaps on Windows (none of them affect key safety: dexterm never holds a wallet key on any platform):
38
-
39
- - Files dexterm keeps private (tokens, the optional RPC key) are written with POSIX mode `0600`. Windows ignores that mode, so on Windows they are protected only by your user profile's normal permissions.
40
- - The analyst runs `claude` without a shell, so it can start Claude Code's native installer build (`claude.exe`) but not the `claude.cmd` script an npm install creates. Doctor counts only `claude.exe` as found, so with an npm install it reports the Claude CLI as missing.
41
- - Voice mode has no Windows speech engine (see voice (https://dexterm.xyz/docs/voice#linux-and-windows)).
42
- - Opening a token's links and the PnL card's "share to X" do not start a browser on Windows; dexterm shows the URL to open yourself.
43
- - `doctor` prints its fixes as POSIX shell commands (`mkdir -p`, `chmod`); in PowerShell, do the equivalent by hand.
44
- - `dexterm kb edit` and `dexterm skill edit` do not open `$EDITOR`; they print the file to edit instead.
35
+ | Windows | not supported | a CI leg ran the suite on Windows for 0.1.4, but Windows is not a supported platform: private files rely on POSIX file modes, voice has no Windows engine, and browser links and `doctor`'s fixes assume macOS or Linux |
@@ -22,6 +22,6 @@ date: 2026-10-16
22
22
 
23
23
  Requirements, install, first run and dexterm doctor.
24
24
 
25
- dexterm is a terminal screener for Solana memecoins with a local Claude analyst. It runs on your machine, reads public data with no key and never holds a wallet key. Trading in dexterm is PAPER (see paper trading (https://dexterm.xyz/docs/paper-trading)); dexterm signs nothing, and live trading happens in a Telegram trading bot of your choice (see live trading (https://dexterm.xyz/docs/live-trading)). This page gets you from nothing to the live screener.
25
+ dexterm is a terminal screener for Solana memecoins with a local Claude analyst. It runs on your machine, reads public data with no key and never holds a wallet key. Trading in dexterm is PAPER by default (see paper trading (https://dexterm.xyz/docs/paper-trading)) and dexterm signs nothing. Real mode is experimental; signals to your own executor; dexterm never holds a key; not financial advice (see real mode (https://dexterm.xyz/docs/real-mode) and live trading (https://dexterm.xyz/docs/live-trading)). This page gets you from nothing to the live screener.
26
26
 
27
- > note: Never used a terminal before? Start with the complete beginner guide (https://dexterm.xyz/docs/beginners). It defines every term, shows exactly what to copy on macOS, Linux and Windows, and ends with a ten-minute read-only coin review.
27
+ > note: Never used a terminal before? Start with the complete beginner guide (https://dexterm.xyz/docs/beginners). It defines every term, shows exactly what to copy on macOS and Linux, and ends with a ten-minute read-only coin review.
@@ -29,7 +29,7 @@ date: 2026-10-16
29
29
 
30
30
  - **LARP check, links only.** The links-based baseline is a weak signal: MCC 0.039 before tuning, 0.054 after. Its tuned `LARP` grade caught 4 of 14 bad coins, too few to rate. `EARLY_BUT_REAL` coins still went bad 10.3 % of the time, and coins with no website 29.2 %. The skill now treats the baseline as a weak prior and never calls `LARP` from links alone.
31
31
  - **Rug check.** The verdict rules improved from MCC 0.043 to 0.159. Liquidity under $5k is the one strong signal (`SPECULATIVE` coins went bad 54.8 % of the time, `WATCH` 14.4 %). Dev percentage, organic score and top-10 share did not predict a worse 72 h outcome and now only lower confidence.
32
- - **LARP score, link-shape part** (`dexterm backtest --subject larp-score`, task-1471). Points fitted on the train split only. On the 328 held-out coins its AUROC is 0.69 (0.73 on train): a modest ranking signal. 27 of 218 low-band coins went bad (12.4 %), 34 of 110 medium-band coins (30.9 %), against 18.6 % overall; no coin reaches the high band from link shape alone. The page, domain, GitHub and X points are not measured: that evidence was not recorded at the time, and looking it up now would leak the outcome (dead coins' sites and accounts disappear).
32
+ - **LARP score, link-shape part** (`dexterm backtest --subject larp-score`). Points fitted on the train split only. On the 328 held-out coins its AUROC is 0.69 (0.73 on train): a modest ranking signal. 27 of 218 low-band coins went bad (12.4 %), 34 of 110 medium-band coins (30.9 %), against 18.6 % overall; no coin reaches the high band from link shape alone. The page, domain, GitHub and X points are not measured: that evidence was not recorded at the time, and looking it up now would leak the outcome (dead coins' sites and accounts disappear).
33
33
  - **Not measured.** The model stage (fetched pages, RDAP, GitHub) cannot be replayed: a past page cannot be fetched as it was. It is measured going forward with `dexterm backtest --subject larp`, below.
34
34
 
35
35
  The method, every number and the limits are in the repository at `packages/packs/eval/README.md`. A grade is a risk flag, not a certificate.
@@ -38,7 +38,7 @@ Measured 2026-10-12 with `dexterm backtest --subject larp` over this project's l
38
38
 
39
39
  | history | outcome labels at 1 h (observed) | LARP verdicts recorded | matched |
40
40
  |---|---|---|---|
41
- | research recorder (task-1287 prototype DB) | 149 (137 flat · 9 fade · 2 runner · 1 dead; 29 unobserved) | 0 | 0 |
41
+ | research recorder (prototype DB) | 149 (137 flat · 9 fade · 2 runner · 1 dead; 29 unobserved) | 0 | 0 |
42
42
  | the app's recorder on the development machine | 0 | 0 | 0 |
43
43
  | the same, re-measured later that day after the recorder fix | 401 (361 flat · 18 dead · 13 runner · 5 fade · 4 rug; 1,206 unobserved) | 0 | 0 |
44
44
 
@@ -26,7 +26,7 @@ date: 2026-10-16
26
26
 
27
27
  A no-install version is in preview at the preview checker (https://dexterm-larp-preview.dexterm-site.workers.dev/check/), not deployed to dexterm.xyz. Paste a Solana mint or a DexScreener / pump.fun / Solscan link and get the grade in your browser, read-only, no wallet. It runs on a Cloudflare Worker and reuses the app's tuned link-shape grade (`larp-links-v1`) and the same prompt firewall, so a hostile coin name or symbol is stripped and shown as inert text, never obeyed.
28
28
 
29
- What the web checker shows, each datum with its source and the age of the reading: the **LARP grade** from the coin's advertised link shape (`LARP` / `REAL?` / `UNKNOWN`), **top-10 holder concentration** and **holder count** (Jupiter), and **liquidity** in USD (DexScreener). It never shows a price, a market cap or a buy/sell call. A **shareable PNG card** carries the grade, those facts, the heuristic label and a dexterm.xyz link.
29
+ What the web checker shows, each datum with its source and the age of the reading: the **LARP grade** from the coin's advertised link shape (`LARP` / `REAL?` / `UNKNOWN`), the **LARP score** from the same link shape with its top three reasons, **top-10 holder concentration** and **holder count** (Jupiter), and **liquidity** in USD (DexScreener). The web checker does not fetch the website, the domain, GitHub or the X account, so those count as not checked: the score shows how far they could still raise it ("12, could be up to 100") rather than treating them as clean. It never shows a price, a market cap or a buy/sell call. A **shareable PNG card** carries the grade, the score with its top three reasons, those facts, the heuristic label and a dexterm.xyz link.
30
30
 
31
31
  The preview defaults to the **keyless** tier. The full in-app LARP check above — fetching the website (SSRF-safe), the RDAP domain lookup and the GitHub read, graded by the analyst — is not part of the web checker. The bundle / sniper checkbox runs the app's wallet-intel rules and Helius history adapter as an optional second step, only when a dedicated site key and real Turnstile configuration are present. The visible preview test mode disables paid deep scans. Missing credentials refuse scans or disable the deep step; there is no silent test-secret fallback.
32
32
 
@@ -55,6 +55,6 @@ date: 2026-10-16
55
55
 
56
56
  **Missing data never lowers the score.** A page that could not be read, an RDAP or X lookup that failed, goes to a `missing` list with the points it could have added, and the result shows the range: "37, could be up to 58". Nothing unread is scored as clean.
57
57
 
58
- Where it shows: the `larp_check` MCP result (`score`, `band`, and `larp_score` with every flag, its points, its weight and its evidence, the range and the `missing` list; the existing fields are unchanged), the analyst panel after a LARP check (a gauge with the three biggest reasons, drawn from the tool's own result, never from the model's text).
58
+ Where it shows: the `larp_check` MCP result (`score`, `band`, and `larp_score` with every flag, its points, its weight and its evidence, the range and the `missing` list; the existing fields are unchanged), the analyst panel after a LARP check (a gauge with the three biggest reasons, drawn from the tool's own result, never from the model's text), and the web checker's result and share card.
59
59
 
60
60
  > warn: a LARP verdict is a risk flag, not a certificate. Public HTML cannot prove a working product, a team's identity or who owns an account; domain age, a clean script scan and a GitHub with commits are evidence, not proof, and a real product can still go to zero.
@@ -0,0 +1,39 @@
1
+ ---
2
+ id: docs-narratives-how-coins-are-grouped
3
+ title: Memes and narratives (experimental) › How coins are grouped
4
+ kind: docs
5
+ page: narratives
6
+ page_title: Memes and narratives (experimental)
7
+ heading: How coins are grouped
8
+ anchor: how-coins-are-grouped
9
+ url: https://dexterm.xyz/docs/narratives#how-coins-are-grouped
10
+ tags:
11
+ - docs
12
+ - narratives
13
+ - coins
14
+ - are
15
+ - grouped
16
+ - memes
17
+ - experimental
18
+ confidence: high
19
+ owner: maintainers
20
+ origin: docs-generated
21
+ reviewed_by: generated@2026-10-16
22
+ generated_from: dexterm/site content/docs (task-1420)
23
+ sources:
24
+ - site/content/docs/narratives.md
25
+ date: 2026-10-16
26
+ ---
27
+
28
+ 1. **Normalise** the name and ticker (and the description or social handles when the data layer has them): leetspeak
29
+ (`Z0RP`), repeated letters (`ZOOOORP`), camelCase (`ZorpWifHat`), emoji (🐸 → frog), glued tickers split against a
30
+ vocabulary learned from other names (`BABYZORP` → baby + zorp), and copy-cat affixes (`BABY`, `MINI`, `2.0`, `INU`,
31
+ `AI`) kept as weak words so "Baby X" lands next to X.
32
+ 2. **Embed** each coin with a local model. The default is built in: a hashed vector of the meme words, their letter
33
+ trigrams and the lexicon themes (dogs, politics, ai-agents, holiday-seasonal, …). An optional small open model,
34
+ all-MiniLM-L6-v2 on CPU through transformers.js, or any local Ollama embedding model, adds meaning links such as
35
+ kitty to cat (`DEXTERM_NARRATIVE_EMBEDDER=minilm` or `ollama`).
36
+ 3. **Cluster** incrementally in first-seen order. A coin joins the closest narrative it shares a meme word with (or, with
37
+ a semantic model, a currently hot one) if it is close enough to that narrative's centre and to the coin that started
38
+ it. Otherwise it starts a new narrative. Ids are stable (`nar_…`) and narratives never merge or split afterwards.
39
+ The label is the most common word or two-word phrase.
@@ -0,0 +1,29 @@
1
+ ---
2
+ id: docs-narratives-limits
3
+ title: Memes and narratives (experimental) › Limits
4
+ kind: docs
5
+ page: narratives
6
+ page_title: Memes and narratives (experimental)
7
+ heading: Limits
8
+ anchor: limits
9
+ url: https://dexterm.xyz/docs/narratives#limits
10
+ tags:
11
+ - docs
12
+ - narratives
13
+ - limits
14
+ - memes
15
+ - experimental
16
+ confidence: high
17
+ owner: maintainers
18
+ origin: docs-generated
19
+ reviewed_by: generated@2026-10-16
20
+ generated_from: dexterm/site content/docs (task-1420)
21
+ sources:
22
+ - site/content/docs/narratives.md
23
+ date: 2026-10-16
24
+ ---
25
+
26
+ - Name-based: themes that live only on X or Telegram are missed until a coin's name carries them.
27
+ - Volume is each source's rolling window at the coin's newest sample; a coin not sampled for 6 h counts as zero.
28
+ - Two themes that converge later stay two rows (ids never change).
29
+ - The first build of the table reads the last 26 h of recorded history: tens of seconds on a large database (the screen stays live meanwhile).
@@ -0,0 +1,44 @@
1
+ ---
2
+ id: docs-narratives-what-is-measured
3
+ title: Memes and narratives (experimental) › What is measured
4
+ kind: docs
5
+ page: narratives
6
+ page_title: Memes and narratives (experimental)
7
+ heading: What is measured
8
+ anchor: what-is-measured
9
+ url: https://dexterm.xyz/docs/narratives#what-is-measured
10
+ tags:
11
+ - docs
12
+ - narratives
13
+ - measured
14
+ - memes
15
+ - experimental
16
+ confidence: high
17
+ owner: maintainers
18
+ origin: docs-generated
19
+ reviewed_by: generated@2026-10-16
20
+ generated_from: dexterm/site content/docs (task-1420)
21
+ sources:
22
+ - site/content/docs/narratives.md
23
+ date: 2026-10-16
24
+ ---
25
+
26
+ Per narrative and window (5 m, 1 h, 6 h, 24 h): coins seen, new coins and the new-coin rate, the narrative's share of all
27
+ tracked volume, unique traders (1 h, Jupiter) and their growth, the top runner (sellable pool of at least 10k USD) and its drawdown
28
+ from its peak, how often the same meme word was relaunched in the last hour, and a 0-100 **traction score** (1 h volume
29
+ growth, spawn rate, repeated-name velocity, share of new-coin volume, breadth). Rank 1 is the highest score.
30
+ **Cross-coin holder overlap is not recorded, so it is not part of the score** (it shows as null, never estimated).
31
+
32
+ **Lifecycle**, first rule that matches:
33
+
34
+ | state | rule |
35
+ |---|---|
36
+ | dead | no member sampled in 6 h, or 1 h volume under 1k USD with no new coin in 6 h |
37
+ | spark | the first coin is under 1 h old |
38
+ | ignition | 1 h volume ≥ 5k USD and ≥ 2× the 1 h volume an hour ago, with a new coin in the hour or unique traders +50% |
39
+ | fading | 1 h volume ≤ 40% of its 24 h high, or ≤ 60% of an hour ago |
40
+ | peak | otherwise: hot, near its 24 h high, growing under 2× |
41
+
42
+ **Copy-cat saturation** (`*` in the table): at least 5 coins, at least 3 of them new in 6 h, and the coins after the 3
43
+ oldest together hold under 25% of the narrative's 1 h volume. The copies are launching, but they are not getting the
44
+ volume.
@@ -0,0 +1,43 @@
1
+ ---
2
+ id: docs-narratives-what-testing-showed
3
+ title: Memes and narratives (experimental) › What testing showed
4
+ kind: docs
5
+ page: narratives
6
+ page_title: Memes and narratives (experimental)
7
+ heading: What testing showed
8
+ anchor: what-testing-showed
9
+ url: https://dexterm.xyz/docs/narratives#what-testing-showed
10
+ tags:
11
+ - docs
12
+ - narratives
13
+ - testing
14
+ - showed
15
+ - memes
16
+ - experimental
17
+ confidence: high
18
+ owner: maintainers
19
+ origin: docs-generated
20
+ reviewed_by: generated@2026-10-16
21
+ generated_from: dexterm/site content/docs (task-1420)
22
+ sources:
23
+ - site/content/docs/narratives.md
24
+ date: 2026-10-16
25
+ ---
26
+
27
+ We replayed 11 days of dexterm's recorded history (219,730 coins) through the tracker in time order, reading each
28
+ coin's narrative at the first moment a scanner could act on it (point in time: nothing recorded after that moment),
29
+ and tested it on days that were held back until the end, the same way as dexterm's other entry research.
30
+
31
+ - **It is a useful map of what is running, not an edge.** On the held-back days, adding the narrative to a coin's own
32
+ numbers did not help tell apart the coins that later tripled (ranking quality fell slightly, by 0.022 (95% interval -0.059 to +0.008)) or the ones that drained
33
+ (fell by 0.033 (-0.052 to -0.015)).
34
+ - **None of the narrative gates we fixed in advance improved paper results** when added to the existing entry rules:
35
+ joining an igniting narrative early, skipping the 5th or later copy of a saturated narrative, and skipping fading or
36
+ dead narratives. In the 22 combinations of these gates and rules with at least 20 paper entries, none raised the average result per entry and three lowered it. (One more gate, added after looking at the earlier days, is reported apart; its 5 combinations moved nothing either way.) Every gate also skipped some of the coins that went on to run.
37
+ - **What it does describe:** a coin that is part of a narrative (two or more coins) drained within 6 hours about twice as often as a coin on its own (about 50% against 27% on the held-back days), and also tripled a little more often. Copy-cat waves are where both the runs and the drains happen. The lifecycle states themselves did not sort the outcomes: the share that later tripled was 4% to 6% in every state.
38
+ - In a hand-graded sample of 100 narratives, 70 were coherent (one meme and its copies, or one theme) and the
39
+ label named the theme in 87. The usual mistakes: the same ticker reused for an unrelated coin, and a shared
40
+ generic word.
41
+
42
+ Every number above comes with its sample size and a 95% interval in the study; the narratives table is a way to see
43
+ what is running, and the numbers say it should not be read as a reason to trade.
@@ -0,0 +1,37 @@
1
+ ---
2
+ id: docs-narratives-where-to-find-it
3
+ title: Memes and narratives (experimental) › Where to find it
4
+ kind: docs
5
+ page: narratives
6
+ page_title: Memes and narratives (experimental)
7
+ heading: Where to find it
8
+ anchor: where-to-find-it
9
+ url: https://dexterm.xyz/docs/narratives#where-to-find-it
10
+ tags:
11
+ - docs
12
+ - narratives
13
+ - where
14
+ - find
15
+ - memes
16
+ - experimental
17
+ confidence: high
18
+ owner: maintainers
19
+ origin: docs-generated
20
+ reviewed_by: generated@2026-10-16
21
+ generated_from: dexterm/site content/docs (task-1420)
22
+ sources:
23
+ - site/content/docs/narratives.md
24
+ date: 2026-10-16
25
+ ---
26
+
27
+ - The `N` screen opens the narrative board. Press `n` to switch between the theme board and the **NARRATIVES**
28
+ heat table. `enter` drills into a narrative's member coins; `esc` goes back to the table.
29
+ - The token screen shows a **Narrative** row once the tracker has been built (open `N` then `n` first), for example
30
+ `ZORP · lifecycle: ignition · rank 3 · #2 of 9`.
31
+ - `dexterm narratives` prints the heat table. `dexterm narratives detail ID` shows one narrative, `dexterm narratives of
32
+ MINT` shows the narrative of one coin, and `dexterm narratives export --out FILE` writes the JSON
33
+ (`dexterm-narratives/1`) for your own tools. `--at ISO` replays up to a past time.
34
+ - MCP tools for your analyst or your own agent: `narratives_top`, `narrative_detail`, `narrative_of` (observe tier,
35
+ read-only). Coin names come back wrapped as untrusted data.
36
+ - Watch rules: the field `narrative_rank` and the tags `narrative:ignition` / `narrative:saturated`, so a rule can fire
37
+ "when the coin's narrative ignites".
@@ -0,0 +1,29 @@
1
+ ---
2
+ id: docs-narratives
3
+ title: Memes and narratives (experimental)
4
+ kind: docs
5
+ page: narratives
6
+ page_title: Memes and narratives (experimental)
7
+ url: https://dexterm.xyz/docs/narratives
8
+ tags:
9
+ - docs
10
+ - narratives
11
+ - memes
12
+ - experimental
13
+ confidence: high
14
+ owner: maintainers
15
+ origin: docs-generated
16
+ reviewed_by: generated@2026-10-16
17
+ generated_from: dexterm/site content/docs (task-1420)
18
+ sources:
19
+ - site/content/docs/narratives.md
20
+ date: 2026-10-16
21
+ ---
22
+
23
+ Groups coins by the theme their name and ticker carry, and measures each theme's heat per window. Measured heat, not advice.
24
+
25
+ A memecoin does not need a real project to run. It moves on a theme: a ticker pun, an animal, a celebrity, an AI-agent
26
+ craze, a holiday, or simply being a copy of a coin that just ran. The narratives tracker groups coins by that theme and
27
+ measures how hot each one is right now. It is **experimental**, **keyless** and **local**. It adds no network requests,
28
+ because it reads the history recorder, and it never calls a model. Everything it shows is **measured heat from recorded
29
+ market data, not advice and not a prediction**.
@@ -0,0 +1,33 @@
1
+ ---
2
+ id: docs-overlay-before-you-start
3
+ title: Streamer overlay (OBS) › Before you start
4
+ kind: docs
5
+ page: overlay
6
+ page_title: Streamer overlay (OBS)
7
+ heading: Before you start
8
+ anchor: before-you-start
9
+ url: https://dexterm.xyz/docs/overlay#before-you-start
10
+ tags:
11
+ - docs
12
+ - overlay
13
+ - before
14
+ - start
15
+ - streamer
16
+ - obs
17
+ confidence: high
18
+ owner: maintainers
19
+ origin: docs-generated
20
+ reviewed_by: generated@2026-10-16
21
+ generated_from: dexterm/site content/docs (task-1420)
22
+ sources:
23
+ - site/content/docs/overlay.md
24
+ date: 2026-10-16
25
+ ---
26
+
27
+ You need an agent session to watch. Pick one:
28
+
29
+ - **An agent connected over MCP** (Claude Code, Cursor, Codex, …): run the app with `dexterm --spectate-mcp`. Your terminal follows the agent and opens the read-only spectator stream. See follow over MCP (https://dexterm.xyz/docs/spectator#follow-over-mcp-in-the-running-terminal).
30
+ - **An agent on the loopback bus**: `dexterm agent serve --spectate`. See bring your own agent (https://dexterm.xyz/docs/agents).
31
+ - **No agent, a dry run or a rehearsal**: a saved session with `--replay FILE` (record one with `dexterm agent serve --record FILE`). Every scene then carries a yellow **SAMPLE DATA · REPLAY** tag.
32
+
33
+ The overlay finds the live stream on its own (the same `spectator.json` that `dexterm spectate --info` reads), waits for it if it is not up yet, and reconnects when it restarts.
@@ -0,0 +1,30 @@
1
+ ---
2
+ id: docs-overlay-limits
3
+ title: Streamer overlay (OBS) › Limits
4
+ kind: docs
5
+ page: overlay
6
+ page_title: Streamer overlay (OBS)
7
+ heading: Limits
8
+ anchor: limits
9
+ url: https://dexterm.xyz/docs/overlay#limits
10
+ tags:
11
+ - docs
12
+ - overlay
13
+ - limits
14
+ - streamer
15
+ - obs
16
+ confidence: high
17
+ owner: maintainers
18
+ origin: docs-generated
19
+ reviewed_by: generated@2026-10-16
20
+ generated_from: dexterm/site content/docs (task-1420)
21
+ sources:
22
+ - site/content/docs/overlay.md
23
+ date: 2026-10-16
24
+ ---
25
+
26
+ - **The scenes show what the agent did.** If the agent never reads holders, the holder bar stays "not read yet"; if it never runs a LARP check, there is no LARP line. Live signals appear only while your terminal follows the agent (`--spectate-mcp`) and has that coin's data.
27
+ - **One coin at a time.** The coin card follows the coin the agent touched last; the PnL card follows the agent's newest paper fill.
28
+ - **A reload needs a fresh URL** (see the OBS steps). This is the single-use ticket working as designed.
29
+ - **The stream starts with the last 200 events** when the overlay connects, then follows live.
30
+ - **Not financial advice.** The verdict, LARP evidence and signals are risk information, never a recommendation; paper results are simulated.
@@ -0,0 +1,36 @@
1
+ ---
2
+ id: docs-overlay-options
3
+ title: Streamer overlay (OBS) › Options
4
+ kind: docs
5
+ page: overlay
6
+ page_title: Streamer overlay (OBS)
7
+ heading: Options
8
+ anchor: options
9
+ url: https://dexterm.xyz/docs/overlay#options
10
+ tags:
11
+ - docs
12
+ - overlay
13
+ - options
14
+ - streamer
15
+ - obs
16
+ confidence: high
17
+ owner: maintainers
18
+ origin: docs-generated
19
+ reviewed_by: generated@2026-10-16
20
+ generated_from: dexterm/site content/docs (task-1420)
21
+ sources:
22
+ - site/content/docs/overlay.md
23
+ date: 2026-10-16
24
+ ---
25
+
26
+ | Option | What it does |
27
+ |---|---|
28
+ | `--scene NAME` | `activity`, `coin`, `pnl` or `all`; repeat it for several. Default: the three scenes |
29
+ | `--theme NAME` | `cyberspace` (phosphor green, the app's default look), `ice` (electric cyan) or `neon` (magenta). Default `cyberspace` |
30
+ | `--replay FILE` | Play a saved spectator session instead of the live stream. Every scene says SAMPLE DATA |
31
+ | `--speed N` | Replay speed (default 1); gaps between calls are capped at 5 s |
32
+ | `--loop` | Replay again from the start; the final scenes hold for 10 s first |
33
+ | `--ledger TRADE_ID` | The PnL scene shows one round trip from your own trade ledger (https://dexterm.xyz/docs/paper-trading#the-trade-ledger) (`dexterm ledger trades` lists the ids) instead of the agent's paper fills. `--sol-usd N` for a USD-booked trade |
34
+ | `--port N` | A fixed loopback port (1024 to 65535) instead of a random one |
35
+ | `--ticket-ttl MIN` | Minutes an unused URL stays valid (default 10) |
36
+ | `--json` | Print the scene URLs as JSON |
@@ -0,0 +1,36 @@
1
+ ---
2
+ id: docs-overlay-security-model
3
+ title: Streamer overlay (OBS) › Security model
4
+ kind: docs
5
+ page: overlay
6
+ page_title: Streamer overlay (OBS)
7
+ heading: Security model
8
+ anchor: security-model
9
+ url: https://dexterm.xyz/docs/overlay#security-model
10
+ tags:
11
+ - docs
12
+ - overlay
13
+ - security
14
+ - model
15
+ - streamer
16
+ - obs
17
+ confidence: high
18
+ owner: maintainers
19
+ origin: docs-generated
20
+ reviewed_by: generated@2026-10-16
21
+ generated_from: dexterm/site content/docs (task-1420)
22
+ sources:
23
+ - site/content/docs/overlay.md
24
+ date: 2026-10-16
25
+ ---
26
+
27
+ The overlay uses the same model as the popup windows (https://dexterm.xyz/docs/popup-chart):
28
+
29
+ - **Loopback only.** The page server listens on `127.0.0.1` (a random port unless `--port`) and refuses any connection that is not from this machine.
30
+ - **Single-use ticket, then a one-time token.** A URL carries a random 32-byte ticket that buys exactly one page load. That page holds a second, one-time token (valid 30 seconds) for its WebSocket. A spent or expired ticket, a ticket for another scene, or a forged token gets an empty 404.
31
+ - **Host and Origin checks.** Every request must say `Host: 127.0.0.1:<port>` (so a DNS-rebinding page cannot reach it), and the WebSocket must come from the overlay's own origin. No CORS header is ever sent. Refused probes are printed in the overlay's terminal, without the ticket.
32
+ - **No inbound control.** The socket only pushes scene data. Whatever a page sends is counted and dropped, never parsed or acted on; the overlay has nothing it could control.
33
+ - **A locked-down page.** Its script and styles are inline under a per-page nonce; the content security policy allows no remote content, no fonts, no frames and no other connections. The page builds its text with `textContent` only (agent and coin text are untrusted), and the only image is the PnL card, sent over the socket.
34
+ - **No new network.** The overlay talks to the spectator stream on loopback and reads your ledger file. It fetches nothing from the internet.
35
+
36
+ The URL is printed in your own terminal so you can paste it; treat it like the popup URLs: it is loopback-only and single-use, but don't post a screenshot of a fresh one.
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: docs-overlay-set-it-up-in-obs-step-by-step
3
+ title: Streamer overlay (OBS) › Set it up in OBS, step by step
4
+ kind: docs
5
+ page: overlay
6
+ page_title: Streamer overlay (OBS)
7
+ heading: Set it up in OBS, step by step
8
+ anchor: set-it-up-in-obs-step-by-step
9
+ url: https://dexterm.xyz/docs/overlay#set-it-up-in-obs-step-by-step
10
+ tags:
11
+ - docs
12
+ - overlay
13
+ - set
14
+ - obs
15
+ - step
16
+ - streamer
17
+ confidence: high
18
+ owner: maintainers
19
+ origin: docs-generated
20
+ reviewed_by: generated@2026-10-16
21
+ generated_from: dexterm/site content/docs (task-1420)
22
+ sources:
23
+ - site/content/docs/overlay.md
24
+ date: 2026-10-16
25
+ ---
26
+
27
+ 1. Start the session you want to show (see above).
28
+ 2. In a second terminal, run:
29
+
30
+ ```sh
31
+ $ dexterm overlay --theme cyberspace
32
+ dexterm overlay · theme cyberspace · each URL works once, for 10 min
33
+ activity http://127.0.0.1:53133/overlay/activity?p=…
34
+ coin http://127.0.0.1:53133/overlay/coin?p=…
35
+ pnl http://127.0.0.1:53133/overlay/pnl?p=…
36
+ ```
37
+
38
+ Leave it running for as long as you stream. `q` (or ctrl+c) stops it.
39
+ 3. In OBS, in your scene's **Sources** panel, click **+** and choose **Browser**. Name it (for example "dexterm coin") and click **OK**.
40
+ 4. In the properties window:
41
+ - **URL**: paste one of the printed URLs (the whole line after the scene name).
42
+ - **Width / Height**: `1240` × `420` for `coin` or `activity`, `1240` × `760` for `pnl`, `1600` × `1300` for `all`. Resize the source on the canvas afterwards; the scenes scale.
43
+ - Leave **Use custom frame rate** off.
44
+ - Leave **Custom CSS** as OBS fills it in (it keeps the background transparent) or empty.
45
+ - Untick **Shutdown source when not visible** and **Refresh browser when scene becomes active**: either one reloads the page, and a reload needs a fresh URL (see below).
46
+ 5. Click **OK**. The panel appears over your stream with a transparent background. Repeat steps 3 to 5 for the other scenes.
47
+ 6. To check the setup without a live agent, run `dexterm overlay --replay session.jsonl --loop` and watch the scenes fill in with the SAMPLE DATA tag on.
48
+
49
+ **Each URL works once.** It is a single-use ticket: OBS's first load spends it, and the page then holds its own one-time connection. If OBS reloads the page, or you paste the URL into a second source, the page stays empty. Press **n** in the overlay's terminal for a fresh set of URLs and paste the new one into the source. URLs that are never loaded expire after 10 minutes (`--ticket-ttl MIN` changes that, 1 to 240). When you restart `dexterm overlay`, its port changes too, so paste fresh URLs then; `--port N` keeps the port fixed (the tickets still change).