dexterm

docs › Keyboard reference

Keyboard reference

Every key, generated from the app's keymap and the help overlay at build time.

Generated at build time from packages/tui/src/keymap.ts (the keymap) and packages/cli/src/screens/overlay.ts (the ? overlay, which adds the keys the interactive loop handles itself). npm run docs:check fails if this page and the app disagree. Source commit: 87b598f (2026-10-09).

Conventions: keys are case-sensitive (g and G differ). A key listed under a screen overrides the global binding on that screen only (on the token screen 1–6 are timeframes, not screen switches). While the chat input, the filter line, the sort menu or a PAPER ticket has the keys, printable keys type instead of acting, so q or 1 can never quit or navigate out from under a half-typed order.

Global keys#

keylabelwhat it does
q / ^Cquitquit; the terminal is always restored (also on a crash or a signal). · quit
1screenerjump to the screener. · screen.screener
2new pairsjump to the new-pairs stream. · screen.newpairs
3watchlistjump to the watchlist. · screen.watchlist
4analystopen the analyst tab (chat beside a coin list). · screen.analyst
tabscreenscycle screener → new pairs → watchlist → analyst. · screen.next
j / ↓movemove the cursor down one row (on the token screen: scroll a long answer). · move.down
k / ↑movemove the cursor up one row (on the token screen: scroll a long answer). · move.up
g / hometopjump to the first row. · move.top
G / endbottomjump to the last row. · move.bottom
PgDn / ^Fpagepage down (20 rows; on a chat screen: scroll the transcript). · move.pagedown
PgUp / ^Bpagepage up (20 rows; on a chat screen: scroll the transcript). · move.pageup
⏎openopen the highlighted token's detail screen. Opening is free: no analyst run starts. · open
esc / ⌫backgo back to the previous screen. · back
aask claudeask Claude: on a list screen it runs a rug-check on the highlighted coin (or a trench scan with nothing highlighted) and opens the analyst tab; on the token screen it runs the full dossier (or toggles the panel once a conversation exists); on the analyst tab it focuses the input. This is the one explicit, paid run. · analyst.toggle
?helpshow every key for the current screen (the first launch shows the welcome card instead). · help.toggle
tthemecycle the theme: cyberspace → midnight → ember → paper. · theme.next
ppausepause live refreshes (the data stops; the keys still work). · pause.toggle
wwatchwatch or unwatch the highlighted token (persisted in the local SQLite database). · watch.add
balertpropose a liquidity alert for the highlighted token. Proposals do nothing until you arm them. · alert.propose
yconfirm alertarm the oldest proposed alert. Armed rules fire once into the ALERTS log. · alert.confirm
xdismiss alertdismiss the oldest proposed alert. · alert.dismiss
Ppositionsopen the PAPER positions screen (equity, cash, PnL, trade history). · screen.positions
ZAI scanAI scan mode on/off (observe-only; it can never trade). · scan.toggle
Rresume scanafter a lock: release the coin and go back to scanning. · scan.resume
Ttrendingopen TRENDING IN THE SPACE: coins 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 a NEWS column from publishers' RSS. No X API and no X posts in live mode. Works everywhere except the token screen, where T opens Telegram (esc, then T). · screen.trending
KKOL listsopen the KOL lists: your own handle lists and imported packs, kept in the local database. Nothing is followed, posted or logged in to. · social.kol

Per-screen keys#

Screener

