dexterm

features

every feature in the app, grouped by area, with a status that comes from one file reviewed against dexterm/app@7204648 on 2026-10-15. nothing is labelled live unless it is on main today.

  • LIVE NOWon dexterm/app main today, on real data, keyless by default
  • IN PROGRESScode exists on main but is labelled experimental, partial or stubbed; not a promise
  • COMINGdesigned, spiked or built on an unmerged branch; not in the app; no date

filter: (click again to clear)

Screener and feeds

11 live · 1 in progress · 0 coming · docs

A live Solana screener in your terminal on keyless public data, honest when a source is down.

featurestatuswhat it doessee
Live screener LIVE NOW DexScreener + Jupiter rows refreshed every 10 s through a rate limiter: price, 5m/1h/6h/24h change, volume, liquidity, market cap, age, holders, organic score, flags, sparkline.
screenshotthe dexterm screener: a table of sample tokens with price, change, volume, liquidity, market cap and a sparkline per row, matrix rain in the gutters, header reads sample data

source: app/README.md › What is live › Screener

docs
Filter grammar and sort menu LIVE NOW vol24 > 250K liq > 50K age < 30d launchpad:pump !flag:mint on the / line, errors inline with the column; a sort menu on every column.

source: packages/cli/src/screener/filter.ts, sort.ts

docs
Feed presets LIVE NOW Trench, Trending, Runners, Organic, Top traded, New, Boosted, All, stepped with [ and ]; gated presets say why.

source: packages/cli/src/screener/presets.ts

docs
Instant first paint LIVE NOW A cold start paints the last rows (marked how old) or skeleton rows in under a second; Jupiter fields fill in behind a DexScreener-only first list.

source: task-1323 handoff: time-to-first-rows 17.5 s → 0.9 s cold, measured live

docs
New pairs stream LIVE NOW PumpPortal push (creates + migrations) on one WebSocket plus Jupiter and RugCheck polls; bonding progress is estimated from the curve's reserves and says so.
screenshotthe dexterm new pairs screen on sample data: freshly created tokens arriving as rows with bonding progress bars

source: app/README.md › What is live › New pairs

docs
Watchlist and alerts as proposals LIVE NOW A local SQLite watchlist priced every 10 s; alerts are proposals until a keypress arms them.
screenshotthe dexterm watchlist on sample data: watched tokens with live prices, a feed badge per row and an alerts panel

source: app/README.md › What is live › Watchlist

docs
Sub-second on-chain price LIVE NOW The open token and your watchlist are priced from pump.fun bonding-curve state over one WebSocket, computed locally; LIVE only while a push is flowing, else POLL.

source: app/README.md › Two-speed feed (task-1312)

docs
Snipers and bundles from the wallet-intel scan LIVE NOW Snipers (first 3 slots after the first pool trade) and bundled supply (same-slot buys that also share a funder) come from the wallet-intel scan, each with its sample. They show on the token screen (light scan on open), in the token popup, and in the new-pairs SNIPE / BUNDLE columns and spotlight for the row your cursor rests on (scanned after about 2 s). Reading the launch window needs a free Helius key; without one the rows say needs Helius key, and an unscanned row shows a dash, never a guess.

source: packages/cli/src/live/intel.ts (launchIntelCells, scanSelectedLater); packages/cli/src/live/screens/newpairs-live.ts; cli/test/snipers-1359.test.ts; app main @ 10de26c (task-1359)

docs
Graduating and Smart-money presets IN PROGRESS Graduating now ships keyless as an mcap-band proxy, labelled approx in the preset bar so it never implies the keyed bonding-% signal; it swaps to the real bonding column when a launch source is keyed. Smart money stays gated on a Tier-1 top-traders key and says needs key, because a smart-money preset without wallet-PnL data would mislead.

source: packages/cli/src/screener/presets.ts (Graduating approx, Smart money gated); app main @ 9d45776

docs
Coin pictures in the terminal LIVE NOW Every row carries the coin's picture and the token screen a bigger one: real pixels in kitty, Ghostty, WezTerm, Konsole, iTerm2 and sixel terminals; half-block art everywhere else, Apple Terminal.app included; a ticker placeholder while an image loads or when there is none.

source: app/README.md › Coin images · Privacy and safety of coin images

docs
Go to any coin by address LIVE NOW g on the screener, new pairs, watchlist or token screen opens a one-line prompt: paste or type a contract address (or a dexscreener / pump.fun / solscan link) and press enter to open that coin's live token screen, even when it is not in any feed. Esc cancels; a bad address shows a notice and changes nothing. Read-only navigation — it never trades or signs.

source: task-1388: packages/tui/src/keymap.ts goto.open (per-screen g); packages/cli/src/main.ts parseMintTarget + openGotoTarget (live.openToken(seedForMint(...)) unknown-launchpad stub); keymap/state tests incl. a 44-char paste and a hostile-input case

docs

Token screen and chart

7 live · 0 in progress · 0 coming · docs

Everything about one coin on one screen, with nothing fabricated.

