Open-core · MIT licensed

A round-trip UI channel between agents and humans.

Agents can already render rich output. Pane gives humans a way to act on it — by URL — and feeds every interaction back as structured data.

The human opens the URL
The agent waits in the terminal

Fill out the form and approve — the agent picks it up in the terminal.

The round-trip

Agents emit rich output. The human's reply is still a text box.

Pane closes the loop. The agent renders a real UI — a form, a picker, a doc-review view, a dashboard — the human acts on it, and every interaction comes back as structured data. The human answers by using a UI, not by typing.

Agent renders a UI
🔗 Human gets a URL
✋ Human acts on it
📦 Structured data back

Why pane?

A UI is a richer answer than a text box.

Rich UI, not a prompt

Hand over a form, picker, or dashboard. The human interacts; you get clean structured data.

Built for headless agents

Cron jobs, Slack & Telegram bots, CI, headless servers — anything with no GUI host app.

Drops into any agent

An Agent Skill that installs into Claude Code, Codex, Cursor, Copilot, Gemini CLI and more.

Get started

A handful of commands to a human in the loop.

No build step, no host app. Pick your audience — paste the agent block into your AI agent's chat, or run the human block yourself.

Paste the block below into your AI agent's chat. It will install the CLI, register against the hosted relay, and install the Pane skill into its own skill directory.

Install Pane for me. Pane is a round-trip UI channel between you (the agent) and me (the human) — you hand me a rich interactive UI by URL and, if the UI captures input, get my response back as structured data. Use it whenever a text reply is the wrong shape: forms, pickers, dashboards, doc or diff review, approvals, status pages, multi-step wizards, file uploads — anything better seen than described. Input is optional; a read-only dashboard or status view is a valid Pane.

Install everything at GLOBAL / USER scope, not in the current workspace. Pane is a personal capability I want available in every project, not a per-repo dependency. Do not create files in the current working directory or commit anything to this repo.

Do the following:
1. Install the CLI globally: `npm i -g @paneui/cli` (needs Node 20+). The binary is `pane`. Do not add it to the current project's package.json.
2. Install the Pane skill into your agent's GLOBAL / USER skill directory, not a project-local one. For example:
   - Claude Code: ~/.claude/skills/pane/SKILL.md  (NOT .claude/skills/ in the current repo)
   - Cursor: user-level rules, NOT .cursor/rules/ in the current repo
   - Codex / Gemini / Copilot: your user-scope AGENTS.md / GEMINI.md / instructions file, NOT the project root
   Run `pane skill` to fetch the skill from the relay you're targeting — it prints the raw markdown to stdout, version-matched to that relay. Capture that output and save it in the appropriate format for your runtime (Claude Code keeps the markdown as-is; Cursor wants `.mdc` rules; Codex / Gemini compose it into the user-scope AGENTS.md / GEMINI.md).
3. Register against the hosted relay: `pane register --name ""`. Pick a name that identifies your agent (e.g. `claude-code-lalit-macbook`, `cursor-work-laptop`) — the default is unhelpful. One-time, writes a key to ~/.config/pane/config.json (already user-scope).
4. Confirm install with `pane keys list`. This round-trips your key against the relay and prints { agent_id, name, key_prefix, ... } — proves the CLI is installed AND registration succeeded.
5. Now exercise the round-trip end-to-end so I can see it work:
   - Create a simple two-way pane — a small HTML artifact with a text input and a submit button that posts an event back to you (use whatever shape `pane create` and the SKILL.md describe; the simplest "hello" form is fine).
   - Print the resulting pane URL and ask me to open it.
   - Start watching for the submit event (e.g. `pane watch <session-id>`).
   - When I submit, show me the structured event payload you received. That's the "aha" moment — confirms the full round-trip works.

After this, reach for `pane create / watch / state / send` whenever a UI would communicate better than text. Run `pane <cmd> --help` for authoritative options.

Under the hood

How it actually works.

Outbound calls only

The agent only calls the relay. No host app, no inbound port, no public address of its own.

Three ways to get the answer

Poll, subscribe over WebSocket, or receive a webhook. Pick what fits your runtime.

Self-host or use the relay

One Docker container, SQLite by default. Or point at the hosted relay and skip the setup.

Learn more