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.
- 61live now
- 14in progress
- 2coming
- 0keys handled, ever
- 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
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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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.screenshot![]() 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.screenshot![]() 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 |
| Trending in the space | LIVE NOW | T opens a board ranked from keyless public lists (Jupiter trending and organic score, GeckoTerminal trending pools, CoinGecko trending for macro; DexScreener paid boosts count against a coin), with narratives and a NEWS column from publishers' official RSS. After dexterm x login, posts from your KOL lists and the open coin add social velocity; without it velocity falls back to volume and the band says x-stream ○ logged out.source: task-1330 handoff (live smoke: 118 board rows from 5 keyless venues + 4 RSS feeds); task-1357 (X states on the band, mock-server tests); keymap T |
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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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 |
| Open advertised links | LIVE NOW | W / X / T open the site, X and Telegram the token advertises; L lists them all. The URL shows first and only http(s) ever launches. source: task-1315 handoff; keymap W/X/T/L |
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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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.screenshot![]() 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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.screenshot![]() 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.
| feature | status | what it does | see |
|---|---|---|---|
| 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.