featurestatuswhat it doessee
Token intel LIVE NOW Market stats, mint and freeze authority from the chain, holder count and top-10 share, RugCheck summary, GoPlus second opinion; the ranked top-20 holders with a free RPC key, each classed from the chain (POOL, CURVE, VAULT, LOCK, CEX, BURN, DEV, LINKED or UNLABELLED, with the reason) and the top-10 shown raw and ex-pool with the main risk called out.
screenshotthe dexterm token screen on sample data: a candle chart, on-chain stats, top holders as bars, safety checks and a trades tape

source: app/README.md › What is live › Token

docs
Candles 1m to 1d, instant switch LIVE NOW 1m and 1h from GeckoTerminal; 5m/15m/4h/1d derived locally, so a timeframe switch is milliseconds and the chart goes ahead of background work.

source: task-1314 + task-1323 handoffs: cold switch 15 s → 250 ms, measured live

docs
Buy/sell flow panel LIVE NOW Buys vs sells for 1m, 5m, 1h, 6h, 24h with a ratio bar, USD volume and a trend arrow, from data already cached; F swaps in the raw trade tape.

source: task-1323 handoff item 6; packages/cli/src/live/flow.ts

docs
Position row under the chart LIVE NOW When you hold a PAPER (or a confirmed LIVE) position in the coin: side, size, value, average entry, price, unrealized PnL on the same tick as the header.

source: task-1323 handoff item 5

docs
Bubble map and holder intel LIVE NOW M on a token: the holder graph as packed bubbles (area = share, colour = the rule that labelled it: dev, bundle, linked, sniper, pool/LP, exchange, unlinked), a CLUSTERS table, sample-captioned HOLDER INSIGHTS (top-10 raw, ex-pool and cluster-adjusted, snipers, bundled, dev, fresh) and a WHY THIS LABEL panel that prints every rule with its confidence and evidence. Light scan when a token opens, deep scan for watchlist coins or on D. Keyless it shows holders and static labels and says a free Helius key adds funders and the launch window. Exchange labels come from a seed list and read "unverified"; cabal-class labels stay hidden until their precision is measured.

source: packages/data/src/intel/ (rules replay the task-1286 spike recordings); packages/tui/src/bubbles.ts; packages/cli/src/screens/bubbles.ts; data/test/intel-1340.test.ts, tui/test/bubbles-1340.test.ts, cli/test/bubbles-1340.test.ts

docs
Social panel LIVE NOW s on the token screen swaps in a SOCIAL panel with spam, duplicate and prompt-injection filtering. Live it holds rule-written on-chain rows (labelled holders, tracked wallets, large trades, wallet-intel clusters and snipers) and, after dexterm x login, X posts about the coin read with your own X app and limits; the header shows the X state (logged out, reading, rate limited, daily budget, app tier) and never fakes a post.

source: task-1330 + task-1359 D (on-chain rows); task-1357 handoff (X posts through the firewall; injection tweet withheld; mock X server tests; no live X smoke without a real Client ID)

docs

Analyst and skills

9 live · 2 in progress · 0 coming · docs

Your own Claude Code login, run locally, with every fact from a tool.

featurestatuswhat it doessee
The Claude analyst LIVE NOW a on a coin runs a rug-check or the full dossier through a read-only MCP server; your subscription and model apply; no API key ships.
screenshotthe dexterm analyst tab on sample data: a coin list beside a chat transcript with a coral verdict line, labelled demo text

source: app/README.md › The Claude analyst (task-1302)

docs
Knows what you are looking at LIVE NOW Every turn carries the screen, the hovered coin, the visible rows, your watchlist and any open ticket, firewalled; “this coin” resolves without asking.

source: task-1313 (merged b7f5804): buildScreenState + CONTEXT block

docs
Short, decided answers LIVE NOW 3 to 6 lines: call, why, levels, size, one risk. No recap of the screen, no disclaimer boilerplate; long form only when you ask.

source: task-1323 handoff items 3+4: 25 lines → 5 lines on five real questions

docs
Navigates for you LIVE NOW Five non-financial UI actions (open a coin, filter the screener, watch, switch feed, open a PAPER ticket), each re-validated against what is on screen and rate-limited.

source: task-1313; packages/data/src/analyst-actions.ts

docs
Plain-language filters LIVE NOW “coins under 5M mcap with 100k liquidity, up on the day, not rugs” becomes a real filter and the analyst states the numbers it chose.

source: task-1313 part E; analyst-system.md

docs
Coin-list answers you can navigate LIVE NOW An answer that lists coins renders as a table: arrows move, ⏎ opens the coin, o opens its PAPER ticket.

source: task-1313 part F

docs
One-call dossier LIVE NOW get_dossier fetches market, holders, security, candles, tape and creator in one parallel pass; a partial verdict names what is missing instead of refusing.

source: task-1314: 6 round trips → 1; warm dossier 14.5 s on sonnet

docs
Knowledge base and case files LIVE NOW A sourced memecoin knowledge base (mechanics, patterns, glossary) and historical case files, for comparison only; never a fact about a live token.

source: packages/mcp/assets (task-1293)

