Skip to content

Web UI

OpenParallax includes a browser-based interface built with Svelte 4 and a glassmorphism design system. The web UI connects to the engine via WebSocket for real-time streaming and REST for session management.

Accessing the Web UI

The web UI starts automatically with the engine (unless web.enabled is set to false in config.yaml). The URL is printed at startup:

Web UI available at http://127.0.0.1:3100

The port is configurable via web.port in config.yaml or the --port flag on openparallax start.

If authentication is enabled (web.auth: true), you will be prompted for a password. On first start with no password configured, the engine generates a one-time password and prints it to the console.

Two-Panel Layout

The interface uses a two-panel layout:

┌──────────┬──────────────────────────────────────┐
│          │                                      │
│ Sidebar  │           Chat Panel                 │
│  240px   │           (flex: 1)                  │
│          │                                      │
│          │                                      │
│          │                                      │
└──────────┴──────────────────────────────────────┘

The left panel provides navigation and session management:

  • New Session button — starts a fresh conversation
  • Session list — previous sessions displayed with auto-generated titles and timestamps
  • Active session highlighted with accent color
  • Settings — gear icon opens the settings panel
  • OTR indicator — amber badge when in Off-the-Record mode

Click a session to switch to it. Full message history and tool call results are preserved.

Chat Panel (flex: 1)

The main panel is the conversation interface:

  • Message input at the bottom with a send button
  • Message stream showing user messages, agent responses, and tool call envelopes
  • Tool call envelopes — collapsible sections showing the action type, Shield verdict, and result
  • Streaming — agent responses stream in real-time via WebSocket

Drag-to-Resize

Panel widths are adjustable by dragging the divider between panels. The widths are stored as CSS custom properties (--sw for sidebar width) and persist in localStorage.

Responsive Breakpoints

The layout adapts to different screen sizes:

BreakpointWidthLayout
Full> 1200pxBoth panels visible
Compact800-1200pxSidebar collapses to icons, chat panel fills space
Mobile< 800pxSingle panel view with navigation tabs

On compact and mobile layouts, the sidebar can be toggled with a hamburger menu button.

Glassmorphism Design

The UI uses a glassmorphism design system with translucent panels, backdrop blur effects, and layered depth. Key design tokens:

  • Background — dark gradient base with frosted-glass panel overlays
  • Accent colors — 8 CSS custom property variants (--accent-base, --accent-dim, --accent-subtle, --accent-ghost, --accent-glow, --accent-glow-strong, --accent-border, --accent-border-active)
  • Typography — Exo 2 for body text, JetBrains Mono for code and badges
  • Borders — subtle translucent borders with accent-colored highlights for active elements

OTR Mode

When an OTR (Off-the-Record) session is active, the UI transforms visually:

  • All accent colors shift from cyan to amber via the .otr CSS class on the document root
  • This affects borders, glows, badges, buttons, and highlights throughout the interface
  • An "OTR" badge appears in the sidebar
  • The visual change serves as a constant reminder that the session is ephemeral and restricted

The color change is applied by overriding all 8 --accent-* CSS tokens. See Sessions for details on OTR behavior.

Real-Time Events

The web UI receives 7 event types from the engine via WebSocket:

EventDescription
llm_tokenStreaming text token from the LLM response
action_startedA tool call has been proposed and is being evaluated
shield_verdictShield has evaluated the tool call (ALLOW/BLOCK/ESCALATE)
action_completedA tool call has been executed
response_completeThe LLM has finished its response
otr_blockedA tool call was blocked because the session is OTR
errorAn error occurred during processing

Events are filtered by session_id to prevent cross-session corruption. The log_entry event type is global and processed before the session filter for the console log.

Tool Call Display

When the agent calls a tool, the UI displays a collapsible envelope showing:

  1. Action type — the tool being called (e.g., write_file, git_commit)
  2. Parameters — the arguments passed to the tool
  3. Shield verdict — the security evaluation result (tier, decision, confidence)
  4. Result — the tool execution output or error

Envelopes start collapsed for completed actions and expanded for in-progress actions. Multiple tool calls in the same LLM turn are grouped together.

Keyboard Shortcuts

