Skip to content

Web admin panel

The web admin panel is APX’s browser-based UI. It runs entirely in your browser, talks to the daemon over its HTTP API, and requires no public server. Any browser on the same machine — or on the same LAN after pairing — can use it.

APX web panel — home screen showing daemon health and project list

The daemon serves the built panel at http://127.0.0.1:7430/. Start the daemon and open that URL:

Terminal window
apx status # boots the daemon if it isn't running yet
# then open http://127.0.0.1:7430 in your browser

On the first load the panel fetches its auth token automatically from /admin/web-token (loopback-only endpoint). You don’t need to copy a token manually when opening from the same machine.

To open the panel on your phone or another computer on the same LAN, use apx pair web. The command prints a QR code and a direct URL:

Terminal window
apx pair web
# Prints:
# http://192.168.1.42:7430/#token=<token>
# [QR code for scanning with a phone camera]

Scan the QR with your phone camera (no app needed) or share the URL. The #token=… fragment carries the bearer token — the panel uses it automatically.

apx
$ apx pair web
  APX pairing (web)  ·  expires in 90s

  █▀▀▀▀▀█ ▀▄█▀▄ █▀▀▀▀▀█
  █ ███ █ ▀█▄▀  █ ███ █
  █ ▀▀▀ █ █▄▀█▀ █ ▀▀▀ █
  ▀▀▀▀▀▀▀ █ ▀ █ ▀▀▀▀▀▀▀
  ██▀▄ ▀▀▄▀█▄▀▄█▀ ▄█▀▄█
  ▀ ▀▀▀▀▀ █▄▀ ▄██▀▀▄ ▄▀
  █▀▀▀▀▀█ ▄▀█▄▀▀█▄▀ █▄█
  █ ███ █ ▀█▄ ▀▄█▀▄▀▀▀▀
  █ ▀▀▀ █ ▀▄█▀█ ▄▀▄█▄ ▄
  ▀▀▀▀▀▀▀ ▀▀ ▀▀▀▀ ▀ ▀▀▀

scan with the phone camera — opens the web already linked
link: http://192.168.1.42:7430/#token=8f3a…d10c
code: pr_7QF2K  (or paste it in the web pairing screen)
apx pair web — QR code and LAN link printed to the terminal

To see all currently paired clients or revoke one:

Terminal window
apx pair list
apx pair revoke <id>

The panel is a Vite + React + TypeScript app under src/interfaces/web/. The built output lands in src/interfaces/web/dist/ and is served by the daemon.

Terminal window
# Build once (from repo root)
node scripts/build-web.js
# Or rebuild manually
cd src/interfaces/web
pnpm install
pnpm build
# Development with hot reload (proxies API calls to :7430)
pnpm dev

The build:web npm script and the prepack hook both call node scripts/build-web.js, so a global npm install -g . always ships a fresh bundle. Set APX_SKIP_WEB_BUILD=1 to skip it during dev flows that don’t touch the UI.

The panel has two navigation levels:

  • Base (/p/0/…) — the global daemon space: workspaces, models, sessions, logs, and global config. The chat in Base talks to the super-agent.
  • Project (/p/:pid/…) — a single project workspace: agents, chat, tasks, routines, MCPs, memories, and config.

A left rail shows all registered projects plus module shortcuts (Voices, Desktop, Deck, Code). Below the rail is a Roby button that opens a floating chat sheet connected to the super-agent.

Left rail — project list plus module shortcuts

Opening a project lands on its Overview — a “mission control” floor with live stat cards (agents, open tasks, active routines, artifacts), a task-workflow strip broken down by status, the agent roster (orchestrators vs. specialists), and the most recent open tasks. Each tab below maps to a daemon API namespace.

🖥️ SCREENSHOT · web Project Overview — stat cards, task workflow strip, and agent roster apx web, then open any project (its landing tab)
Project Overview — stat cards, task workflow strip, and agent roster

The Chat tab talks to the super-agent (Roby) and to each project agent. The sidebar is channel-first, grouped as Web, Telegram, Desktop, Voice, Agent ↔ Agent, Schedule, Other — in that order. Besides your own web conversations, it also surfaces the super-agent’s day-threads from every other channel (Telegram, Desktop, Deck), so a conversation that happened over Telegram is visible and continuable from the web.

The ”+ New” button opens an agent picker (super-agent or any project agent) and starts a fresh session that only materializes under the Web group once you send the first message. Each open conversation has a “New session” action (resets in place) and a “Delete” action (behind a confirmation dialog) that permanently removes the conversation file or the channel thread.