docs
One-line digests on the watchlist and new pairs IN PROGRESS The deterministic one-line digest now ships (model_output: false): a VERDICT [p(rug) NN%] · highlights line built by buildDigest and surfaced by the analyze_token tool — no model, no token cost. The in-panel line on the watchlist and new-pairs spotlight is still labelled demo until you run the analyst yourself.

source: app/README.md › One-line digests (task-1356); analyze_token / buildDigest; app main @ 9d45776

docs
Local history recorder LIVE NOW On by default in live mode: keeps what the app saw and code-only outcome labels in your local database for future backtests. Nothing is uploaded; about 100 MB per 8-hour day (measured); --no-recorder turns it off. Fixed 2026-10-12: outcome checks and labels used to wait a full minute after launch and never ran at quit, so short runs left 0 outcomes; the first pass now runs 5 s after launch and quitting labels what is due.

source: task-1329 handoff (measured footprint and CPU); dexterm recorder stats; task-1361 (packages/recorder/src/schedule.ts, recorder/test/schedule-1361.test.ts, live check in the handoff)

docs
Analysis packs, narrative board, backtests IN PROGRESS The deterministic analysis packs and the narrative board are live (analyze_token and narrative_board, no model, no token cost). The rug-probability model ships as a pre-registered additive heuristic (H1-v0.1), not a learned model — dexterm will not ship a trained model until the recorder has about two weeks of labelled outcomes — and rug_backtest / dexterm backtest is the harness that would judge a future v1 honestly against recorded history. The screener now shows H1's p(rug) as a P(RUG) column labelled as a model output (model id in the panel caption, data age in the spotlight; rug sort key). First backtest on the app's own recorder (2026-10-12, after the recorder fix): too few positives to rate the heuristic — see the changelog for the counts.

source: app/README.md › After-launch analysis suite (task-1356); packages/mcp/src/server.ts; app main @ 9d45776; task-1361 P(RUG) column (packages/cli/src/screener/rug.ts, cli/test/rug-1361.test.ts)

docs

LARP detector

3 live · 1 in progress · 0 coming · docs

Vet the product behind a coin: website, domain, GitHub. Read-only, only when you ask.

featurestatuswhat it doessee
larp-check skill LIVE NOW V on a token fetches its site (SSRF-safe, robots-aware, no JS), its domain registration via RDAP and its GitHub activity, and grades the claims: REAL_PRODUCT · EARLY_BUT_REAL · LARP · UNVERIFIABLE · AMBIGUOUS.

source: task-1315 handoff (merged b7f5804 + 0882e59)

docs
Verdict badge LIVE NOW LARP / REAL / REAL? / UNKNOWN in the screener FLAGS column and the token title strip, only for a coin you actually vetted.
screenshotthe dexterm screener on sample data with a red LARP badge and a green REAL badge in the flags column of two vetted sample rows

source: task-1315: larpBadge, larpByMint

docs
Mechanical signals LIVE NOW Site-builder and default-page patterns, wallet-connect and drainer signatures, external script hosts, team and placeholder text, link mismatch across sources, domain age and registrar privacy.

source: packages/data/src/larp/evidence.ts

docs
Measured classifier accuracy IN PROGRESS Measured 2026-10-12: no accuracy figure exists yet. The labelled history holds 149 observed 1 h outcomes (research recorder) and, after the same-day recorder fix, 401 on the app's own recorder — but no LARP verdict has been recorded yet (one is written only when you run the LARP check on a token), so n = 0. dexterm backtest --subject larp scores verdicts against outcomes with the method printed. It reports counts only below 50 matched verdicts and 95% Wilson intervals above. Even then it measures agreement with a bad price outcome, not whether a product is real. A verdict is a risk flag, not a certificate.

source: packages/packs/src/larp-eval.ts; packages/recorder/src/verdicts.ts; cli/test/larp-eval-1359.test.ts; measurement output in medium-coder/handoffs/task-1359-evidence/larp-measure.txt; app main @ 7324147 (task-1359); re-measured in expert-coder/handoffs/task-1361-evidence/backtest-real-db-2026-10-12.txt

docs

AI scan mode

4 live · 0 in progress · 0 coming · docs

An observe-only watcher that pulls up the coin that lights up and keeps analysing it.

featurestatuswhat it doessee
AI scan mode LIVE NOW Z toggles it anywhere; six triggers score every coin from data already on hand; a lock opens the coin and starts a short read; R resumes.
screenshotthe dexterm screener on sample data with AI scan mode on: the header reads AI SCAN SCANNING and row 1 shows a ticker of the top-scoring sample coins with their triggers

source: task-1324 handoff (merged 242863e); live lock at default thresholds on real data

docs
Zero extra requests LIVE NOW The scan reads memory and the SQLite cache only; a test asserts 0 HTTP calls over 50 ticks and live req/min matched on and off.

source: task-1324: 44.4 vs 44.8 req/min

docs
Observe-only, by structure LIVE NOW Empty action allow-list at the validator, the MCP server and the claude launch, plus an app-side refusal; a compromised-model test proves open_ticket changes nothing during a scan.

