A really nice terminal-based coding agent.
npm install
tsx src/app.ts
Set at least one API key:
export ANTHROPIC_API_KEY=sk-ant-... # anthropic/* models
export OPENAI_API_KEY=sk-... # openai/* models
export OPENCODE_ZEN_API_KEY=... # opencode/* models via OpenCode Zen
export FIREWORKS_API_KEY=... # fireworks/* models- Interactive TUI
- Sessions
- Undo
- Bash, web search, web fetch, read, write, edit
- Paste image for vision models
- MCP
- Skills
- AGENTS.md
- Mouse support (scroll, select to copy)
- Slash commands
- Tables
- Token usage and cost in your currency
- Fast boot
- Table rendering
Switch models at any time with Tab or /model <model-id>. Model IDs use the full provider/model string. Models default to an unset variant, so Pace sends no explicit reasoning effort, thinking level, or similar provider-native options unless you select a variant. For models with variants, use Ctrl+T or /variant <variant> to cycle provider-native options such as OpenAI reasoning effort; the cycle includes the unset variant.
| Model ID |
|---|
anthropic/claude-haiku-4-5 |
anthropic/claude-sonnet-4-6 |
anthropic/claude-opus-4-6 |
anthropic/claude-opus-4-7 |
anthropic/claude-opus-4-8 |
opencode/claude-haiku-4-5 |
opencode/claude-sonnet-4-6 |
opencode/claude-opus-4-6 |
opencode/claude-opus-4-7 |
opencode/claude-opus-4-8 |
opencode/kimi-k2.6 |
opencode/gpt-5.5 |
fireworks/kimi-k2.6 |
openai/gpt-5.5 |
| Key | Action |
|---|---|
| Tab / Shift+Tab | Cycle models forward / backward |
| Ctrl+T | Cycle the current model's variant, including unset |
| Escape | Cancel the running prompt |
| Ctrl+V | Paste image from clipboard |
| Ctrl+C | Clear input, or press twice to exit |
| Shift+Enter | Insert a newline |
!command |
Run a shell command directly (e.g. !ls -la) |
| Command | What it does |
|---|---|
/new |
Start a fresh conversation |
/model <model-id>[:variant] |
Switch model (or list models without args) |
| `/variant [variant | unset]` |
/sessions |
List saved sessions for this project |
/resume <id> |
Resume a saved session |
/undo |
Rewind to before the last user message |
/skills |
List available skills |
/skill:<name> |
Run a skill |
/mcp |
List connected MCP servers and tools |
@filename— mention a project file (autocomplete with Tab)@image(./path.png)— attach an image inline- Bare image paths like
./screenshot.pngare also auto-detected
Pace reads global configuration from ~/.config/pace/config.json.
Choose the startup model and the models that Tab / Shift+Tab cycle through with full provider/model IDs. Omit :variant for the unset/default selection, or use provider/model:variant to select a provider-native variant explicitly:
{
"defaultModel": "opencode/gpt-5.5:medium",
"cycleModels": [
"opencode/gpt-5.5:medium",
"opencode/gpt-5.5:high",
"opencode/kimi-k2.6",
"openai/gpt-5.5:xhigh"
],
"sessionTitleModel": "opencode/deepseek-v4-flash:nothink"
}Pace remembers the last explicit variant used for each model in memory, so cycling away from a model and back restores that model's previous variant during the current run. Use Ctrl+T until the model label has no :variant, or run /variant unset, to return to the provider default without sending explicit variant options.
Pace uses sessionTitleModel to auto-name new sessions after the first user message. Choose a cheap, fast text model; for models with thinking variants, prefer a no-thinking variant such as opencode/deepseek-v4-flash:nothink. If title generation fails, Pace falls back to showing a preview of the first user message.
To display estimated costs in a specific currency, configure a USD conversion rate, display format, and how many fraction digits:
{
"cost": {
"conversionRate": 10,
"format": "{amount} kr",
"fractionDigits": 1
}
}If fractionDigits is omitted, Pace uses dynamic precision similar to the default USD display.
Configure external tool servers in ~/.config/pace/mcp.json:
{
"filesystem": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-filesystem", "~"],
"enabled": true
},
"remote-api": {
"type": "remote",
"url": "https://example.com/mcp",
"headers": { "Authorization": "Bearer <token>" },
"enabled": true
}
}MCP tools show up as mcp__<server>__<tool> and the agent uses them automatically when relevant.
Type check:
npm run lint

