Typed panes
Not every pane is a shell.
Most multiplexers treat every pane identically — it's just a PTY running a command. Quil lets you tag panes with a type, and each type gets its own spawn command, resume strategy, error handler, and status line.
Built-in plugins
4 shipped in v1.0Terminal
built-inThe default shell pane. Runs your system shell (bash, zsh, PowerShell, fish) with OSC 7 auto-injection so pane borders display the live working directory.
spawn = ["${SHELL:-bash}", "-l"] - Runs $SHELL or /bin/bash as fallback
- OSC 7 hook auto-injection on bash / zsh / PowerShell (fish emits natively)
- 500-line ghost buffer replay on reconnect
- Full mouse + keyboard support
Claude Code
built-inAn AI session pane that runs Anthropic's Claude Code CLI with a per-pane UUID so sessions auto-resume on reboot. Ghost buffers show the last 500 lines while the session is restoring.
spawn = ["claude", "--session-id", "{{uuid}}"]
resume = ["claude", "--resume", "{{uuid}}"] - UUID assigned at pane creation time, stored in workspace.json
- Auto-resume via `claude --resume <uuid>` on reboot
- Idle-state detection surfaces to the notification center
- Context-aware status line shows token usage + model name
SSH
built-inA persistent SSH tunnel pane. On reboot Quil re-runs the original SSH command with the same host, port, and forwarding rules.
spawn = ["ssh", "-o", "ServerAliveInterval=30", "{{host}}"] - Stores host, port, and forwarding arguments in workspace.json
- Auto-reconnects on disconnect via ServerAliveInterval
- Error handler pattern-matches `Connection refused` and `Host key verification failed`
- Status line shows connection state + latency
Stripe CLI
built-inA webhook listener pane that runs `stripe listen` with a configurable forward URL. Quil captures the webhook signing secret from the output and exposes it in the pane status line.
spawn = ["stripe", "listen", "--forward-to", "{{forward}}"] - Forward URL stored per pane so the exact `stripe listen` invocation restores
- Webhook signing secret extracted from output and surfaced in status line
- Error handler pattern-matches common auth failures
- Resume strategy: re-spawn with the same forward URL on reboot
How plugins work
A plugin is a single TOML file in ~/.quil/plugins/.
Five optional sections declare its behaviour:
-
[plugin]name, type, and description — the plugin's identity. -
[spawn]command array, working directory, environment variables. -
[resume]what to run when restoring after a reboot (respawn, replay, or custom). -
[keys]pane-local keybindings that override the global config. -
[error]regex patterns that mark the pane as errored when matched in output. -
[status]regex + template that produces the pane's status line.
Plugins are hot-reloaded — save the file and Quil picks up the changes on the next pane creation without restarting.
Sample: a smee.io webhook receiver
This plugin runs smee.io's webhook forwarder, extracts the live URL from its output into the pane status line, and catches auth failures as errors.
# ~/.quil/plugins/webhook.toml
[plugin]
name = "webhook"
type = "webhook"
description = "Receives incoming HTTPS webhooks via smee.io"
[spawn]
command = ["smee", "--url", "{{webhook_url}}", "--path", "/hook"]
cwd = "{{project_root}}"
[resume]
# Just re-run the original spawn command — smee is stateless
strategy = "respawn"
[status]
# Grep for the smee URL in the output and surface it on the pane tab
pattern = 'Forwarding (https://smee.io/[a-zA-Z0-9]+)'
template = "{1}"
[error]
# Catch auth failures and mark the pane as errored
pattern = '(?i)(unauthorized|403 forbidden)'
severity = "error"
Write your own plugin.
Full TOML reference on GitHub — every section, every field, every template variable with copy-pasteable examples.