source: packages/cli/test/scan-safety-1324.test.ts

docs
Cost caps LIVE NOW 8 analyst turns an hour, 4 per coin, a 90 s refresh floor that also needs the data to move, 15 min same-coin cooldown.

source: packages/cli/src/scan/engine.ts DEFAULT_SCAN_CONFIG

docs

Paper trading and safety

1 live · 7 in progress · 0 coming · docs

A simulated wallet on real quotes; a non-custodial live path behind a separate signer process, devnet first, mainnet only behind a flag.

featurestatuswhat it doessee
PAPER trade ticket IN PROGRESS B / S on a token: size in SOL or %, slippage, a rolling keyless Jupiter quote with impact, route and minimum received; every frame says PAPER.
screenshotthe dexterm PAPER buy ticket on sample data: a yellow PAPER TRADING banner, size and slippage fields, a quote block and the confirm hint

source: task-1310 T0 (merged 582224e)

docs
Confirm gate on by default IN PROGRESS ⏎ arms, y confirms from a fresh quote, sizes above 1 SOL are typed back, any stray key cancels; a quote that stalls times out instead of hanging.

source: packages/cli/src/trade.ts; task-1310 T1 fix f2f07ea (merged via 1319)

docs
Trade-moment effects and sound, only after the result IN PROGRESS A green shockwave on a confirmed buy, a gold burst on a profitable sell, red static on a loss, a lockout flicker on a refusal or failure, and a neutral scanning sweep while a send is in flight. They fire from one place only: the settled outcome of a booked paper fill or a confirmed live fill (never a quote, a plan or an unknown send). The ticket is shielded so no effect can touch it, and --sound adds short cues (muted by default).

source: packages/tui/src/fx-trade.ts + sound.ts; packages/cli/src/live/trade.ts onSettled; tui/test/fx-trade-1340.test.ts, cli/test/trade-moments-1340.test.ts (shield byte-identity, one call site)

docs
PAPER positions and history IN PROGRESS Equity, cash, realized and unrealized PnL marked from live prices, the trade history, persisted in SQLite.
screenshotthe dexterm PAPER positions screen on sample data: equity, cash and PnL summary, one open position and the trade history

source: task-1310 T0

docs
No private key, ever LIVE NOW dexterm holds no key and imports no keypair or signing library; the only signing happens in your own wallet extension, on a loopback page in your browser. The app stores your public key and nothing else; a key scan of the sources is part of verification.

source: task-1310 T0 handoff › key scan clean; task-1328 handoff › secret scan of the T1/T2 diff; packages/data/src/trade/link-store.ts

docs
Non-custodial swaps (devnet first) IN PROGRESS On main: L on a ticket flips it LIVE once a wallet is linked. A separate signer process quotes, builds, decodes and binds the one Jupiter route to your plan, simulates it with your token balances, prices it from its own SOL/USD feed, shows the PLAN, waits for your keypress, hands the bytes to Phantom, verifies and re-simulates what comes back, then submits. Caps live in the signer ($5 per trade, $20 per day, 1 SOL out, 3% impact, downward-only without --mainnet); /wallet panic stops everything. Devnet by default; a Jupiter swap is a mainnet transaction, so real swaps need --mainnet and a red banner. Verified on fakes and a real recorded Jupiter transaction; a real-Phantom devnet probe is still to be run by Joey. Since 2026-10-12 (task-1368) a Jupiter 429 or 5xx no longer kills a plan: the signer retries on the other keyless host after the server's own reset, the preview, re-quote and build are paced by the signer's one limiter, and a limited ticket shows “retrying in Ns” with r to retry now; the ticket prices your size at the signer's SOL/USD against the per-trade and daily caps before ⏎ (red, with the size that fits and f to set it), says plainly that a devnet signer cannot fill a mainnet token, shows small token amounts as such (0.0144, never 0) and the full simulation error with a plain-English hint. The Phantom sign page connects before it signs (no more 4100), checks the connected account against the linked wallet and explains Phantom's errors; the wallet bridge sits on the fixed loopback port 127.0.0.1:41291 so Phantom's per-origin trust persists.

source: task-1310 T1 rounds 1–3 + task-1328 T2 + task-1337 hardening (merged 8fce789); packages/data/src/trade/signer/; packages/data/test/trade-1337.test.ts; task-1368 (Jupiter 429 fixtures recorded 2026-10-12: packages/data/fixtures/trade/jupiter-429-2026-10-12.json; packages/data/test/jupiter-retry-1368.test.ts; packages/cli/test/trade-1368.test.ts; packages/data/test/bridge-1368.test.ts)