Chat tab — channel-first sidebar with super-agent and per-agent threads

The Tasks tab is the project’s backlog. Besides the classic id/title/tags/due date/assigned-agent fields, tasks now carry a workflow statuspending, running, in_review, or blocked while open, and done/dropped once closed — shown with a status icon and color. Opening a task shows a detail panel with an editable status and body, and a “View thread” link when the task is linked to a chat thread. The list is server-paginated (see below) and can be filtered by state (open / done / dropped).

Tasks tab — open tasks with workflow status, tags, due dates, and assigned agents

The Routines tab schedules recurring work — a super-agent prompt, a shell command, a Telegram message, or a heartbeat — on a cron expression.

Routines tab — scheduled super-agent, shell, Telegram, and heartbeat routines

The MCPs tab lists the Model Context Protocol servers available to the project across all three scopes (shared, runtime, global), with a live log pane. Header/config values in the MCP editor support the variable token picker — see Variables below.

MCP servers — filesystem, GitHub, Postgres, and an HTTP server across scopes

The Memories tab edits the project’s .apc/memory.md and each agent’s runtime memory, the long-lived context the agents read on every turn.

Memories tab — the project memory.md editor

The Skills tab embeds the same skills manager used in Settings (see Skills), locked to this project’s scope — enable, disable, add, and inspect skills without leaving the project.

Structure Company projects

Section titled “Structure ”

For projects with kind: "company", a Structure tab appears to manage the org model behind agent assignment: Areas (e.g. “Engineering”, “Sales”) and Roles within or outside an area. Areas and roles can be created, edited, and deleted here, and are backed by .apc/organization.json. The same quick-create dialogs are reachable from the agent editor’s Area/Role pickers.

🖥️ SCREENSHOT · web Structure tab — Areas and Roles for a company-kind project apx web, then open a company project → Structure
Structure tab — Areas and Roles for a company-kind project

Two tabs browse the project’s files with the same viewer component:

  • Docs — editable. Rooted at the project’s configured docs folder (docs.root, default docs/). Supports creating, editing (a dependency-free markdown split editor with live preview), and deleting files.
  • Files — read-only. Browses the whole project tree. Type-aware: Markdown renders, code shows with line numbers, images preview inline.
🖥️ SCREENSHOT · web Docs tab — markdown split editor with live preview apx web, then open a project → Docs → create or open a file
Docs tab — markdown split editor with live preview

The Artifacts tab lists the artifacts stored under <project>/artifacts/ — the same list used by the Code module’s side panel, now reachable from the project’s own navigation. Run and Edit hand off to the Code module so you can pass arguments (e.g. a URL) in the terminal or edit the file directly, instead of running headlessly in place.

The Config tab shows the effective project configuration merged from the project’s .apc/ files and the global defaults.

Config tab — effective project configuration and its sources

The Variables tab (vars) manages named, masked secret/config values at project or global scope (e.g. MY_API_KEY). Values are hidden by default with a per-row and a global reveal toggle. Anywhere a value can reference a variable — for example an MCP server’s headers — a token picker (the ”+” button next to the field) lets you search and insert ${var.NAME}, rendered inline as a $NAME badge so the reference reads as part of the line instead of a raw template string.

🖥️ SCREENSHOT · web Variables tab — masked values with the token picker used to reference them elsewhere apx web, then open a project → Variables, and MCPs → header field
Variables tab — masked values with the token picker used to reference them elsewhere

The Projects tab (Base → Workspaces) lists all registered projects as cards. Click a card to enter that project. The “New project” button opens an inline dialog (?action=add-project).

Workspaces tab — project cards with name, kind, and path

Each project has an Agents tab. You can create, edit, and delete agents; view and edit each agent’s memory.md; and assign skills. In the Base space the Agents tab shows the super-agent configuration (read-only summary).

Agents tab — agent list with memory and skill counts

Open an agent to inspect its memory, skills, tools, sub-agents, and brain graph. The editor also sets an emoji (shown next to the agent everywhere in the UI, including the Overview roster), an autonomy level — a three-way toggle for the same permission modes as the CLI/config (total, automatico, permiso, labeled Total / Auto / Permission) — and, for company-kind projects, an Area and Role pulled from Structure, with quick-create buttons next to each picker.

Agent detail — memory, skills, sub-agents, and the brain graph tabs

