docs › CLI flags and commands
CLI flags and commands
Every flag parseArgs accepts, the subcommands, the filter grammar, sort keys and presets.
Generated from packages/cli/src/main.ts (parseArgs, the subcommand dispatch and dexterm --help), scan/command.ts (the --scan-* table), screener/filter.ts, screener/sort.ts and screener/presets.ts at commit c289d90. npm run docs:check fails if a flag here does not exist or an accepted flag is undocumented.
Invocations#
$ dexterm # interactive, live keyless data (needs a TTY)
$ dexterm doctor # pre-flight checks with the exact fix per line
$ dexterm --fixtures # interactive demo on seeded fixtures
$ dexterm --calm # effects off
$ dexterm --scan # live, with AI scan mode on from the start
$ dexterm --screen screener --width 176 --height 48 # one live frame to stdout
$ dexterm --screen token --mint <MINT> --interval 5m # one live token frame
$ dexterm --screen screener --record /tmp/rec.json # live frame, saved for replay
$ dexterm --screen screener --replay /tmp/rec.json # the same frame, no network
$ dexterm mcp # the read-only MCP server on stdio
$ dexterm popup --self-test # chart popup self-test
$ dexterm x login # Login with X (your own X app; read scopes only)
$ dexterm --workspace morning-hud # start in a workspace (task-1358)
$ dexterm pack verify ./some-pack # the install card for a shareable pack
Exit codes: 0 ok · 1 interactive mode without a TTY, or a doctor failure · 2 bad arguments (the message names the flag).
Subcommands#
| command | what | flags |
|---|
dexterm workspace | list, show, remove or initialize local workspace files; no network. | — |
dexterm theme | list, show, initialize or check user themes; custom themes extend built-ins with contrast and hue checks. | — |
dexterm display | show or set the saved price display mode (display.priceMode: price or mcap) in ~/.dexterm/config.json; journaled, no network. | — |
dexterm keymap | show effective keys for an optional screen, including configuration overrides. | — |
dexterm rules | list, add, remove, enable, disable, check or dry-run rules; fields lists supported inputs. Rules are parsed, never evaluated as code; they can alert or propose, never arm or sign. | — |
dexterm pack | shareable packs: list installed packs, verify a directory (the install card), add (unsigned needs --accept-unsigned), remove, export your own workspaces / themes / rules / keymap to a new pack with a sha256 lock, lock, sign with ssh-keygen -Y, trust (pin a publisher key), signers, keymap (show a pack keymap; --merge applies it, reserved keys refused), widget (--enable / --disable a pack widget page). No network; a pack never runs code. | — |
dexterm doctor | pre-flight: Node, terminal colour, the claude CLI, the RPC key, every data source, the chart window, the data directory. Exit 0 when dexterm will run (warnings are optional), 1 when something must be fixed; every non-pass line prints the exact fix. | --offline skip the network probes
--no-color plain output |
dexterm narrative | the narrative board over recorded history (deterministic, no network, no model): what is running and what is working across the tokens dexterm has recorded. `--summary` prints the deterministic 90-second spoken summary instead of the table. | --window 1h|24h which window the "what is working" score uses (default 1h)
--summary print the deterministic 90-second spoken summary (keyless, no model)
--db PATH the database (default DEXTERM_DB_PATH, else ~/.local/share/dexterm/dexterm.db) |
dexterm backtest | honest rug-model metrics over recorded outcomes (no network, no model): scores a subject against the recorder's outcome-labelled snapshots and prints precision/recall, Brier vs a base-rate Brier, AUC, calibration, a per-feed breakdown and the worst misses/false alarms. With no labelled outcomes it says so and prints no metrics. | --subject heuristic|pack_verdicts|larp the pre-registered H1 rug model (default), recorded pack verdicts, or larp: recorded LARP-detector verdicts vs the outcome labels (counts only below 50 matched verdicts; agreement with a bad outcome, not ground truth)
--horizon SEC outcome horizon in seconds (default 3600 = 1h)
--db PATH the database (default DEXTERM_DB_PATH, else ~/.local/share/dexterm/dexterm.db)
--json print the full result object instead of the human table |
dexterm mcp | run the read-only MCP server on stdio (what the analyst uses; add it to any Claude Code with `claude mcp add dexterm -- dexterm mcp`). | — |
dexterm popup | `dexterm popup --self-test`: open a chart popup on fixture data and report the shell choice, whether the global hotkey registered and the measured frame rate. It never claims a frame rate it did not measure. | --self-test the only subcommand
--browser force the browser fallback
--seconds N how long to measure
--theme NAME theme for the popup |
dexterm recorder | the history recorder's local tables: stats (rows, labels, bytes, DB size), label (label due outcomes now, code rules, no model), prune (run retention now), export (one record per hourly t0 anchor: the row as it was seen plus its later outcomes, for evals and backtests). No network; reads and writes the local DB only. dexterm recorder help prints the usage. | --db PATH the database (default DEXTERM_DB_PATH, else ~/.local/share/dexterm/dexterm.db)
--out FILE export: write to a file instead of stdout
--since T · --until T export: time window (ISO date or unix ms)
--labelled-only export: only anchors that have an outcome
--limit N export: cap the number of records |
dexterm wallet | the non-custodial wallet link and the live-trading kill switch, from a shell. `link` opens a one-shot loopback page where Phantom connects and signs a message; only the public key is kept (~/.dexterm/wallet-link.json). `status` shows the link, the caps and the panic state; `unlink` forgets the key. `panic` disables live signing at once (a kill-switch file every signer re-reads plus a lock on the shared cap ledger) and needs no terminal; `resume` is the only way back and needs a real keypress on a TTY (piped input is refused). `probe` runs the devnet plumbing test: a wrap-and-unwrap transaction dexterm builds itself (fees only, never on mainnet) through the whole signer path, your keypress and Phantom. `fast status | create | airdrop | remove` (task-1363) is the capped DEVNET fast wallet armed order plans fire from: `create` needs a real TTY keypress, never overwrites and writes mode 600; `airdrop` asks the devnet faucet; `remove` refuses while it still holds SOL unless --force; --mainnet is refused. | --mainnet · --max-usd N · --daily-usd N · --max-sol-out N · --max-slippage-bps N the same caps flags as the app, for `status` (what the signer would apply) and `probe` (which refuses --mainnet)
--reason TEXT panic: why (recorded in the kill-switch file)
fast status | create | airdrop [--sol N] | remove [--force] the devnet fast wallet (public key and balance only; the seed is never printed) |
dexterm kol | manage KOL lists in the local DB: list, create <name>, add|remove <list> @handle, mute|unmute @handle, enable|disable <list>, import <dir>, import-x. A pack is a hash-locked directory (pack.json + pack.lock, optional pack.lock.sig checked against ~/.dexterm/allowed_signers); a tampered or unlocked pack is refused, never imported as unsigned. No network except `import-x`, which (after `dexterm x login`) imports the lists your X account owns as `own-x-list` lists: handles only, never posts. | --db PATH the database (default ~/.local/share/dexterm/dexterm.db) |
dexterm agent | bring-your-own-agent registry + loopback bus (task-1345): register an agent and mint a one-time token (add/rotate/remove/list/tier/pause/resume), run a standalone loopback agent bus (serve, on fixtures or keyless live reads, optional roster popup), connect a test agent (connect), and read the audit log, proposals and agent packs (audit/proposals/packs). Every agent has a server-side capability tier (observe / annotate / propose); no agent path can arm, sign, confirm, raise a cap, change the gate or touch a wallet, a mandate or the signer. Tokens are read only from $DEXTERM_AGENT_TOKEN, never a flag. | --tier observe|annotate|propose the capability tier at `agent add`
--note T · --reads N · --proposals N · --connections N per-agent note and rate/quota/connection limits at `agent add`
--fixtures | --live `agent serve` data source (deterministic fixtures, the default, or keyless live reads)
--roster `agent serve` also opens the agent roster popup (pause / kick / audit)
--port N · --db PATH `agent serve` bind port and shared database
--name NAME · --url ws://127.0.0.1:PORT · --watch SECONDS `agent connect` (token via $DEXTERM_AGENT_TOKEN)
--agent NAME · --status S · --limit N filters for `agent audit` / `agent proposals` |
dexterm plan | typed order plans (task-1355): propose a plan (entry / take-profit / stop triggers on market cap), list it, arm it against a mandate, cancel it, or read and verify the hash-chained journal. Proposing never arms; `arm` reads one physical keystroke on a TTY and refuses a pipe, a subprocess, voice or an agent. Paper by default. | propose --mint M --symbol S --size USD --entry TRIGGER propose a plan (also --tp, repeatable, --stop, --decimals, --supply, --slippage)
list [--json] list plans
arm <planId> --mandate <id> arm a plan under a mandate (physical keypress on a TTY only)
cancel <planId> cancel a plan
journal [--verify] [--export] the hash-chained plans journal (~/.dexterm/plans.journal)
amend <planId> [--size USD] [--entry TRIGGER] [--tp EXIT]… [--stop TRIGGER|none] [--slippage BPS] edit a PROPOSED plan: a new plan with a new hash supersedes the old one (every earlier confirmation is void); never arms |
dexterm mandate | standing mandates (task-1355): draft the caps a set of plans may use (total, per trade, per coin, daily loss, the highest confirmation tier, a time-to-live), list them, arm one (physical keypress only) or revoke it. The signer-side caps still apply on top. | draft [--total USD] [--per-trade USD] [--per-coin USD] [--daily-loss USD] [--max-tier keypress|ptt-held|hands-free] [--ttl-hours N] draft a mandate
list [--json] list mandates
arm <id> arm a mandate (physical keypress on a TTY only)
revoke <id> revoke a mandate |
dexterm follow | copy trading, stages 1 and 3 from a shell (task-1360): `add` follows a wallet with an optional label of your own (firewalled, local, never inferred or exported), `remove` / `list` / `purge --yes` manage the list (~/.dexterm/follows.json, mode 600), `stats` and `trades` fetch one page of the wallet's history (free Helius key; 10 credits) and print its decoded swaps, FIFO realised PnL with the rate used, win rate (hidden under n = 10) and the sample caption. `auto <addr> …` drafts the auto-mirror caps, clamped down to the ceilings ($100/trade, $500/day, 10 open, 10 s cooldown, k ≤ 2); auto is always OFF in a fresh process and is enabled only in the app by a keypress (U then A) after the less-safe popup. `auto` alone lists the policies; `--off` turns one off. Nothing here trades, proposes or signs. | add <addr> [--name LABEL] follow a wallet (your own label, firewalled, ≤ 24 chars)
remove <addr> unfollow
list [--json] the follow list
stats <addr> [--json] one history fetch: trades, FIFO realised PnL, win rate (n), early-entry note, per-mint rows
trades <addr> [--limit N] the decoded swaps behind the stats
purge --yes delete every follow and label
auto <addr> [--per-trade USD] [--daily USD] [--max-open N] [--cooldown SEC] [--k X] [--disarm N] [--off] draft (or turn off) the auto-mirror caps for a followed wallet; no addr lists the policies |
dexterm x | Login with X (OAuth 2.0 PKCE on the fixed loopback callback http://127.0.0.1:41287/callback) with YOUR OWN X developer app: `set-client-id` stores the app's Client ID (prompted on the terminal or one line on stdin, never on the command line), `login` opens your browser and stores the tokens in ~/.dexterm/x/tokens.json (mode 600; read scopes only: tweet.read users.read list.read offline.access), `status` shows the handle, scopes, token age and file modes (never a token), `logout` revokes both tokens at X and deletes the record. dexterm never posts and never scrapes; see docs › Login with X for the free vs paid tiers. | --stdin set-client-id: read the Client ID as one line from stdin instead of prompting (scripts) |
dexterm kb | list, show, create, edit, check and reset the bundled knowledge-base entries the analyst, Jarvis and the MCP server read. Your own files live in ~/.dexterm/kb/entries/ (same id as a bundled entry overrides it, a new id adds one) and take effect on the next call with no restart. KB text explains mechanics and patterns only; it never holds facts about a live token. | — |
dexterm skill | list, show, create, edit, check and reset the analyst's skills (read-only guidance). Your own files live in ~/.dexterm/skills/ (same name as a bundled skill overrides it, a new name adds one). A skill may name only read tools; `dexterm skill check` refuses any skill that names a trade, sign, arm or ticket tool. | — |
Flags#
data and modes
| flag | what |
|---|
--fixtures | seeded demo data instead of the network (interactive or one-shot). The demo event keys n/u/d/x work here. |
--replay FILE | serve a recording made with --record: no network, same frames. A recording also carries the PumpPortal session. |
--record FILE | save every live response (and the PumpPortal session) to FILE for --replay. Keys are redacted at capture; a file that still carries one refuses to save. |
--max-requests N | hard cap on live requests for this run (default none). Used by the smoke scripts. |
--max-credits N | hard cap on Helius credits for this run (default 5000). At the cap Helius switches off for the run and the keyless sources take over. |
--db PATH | SQLite path for the cache, watchlist, credit meter and paper wallet (default `~/.local/share/dexterm/dexterm.db`; `:memory:` for a throwaway session). |
--no-recorder | do not run the history recorder this run (also DEXTERM_RECORDER=0). It is on by default in live mode and writes token snapshots, feed membership and outcome labels into the local --db file only; nothing is uploaded. Never on with --fixtures, --replay or --db :memory:. See configuration › history recorder. |
--verbose | log every live request to stderr (source, status, latency, redacted URL) plus the rpc provider and db path. |
screener
| flag | what |
|---|
--filter QUERY | screener filter in the filter grammar, e.g. `vol24 > 250K liq > 50K age < 30d launchpad:pump`. A bad query fails at startup with the column. |
--sort KEY[:asc|desc] | screener sort key (see the sort keys table). |
--preset NAME | screener feed preset (see the presets table). A gated preset fails with its reason. |
one-shot frames
| flag | what |
|---|
--screen NAME | render one frame of a screen to stdout and exit (live unless --fixtures/--replay). Screens: screener · token · newpairs · watchlist · analyst · boot · ticket · positions · trending · kol. |
--mint MINT | open this token on the token screen (base58 address). Live or replay only. |
--interval IV | candle interval for the token screen: 1m · 5m · 15m · 1h · 4h · 1d (default 1h). |
--listen SECONDS | one-shot new pairs: how long to listen to PumpPortal before rendering (default 20, max 120). |
--width N | frame width for one-shot renders (default: the terminal, else 160). |
--height N | frame height for one-shot renders (default: the terminal, else 45). |
--selected N | highlighted row or token index for one-shot renders. |
--seed N | fixture PRNG seed (default 7). |
--no-ai | hide the analyst panel on the token screen. |
--frame N | effect frame index for one-shot renders (the same frame renders byte-identical output). |
--event KIND | one-shot demo event on fixtures: newpair · pump · dump · rug. |
--ai PHASE | analyst panel state for one-shot renders: thinking · streaming:N (characters revealed). |
--mood M | force the rain mood: pump · dump · neutral. |
--activity A | force the rain activity 0..1. |
--t 0..1 | boot progress for `--screen boot`. |
the look
| flag | what |
|---|
--theme NAME | cyberspace (default) · midnight · ember · paper. `t` cycles at runtime. |
--workspace NAME | start in default, morning-hud, or a user workspace under ~/.dexterm/workspaces/. |
--price-mode MODE | price | mcap: show the USD price or the market cap (price × supply) on the tables, the token screen and both charts for this run; overrides config.json display.priceMode without saving it. `$` toggles and saves it. |
--calm | effects off: no rain, glitch, blink or scanlines (same as --intensity off; DEXTERM_CALM=1 too; NO_COLOR implies it). |
--intensity LEVEL | off · normal · fever. fever (default): rain, trails, glitch, blink, scanlines at 30 fps; normal: 15 fps, sparser rain, no idle aberration. |
--fps N | frame cap 1..60 (default 30 fever / 15 normal). Data still refreshes at 2 Hz; after 5 s without a key the ambient rain drops to 8 fps. |
--no-boot | skip the boot sequence (first launch is the full glitch boot, later launches one second). |
--ascii-rain | hex-only rain glyphs instead of half-width katakana (automatic when LANG is not UTF-8). |
--tz ZONE | header clock zone (default America/New_York; `local` = the machine zone). Replays pin the recording's zone. |
--no-images | no coin images this run (also DEXTERM_IMAGES=0, or {"enabled": false} in ~/.dexterm/images.json). With images on, real pixels in kitty / Ghostty / WezTerm / Konsole / iTerm2 / sixel terminals and half-block art everywhere else, Apple Terminal.app included. |
--sound | trade-moment sound cues: a buy chirp, a sell sweep then a profit chime or a loss thud, an error buzz on a refusal or failure. Muted by default (also DEXTERM_SOUND=1). Cues follow the SAME settled outcome the effects do, never a quote or an in-flight send; the WAVs are synthesized once into ~/.dexterm/sounds and played detached (afplay on macOS), so the render loop never waits. |
AI scan mode
| flag | what |
|---|
--scan | start AI scan mode with the run (the same path as the Z key). Live or replay only; incompatible with --screen. |
--scan-min-score N | lock when a coin scores at least N (default 45). |
--scan-min-triggers N | and at least N triggers fired (default 2). |
--scan-min-liq USD | ignore coins below this liquidity (default 10000). |
--scan-vol-x N | volume trigger: 5m volume at least N× the coin's own pace (default 3). |
--scan-flow-share 0..1 | flow trigger: 5m buy share at or above this (default 0.62). |
--scan-breakout-pct PCT | breakout trigger: last close above the prior 20 cached candles' high by this % (default 2). |
--scan-liq-jump-pct PCT | liquidity trigger: +% vs the coin's own 10-minute minimum (default 20). |
--scan-holders-jump-pct PCT | holders trigger: +% vs the oldest 10-minute sample (default 5, and at least +25 holders). |
--scan-warmup-s S | seconds of watching before the first lock is possible (default 30). |
--scan-max-ai-per-hour N | analyst turns the scan may start per rolling hour (default 8). |
--scan-max-ai-per-coin N | analyst turns per coin per hour (default 4). |
--scan-refresh-s S | minimum seconds between reads of the locked coin (default 90; a read also needs the data to have moved). |
--scan-move-pct PCT | price move that counts as "moved" for a refresh (default 3). |
--scan-cooldown-s S | how long a released coin is barred from locking again (default 900). |
--scan-post-lock-s S | no new lock for this long after a lock ends (default 60). |
live trading (signer process)
| flag | what |
|---|
--mainnet | allow MAINNET swaps (real funds) within the caps, and let --max-usd / --daily-usd / --max-sol-out / --max-slippage-bps go above their defaults (never above the hard ceilings). Without it the signer process talks to devnet, refuses any mainnet plan and clamps every cap to its default or lower. The banner turns red. These flags are forwarded once to the signer process, which validates them itself; nothing on its channel can change them later. |
--max-usd N | per-trade USD cap, priced by the signer from its own two-source SOL/USD feed (default $5; above $5 needs --mainnet; hard ceiling $500). An over-ceiling value is refused at startup. |
--daily-usd N | daily USD cap across every mainnet trade on this machine, kept in a shared SQLite ledger that survives a restart (default $20; above $20 needs --mainnet; hard ceiling $2000). |
--max-sol-out N | SOL that may leave the wallet in one transaction per the simulation, any network (default 1; above 1 needs --mainnet; ceiling 5). |
--max-slippage-bps N | slippage ceiling a plan may carry (default 500; above 500 needs --mainnet; ceiling 1000). |
--trade-rpc URL | the signer process's RPC endpoint (default api.devnet.solana.com). The network the signer reports and caps by is classified from this URL by exact hostname, never from a label; without --mainnet anything but a known devnet host is refused at startup. |
--no-live | paper only: never start the signer process; L on a ticket does nothing. Replay and offline runs are paper-only regardless. |
output
| flag | what |
|---|
--plain | monochrome text output (the snapshot-test surface). |
--ansi | ANSI output even when stdout is not a TTY (24-bit unless --color or NO_COLOR). |
--html FILE | write the frame as a standalone HTML page (screenshots); always rendered in truecolor. |
--fit WxH | with --html: fixed page size, centred, no window chrome (video frames). |
--font PX | with --html: font size in pixels. |
--color DEPTH | truecolor · 256 · none (default: detected from NO_COLOR, FORCE_COLOR, COLORTERM, TERM). |
--title TEXT | page title for --html. |
--help | print the built-in help (reproduced below) and exit. |
-h | same as --help. |
--version | print the version and exit. |
Exclusive combinations parseArgs rejects: --fixtures with --replay; --record with either; --mint or --event without the data they need (--mint needs live or replay data, --event needs --fixtures); --scan with --fixtures or with --screen.
Filter grammar#
Used by --filter, the / line, and the analyst's show_in_screener tool. Space-separated clauses are ANDed. A clause is field op value, a tag, or a bare word (symbol or name substring).
- Operators:
> >= < <= = == !=. - Money takes
K / M / B (5M, 100K). Percents are plain or %. Ages need a unit: s m h d w mo (6h, 30m). - Tags:
launchpad: (alias lp:) one of pump dbc raydium meteora bonk · flag: one of mint freeze top10 dev bundle lp clean · verified:yes|no · sus:yes|no · chain:solana. Negate with a leading ! (!flag:mint).
| field | type | meaning |
|---|
vol24 | usd | volume 24h |
vol6h | usd | volume 6h |
vol1h | usd | volume 1h |
vol5m | usd | volume 5m |
liq | usd | liquidity |
mcap | usd | market cap |
fdv | usd | FDV |
price | price | price |
age | age | age |
holders | num | holders |
buys | num | buys 24h |
sells | num | sells 24h |
org | num | organic score |
top10 | pct | top-10 share |
dev | pct | dev share |
lplocked | pct | LP locked |
bundled | pct | bundled |
snipers | num | snipers |
m5 | pct | change 5m |
h1 | pct | change 1h |
h6 | pct | change 6h |
h24 | pct | change 24h |
Aliases: vol → vol24, volume → vol24, v24 → vol24, v6h → vol6h, v1h → vol1h, v5m → vol5m, liquidity → liq, lp → liq, marketcap → mcap, cap → mcap, mc → mcap, holder → holders, h → holders, organic → org, score → org, top → top10, top-10 → top10, devpct → dev, locked → lplocked, lplock → lplocked, bundle → bundled, sniper → snipers, chg5m → m5, 5m → m5, chg1h → h1, 1h → h1, chg6h → h6, 6h → h6, chg24 → h24, chg24h → h24, 24h → h24, change → h24
Example: vol24 > 250K liq > 50K age < 30d org >= 60 launchpad:pump !flag:mint cat.
Sort keys#
| key | sorts by | default |
|---|
vol | vol 24h | desc |
liq | liquidity | desc |
mcap | mcap | desc |
price | price | desc |
age | age | asc |
m5 | 5m change | desc |
h1 | 1h change | desc |
h6 | 6h change | desc |
h24 | 24h change | desc |
holders | holders | desc |
org | organic score | desc |
top10 | top-10 share | asc |
rug | p(rug) H1-v0.1 heuristic | asc |
Presets#
| preset | label | notes |
|---|
trench | Trench | folds the live new-pairs stream into the pool |
trending | Trending | |
runners | Runners | |
organic | Organic | |
graduating | Graduating | folds the live new-pairs stream into the pool; gated: unavailable until its source exists (the app says why) |
smart | Smart money | gated: unavailable until its source exists (the app says why) |
traded | Top traded | |
new | New | folds the live new-pairs stream into the pool |
boosted | Boosted | |
all | All | folds the live new-pairs stream into the pool |
dexterm --help#
The built-in help, verbatim from the app at c289d90:
dexterm 0.1.0 (live: screener, token, new pairs, watchlist · analyst = your local claude CLI · cyberspace look)
dexterm interactive, live data (needs a TTY)
dexterm doctor check this machine is ready (Node, colour, claude, network, Helius key)
dexterm recorder stats|label|prune|export the history recorder's tables (no network; 'dexterm recorder help')
dexterm kb list|show|new|edit|check|reset|path your knowledge-base entries (~/.dexterm/kb/entries) over the bundled 17
dexterm skill list|show|new|edit|check|reset|path your analyst skills (~/.dexterm/skills) over the bundled ones (read tools only)
dexterm narrative [--window 1h|24h] [--summary] the narrative board over recorded history (no network, no model)
dexterm backtest [--subject heuristic|pack_verdicts] [--horizon SEC] honest rug-model metrics over recorded outcomes (no network, no model)
dexterm wallet link|unlink|status|panic|resume link a Phantom wallet via a local bridge (pubkey only); panic disables live trading, resume needs a TTY keypress
dexterm plan propose|list|arm|cancel|journal conditional order plans (entry/ladder/take-profit/moon bag/stop); arming needs a physical keypress
dexterm mandate draft|list|arm|revoke standing capped mandates (fast wallet); arming needs a physical keypress — voice/agents can never arm
dexterm follow add|remove|list|stats|trades|purge copy trading tier 1: follow a wallet (your list, local labels), its decoded swaps + FIFO PnL; alerts in the app
dexterm --fixtures interactive demo on seeded fixtures
dexterm --screen <name> one-shot frame to stdout (live)
dexterm --screen <name> --fixtures one-shot frame from fixtures
dexterm --screen <name> --replay FILE one-shot frame from a recording (no network)
dexterm --screen token --mint MINT one-shot live token detail
dexterm --screen newpairs --listen 30 listen to PumpPortal for 30 s, then render
screens: screener | token | newpairs | watchlist | analyst | boot | ticket | positions | trending | kol | bubbles | narrative | plans | follows | rules
--filter QUERY screener filter, e.g. "vol24 > 250K liq > 50K age < 30d launchpad:pump"
--sort KEY[:asc|desc] vol | liq | mcap | price | age | m5 | h1 | h6 | h24 | holders | org | top10 | rug
--preset NAME trench | trending | runners | organic | graduating | smart | traded | new | boosted | all
--record FILE save every live response (and the PumpPortal session) to FILE (replay it with --replay)
--max-requests N hard cap on live requests for this run (default: none)
--max-credits N hard cap on Helius credits for this run (default: 5000)
--mint MINT token to open on the token screen
--interval IV candle interval for the token screen: 1m | 5m | 15m | 1h | 4h | 1d (default 1h)
--listen SECONDS one-shot new pairs: how long to listen to PumpPortal (default 20)
--db PATH SQLite path for cache, watchlist, credit meter and history (default: ~/.local/share/dexterm/dexterm.db; ':memory:' for none)
--no-recorder do not record history this run (the recorder keeps token snapshots, feed membership and
outcome labels in the --db file for the rug model / backtests; DEXTERM_RECORDER=0 too)
--verbose log every live request to stderr
--width N --height N frame size (default: terminal size, else 160×45)
--theme NAME cyberspace | midnight | ember | paper or a user theme (default cyberspace; t cycles built-ins then user themes)
--selected N highlighted row / token index
--seed N fixture PRNG seed (default 7)
--no-ai hide the analyst panel on the token screen
--intensity LEVEL off | normal | fever (default fever: rain, trails, glitch, blink, scanlines at 30 fps;
normal: 15 fps, sparser rain, no idle aberration; off = calm: neon theme, no motion)
--calm same as --intensity off (DEXTERM_CALM=1 too; NO_COLOR implies it)
--fps N frame cap 1..60 (default 30 fever / 15 normal); data still refreshes at 2 Hz
--no-boot skip the boot sequence (first launch is the full glitch boot, later ones 1 s)
--frame N effect frame index for one-shot renders (same frame = byte-identical output)
--event KIND one-shot demo event: newpair | pump | dump | rug (fixtures)
--ai PHASE analyst state for one-shot renders: thinking | streaming:N (chars revealed)
--mood M --activity A force the rain: mood pump | dump | neutral, activity 0..1
--t 0..1 boot progress for --screen boot
--ascii-rain hex-only rain glyphs (no half-width katakana; automatic when LANG is not UTF-8)
--no-images no coin images (also DEXTERM_IMAGES=0, or {"enabled": false} in ~/.dexterm/images.json);
real pixels in kitty / Ghostty / WezTerm / iTerm2 / sixel terminals, block art elsewhere
--sound trade-moment sound cues (buy chirp, profit chime, loss thud, error buzz) after a CONFIRMED
result only; muted by default (also DEXTERM_SOUND=1); ~/.dexterm/sounds holds the WAVs
--workspace NAME start in a workspace: default | morning-hud | a file in ~/.dexterm/workspaces/ (task-1358);
in the app ctrl+w then w (list) · n/N (next/prev) · s (save as) · m (morning HUD) · o (popups) · d · 1-9
--price-mode MODE price | mcap: show USD price or MARKET CAP (price × supply) on the tables, token screen and both
charts for this run (default: config.json display.priceMode; $ in the app toggles and saves it)
dexterm workspace list|show|remove|init the workspace files (no network)
dexterm theme list|show|init|check user themes in ~/.dexterm/themes (extends a built-in; contrast + hue guarded)
dexterm keymap [screen] the effective keys (defaults + config.keymap overrides, marked ·)
dexterm display [price|mcap] show or set the price display mode (market cap = price × supply)
dexterm rules list|add|remove|enable|disable|check|dry-run|fields
"when <cond> [for n ticks] then alert|ticket|ask|popup|tag|sound|watch" rules in config.json (task-1358);
parsed never eval'd; mandatory cooldown + max/h; rules only alert or PROPOSE (ctrl+r in the app)
dexterm pack list|verify|add|remove|export|lock|sign|trust|signers|keymap|widget
shareable packs (task-1358): workspaces + themes + rules + a keymap + popup widgets as plain files
with a sha256 pack.lock and an optional ssh-keygen signature; trust reviewed > signed > unsigned.
a pack never runs code: widgets install DISABLED (pack widget … --enable after reading the page),
unsigned rules load disabled, the keymap merges only with "pack keymap <name> --merge"
AI SCAN MODE (off by default; observe + analyze only — it can never open a ticket, sign or trade):
--scan start AI SCAN MODE on launch (also: Z key, or /scan on|off|resume in the / line or chat)
--scan-min-score N lock when a coin scores ≥ N (default 45) with ≥ --scan-min-triggers (default 2) triggers
--scan-vol-x N volume-spike trigger: 5m volume ≥ N× the coin's own pace (default 3)
--scan-max-ai-per-hour N analyst turns the scan may start per hour (default 8; per coin --scan-max-ai-per-coin 4)
--scan-refresh-s N min seconds between reads of the locked coin (default 90; only when data moved)
more: --scan-min-liq --scan-flow-share --scan-breakout-pct --scan-liq-jump-pct --scan-holders-jump-pct
--scan-warmup-s --scan-move-pct --scan-cooldown-s --scan-post-lock-s
LIVE TRADING (task-1328; devnet by default; a separate signer process holds the caps and signs via Phantom):
--mainnet allow MAINNET swaps (real funds) within the caps; without it the signer refuses mainnet
--max-usd N per-trade USD cap (default $5; raising it needs --mainnet; hard ceiling $500)
--daily-usd N daily USD cap (default $20; raising it needs --mainnet; hard ceiling $2000)
--max-sol-out N SOL that may leave the wallet in one tx (default 1, ceiling 5)
--max-slippage-bps N slippage ceiling (default 500, ceiling 1000)
--trade-rpc URL the signer's RPC (default devnet; must be devnet unless --mainnet)
--no-live paper only: never start the signer process
/wallet [status] linked wallet (pubkey only), the signer's network + caps, panic state
/wallet link open the browser to link a Phantom wallet (sign-a-message proof; no transaction)
/wallet unlink forget the linked public key
/wallet panic disable live signing at once (kill-switch file + cap-ledger lock); resume needs `dexterm wallet resume`
/wallet probe devnet plumbing test: a wrap-and-unwrap transaction you sign in Phantom (fees only)
dexterm wallet fast … the capped DEVNET fast wallet armed order plans fire from: create (TTY keypress) · status · airdrop · remove
LOGIN WITH X (task-1357; your own X app, your limits, your bill; read scopes only, no scraping, dexterm never posts):
dexterm x status Login with X: client id stored? logged in as @handle? scopes, expiry, file modes
dexterm x set-client-id store YOUR X app's Client ID (prompted on the terminal, or one line on stdin with --stdin)
dexterm x login OAuth2 PKCE in your browser → tokens in ~/.dexterm/x/tokens.json (0600); read scopes only
dexterm x logout revoke both tokens at X and delete the local record
--plain monochrome text (snapshot surface)
--ansi ANSI output even when stdout is not a TTY (24-bit unless --color / NO_COLOR)
--html FILE write a standalone HTML page (for screenshots); --fit WxH --font PX for video frames
--color DEPTH truecolor | 256 | none (default: detected; NO_COLOR honoured)
--tz ZONE header clock zone (default America/New_York, the prototype's; 'local' = machine zone)
--title TEXT HTML page title
-h, --help this text
--version print the version
Keys: 1-4 screens · tab cycle · j/k move · ⏎ open · esc back · a analyst · v voice · t theme · c calm · p pause · q quit
voice (JARVIS, macOS): v push-to-talk (press to talk, press to send) · m mute · , change voice · esc stop speaking
voice asks the analyst or triggers safe actions (open/filter/watch/open a PAPER ticket);
a spoken "buy"/"sell" only OPENS a ticket — you still confirm it with a keypress
screener: / filter · s sort · [ ] presets · r refresh · g/G top/bottom
social (task-1330): T trending in the space · K KOL lists · token screen: s social panel · f filter · x hidden spam
dexterm kol list | create <name> | add <list> @handle | remove <list> @handle | mute @handle | unmute @handle | enable <list> | disable <list> | import <dir> | import-x
Login with X (task-1357): dexterm x login · then the SOCIAL panel + TRENDING read X with your own limits · KOL screen: X imports your X lists · o = only this handle
token: B/S buy/sell ticket (PAPER; L on the ticket flips LIVE when a wallet is linked) · P positions · w watch
token: M bubble map (holder graph: clusters by funder / same-slot buys / transfers; colour = rule) · bubble map: M popup · m treemap · z zoom · D deep scan
demo events on --fixtures: n new pair (glitch) · u pump (gold rain) · d dump (red rain) · x rug flag
AI scan: Z on/off · R resume scanning after a lock · esc (on the locked coin) cancel the analysis
any key skips the boot sequence or a blink transition
State: ~/.dexterm/state.json remembers launches (DEXTERM_HOME overrides the directory).
DEXTERM_OFFLINE=1 refuses live data (tests and CI). Trading is PAPER by default — a simulated wallet
priced from live Jupiter quotes. LIVE (L on a ticket, /wallet link first): a separate signer process
quotes, builds, decodes, simulates and enforces the caps; Phantom signs in your browser; dexterm never
holds a key. The analyst, voice and scan mode can never open, confirm or sign a live trade.
RPC: DEXTERM_RPC_URL, else ~/.dexterm/helius.key (Helius, metered with a credit meter), else the public RPC.
/scan commands#
Typed on the screener's / line or in the chat input; the leading slash is optional on the / line. /scan (toggle) · /scan on (on) · /scan start (on) · /scan off (off) · /scan stop (off) · /scan resume (resume) · /scan next (resume) · /scan status (status)