Skip to content

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.0

Terminal

built-in

The 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-in

An 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-in

A 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-in

A 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.