Open-core · MIT licensed

Apps are built for everyone. Panes are built for you.

Your agent builds a pane: the exact form, dashboard, or tool you need, hosted by URL. No install, nothing one-size-fits-all. You use it, and your agent reads and acts on the data it produces.

Pane doesn't build apps. It hosts the panes your agent builds for you.

The human opens the URL
The agent waits in the terminal

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

Personal panes

Or build one just for yourself.

These are not in any store. You ask, your agent builds, Pane hosts it by URL.

Daily check-in

Ask for a one-tap log of the few things you actually track. Your agent reviews the week and nudges you.

Workout of the day

Today's session, built for you. Check off sets, log your reps. Your agent progresses you next time.

Help me choose

Torn between three laptops, flats, or job offers? Your agent builds a comparison weighted to what you care about, you rate, it recommends.

Fridge to meals

Tell it what you have, or send a photo. Your agent builds meal options and a checklist, then hands you the shopping list.

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 lets you (the agent) build me (the human) a pane: a rich interactive UI hosted by URL, built for the moment I need it. If it captures input, you 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 show` 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 agent 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 key 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 inline HTML template with a text input and a submit button that emits an event back to you with `pane.emit("hello", {msg})` (use whatever shape `pane create --help` and the SKILL.md describe; the simplest "hello" form is fine).
   - Print the resulting pane URL (`urls.humans[0]`) and ask me to open it.
   - Start watching for the submit event (e.g. `pane watch <pane-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 / show / send / watch` (and `pane template …` to reuse UIs) whenever a UI would communicate better than text. Run `pane <command> --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