docs
Order plans and standing mandates IN PROGRESS On main, paper by default: “buy this if it dips to 300k, sell half at 600k, leave a moon bag” typed (dexterm plan propose), spoken to Jarvis or drafted by an agent becomes an inert PROPOSAL; you arm it under a standing mandate (total / per-trade / per-coin / daily-loss caps, a time-to-live, hard ceilings $2000 / $500 / $1000 / $2000) with a held physical keypress on the O screen or a TTY. The terminal feeds the monitor the prices it already shows, so an armed plan fires its entries, take-profit tranches and stops inside the armed plan and only through the executor, which re-checks the caps on every fill; a hash-chained journal is the audit log and the crash-recovery source. New: a LIVE fire path on DEVNET — L on the O screen (a held keypress, refused while plans are armed) sends fills through the signer process, which builds a wrap-and-unwrap transaction sized to the plan's SOL leg (Jupiter has no devnet), simulates it, enforces its USD per-trade and daily caps even on devnet plus a 0.05 SOL per-fill ceiling, and has a separate capped FAST WALLET (dexterm wallet fast create, TTY keypress, devnet only, never mainnet) sign it; the token leg is modelled and labelled so. dexterm plan amend edits a proposed plan into a new hash. Voice, agents, pipes and the read-only popup can never arm, raise a cap, widen a mandate, turn the gate off or switch the fire path. Still unobserved: a fill confirmed on devnet with real faucet SOL (the public faucet was dry), and any mainnet action.

source: task-1355 on main: 8be79d0 engine, ad42d6d PlanService + CLI + compromised-model suite, 00b1489 Jarvis proposal path, b180ffa O screen + popup, 6ac0732 hands-free opt-in, fae60db voice→TUI seam; task-1363: fast wallet + signer devnet fill (packages/data/src/trade/signer/fast-wallet.ts, executor.ts buildFill), LivePlanExecutor (plans/executor-live.ts), keypress-only useLive, engine ticks from the board, wallet fast / plan amend; tests signer-fast-1363, plans-live-1363, plans-live-ui-1363, wallet-fast-1363, voice-seam-1363

docs
Copy trading: wallet tracker, mirror ticket, capped auto-mirror IN PROGRESS A personal tool for your own wallet: follow a wallet (U; labels are yours, firewalled, local, purgeable), see its swaps decoded from Helius history (buy / sell / transfer / lp-like / token-swap, wrapped SOL never a mint), FIFO realised PnL in SOL with the rate used, win rate hidden under n = 10, every figure with its sample, and toasts when it buys or sells (history is backfilled silently; only new transactions alert). m previews a MIRROR TICKET for its latest buy with the lag / drift / liquidity / age / leader-sold / leader-dev checks and a size from your own cap, and proposes it as an inert order plan on the O screen, armed only by the keypress / Phantom gate. A turns on a capped AUTO-MIRROR for that wallet: default off, a captured physical keypress that also arms a buy-only hands-free copy mandate in the plan engine, allowed only after the engine's own less-safe popup; mirrors arm at ¼ of the per-trade cap and the engine re-checks every cap signer-side; daily cap, max open, cooldown, auto-disarm streak, panic, gate restore and every restart turn it off. No custody, no third parties, no pooled copy, no leader lists, no fees. Paper by default; mirror-sell is not built; no mirror has run on devnet or mainnet.

source: task-1360: 18922b6 tracker + follows + U screen + dexterm follow, 79d58ca mirror ticket, 0f2d642 capped auto-mirror; 81d3146 and c7ccd9b harden engine-owned confirmation provenance and private copy authority. packages/data/src/trade/copy/, packages/data/test/copy-1360.test.ts (fixture histories + the three task-1286 spike recordings), copy-mirror-1360, copy-auto-1360, proof-provenance-1360 (forged, cloned, modified and reused proof regressions), packages/cli/test/copy-ui-1360, copy-mirror-ui-1360, copy-auto-ui-1360

docs

Popup chart

6 live · 0 in progress · 0 coming · docs

A docked native chart window fed only by the terminal.

featurestatuswhat it doessee
Chart popup v2 LIVE NOW C opens TradingView Lightweight Charts (vendored, no CDN) for the open coin: candles/line/area, volume, EMA 9/21, VWAP, tape markers, drawings, six timeframes with zero fetches.
screenshotthe dexterm chart popup on sample data: candlesticks with a volume pane, EMA lines, tape markers, a crosshair legend and a LIVE badge

source: task-1325 handoff (merged 242863e)

docs
Docked native window (macOS) LIVE NOW Opens flush right of the terminal with the same height, follows it, never steals focus, no Dock icon; global chords show/hide and close.

source: task-1325: window-1325.json; docking verified via the system window list

docs
Browser fallback LIVE NOW No Rust toolchain or no display: the same page opens in your browser and says why, in the terminal and on the page.

source: popup README › browser fallback

docs
Position on the chart LIVE NOW ENTRY line with size and PnL %, fill markers, stop/target lines when set, and the same position row the terminal shows, from the paper ledger.

source: task-1325: popup row == terminal row byte for byte after a real paper buy

docs
Token and feeds popups LIVE NOW I on the token screen opens the token-detail HUD (market, risk, authorities, and snipers / bundled from the wallet-intel scan), updated on every tick. M on the trending screen opens the feeds HUD: the board's posts as the SOCIAL panel filters them, with instruction-like posts withheld, plus official news headlines, newest first. ⏎ opens that coin in the terminal; the page never holds an address. Both are read-only.

