Frontend UIs
Download a ready-made web or desktop chat UI, point it at your local bot-agent, and start talking.
bot-agent is an HTTP/WebSocket server, not a product UI. If you do not want to
build a client from scratch, download one of these boilerplates from this
dashboard (you must be signed in) and point it at
http://localhost:4484.
Both talk to the same runtime you launched in Getting started or the Launch an agent on your machine guide. They never call the control plane LLM proxy themselves — bot-agent already holds the session.
GitHub (IBM Enterprise): local-agent-frontend · Bot-Platform-Desktop.
The zip is the current default branch. GitHub names the inner folder
copilot-<repo>-<sha>/ — cd into that after unzip.
Leave bot-agent running
Start and sign in the runtime first. The web UI has no bootstrap-token screen.
The desktop app does, but if you already ran the curl from Launch an agent, it
will see signedIn: true and skip the gate.
Which UI to pick
| Web chat UI | Desktop app | |
|---|---|---|
| Repo | copilot/local-agent-frontend | copilot/Bot-Platform-Desktop |
| Stack | Next.js 15, React 19, Bun, SQLite | Electron, React, npm |
| How it talks to bot-agent | Next.js /api/* proxy (HTTP) + browser WebSocket | Main-process HTTP/WS client |
| Default URL | NEXT_PUBLIC_BOT_AGENT_URL=http://localhost:4484 | BOT_AGENT_URL=http://127.0.0.1:4484 |
| Local API key | Not sent (run bot-agent without --api-key) | BOT_AGENT_API_KEY if you set one |
| Best when | You want a browser chat UI you can fork | You want a native app and agent-driven browser tabs |
Your UI --HTTP + WebSocket--> bot-agent (:4484)
│
└── JWT session --> this dashboard
(/api/runtime/*)
Features each UI covers
bot-agent's full surface is in the Agent API. These UIs cover the chat path, not every route.
| bot-agent capability | Web chat UI | Desktop app |
|---|---|---|
| Health / reachability | Yes | Yes |
| Conversations (list, create, rename/delete, switch) | Yes (no rename) | Yes |
Send message + token stream (message.delta) | Yes | Yes |
Run progress (preparing / llm / tool / …) | Yes | Yes (collapsible steps) |
| Cancel an in-flight run | Yes | Yes |
| Markdown replies | Yes | Yes |
| WebSocket reconnect + event replay | Yes | Yes |
| Cloud bootstrap sign-in UI | No — agent must already be signed in | Yes — paste a bootstrap token |
| Agent-driven browser tabs (CDP) | No (agent may still use Playwright separately) | Yes — in-app tabs via CDP shim :9223 |
| Cron jobs, fork, compaction, subagent inspector | API exists on bot-agent; no UI | Same |
| Skills / MCP / workspace files | Managed in this dashboard, not in the UI | Same |
Web chat UI (local-agent-frontend)
Browser chat: sidebar of conversations, composer, live status pill, stop
button. HTTP goes same-origin through Next.js because bot-agent does not send
CORS headers. The WebSocket is opened directly at
ws://localhost:4484/conversations/:id/ws.
Prerequisites
- Bun
- bot-agent already running on port 4484 and signed in
- Do not start bot-agent with
--api-keyfor this UI — the proxy does not sendAuthorization
Setup
unzip local-agent-frontend.zip
cd copilot-local-agent-frontend-* # GitHub zipball folder name
bun install
cp .env.example .env
.env (defaults already match a local runtime):
DATABASE_URL="file:./db.sqlite"
NEXT_PUBLIC_BOT_AGENT_URL="http://localhost:4484"
Change NEXT_PUBLIC_BOT_AGENT_URL only if bot-agent is not on 4484. The
browser uses that value for the WebSocket, so it must be reachable from your
machine.
bun run db:push
bun run dev
Open http://localhost:3000. New starts a conversation; Enter sends; Shift+Enter is a newline.
Port 3000
This dashboard also uses port 3000 in development. Run the web UI on another
port (bun run dev -- --port 3001) if both need to be up at once.
Desktop app (Bot-Platform-Desktop)
Electron shell: chat on one side, optional Browser mode with tabs the agent can open and control. History lives in bot-agent's SQLite home, so it survives restarts. Packaged builds can spawn a bundled bot-agent; in development you point at the process you already started.
Prerequisites
- Node.js 20+
- bot-agent on port 4484 (or let a packaged build spawn it)
- This dashboard URL for bootstrap exchange (
BOT_AGENT_CLOUD_URL)
Setup
unzip Bot-Platform-Desktop.zip
cd copilot-Bot-Platform-Desktop-*
npm install
cp .env.example .env
Edit .env:
BOT_AGENT_URL=http://127.0.0.1:4484
BOT_AGENT_CLOUD_URL=https://your-dashboard-origin
OPS_DASHBOARD_URL=https://your-dashboard-origin
# Only if you started bot-agent with --api-key:
# BOT_AGENT_API_KEY=the-same-key
Use this dashboard's origin for BOT_AGENT_CLOUD_URL and
OPS_DASHBOARD_URL (the address in your browser, no trailing slash).
npm run dev
If the runtime is already signed in, chat opens. If not, paste a bootstrap token from Project → Agents → Generate Bootstrap Token (5-minute TTL).
Agent-driven browser tabs
The desktop exposes a CDP shim on 127.0.0.1:9223 so Playwright talks to
in-app tabs, not a hidden Chrome. When you start bot-agent yourself in
dev, set this in the bot-agent environment (not the desktop .env):
CHROME_CDP_URL=http://127.0.0.1:9223
Bun needs the desktop's preload so Playwright's CDP WebSocket can reach the
shim (see the desktop README). Override BOT_PLATFORM_CDP_PORT /
BOT_PLATFORM_CDP_SHIM_PORT only if 9222/9223 are taken.
Leave BOT_AGENT_MANAGED unset in this workflow so the desktop does not
spawn a second agent.
Next steps
- Getting started — download and sign in bot-agent
- Agent API — build your own client
- Deployment — spawn, ports, browser automation