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.

Open on the local machine
Section titled “Open on the local machine”The daemon serves the built panel at http://127.0.0.1:7430/. Start the daemon
and open that URL:
apx status # boots the daemon if it isn't running yet# then open http://127.0.0.1:7430 in your browserOn 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.
Open from another device (LAN pairing)
Section titled “Open from another device (LAN pairing)”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:
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 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)
To see all currently paired clients or revoke one:
apx pair listapx pair revoke <id>Building the web bundle
Section titled “Building the web bundle”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.
# Build once (from repo root)node scripts/build-web.js
# Or rebuild manuallycd src/interfaces/webpnpm installpnpm build
# Development with hot reload (proxies API calls to :7430)pnpm devThe 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.
Navigation model
Section titled “Navigation model”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.

Project workspace
Section titled “Project workspace”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.
apx web, then open any project (its landing tab) 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.

The Tasks tab is the project’s backlog. Besides the classic id/title/tags/due
date/assigned-agent fields, tasks now carry a workflow status — pending,
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).

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

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.

Memories
Section titled “Memories”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.

Skills
Section titled “Skills”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.
apx web, then open a company project → Structure Docs and Files
Section titled “Docs and Files”Two tabs browse the project’s files with the same viewer component:
- Docs — editable. Rooted at the project’s configured docs folder
(
docs.root, defaultdocs/). 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.
apx web, then open a project → Docs → create or open a file Artifacts
Section titled “Artifacts”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.
Config
Section titled “Config”The Config tab shows the effective project configuration merged from the
project’s .apc/ files and the global defaults.

Variables
Section titled “Variables”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.
apx web, then open a project → Variables, and MCPs → header field Rail modules
Section titled “Rail modules”Projects
Section titled “Projects”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).

Agents
Section titled “Agents”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).

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.

Sessions
Section titled “Sessions”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.

Voices
Section titled “Voices”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.

Desktop
Section titled “Desktop”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.
Deck Preview
Section titled “Deck ”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.
Config
Section titled “Config”Global config lives under Settings (/settings/*), grouped into sections.
Sub-sections:
| Path | Section | What it edits |
|---|---|---|
/settings/identity | Account | Assistant name, persona, timezone |
/settings/super-agent | Agents | Super-agent model, system prompt, channels |
/settings/engines | Agents | Model providers (add, edit, toggle) |
/settings/memory | Agents | Memory (RAG) — embeddings + retrieval config |
/settings/skills | Agents | Skills manager + RAG (Skill Inspector) — see Skills |
/settings/telegram | Channels | Telegram bot token and channels |
/settings/devices | Channels | Paired devices list |
/settings/voice | Modules | TTS/STT — same as the Voices rail module |
/settings/desktop | Modules | Desktop window settings |
/settings/deck | Modules | Deck companion settings |
/settings/web | Modules | Web — this panel’s own theme, language, and (via Identity) timezone |
/settings/advanced | Advanced | Raw ~/.apx/config.json editor |
The old /settings/appearance route still works — it now opens /settings/web.

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.

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.
apx web, then Settings → Modules → Web The Telegram panel manages the bot’s channels, contacts, and per-role tool permissions.

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

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.
Architecture
Section titled “Architecture”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.