Slash Commands
Type / in the input to filter the list as you type. Enter runs the highlighted command.
The list also opens while the agent is working. There, Esc closes the list first, and
only a second Esc cancels the run. The list stays closed while a permission prompt is
waiting for your answer.
The filter is fuzzy: it matches the tail of a command or skill name, a subsequence of it, or a close
typo, so you rarely need to type a name exactly. /rse finds /resume, and typing /simplifyer
still lines up the simplifier in /code-simplifier. Built-ins, plugin commands, and skills all
join the same list, ranked by how closely they match the start of the name. The first one or two
characters match strictly as a prefix, so a barely-started buffer stays tight instead of surfacing
every name that merely contains those letters.
Installed skills from every scope (Skills: project, plugin, and user ~/.jan/skills) join the same popup: typing /deploy matches a skill named deploy (magenta row, alongside the cyan commands), Tab completes it, and Enter tells the agent to follow the skill. Disabled skills (via [skills].enabled) are not offered, and neither are user-invocable: false skills - those stay agent-invoked only.
Skills accept arguments, and there are two ways to invoke one:
/deploy staging- short form; arguments after the name are passed to the skill. If the name collides with a built-in command, the command wins./skill:deploy staging- explicit form, never collides with a command, and also works mid-prompt:fix the auth flow /skill:deploy hardenruns the skill with the surrounding prose as its arguments.
Either form loads the skill's full instructions into the conversation (no separate fetch step), announces the skill's folder so bundled files resolve relative paths, and renders one compact [skill:deploy] row in the transcript.
Session
| Command | Description |
|---|---|
/new | Start a new session |
/clear | Clear the conversation |
/threads | List saved threads for this project |
/resume [id] | Resume a thread. Bare: pick interactively |
/fork | Branch this session at a past message into a new thread, keeping this one |
/tree | Saved threads as a fork tree. Enter resumes one |
/worktree | The dedicated checkout this session works in, and what changed there |
/quit | Exit |
See Sessions.
Working
| Command | Description |
|---|---|
/goal [condition|clear] | Keep working until a condition is met. Bare: status |
/plan [exit|text] | Enter read-only plan mode, optionally with a first message |
/todo [add [phase|] text | clear] | Open the todo editor, append an item, or drop all |
/compact | Summarize older turns to free up context |
/context | Show what is filling the context window, by category. Opens a readout docked above the input, live while the turn keeps running; Esc or q closes it |
/usage [session|run|account|daily|requests|limits|<execution-id>] | Bare: an overview of both answers -- this session's estimate over your account's recorded spend, each labelled with its source and never added together. The session half draws immediately; the account half fills in when the read lands, or says why it could not. session shows the local estimate alone: total tokens and estimated cost, then the costliest models behind it, priced from what the provider publishes (a model it publishes no price for is listed as such rather than counted as free); m expands the model list past the top few. The other views read what the provider actually recorded, each leading with the figure it was opened for -- account spend, the newest day, whether spending is allowed -- with breakdowns folded behind the same m. Reported amounts print exactly as the provider sent them, so they never read as a local estimate. Same docked readout as /context, and only one is open at a time; the input field is inactive while it is up |
/cancel [N] | Cancel queued messages. Bare: all, or an index |
/agents | Inspect running subagents: each one's stats and current activity. Select one and press m to message it or x to stop it |
/shells (alias /jobs) | Inspect and stop background shell commands the agent left running |
See Run modes, Goals and todos, and Context and compaction.
Setup
| Command | Description |
|---|---|
/model [id] | Switch model. Bare: pick interactively. Opening the picker re-lists each provider's models once per session; Ctrl+R inside it re-lists them again on demand |
/effort [low|medium|high] | Set reasoning effort. Bare: show current; low is faster, high thinks deeper |
/mcp | List, toggle, add, edit, and remove MCP servers; Enter opens a server's detail screen, where you can list its tools and sign in to it |
/plugin [list|install <spec>|remove <name>|search [query]|setup [name]] | Install and manage plugins. Installation opens setup automatically: masked API-key entry, then confirmation to enable declared MCP servers and sign in when required. Bare setup opens a single-plugin picker; setup <name> resumes that plugin directly without manual MCP configuration or restarting Jan |
/skills | List every skill Jan can see from this project, with its scope (project, plugin, user, built-in), invocation flags, and whether it is disabled. A skill hidden by a same-named higher-precedence one is marked shadowed by <scope> |
/reload [config|plugin|skills|system-prompt] | Re-read on-disk state into the running session without a restart (bare: all). config re-applies the project's agent.toml limits - context_window, compaction_ratio, compaction_reserve_tokens, max_tokens, send_reasoning, [budget].max_tokens - to the next run and lists what changed; the model, [tools], [provider] and [budget].max_usd still need a restart. plugin/skills re-scan and rebuild the catalog, reporting added/removed/changed entries. system-prompt re-reads the project instructions (AGENTS.md, or a legacy JAN.md where a directory has one), which apply on the next run |
/login | Sign in to Tokamak and save the API key |
/config [what you want] | View provider config (~/.jan/config.toml). With words, it is /vibe-setting |
/terminal-setup | Configure this terminal so Shift+Enter inserts a newline and, on macOS, Option+Delete deletes a word. Writes the terminal's own config where it can (VS Code, kitty, Ghostty, tmux) and prints the manual step where it cannot. Idempotent |
/settings [what you want] | With words (other than the max_parallel_subagents N shortcut), it is /vibe-setting. Bare, it opens the menu to edit settings in an interactive menu - the project's agent.toml ([agent] knobs context_window, compaction_ratio, compaction_reserve_tokens, max_tokens, max_parallel_subagents, [budget] limits, the [tools] / [skills] toggles) and user-wide ~/.jan/config.toml keys such as wave and ask_timeout_secs in the one list (Enter edits a row, x resets to default, Esc cancels, clearing the field unsets - except wave, where an empty field is the "no sweep" value and x restores the default 👋). The leading providers row opens a manager for OpenAI-compatible providers in ~/.jan/config.toml: a adds, Enter edits, d twice deletes. max_parallel_subagents N works as a one-shot shortcut. Writes apply on the next session (or after /reload config for the [agent]/[budget] limits), except cosmetic ones like wave that apply immediately |
/vibe-setting <what you want> | Say what you want in plain words and the agent proposes the settings changes that get it. /settings <words> and /config <words> do the same. See below |
/vibe-setting
/vibe-setting I work on huge repos with Opus, stop compacting so often and show me its thinking
The session's model receives the /settings keys (name, file, type, default, current value, what
it does) and your sentence, in one request of its own. The conversation is not included, and
nothing is added to it. The model answers with a list of changes. Jan checks each one with the
same rules /settings uses, then shows a diff:
agent.toml (this project) context_window 128000 -> 1000000 Opus has a 1M window compaction_ratio 0.8 -> 0.9 compact later show_reasoning default (false) -> trueApply? [y/N]
Nothing is written until you press y. Enter, n or Esc
cancels. Accepted changes go through the /settings writer, and the note that follows says when
each one applies:
| Keys | Applies |
|---|---|
wave | Now |
context_window, compaction_ratio, compaction_reserve_tokens, max_tokens, send_reasoning, budget.max_tokens | After /reload config, from the next run |
Everything else (max_parallel_subagents, tools.default, show_reasoning, ...) | When Jan restarts |
- It only changes
/settingskeys. The model, providers, API keys, MCP servers and skills are out of scope; when a request needs one, the reply names the command to use (/model,/login, ...). - It never touches credentials.
claude_code_aliasis not offered. - A change that loosens tool permissions (
tools.defaulttowardallow) needsyestyped out, not a single key. - A key it doesn't know, or a value outside its range, is listed as refused and never written.
- When the request is ambiguous ("make it faster"), it asks a question instead of guessing. Nothing is written.
It runs only while the agent is idle.
See Providers, MCP, Plugins, and Keybindings.
Other
| Command | Description |
|---|---|
/help | Show available commands and keyboard shortcuts |
/update | Install the latest published build. Takes effect on restart |
Bare /config is read-only. To change providers, use jan config set from the shell - see
Providers.