source: packages/cli/src/popup.ts (openToken / openFeeds); packages/cli/src/social/view.ts (feedsPopupModel); cli/test/popup-1359.test.ts; pages rendered headless from the loopback server on 2026-10-12; app main @ a51dc38 (task-1359)

docs
Bubble map popup LIVE NOW M on the bubble screen opens the same holder graph as real circles in a loopback-only HUD window: hover a bubble for the rule behind its colour, click to select (the terminal follows), m for a treemap, z to zoom a cluster. Text-only view model over the local WebSocket; no keys, no network. Browser fallback when the native shell is not built.

source: packages/popup/src/pages/bubbles.{html,js,css}, bubbles-lib.js; popup/test/bubbles-lib-1340.test.ts; cli/test/bubbles-1340.test.ts (TokenPopups with a fake window host)

docs

Voice

3 live · 0 in progress · 1 coming · docs

Jarvis: push-to-talk on v, an instant local command path, Claude for analysis, spoken replies, popups. Proposals only.

featurestatuswhat it doessee
Jarvis voice mode (macOS) LIVE NOW v push-to-talk with an always-visible mic badge; screens, coins, filters, the watchlist, the chart popup and PAPER tickets by voice in under a millisecond after the transcript; analysis questions go to your own claude and the first two sentences are read back. Free and local: say, on-device Apple Speech or whisper.cpp, no paid speech API, nothing recorded.

source: packages/voice; cli/test/voice-1339.test.ts drives the real key loop; latency measured 2026-10-10 (task-1339 handoff)

docs
Clarifies, never guesses LIVE NOW Unknown ticker, copycat ticker (two mints, one symbol), a visible ticker that is also a command word ("buy live"), more than one ticker in a breath ("buy wif and bonk"), a spoken size or slippage ("buy 10 sol of bonk"), homophone, pronoun on an empty list, screen command plus trade in one breath, bare close or exit: each gets a spoken question, not an action. A named ticker always beats “it”.

source: voice/test/router-1339.test.ts, cli/test/voice-1339.test.ts (N1, N4)

docs
Proposals only: never arms, signs or raises caps LIVE NOW The most voice can do is open a PAPER ticket in its editing phase; the keypress gate stands. Spoken confirm, send, sign, go live, arm, raise my cap, panic and /wallet are questions or ignored. A guard rejects any decision carrying a mode, live, arm, caps, confirm, sign or send field; an in-app test traps the executor, both confirm paths, the LIVE flip and the wallet commands: twenty-one hostile utterances, zero touches.

source: voice/src/router.ts isSafe; cli/test/voice-1339.test.ts

docs
Voice on Linux and Windows COMING Not built: voice is macOS-only (speech-out is macOS say, speech-in is Apple Speech or whisper.cpp with macOS mic capture). Off macOS the doctor says voice is off and every voice action has a key. A port would need a local TTS (Piper or Kokoro, or the system speech API), Linux and Windows mic capture for the existing whisper.cpp path, and per-engine platform gates. It would add engines, not powers. No date.

source: packages/voice/src/doctor.ts (platform gate), src/tts/say.ts, src/stt/whisper.ts (sox / ffmpeg avfoundation capture); docs/voice Linux and Windows (task-1359)

docs

Integrations and MCP

12 live · 3 in progress · 1 coming · docs

Yours to run, yours to extend: no accounts, no paid data, no shipped keys.

featurestatuswhat it doessee
Read-only MCP server for any agent LIVE NOW dexterm mcp is a plain stdio server with 21 tools: the same adapters the screens use, the knowledge base, case files, the LARP tools and five navigation actions. No tool can build, sign or send.

source: packages/mcp/src/server.ts

docs
dexterm doctor and a user-level installer LIVE NOW Node, colour, the claude CLI, the RPC key, every data source, the chart window and the data dir, each with the exact fix; the installer needs no sudo and verifies any Node it fetches.

source: task-1305 (merged 07e42e9); install.sh

docs
Free forever: no paid data LIVE NOW Every feature has a keyless path on public APIs; a free key you make yourself only raises limits. Each user has their own quota; there is no server in the middle.

source: app/README.md › FREE-FOREVER (task-1309)

docs
Health registry: never fake data LIVE NOW Every source degrades visibly (unavailable: reason, needs key, rate-limited); a screen with no data says why instead of hanging.

source: packages/data/src/health.ts; ROADMAP hard rules

docs
The cyberspace look, calm mode, themes LIVE NOW Rain that follows the market, two masks so no effect can overdraw a number, a contrast gate in the tests, c for calm, four themes, an idle throttle to ~2% CPU.
screenshotthe dexterm screener in calm mode on sample data: the same table with no rain, glitch or scanlines

source: app/README.md › The cyberspace look; task-1319 idle throttle

docs
Phantom as a signing bridge IN PROGRESS dexterm wallet link (or /wallet link) opens a one-shot loopback page; Phantom connects and signs a message; only your public key is stored. Signing a transaction uses the same page with @solana/web3.js vendored, no CDN. The link was driven end to end against the real Phantom extension on 2026-10-10; the signed devnet probe still awaits a run with faucet SOL.

