plank โ€บ User guide โ€บ Slash commands

4. Slash commands

A line beginning with / is a command, not a prompt. Unknown slash lines are passed to the model as ordinary text. /help prints the full usage text; completion offers the known commands as you type.

Every command below works identically in the TUI and the plain REPL.

Session lifecycle

Command What it does
/new, /clear start a fresh session, dropping the current transcript
/save write the current session to disk (sessions also save automatically)
/list list saved sessions, most recent first
/switch <id> load another saved session by name or number
/resume [prefix] resume a saved session; no argument picks the most recent, or shows a list
/del <id> delete a saved session
/tag <text> label the current session so it is recognizable in /list
/rename <name> change the name later saves use; what is already on disk keeps its old name
/strip <id> drop a saved session's KV payload to reclaim disk; the transcript survives and a later resume re-prefills it
/history reprint recent turns
/quit, /exit leave (the session is saved). Mid-turn it asks [y/N] first, then interrupts the turn and leaves once it stops

See Sessions.

Branching and rollback

Command What it does
/checkpoint [name] mark a named return point in this session
/rollback [name] return to a checkpoint; the discarded tail is kept as pre-rollback
/tree draw the session tree and number its fork points
/fork [n] rewind to fork point n and explore a different path; no argument shows the tree
/clone freeze the current branch and continue on a copy

Context

Command What it does
/context report context-window usage by category (or click the ctx N% gauge)
/compact [instructions] compact the conversation now, rather than waiting for the automatic pass; an argument steers what this one summary keeps
/usage billed token counts for the session (hosted providers, including cache hit rate)
/toks two braille line charts side by side, generation speed and prefill speed, one sample per second of decoding. Works mid-turn and redraws as the model types
/jobs the background bash job table: id, pid, elapsed, state and output file. A live panel in the TUI, also mid-turn; clicking โง— N jobs in the status bar toggles it
/rate [+|-] [note] rate the last turn (thumbs up by default) with an optional note; works in the TUI and the plain REPL alike
/remember [user] <fact> append a dated entry to project memory (or user memory with user)
/memory open user and project memory as one buffer in the built-in editor; edits are split back to the right file on save
/memory log print the recent entries of the memory audit log: what the model or the extraction pass added, changed or removed, and why
/memory calibrate [N] ask the memory gate's question about up to N saved turns (default 20) twice, with yes and no swapped, and suggest a memory.gateBias value that cancels the model's lean toward one letter
/forget <pattern> delete every memory entry whose text contains the pattern, case-insensitively, after previewing the matches and asking
/init have the model read the repo and generate an AGENTS.md

See Context.

Extensions and inspection

Command What it does
/mcp connected MCP servers and the tools they expose
/skills [on|off] skills available to the model; on/off enable or disable skill expansion for this session, on both the slash route and the skill tool
/templates your {{var}} prompt templates
/agent named subagents you can delegate to, and which engine each runs on
/hooks [on|off] which hooks are configured and on what events; on/off enable or disable hook execution for this session
/plugins loaded plugins, where each came from, what it contributes, and any warnings
/tasks the model's task list

See Extending plank.

Asides and delegation

Command What it does
/btw <question> ask a side question mid-task; answered in a split panel, nothing written to the conversation
/subagent <task> delegate a task to a general-purpose subagent; only its final report enters the transcript, and the turn continues from it
/subagent:<name> <task> the same, using a named definition. The :<name> shows green while you type if it exists and red if it does not

/btw genuinely suspends the running generation, answers, and resumes byte-for-byte with no re-prefill (safety.btwSuspend, on by default). With suspend off, the question is queued and answered at the next generation boundary instead.

Configuration and runtime

