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.
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-INAn 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-INAn 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 · BETAA persistent SSH tunnel pane. On reboot Quil re-runs the original SSH command with the same host, port, and forwarding rules.
← 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.
← BUILT-INA 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