source: packages/data/src/trade/bridge.ts (merged 8fce789); task-1337 evidence › devnet-probe JSON (link step)

docs
KOL lists LIVE NOW K and dexterm kol manage your own handle lists and hash-locked packs in the local database (a tampered pack is refused). X on the KOL screen (or dexterm kol import-x) imports the lists your X account owns, handles only; o narrows the board and the SOCIAL panel to one handle; m mutes. With a login the lists are polled every 5 minutes and their posts rank the board; without one the tiers still apply to on-chain rows via pack wallets.

source: task-1330 handoff; task-1357 handoff (import via mock X, per-handle filter test); keymap K, X, o; dexterm kol import-x

docs
Login with X LIVE NOW dexterm x set-client-id / login / status / logout: OAuth 2.0 PKCE on a loopback callback with your own X developer app, read scopes only, tokens in ~/.dexterm/x (mode 600) and never printed, logged or sent to a model. Each user brings their own X access, rate limits and bill; the docs explain the Free tier (identity only, no search) versus pay-per-use. No scraping, no posting.

source: task-1357 handoff: full flow against a mock OAuth/API server in the test suite (PKCE, state, 30-s codes, refresh rotation, revoke, 401/429/403/budget); not smoke-tested against x.com (needs a real Client ID)

docs
Bring your own agent LIVE NOW Your own agents (Claude Code, custom bots) through MCP and a local agent bus with per-agent capability tiers (observe, annotate, propose); agents are untrusted and can never arm, sign or raise caps. Per-agent mandates are not built.

source: task-1345 merged (app@8c2906f): dexterm mcp agent packs, loopback agent bus, observe/annotate/propose tiers, roster popup, 41-attempt malicious-agent suite; per-agent mandates remain design only

docs
Workspaces and the morning HUD LIVE NOW Named workspaces in ~/.dexterm/workspaces/<name>.json: the start screen, theme, intensity, screener preset / filter / sort, token panels, per-screen pane trees for the layout solver, and the HUD popups to open together. ctrl+w then w / n / N / s / m / o / d / 1-9, --workspace <name>, dexterm workspace. The built-in morning HUD opens the narrative board, feeds, plans and the chart at once. A switch is a UI action: it navigates, re-themes and opens read-only windows; it never opens a ticket, confirms, arms or signs.

source: app/README.md › Customization; packages/custom/src/{layout,workspace,config}.ts; packages/cli/src/custom.ts; packages/cli/test/workspace-1358.test.ts (task-1358 Tiers 1-1b, app main 51f692d / 0f18138)

docs
Market cap display mode LIVE NOW $ shows market cap instead of the USD price on the screener, watchlist, new pairs, token screen, the terminal chart and the popup chart's Y axis (K/M/B, crosshair with the price in parentheses), and order-plan levels and position rows show both. Market cap = price × the supply the sources report; history is scaled by the current supply and labelled so; a token without a supply falls back to price and says so. Saved as display.priceMode (dexterm display, --price-mode, per workspace). Display only: nothing that trades reads it.

source: packages/cli/src/display.ts; packages/custom/src/schema.ts (config v4, display.priceMode, migration v3→v4); packages/tui/src/fmt.ts fmtMcap; packages/popup/src/pages/chart-lib.js fmtMcapAxis/axisFormatter; packages/cli/test/display-1366.test.ts, packages/custom/test/display-1366.test.ts, packages/tui/test/fmt-mcap-1366.test.ts, packages/popup/test/chart-lib.test.ts (task-1366)

docs
User themes and keymap overrides LIVE NOW ~/.dexterm/themes/<name>.json extends a built-in with hex tokens; a contrast floor and an up/down hue guard refuse a theme that could hide a warning or swap the buy and sell colours (it loads as paper with the reason). config.keymap re-binds actions; ctrl+c, esc, enter, y and the panic key, and the confirm / dismiss / panic / quit actions, are refused by name, collisions and chord clashes refuse the whole keymap. dexterm theme and dexterm keymap.

source: packages/custom/src/{themes,keymap}.ts; packages/cli/test/themes-keymap-1358.test.ts (task-1358 Tier 2, app main f6a825a)

docs
Rules engine: when X then alert, propose, ask LIVE NOW when <cond> [for n ticks] then alert | ticket | ask | popup | tag | sound | watch, with a mandatory cooldown and max per hour, parsed never evaluated as code, derived signals (velocity, delta) over a per-coin history, a live dry-run while you type (ctrl+r) and dexterm rules. Rules alert, annotate your own watchlist, open read-only popups, or PROPOSE: a ticket or ask becomes a proposal card that opens the PAPER ticket editor or asks the analyst on your keypress. Money-shaped arguments (arm, auto, sign, …) are refused at parse time in text and in JSON.

source: packages/custom/src/rules.ts + custom/test/rules.test.ts (compromised-rule suite); packages/cli/src/{rules,rules-cmd}.ts, screens/rules.ts; packages/cli/test/rules-1358.test.ts (task-1358 Tier 3, app main 1727ab0)