ShortcutAction
EnterSend message
Shift+EnterNew line in message input
Ctrl+N / Cmd+NNew session
EscapeClose settings / cancel current action

Console & Logging

The web UI includes a real-time console that streams structured engine events as they happen. It is one of OpenParallax's most powerful diagnostic tools — every Shield verdict, tool execution, sub-agent spawn, memory write, and error flows through it live.

What the console shows

The console streams the same structured JSON events that power the chat UI, plus engine-level log entries that the chat panel does not render:

  • Shield verdicts — every tool call shows the tier that evaluated it, the decision (ALLOW/BLOCK/ESCALATE), the confidence score, and the reasoning. Use this to understand why an action was blocked and which policy rule or heuristic fired.
  • Tool execution — start, complete, duration, and error for every tool call. See which tools are slow and which are failing.
  • Sub-agent lifecycle — spawn, status, completion, and failure events for every sub-agent. Monitor parallel work in real time.
  • Memory writes — compaction flushes and session summarizations as they land in MEMORY.md.
  • Connection events — WebSocket connections, agent gRPC stream status, reconnections.
  • Errors — pipeline errors, LLM call failures, and agent crashes with full error messages.

Using logs to tune security

The console is the fastest way to tune your Shield policy:

  1. Identify over-blocking. If legitimate actions are blocked, the console shows exactly which tier and rule fired. A Tier 0 block names the policy rule; a Tier 1 block names the heuristic rule and its description; a Tier 2 block shows the LLM evaluator's reasoning.
  2. Identify under-blocking. If actions you expected to be caught are passing, check the tier that evaluated them and the confidence score. Low confidence on a Tier 1 ALLOW may indicate the classifier needs a policy override.
  3. Budget monitoring. The console shows when the daily Tier 2 budget is exhausted and whether the engine fails closed (blocks) or open (allows with reduced confidence). Adjust general.daily_budget based on observed usage.
  4. Rate limit tuning. Shield rate-limit-hit events appear in the console. If legitimate bursts are being throttled, increase general.rate_limit.

CLI logging

From the CLI, use the /logs command or the openparallax logs subcommand:

bash
# Tail the last 50 lines, filtered by event type
openparallax logs --lines 50 --event shield_verdict

# Filter by log level
openparallax logs --level warn

When the engine is started with -v (verbose), all structured events are written to <workspace>/.openparallax/engine.log. This file is the definitive record of everything the engine did — it persists across restarts and can be searched with standard tools (grep, jq).

Audit log

The audit log (<workspace>/.openparallax/audit.jsonl) is a separate, append-only, hash-chained record of security-relevant events only. Use it for compliance verification:

bash
# Verify the hash chain is intact
openparallax audit --verify

# Query by event type
openparallax audit --type ACTION_BLOCKED --lines 20

See the audit documentation for the full event type catalog and verification protocol.

Connection Management

The WebSocket connection includes automatic reconnection with exponential backoff. Connection status is displayed in the UI:

  • Connected — green indicator, real-time events flowing
  • Reconnecting — yellow indicator, attempting to restore connection
  • Disconnected — red indicator, manual reconnection may be needed

If the engine restarts (via /restart or crash recovery), the WebSocket reconnects automatically and resumes the current session.

Settings Panel

The settings panel (gear icon in the sidebar) is read-only. It displays the current configuration as labels and values — no editors, no Save button. A banner at the top points at the slash command path for changes.

What you see:

  • Agent info — name, avatar
  • Chat model — provider, model, API key configured, base URL
  • Shield — policy, evaluator provider/model, Tier 2 budget and usage
  • Memory — embedding provider/model
  • MCP servers — configured servers
  • Email and calendar — configured channels
  • Web — port
  • Sandbox — kernel sandbox mode and capabilities

To change a setting from the web UI, type the slash command in the chat input:

  • /config set chat.model claude-haiku-4-5-20251001 — change a model on the active role
  • /model chat <pool-entry> — switch which model from the pool a role points at
  • /config set identity.name Bear — change the agent's display name

Slash commands work in the web chat the same way they work in the TUI. There is no HTTP write endpoint for settings — the read-only design closes the secret-exfiltration and Shield-disarm vectors that an HTTP write surface would expose. See Configuration → Editing Config at Runtime for the complete list of settable keys.

Next Steps