keylabelwhat it does
/filteropen the filter line. Type a query in the filter grammar; ⏎ applies, esc cancels. `/scan …` on this line is a command, not a filter. · filter.edit
\clear filterclear the applied filter (the preset's own baked filter stays). · filter.clear
ssortopen the sort menu: j/k pick a key, ⏎ on the current key flips the direction. · sort.menu
] / → / lpresetnext feed preset. · preset.next
[ / ← / hpresetprevious feed preset. · preset.prev
rrefreshrefresh this screen's data now. · refresh

Token screen

keylabelwhat it does
iaskfocus the chat input so the next keystrokes type a question (⏎ does the same). · input.focus
11mchart timeframe 1 minute. · tf.1
25mchart timeframe 5 minutes (derived locally from 1m, no fetch). · tf.2
315mchart timeframe 15 minutes (derived locally from 1m, no fetch). · tf.3
41hchart timeframe 1 hour (the default). · tf.4
54hchart timeframe 4 hours (derived locally from 1h, no fetch). · tf.5
61dchart timeframe 1 day (derived locally from 1h, no fetch). · tf.6
ycopy CAcopy the full contract address to the clipboard (pbcopy / clip / xclip; the address stays on screen if none exists). · copy.ca
rrefreshrefresh this screen's data now. · refresh
Bpaper buyopen a PAPER buy ticket for this token (simulated; nothing goes on-chain). · trade.buy
Spaper sellopen a PAPER sell ticket for this token. · trade.sell
Wopen siteopen the token's advertised website in your browser. The URL is shown first; only http(s) links ever launch. · open.web
Vvet product (Claude)vet the product: run the larp-check skill on this token (reads its website, domain registration and GitHub, read-only, only when you press this). · analyst.larp
Xopen Xopen the token's advertised X account in your browser. · open.x
Topen TGopen the token's advertised Telegram in your browser. · open.tg
Llinkslist every advertised link in a menu (j/k select, ⏎ open, esc close). Links are claims by the token, not verified. · open.links
Cchart popupopen or close the chart popup for this token (native docked window, or your browser as the fallback). · popup.chart
Fflow ⇄ tapeswap the lower-right panel between BUY/SELL FLOW (default) and the raw trade tape. · tape.toggle
ssocialtoken screen: swap ON-CHAIN/HOLDERS for the SOCIAL panel. Live it shows rule-written on-chain rows (labelled holders, tracked wallets, trades ≥ $5K); X and Telegram posts appear only in the --fixtures demo, because no keyless post source is wired. · social.toggle
ffiltercycle the source filter (all · kol · x · chain · news · own) on the trending board or the token SOCIAL panel. · social.filter

New pairs

keylabelwhat it does
rrefreshrefresh this screen's data now. · refresh

Watchlist

keylabelwhat it does
dremoveremove the highlighted watchlist row. · watch.remove
rrefreshrefresh this screen's data now. · refresh

Analyst tab

keylabelwhat it does
iaskfocus the chat input so the next keystrokes type a question (⏎ does the same). · input.focus

PAPER positions

keylabelwhat it does
rrefreshrefresh this screen's data now. · refresh
keylabelwhat it does
ffiltercycle the source filter (all · kol · x · chain · news · own) on the trending board or the token SOCIAL panel. · social.filter
xhidden spamshow or hide rows held back as spam, duplicates or cashtag squats; the hidden count stays in the title either way. · social.spam
nnarrativecycle the narrative filter: only coins linked by shared KOL threads or co-mentions. News never forms a narrative. · social.narrative
ssourcesshow the SOURCES panel: each venue's health, data age and limiter rate. · social.sources
asummary (claude)one analyst turn over the board, run by your own claude: firewalled posts only, injection-like posts withheld (counted, never shown to the model), spam counted not shown. At most once every 5 minutes. · social.summary
rrefreshrefresh this screen's data now. · refresh

KOL lists

keylabelwhat it does
spcenable/disable listenable or disable the selected list for the trending board. · kol.toggle
mmute/unmutemute or unmute the selected handle. · kol.mute
dremove handleremove the selected handle from a manual list (packs are read-only). · kol.remove
iadd handletype a new handle into the selected manual list (⏎ saves, esc cancels). · kol.add

Keys handled by the loop#

These are not keymap bindings; the interactive loop handles them in context. Each row is verified against the source by docs:check.

wherekeyswhat
everywhereccalm mode on/off: rain, glitch, blink and scanlines off; back to the last intensity when pressed again.
everywhere^Cquit, whatever is focused (a half-typed question or an open ticket cannot trap you).
everywhereany keyskips the boot sequence or a blink transition; the key still does its job.
welcome / help cardany key · ?any key closes the card; ? turns the welcome card into the key list. A digit 1–4 on the welcome card also switches to that screen.
chat (token · analyst)⏎focus the input when it is not focused; send the question when it is. Typing `/scan …` here runs a scan command instead of asking Claude.
chat (token · analyst)escclear a non-empty input, else blur it (the number keys and q work again). While an answer is streaming, esc interrupts the analyst from any screen.
chat (token · analyst)⌫ · ^U · ^Wdelete a character · clear the line · delete the last word. The input holds up to 400 characters.
analyst tab, coin-list answer↑ ↓ · ⏎ · o · escwhen an answer lists coins it renders as a table: arrows move the table cursor, ⏎ opens that coin, o opens its PAPER ticket (edit phase only, never confirms), esc returns to the chat.
AI scanescon the locked coin: cancel the analysis but keep the coin (state PAUSED); a second esc navigates. On the screener table while SCANNING: stop the scan.
links menuj k ↑ ↓ · ⏎ · esc qselect a link · open it (the URL is drawn on screen before the browser launches) · close.
PAPER ticket0-9 .type the size (SOL or % of balance when buying; % of the position when selling) or the slippage in bps.
PAPER tickettabswitch between the size and slippage fields.
PAPER ticket← →flip the side (buy ⇄ sell).
PAPER ticketutoggle the buy size unit between SOL and % of balance (a sell is always % of the position).
PAPER ticket⏎review: arm the order (the confirm step). Sizes above 1 SOL must be typed back digit for digit.
PAPER ticket (confirm step)y · ⏎confirm the PAPER fill from a fresh quote. Any other key cancels the arm; a stray key can never confirm.
PAPER ticketesccancel the confirm step, or close the ticket. While a fill is in flight, esc aborts the quote.
filter linetype · ⏎ · escedit the filter query; apply; cancel. Errors show inline with the column that failed.
sort menuj k · ⏎ · escpick a sort key; ⏎ on the current key flips the direction; esc closes.
--fixtures demo onlyn · u · d · xdemo events on seeded fixtures: new pair (glitch) · pump (gold rain) · dump (red rain) · rug flag.

What ? shows#

The in-app help card lists exactly the rows below for each screen (global keys shadowed by a screen-specific binding are attributed to the screen):

KEYS — Screener (35 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
?help
ttheme
ppause
/ filter
\clear filter
ssort
] / → / lpreset
[ / ← / hpreset
rrefresh
wwatch
balert
yconfirm alert
xdismiss alert
Ppositions
ZAI scan
Rresume scan
Ttrending
KKOL lists
ccalm mode (effects off)
?this help
KEYS — Token screen (43 rows)
keyslabel
q / ^Cquit
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
iask
?help
ttheme
ppause
wwatch
balert
xdismiss alert
11m
25m
315m
41h
54h
61d
ycopy CA
rrefresh
Bpaper buy
Spaper sell
Ppositions
Wopen site
Vvet product (Claude)
Xopen X
Topen TG
Llinks
Cchart popup
Fflow ⇄ tape
ZAI scan
Rresume scan
KKOL lists
ssocial
ffilter
ccalm mode (effects off)
?this help
KEYS — New pairs (30 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
?help
ttheme
ppause
wwatch
balert
yconfirm alert
xdismiss alert
rrefresh
Ppositions
ZAI scan
Rresume scan
Ttrending
KKOL lists
ccalm mode (effects off)
?this help
KEYS — Watchlist (31 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
?help
ttheme
ppause
wwatch
dremove
balert
yconfirm alert
xdismiss alert
rrefresh
Ppositions
ZAI scan
Rresume scan
Ttrending
KKOL lists
ccalm mode (effects off)
?this help
KEYS — Analyst tab (31 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
iask
?help
ttheme
ppause
wwatch
balert
yconfirm alert
xdismiss alert
Ppositions
ZAI scan
Rresume scan
Ttrending
KKOL lists
typeask a follow-up · ⏎ send · esc clear/back
ccalm mode (effects off)
?this help
KEYS — PAPER ticket (29 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
?help
ttheme
ppause
wwatch
balert
yconfirm alert
xdismiss alert
Ppositions
ZAI scan
Rresume scan
Ttrending
KKOL lists
ccalm mode (effects off)
?this help
KEYS — PAPER positions (30 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
?help
ttheme
ppause
wwatch
balert
yconfirm alert
xdismiss alert
Ppositions
rrefresh
ZAI scan
Rresume scan
Ttrending
KKOL lists
ccalm mode (effects off)
?this help
KEYS — Trending in the space (33 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
?help
ttheme
ppause
wwatch
balert
yconfirm alert
Ppositions
ZAI scan
Rresume scan
Ttrending
KKOL lists
ffilter
xhidden spam
nnarrative
ssources
asummary (claude)
rrefresh
ccalm mode (effects off)
?this help
KEYS — KOL lists (33 rows)
keyslabel
q / ^Cquit
1screener
2new pairs
3watchlist
4analyst
tabscreens
j / ↓move
k / ↑move
g / hometop
G / endbottom
PgDn / ^Fpage
PgUp / ^Bpage
⏎open
esc / ⌫back
aask claude
?help
ttheme
ppause
wwatch
balert
yconfirm alert
xdismiss alert
Ppositions
ZAI scan
Rresume scan
Ttrending
KKOL lists
spcenable/disable list
mmute/unmute
dremove handle
iadd handle
ccalm mode (effects off)
?this help