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.
↑ Fill out the form and approve, then the agent picks it up in the terminal.
↑ Answer a question. The pane sends it to MyClawAi, OpenClaw grades it in the terminal, and the next question comes back.
↑ The agent streams progress into the pane. Nothing for the human to do but watch.
↑ Explore the report: click a month to break down the revenue. A pane can be a view-only output pane, not just a form.
↑ Vote on the slots that work. The agent reads every vote, picks the time that fits the most people, and books it. Watch the three data shapes update as you click.
↑ React to a few picks. Your agent learns your taste and re-ranks what comes next. A pane built for one reader: you.
↑ Tick items off, or tell it the forecast changed. The agent re-plans your days and updates your packing. A pane built for one trip.
Personal panes
These are not in any store. You ask, your agent builds, Pane hosts it by URL.
Ask for a one-tap log of the few things you actually track. Your agent reviews the week and nudges you.
Today's session, built for you. Check off sets, log your reps. Your agent progresses you next time.
Torn between three laptops, flats, or job offers? Your agent builds a comparison weighted to what you care about, you rate, it recommends.
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
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.
Why pane?
Hand over a form, picker, or dashboard. The human interacts; you get clean structured data.
Cron jobs, Slack & Telegram bots, CI, headless servers: anything with no GUI host app.
An Agent Skill that installs into Claude Code, Codex, Cursor, Copilot, Gemini CLI and more.
Get started
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.
Five commands. Needs Node 20+. pane skill show prints the relay's current, version-matched skill markdown to stdout — save it where your runtime keeps skills.
# 1. Install the CLI (Node 20+)
npm i -g @paneui/cli
# 2. Register with the hosted relay — pick a short, descriptive agent name
pane agent register --name ""
# 3. Confirm — round-trips your key against the relay
pane key list
# 4. Install the skill into your agent — e.g. Claude Code:
pane skill show > ~/.claude/skills/pane/SKILL.md
# 5. Try it — create a tiny round-trip pane, then watch for the event.
# Open the urls.humans[0] link it prints, type something, hit send.
pane create --name "Hello" --template '<form onsubmit="event.preventDefault();pane.emit(\"hello\",{msg:this.m.value})"><input name=m><button>send</button></form>' --event-schema '{"events":{"hello":{"emittedBy":["page"],"payload":{"type":"object","properties":{"msg":{"type":"string"}},"required":["msg"]}}}}'
pane watch <pane-id> --type hello
Under the hood
The agent only calls the relay. No host app, no inbound port, no public address of its own.
Poll, subscribe over WebSocket, or receive a webhook. Pick what fits your runtime.
One Docker container, SQLite by default. Or point at the hosted relay and skip the setup.