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#
| key | label | what it does |
|---|---|---|
| q / ^C | quit | quit; the terminal is always restored (also on a crash or a signal). · quit |
| 1 | screener | jump to the screener. · screen.screener |
| 2 | new pairs | jump to the new-pairs stream. · screen.newpairs |
| 3 | watchlist | jump to the watchlist. · screen.watchlist |
| 4 | analyst | open the analyst tab (chat beside a coin list). · screen.analyst |
| tab | screens | cycle screener → new pairs → watchlist → analyst. · screen.next |
| j / ↓ | move | move the cursor down one row (on the token screen: scroll a long answer). · move.down |
| k / ↑ | move | move the cursor up one row (on the token screen: scroll a long answer). · move.up |
| g / home | top | jump to the first row. · move.top |
| G / end | bottom | jump to the last row. · move.bottom |
| PgDn / ^F | page | page down (20 rows; on a chat screen: scroll the transcript). · move.pagedown |
| PgUp / ^B | page | page up (20 rows; on a chat screen: scroll the transcript). · move.pageup |
| ⏎ | open | open the highlighted token's detail screen. Opening is free: no analyst run starts. · open |
| esc / ⌫ | back | go back to the previous screen. · back |
| a | ask claude | ask 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 |
| ? | help | show every key for the current screen (the first launch shows the welcome card instead). · help.toggle |
| t | theme | cycle the theme: cyberspace → midnight → ember → paper. · theme.next |
| p | pause | pause live refreshes (the data stops; the keys still work). · pause.toggle |
| w | watch | watch or unwatch the highlighted token (persisted in the local SQLite database). · watch.add |
| b | alert | propose a liquidity alert for the highlighted token. Proposals do nothing until you arm them. · alert.propose |
| y | confirm alert | arm the oldest proposed alert. Armed rules fire once into the ALERTS log. · alert.confirm |
| x | dismiss alert | dismiss the oldest proposed alert. · alert.dismiss |
| P | positions | open the PAPER positions screen (equity, cash, PnL, trade history). · screen.positions |
| Z | AI scan | AI scan mode on/off (observe-only; it can never trade). · scan.toggle |
| R | resume scan | after a lock: release the coin and go back to scanning. · scan.resume |
| T | trending | open 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 |
| K | KOL lists | open 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
| key | label | what it does |
|---|---|---|
| / | filter | open 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 filter | clear the applied filter (the preset's own baked filter stays). · filter.clear |
| s | sort | open the sort menu: j/k pick a key, ⏎ on the current key flips the direction. · sort.menu |
| ] / → / l | preset | next feed preset. · preset.next |
| [ / ← / h | preset | previous feed preset. · preset.prev |
| r | refresh | refresh this screen's data now. · refresh |
Token screen
| key | label | what it does |
|---|---|---|
| i | ask | focus the chat input so the next keystrokes type a question (⏎ does the same). · input.focus |
| 1 | 1m | chart timeframe 1 minute. · tf.1 |
| 2 | 5m | chart timeframe 5 minutes (derived locally from 1m, no fetch). · tf.2 |
| 3 | 15m | chart timeframe 15 minutes (derived locally from 1m, no fetch). · tf.3 |
| 4 | 1h | chart timeframe 1 hour (the default). · tf.4 |
| 5 | 4h | chart timeframe 4 hours (derived locally from 1h, no fetch). · tf.5 |
| 6 | 1d | chart timeframe 1 day (derived locally from 1h, no fetch). · tf.6 |
| y | copy CA | copy the full contract address to the clipboard (pbcopy / clip / xclip; the address stays on screen if none exists). · copy.ca |
| r | refresh | refresh this screen's data now. · refresh |
| B | paper buy | open a PAPER buy ticket for this token (simulated; nothing goes on-chain). · trade.buy |
| S | paper sell | open a PAPER sell ticket for this token. · trade.sell |
| W | open site | open the token's advertised website in your browser. The URL is shown first; only http(s) links ever launch. · open.web |
| V | vet 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 |
| X | open X | open the token's advertised X account in your browser. · open.x |
| T | open TG | open the token's advertised Telegram in your browser. · open.tg |
| L | links | list every advertised link in a menu (j/k select, ⏎ open, esc close). Links are claims by the token, not verified. · open.links |
| C | chart popup | open or close the chart popup for this token (native docked window, or your browser as the fallback). · popup.chart |
| F | flow ⇄ tape | swap the lower-right panel between BUY/SELL FLOW (default) and the raw trade tape. · tape.toggle |
| s | social | token 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 |
| f | filter | cycle the source filter (all · kol · x · chain · news · own) on the trending board or the token SOCIAL panel. · social.filter |
New pairs
| key | label | what it does |
|---|---|---|
| r | refresh | refresh this screen's data now. · refresh |
Watchlist
| key | label | what it does |
|---|---|---|
| d | remove | remove the highlighted watchlist row. · watch.remove |
| r | refresh | refresh this screen's data now. · refresh |
Analyst tab
| key | label | what it does |
|---|---|---|
| i | ask | focus the chat input so the next keystrokes type a question (⏎ does the same). · input.focus |
PAPER positions
| key | label | what it does |
|---|---|---|
| r | refresh | refresh this screen's data now. · refresh |
Trending in the space
| key | label | what it does |
|---|---|---|
| f | filter | cycle the source filter (all · kol · x · chain · news · own) on the trending board or the token SOCIAL panel. · social.filter |
| x | hidden spam | show or hide rows held back as spam, duplicates or cashtag squats; the hidden count stays in the title either way. · social.spam |
| n | narrative | cycle the narrative filter: only coins linked by shared KOL threads or co-mentions. News never forms a narrative. · social.narrative |
| s | sources | show the SOURCES panel: each venue's health, data age and limiter rate. · social.sources |
| a | summary (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 |
| r | refresh | refresh this screen's data now. · refresh |
KOL lists
| key | label | what it does |
|---|---|---|
| spc | enable/disable list | enable or disable the selected list for the trending board. · kol.toggle |
| m | mute/unmute | mute or unmute the selected handle. · kol.mute |
| d | remove handle | remove the selected handle from a manual list (packs are read-only). · kol.remove |
| i | add handle | type 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.
| where | keys | what |
|---|---|---|
| everywhere | c | calm mode on/off: rain, glitch, blink and scanlines off; back to the last intensity when pressed again. |
| everywhere | ^C | quit, whatever is focused (a half-typed question or an open ticket cannot trap you). |
| everywhere | any key | skips the boot sequence or a blink transition; the key still does its job. |
| welcome / help card | any 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) | esc | clear 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 · ^W | delete a character · clear the line · delete the last word. The input holds up to 400 characters. |
| analyst tab, coin-list answer | ↑ ↓ · ⏎ · o · esc | when 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 scan | esc | on 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 menu | j k ↑ ↓ · ⏎ · esc q | select a link · open it (the URL is drawn on screen before the browser launches) · close. |
| PAPER ticket | 0-9 . | type the size (SOL or % of balance when buying; % of the position when selling) or the slippage in bps. |
| PAPER ticket | tab | switch between the size and slippage fields. |
| PAPER ticket | ← → | flip the side (buy ⇄ sell). |
| PAPER ticket | u | toggle 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 ticket | esc | cancel the confirm step, or close the ticket. While a fill is in flight, esc aborts the quote. |
| filter line | type · ⏎ · esc | edit the filter query; apply; cancel. Errors show inline with the column that failed. |
| sort menu | j k · ⏎ · esc | pick a sort key; ⏎ on the current key flips the direction; esc closes. |
| --fixtures demo only | n · u · d · x | demo 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)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| ? | help |
| t | theme |
| p | pause |
| / | filter |
| \ | clear filter |
| s | sort |
| ] / → / l | preset |
| [ / ← / h | preset |
| r | refresh |
| w | watch |
| b | alert |
| y | confirm alert |
| x | dismiss alert |
| P | positions |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| c | calm mode (effects off) |
| ? | this help |
KEYS — Token screen (43 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| i | ask |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| b | alert |
| x | dismiss alert |
| 1 | 1m |
| 2 | 5m |
| 3 | 15m |
| 4 | 1h |
| 5 | 4h |
| 6 | 1d |
| y | copy CA |
| r | refresh |
| B | paper buy |
| S | paper sell |
| P | positions |
| W | open site |
| V | vet product (Claude) |
| X | open X |
| T | open TG |
| L | links |
| C | chart popup |
| F | flow ⇄ tape |
| Z | AI scan |
| R | resume scan |
| K | KOL lists |
| s | social |
| f | filter |
| c | calm mode (effects off) |
| ? | this help |
KEYS — New pairs (30 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| b | alert |
| y | confirm alert |
| x | dismiss alert |
| r | refresh |
| P | positions |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| c | calm mode (effects off) |
| ? | this help |
KEYS — Watchlist (31 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| d | remove |
| b | alert |
| y | confirm alert |
| x | dismiss alert |
| r | refresh |
| P | positions |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| c | calm mode (effects off) |
| ? | this help |
KEYS — Analyst tab (31 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| i | ask |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| b | alert |
| y | confirm alert |
| x | dismiss alert |
| P | positions |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| type | ask a follow-up · ⏎ send · esc clear/back |
| c | calm mode (effects off) |
| ? | this help |
KEYS — PAPER ticket (29 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| b | alert |
| y | confirm alert |
| x | dismiss alert |
| P | positions |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| c | calm mode (effects off) |
| ? | this help |
KEYS — PAPER positions (30 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| b | alert |
| y | confirm alert |
| x | dismiss alert |
| P | positions |
| r | refresh |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| c | calm mode (effects off) |
| ? | this help |
KEYS — Trending in the space (33 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| b | alert |
| y | confirm alert |
| P | positions |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| f | filter |
| x | hidden spam |
| n | narrative |
| s | sources |
| a | summary (claude) |
| r | refresh |
| c | calm mode (effects off) |
| ? | this help |
KEYS — KOL lists (33 rows)
| keys | label |
|---|---|
| q / ^C | quit |
| 1 | screener |
| 2 | new pairs |
| 3 | watchlist |
| 4 | analyst |
| tab | screens |
| j / ↓ | move |
| k / ↑ | move |
| g / home | top |
| G / end | bottom |
| PgDn / ^F | page |
| PgUp / ^B | page |
| ⏎ | open |
| esc / ⌫ | back |
| a | ask claude |
| ? | help |
| t | theme |
| p | pause |
| w | watch |
| b | alert |
| y | confirm alert |
| x | dismiss alert |
| P | positions |
| Z | AI scan |
| R | resume scan |
| T | trending |
| K | KOL lists |
| spc | enable/disable list |
| m | mute/unmute |
| d | remove handle |
| i | add handle |
| c | calm mode (effects off) |
| ? | this help |