Skip to content
§ PLUGINS BUILT-IN 5 FORMAT TOML hot-reload on save
PANE TYPES · TOML · HOT RELOAD

Plugins, in 30 lines of TOML.

A pane type is a TOML file. No compile. No restart. No shell scripting footguns. Drop it in ~/.quil/plugins/ and the daemon reloads on save.

BUILT-IN · 5 TYPES
◇ 01 terminal

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.

← BUILT-IN
◇ 02 claude code

An AI session pane that runs Anthropic's Claude Code CLI. A setup dialog asks for the working directory (so project-specific `.claude/` context is preserved) and offers a `Dangerously skip permissions` checkbox for unattended runs. Sessions resume across daemon restarts.

← BUILT-IN
◇ 03 opencode

An AI session pane that runs [opencode](https://opencode.ai), the second production AI integration alongside Claude Code. A setup dialog asks for the working directory; sessions resume across daemon restarts to the exact conversation (not just the most recent in CWD) via a small JS plugin Quil registers through opencode's plugin runtime. The user's own opencode plugins, agents, and modes remain active — Quil's plugin is additive.

← BUILT-IN · BETA
◇ 04 ssh

A persistent SSH tunnel pane. On reboot Quil re-runs the original SSH command with the same host, port, and forwarding rules.

← BUILT-IN
◇ 05 stripe cli

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.

← BUILT-IN
WRITE YOUR OWN · SAMPLE

A webhook plugin, top to bottom.

Drop this in ~/.quil/plugins/webhook.toml. Reload happens on save — you'll see the new pane type in the Ctrl+N dialog seconds later.

# ~/.quil/plugins/webhook.toml
[plugin]
name = "webhook"
display_name = "Webhook listener"
category = "tools"
description = "Receives incoming HTTPS webhooks via smee.io"
schema_version = 1                # bump when TOML structure changes

[command]
cmd = "smee"
detect = "smee --version"
arg_template = ["--url", "{url}", "--path", "/hook"]
prompts_cwd = true               # ask for the working directory at pane creation

[[command.form_fields]]
name = "name"
label = "Name"
required = true

[[command.form_fields]]
name = "url"
label = "Smee URL"
required = true

[persistence]
strategy = "rerun"               # respawn with the same instance args
ghost_buffer = true

[[notification_handlers]]
pattern = 'Forwarding (https?://smee\.io/\S+)'
title = "Webhook tunnel ready"
severity = "info"

[[error_handlers]]
pattern = '(?i)(unauthorized|403 forbidden)'
title = "Webhook auth failed"
message = "Check your smee.io credentials and re-run the pane."
action = "dialog"

└── full reference: docs/plugin-reference.md

Write one. Reload on save.