Command What it does
/config open the interactive settings form
/config <section>.<key> <value> set one setting, e.g. /config ui.showThinking false
/debug [on|off] override the --debug switch: mirror the raw model stream to a running tdk (on connects and backfills at once); bare /debug reports the state
/power <1..100> cap GPU power draw for this run; shown as (local โšก60%) in the status bar
/mtp [on|off] turn speculative decoding (multi-token prediction) on or off for this session; bare /mtp reports the state
/temp [0..100] set the sampling temperature; refused while /mtp is on, which pins it at 0
/engines open the engine menu, download the one you pick if it is missing, and restart into it, resuming this session when the new engine's family has its transcript
/steer [name] [-100..100] alone, list the steering directions stored for this model in ~/.plank/models/vectors.json, the loaded one starred; with a scale, retarget the loaded direction (a name is required when the model has more than one); with another direction's name, switch the running model to it. See Steering
/loopguard [on|off], /lg arm or silence the loop guards. Works mid-turn
/mc [on|off] turn micro-compaction on or off for this session; bare /mc reports the state. Works mid-turn
/hints [on|off] ask the model for occasional one- or two-sentence > **Hint:** asides on the concepts behind its work (a design choice, why something failed, a trade-off, how to check it). Takes effect at the next turn boundary without rewriting cached context; off in every new or resumed session. Works mid-turn
/buddy [on|off|install] an animated buddy standing on the rule above the prompt while plank is idle; it does nothing. Needs a terminal with kitty graphics (kitty, Ghostty or Warp, not inside tmux) and ffmpeg. Buddies are the folders of plank-buddies; you have one, in ~/.plank/buddy/. on with none installed, and install, offer them as a menu (install <name> installs one directly), and the new buddy replaces the old. Its clips play one after another: one whose name ends in a letter three times in four, at random, otherwise the next one ending in a digit. Bare, it reports the state. On and off are remembered for the next launch (~/.plank/buddy.on), so a buddy you left on is back when plank starts in a terminal that can show it. TUI only
/notify <mode> change notification mode for this session
/version the running version
/help full command and flag reference

The model can also ask for a compaction itself, with the compact tool, and carries on from the summary. It is told not to reach for it unprompted: only you know whether the detail a summary drops still matters, and plank compacts on its own when the window gets tight.

Speculative decoding verifies its drafts by argmax, so it only runs at temperature 0: /mtp on pins the temperature there and /mtp off gives you back the one you were sampling at. /mtp on is refused without loaded draft support โ€” that is chosen at startup (--mtp, --mtp-model) and cannot be loaded into a running engine. The status bar shows โœจ while speculation is on, with its per-step figures beside it, and ๐ŸŒก 0.60 while it is off.

/loopguard off silences every rung of every guard: the repetition guard with its draft rung and think budget, the repeated-tool-call guard and its no-progress budget, and the repeat advisory. Unlike other settings commands it takes effect on a turn that is already generating, because the moment you want the guards out of the way is usually while they are firing. ๐Ÿ” in the status bar means they are armed; โ™ป looping means one has actually seen a cycle. The switch is session-only and is never written to disk (the underlying setting is tools.loopGuards).

The no-progress budget

One rung of the loop guard is off unless you ask for it. The no-progress budget watches a whole turn rather than a single pass: it counts the bytes the model generates and resets that count only when a file actually changes on disk. Cross 32 KB without a change and the turn ends with guard: turn stopped: the model generated 32KB of output and changed no file.

What counts as a change is narrow on purpose. A successful write or edit counts. So does a shell command that left the git working tree different than it found it, which is how sed -i, cargo fmt, a codegen script and git apply get credit for work they do without plank ever seeing the edit. Reads, searches, builds and test runs do not count, however many of them succeed, and neither does an edit that failed to apply. That asymmetry is the whole point: the pattern this rung was built for is a turn whose every individual pass looks reasonable and which still, fifty minutes later, has written nothing.

It is off by default because the count is a measure of output volume, not of looping, and there is a perfectly ordinary turn that trips it: a long read-only investigation. Ask plank why a test is flaky, or to explain how a subsystem fits together, and it will read, search, build and reason its way to a real answer without touching a file. The budget stops that turn too, and the notice tells you to narrow a request that was never too wide. Every other rung of the guard, which watches for genuine repetition instead, stays armed by default.

Turn it on when you are handing plank a long autonomous task and you would rather it gave up than spent an afternoon:

{ "tools": { "noProgressGuard": true } }

It is ANDed with tools.loopGuards, so /loopguard off silences it along with everything else, and arming it while the guards are off does nothing. There is no slash command of its own; /config tools.noProgressGuard true sets it for the project.

/config changes write to ./.plank/settings.json and apply immediately. In the TUI, a bare /config opens the form and /config <key> <value> sets and persists the value directly, the same as on the plain REPL. See Configuration.

Output and diagnostics

Command What it does
/export [md|html] [path] write the transcript to a shareable file (markdown by default, auto-named; HTML is standalone)
/kvcache browse the KV cache as a tree: what each snapshot is, what it was built on, its size, how often it has been used, and when it expires
/kvcache gc|pin|unpin|rm sweep expired entries now, or pin, unpin or delete one by fingerprint prefix
/insights [fast|fresh] a usage report computed from every saved session, written to ~/.plank/usage-data/report.html (fast skips the model-written prose, fresh forces it to be written again)
/stats [7|30|all] a year of activity as a heatmap, with streaks and totals under it; re-issue bare /stats to cycle the range
/repro [note] dump the exact engine input and runtime knobs to ~/.plank/repro/ for a bug report; the file's path is copied to the clipboard