docs
Shareable packs with a hash lock and an ssh signature IN PROGRESS A pack is a directory of workspaces, themes, rules, a keymap and popup widgets with a sha256 pack.lock and an optional ssh-keygen -Y signature; trust reviewed > signed > unsigned. dexterm pack verify / add / remove / export / lock / sign / trust / keymap / widget. A pack never runs code: widgets install disabled, rules from an unsigned pack load disabled, the keymap is merged only by an explicit command, and every load re-hashes the installed copy. In progress because install is from a local directory only (no git or zip fetch), export never signs by itself, and the reviewed-pack list ships empty.

source: packages/custom/src/packs.ts + custom/test/packs.test.ts (malicious-pack suite); packages/cli/src/pack-cmd.ts; packages/cli/test/pack-1358.test.ts (task-1358 Tier 4, app main a802324)

docs
Popup widget API (beta) IN PROGRESS A pack widget is an html page the popup host serves as a sandboxed frame inside its own wrapper window: the pack html is served exactly as installed (no nonce, nothing substituted) under a hash-only CSP where every inline script and style block runs by its sha256, with no network of its own, an opaque origin, no way to navigate anywhere (the wrapper's frame-src refuses it and the widget is closed) and a sealed DOM (the SDK locks the insertion methods, every HTML-parsing entry point, adoptNode / importNode, the element-taking setters and WebRTC before any pack script runs and cancels any click on a link that targets another window, so neither a runtime preconnect link nor a scripted click can open a connection; this holds without Trusted Types and was verified inside the real native shell on the system WebKit as well as in headless Chromium and WebKit). Widgets open only in the native popup shell (macOS 14 or newer), whose windows also go through a loopback sink proxy. A page with a remote script, a link, a frame, a meta http-equiv or an @import is refused at install, at open and at ticket issue. A small frozen SDK (dexterm.on(topic, fn), dexterm.theme, dexterm.close()) delivers public view models for the topics the widget declared (rows, token, narrative, positions, alerts, theme) by postMessage; it can send nothing but ready / log / close. Installed disabled; dexterm pack widget <pack> <name> --enable is the consent, re-checked against the pack hash at every open. Beta: one example widget, a popup window only; the in-process plugin sandbox (columns, panels, host-mediated fetch, storage) from the design is not built.

source: packages/popup/WIDGETS.md, src/pages/widget-sdk.js, popup/test/widget-1358.test.ts; packages/cli/src/widgets.ts + cli/test/widget-1358.test.ts; packs/example-widgets (task-1358 Tier 5, app main 0f28c1e)

docs
Public repo, signed releases, published scans COMING A public GitHub repo, releases with build provenance, checksums and an SBOM, third-party scan results on the trust page. License decision pending; no date.

source: ROADMAP.md › pillar 9 (task-1301)

docs

Bring your own agent

5 live · 0 in progress · 0 coming · docs

Connect Claude Code, Codex or a custom bot over MCP or the loopback bus — untrusted by default, your keys never leave.

featurestatuswhat it doessee
Server-side capability tiers LIVE NOW Every agent runs at a tier you grant — observe (reads + streams), annotate (navigation + notes), propose (alerts/order-plan drafts/watch adds you confirm). The tier comes from your registry, never the request; no tier can arm, sign, raise a cap or change the gate.

source: packages/agents/src/tiers.ts, gate.ts (task-1345)

docs
Loopback agent bus + SDKs LIVE NOW A 127.0.0.1 WebSocket/JSON-RPC bus with per-agent tokens: subscribe to new pairs, trades, alerts and screen state, call read/navigation tools, create proposals. TS and Python SDKs, and dexterm agent connect.

source: packages/agents/src/bus.ts, sdk.ts, python/dexterm_agent.py (task-1345)

docs
Agent packs over MCP LIVE NOW The dexterm skills (trench-scan, rug-check, token-dossier) are served as MCP prompts and the knowledge base, cases and skills as MCP resources, so your own agent gets the same playbooks as the built-in analyst.

source: packages/mcp/src/server.ts (prompts/resources), assets/skills (task-1345)

docs
Agent roster: pause, kick, audit LIVE NOW A popup lists every connected agent with tier, last activity, reads/proposals and rate usage, with per-agent pause and kick and the full audit log; agent-created proposals are labelled with the agent that made them.

source: packages/popup/src/pages/roster.*, packages/cli/src/agent-roster.ts (task-1345)

docs
Untrusted by default + red-team suite LIVE NOW Closed schemas, rate limits, quotas, a flood breaker, idempotency keys, a prompt firewall on every untrusted string, and proposals that are never armed. Proven by a 41-attempt malicious-agent suite — every escalation, exfiltration, spoof, flood and UI-injection refused.

source: packages/agents/test/malicious-1345.test.ts, demo/worked-demo.ts (task-1345)

docs

screenshots are the real app on seeded sample data with made-up tickers; the header reads ◌ sample data. the analyst transcript in those shots is demo text: a real run spawns your own claude login, which a screenshot cannot show honestly.