The Base Sessions tab (/p/0/sessions) lists every recorded session across engines. A search box (title match by default, with a “Deep” toggle to scan transcript content) reuses the same matching logic as apx session find, plus an engine filter and a Clear button. Each row exposes four actions: copy the apx session resume <id> --continue command, ask the assistant to continue that session from a quick-chat bubble, open the session’s working folder, and copy its path.

Sessions tab — search, engine filter, and per-row actions

The Voices module (/m/voice) configures TTS and STT globally. It shows the live status of every configured TTS engine (Piper, ElevenLabs, OpenAI, Gemini, mock), lets you pick a default or chain-with-fallback mode, reorder the chain, configure per-engine credentials, and run a live test playback. The STT section configures the Whisper model and language for mic input.

See Voice for the full CLI reference.

Voices module — TTS provider list with status badges and default picker

The Desktop module (/m/desktop) shows whether the floating Electron window is running (connected WebSocket clients), lets you edit the global shortcut, and toggle whether the daemon responds to desktop messages. You cannot start or stop the Electron process from the web panel — use apx desktop start / stop.

See Desktop for the full CLI reference.

The Deck module (/m/deck) will surface the GET /deck/manifest payload: daemon health, active project, registered plugins, and the widget/desktop grid, and let you enable or disable individual widgets from this view.

See Deck for the pairing CLI reference.

The Code module (/m/code) is the admin surface for the APX coding assistant (apx code). It lets you pick a project and inspect the tool trail from recent sessions.

Global config lives under Settings (/settings/*), grouped into sections. Sub-sections:

PathSectionWhat it edits
/settings/identityAccountAssistant name, persona, timezone
/settings/super-agentAgentsSuper-agent model, system prompt, channels
/settings/enginesAgentsModel providers (add, edit, toggle)
/settings/memoryAgentsMemory (RAG) — embeddings + retrieval config
/settings/skillsAgentsSkills manager + RAG (Skill Inspector) — see Skills
/settings/telegramChannelsTelegram bot token and channels
/settings/devicesChannelsPaired devices list
/settings/voiceModulesTTS/STT — same as the Voices rail module
/settings/desktopModulesDesktop window settings
/settings/deckModulesDeck companion settings
/settings/webModulesWeb — this panel’s own theme, language, and (via Identity) timezone
/settings/advancedAdvancedRaw ~/.apx/config.json editor

The old /settings/appearance route still works — it now opens /settings/web.

Settings — model providers panel

The Super-agent panel sets Roby’s permission mode, personality, and system prompt; the active model and fallback chain are configured in the model router.

Settings — super-agent behavior, permission mode, and system prompt

The Web panel controls the panel’s own UX rather than the agent’s identity: pick Light, Dark, or System (follows the OS color scheme) for theme, and switch the UI language — the page reloads once so every rendered string picks up the new locale.

🖥️ SCREENSHOT · web Settings → Web — theme (light/dark/system) and language pickers apx web, then Settings → Modules → Web
Settings → Web — theme (light/dark/system) and language pickers

The Telegram panel manages the bot’s channels, contacts, and per-role tool permissions.

Settings — Telegram channels, contacts, and roles

The Devices panel lists every paired browser or phone and lets you revoke a token.

Settings — paired devices with last-seen and revoke

List views: pagination and full-height layout

Section titled “List views: pagination and full-height layout”

The Sessions, global Tasks, and per-project Tasks lists use real server-side pagination: the daemon pages by ?limit & ?offset and returns the total row count in an X-Total-Count header, so the panel only fetches the current page and shows a true range (“1–20 of 485”) and page count instead of being capped at a fixed fetch size. Page size is selectable (10/20/50/100, default 20). These list tabs also use a full-height layout: the list scrolls internally while the pager stays pinned at the bottom, so the whole view fits one screen.

The panel is a thin client: it has no local state beyond the current session. Every read is a GET against the daemon’s HTTP API; every write is a PATCH or POST. The daemon is the single source of truth.

Browser → GET/POST → http://127.0.0.1:7430/<route>
APX daemon (host/daemon/)
core/ (logic, memory, agents…)

The web bundle is served by src/host/daemon/api/web.js. API routes always take priority over the SPA catch-all, so a request to /projects/1/agents hits the real endpoint, not index.html.

  • Desktop — the Electron floating window
  • Voice — TTS/STT CLI and providers
  • Deck — companion app pairing
  • Skills — the skills manager, scopes, and the Skill Inspector (RAG)