/repro is the one to reach for when you want to report a problem: it captures the rendered prompt the engine would see plus the model, backend, context size, sampling settings and think mode, in a single self-contained file. It never touches the live session.

Under --debug (or after /debug on) plank dumps on its own as well: quitting writes repro-debug-<timestamp>.md, and a panic writes repro-panic-<timestamp>.md with whatever transcript the session had last rendered. Neither needs you to remember /repro before the session ends.

/insights computes every number in code and uses the model only for prose it cannot replace โ€” a failed or skipped model call costs the report its narrative, never its statistics.

The report is differential. Per-session statistics have always been cached and recomputed only for sessions that changed; the written sections now work the same way. plank remembers the last report in ~/.plank/usage-data/last-report.json and reuses its prose until ten sessions โ€” or a tenth of your history, whichever is smaller โ€” are new or have been written to since. A section the previous run failed to produce is not reused, so it gets written on the next run rather than staying missing. /insights fresh writes everything again regardless, for when the last answer was wrong rather than stale.

When there is a previous report to compare against, the new one opens with a Since strip: sessions new or updated, prompts, lines, files, commits, and any tool or friction category that was not there last time. It is subtraction of two deterministic aggregates, so it costs nothing and cannot be wrong the way a written summary could.

/stats is the quick look /insights is not: a year of weeks as a heatmap, four green tones from your quietest day to your busiest, and eight figures under it โ€” favourite model, total tokens, sessions, longest span, days started, longest and current streak, most active day. It reads the same per-session cache /insights fills, so it costs nothing after the first run and never calls the model.

Two of those figures are named for exactly what they count. Days started counts days a session began, so a session opened on Monday and resumed through Thursday lights one square, not four. Longest span is wall-clock between a session's first and last message, which is not time spent working โ€” resume something a month later and the span is a month. Token totals are transcript bytes divided by four, since plank keeps no true per-session count.

The heatmap always shows the full year. The figures under it take a range: /stats 7 and /stats 30 jump straight to the last week or month, /stats all goes back, and re-issuing bare /stats while the panel is open cycles the three. Esc closes it. Like /insights, it is answered only while plank is idle.

Suggestions are made to be used, not read: every snippet, prompt and instruction in the report has a Copy button, and the Worth putting in AGENTS.md list arrives as a checklist โ€” untick what you disagree with, press Copy all checked, and paste the rest into plank. The report stays a single self-contained local file: the clipboard handler is inlined next to the stylesheet, with a fallback for file://, where the browser clipboard API is unavailable.

Among the written sections is Features to try: two or three of plank's own extension points โ€” a skill, a template, a subagent, a hook, an MCP server โ€” chosen from what your sessions actually show, each with a ready-to-run snippet that sets it up. The report knows what you already have installed (it reads the live skill, template, subagent, hook and MCP rosters), so it recommends what is missing rather than what is already there.

Editing a file

Command What it does
/open [path] edit an existing file in the built-in editor; with no path, reopens the last file a tool call edited this session

/open hands the terminal to the same editor Ctrl-G uses, with the file loaded: Ctrl-S saves, Esc discards. It is the fast way to fix up an edit the model just made โ€” bare /open needs no path at all โ€” or to look at a file without spending a turn on it.

It edits, and only edits. A path that does not exist is refused rather than created, so a typo cannot leave an empty file behind, and so are directories, binary files, and anything over 32 MB. An untouched Ctrl-S writes nothing. Saving follows a symlink to the file it points at instead of replacing the link. TUI only; in the plain REPL the command is not available.

Remote control

Command Status
/remote recognized as a command
/grant [session] approves a remote client's control request

Both are part of the remote-control surface described in Remote and hosted engines. /grant matters only when the bridge was started with /rc ask, which withholds control from attaching clients until you approve each request; plain /rc grants it up front and leaves /grant with nothing to answer.

Not in /help

Five arcade commands are deliberately absent from /help and from the completion popup. They are covered in The arcade, and they can be removed entirely with ui.easterEggs: false.

Skills and templates as commands

Any installed skill or template also becomes a slash command: /<name> [args]. Built-in commands always win over a template or skill with the same name. /skills and /templates list what is available.


Next: Tools โ†’