# Slash Commands (/agent/slash-commands)

Type `/` in the input to filter the list as you type. <kbd>Enter</kbd> runs the highlighted command.
The list also opens while the agent is working. There, <kbd>Esc</kbd> closes the list first, and
only a second <kbd>Esc</kbd> 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](/agent/skills): project, plugin, and user `~/.jan/skills`) join the same popup: typing `/deploy` matches a skill named `deploy` (magenta row, alongside the cyan commands), <kbd>Tab</kbd> completes it, and <kbd>Enter</kbd> 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 harden` runs 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 [#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](/agent/sessions).

## Working [#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 this session's subagents, running and finished. Enter opens one's run, drawn like the conversation (PgUp/PgDn to scroll); `m` messages it, `x` stops it |
| `/shells` (alias `/jobs`) | Inspect background shell commands the agent left running: one `• command` row each, with how long it has run; `x` stops the selected one |
| `/stop` | Stop every background shell command at once |
| `/monitors` | Inspect the monitors watching for a condition: id, name, polls so far and script; `x` stops the selected one |
| `/find <term>` | Search the whole transcript (case-insensitive) and jump to the nearest match, unfolding it if needed. A term that wraps across two lines is still found and highlighted on both, and the match count does not change when you resize the window. The exception is text a narrow window lays out differently from how it was written, such as a table row whose cells wrap, or a label cut short with `…`: there only what is on screen is searched, so a match inside it can come and go with the width. <kbd>Enter</kbd> / <kbd>Shift</kbd>+<kbd>Enter</kbd> step to the next / previous match, wrapping at the ends, while the input is empty (they type nothing, so the start of your next message is never eaten); <kbd>Esc</kbd> or the next message clears it. A miss is reported in the footer |

See [Run modes](/agent/run-modes), [Goals and todos](/agent/goals-and-todos), and
[Context and compaction](/agent/context).

## Setup [#setup]

| Command | Description |
| --- | --- |
| `/model [id]` | Switch model. Bare: pick interactively. Opening the picker re-lists each provider's models once per session; <kbd>Ctrl</kbd>+<kbd>R</kbd> 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 <kbd>Shift</kbd>+<kbd>Enter</kbd> inserts a newline and, on macOS, <kbd>Option</kbd>+<kbd>Delete</kbd> 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 `ask_timeout_secs` in the one list (Enter edits a row, `x` resets to default, Esc cancels, clearing the field unsets). The leading `providers` row opens a manager for OpenAI-compatible providers in `~/.jan/config.toml`: `a` adds, Enter edits, `d` twice deletes. The `subagents` row lists each subagent with its model; Enter picks one from the model picker (the `smol` and `inherit` roles included) and `x` clears the override. The `smol_model` row opens the model picker too (see [Subagents](/agent/subagents#choosing-a-subagents-model)). `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) |
| `/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` [#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) -> true
Apply? [y/N]
```

Nothing is written until you press <kbd>y</kbd>. <kbd>Enter</kbd>, <kbd>n</kbd> or <kbd>Esc</kbd>
cancels. Accepted changes go through the `/settings` writer, and the note that follows says when
each one applies:

| Keys | Applies |
| --- | --- |
| `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 `/settings` keys. 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_alias` is not offered.
- A change that loosens tool permissions (`tools.default` toward `allow`) needs `yes` typed 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](/agent/providers), [MCP](/agent/mcp), [Plugins](/agent/plugins), and
[Keybindings](/agent/keybindings#shiftenter-and-the-option-key).

## Other [#other]

| Command | Description |
| --- | --- |
| `/help` | Show available commands and keyboard shortcuts |
| `/update` | Install the latest published build. Takes effect on restart |

<Callout type="info">
Bare `/config` is read-only. To change providers, use `jan config set` from the shell - see
[Providers](/agent/providers).
</Callout>
