v2.3

Faster Browser Streaming, Orchestration, & Goals

July 9, 2026

v2.3 delivers faster, more resilient Browser streaming, flexible per-chat and host-browser controls, three new built-in workflow plugins, cleaner skill and project context, and broad provider, tool, and WebUI reliability improvements.

🌐 Browser Viewer & Streaming

  • URL intent routing fixed — Custom Agent Zero schemes no longer get misrouted to the Browser handler.
  • Frame delivery follows the producer — Live screencasts now use blocking frame reads instead of a 50 ms idle poll.
  • Leaner frame transport — Binary and slim-frame negotiation avoids repeated metadata and base64-in-JSON overhead, while capture is clamped to the viewer's viewport and device pixel ratio.
  • Safe WebUI fallback retained — Binary frames stay disabled where Socket.IO cannot reconstruct attachments correctly, preserving the base64 path.
  • Proportional resizing — Browser frames use contain sizing instead of stretching during viewport changes.
  • Canvas rendering path — Live frames can render through Canvas and ImageBitmap with WebSocket consumers, removing per-frame round trips.
  • Stream completion hardened — The WebSocket supervisor wakes when frame tasks stop early, and the canvas backing store is no longer reallocated unnecessarily.
  • Input survives stream restarts — Hover, click, and wheel input keep working after screencast restarts by preserving the active canvas input surface.

🧭 Browser Controls

  • Per-chat or shared tabs — Browser settings now control tab scope and the maximum tabs allowed per chat.
  • Bring Your Own Browser — Host browser selection, normalized configuration, settings controls, and CLI-advertised browser inventory are now built in.
  • Live browser inventory — Available host browsers refresh while settings are open, with guidance for Brave, Opera, Vivaldi, and Chromium-family browsers.
  • Clear endpoint selection — BYOB connections can use automatic discovery, an advertised debug endpoint, or a validated custom endpoint.
  • Keyboard capture stays scoped — Browser controls no longer block typing in the chat composer or other editable fields.

🧩 Orchestrator, Commands, & Goals

  • Built-in Orchestrator — The new Orchestrator plugin adds coding-agent adapter status, settings, per-agent skill references, and a dedicated Plugin Hub entry.
  • Built-in slash commands — Commands can be stored, selected from the composer, and extended from a bundled command pack, with migration for legacy commands.
  • Built-in goal management — Per-chat goals now have visible progress, a /goal command, persistent state, and agent-facing tools.
  • External plugin settings are discoverable — Plugins that declare external settings now appear under External Services.

🧠 Skills & Project Context

  • Skills move into chat history — Loaded skills are preserved with the conversation instead of being injected as scope-wide prompt pins.
  • More direct skill recall — Relevant skills are matched against the raw user message using names, triggers, tags, and description phrases.
  • Legacy skill cleanup removed — Obsolete active-skill prompt injection and cleanup paths are gone.
  • Project guidance follows the path — Active-project AGENTS.md guidance is loaded into the protocol area without duplicating root project instructions.

🤖 Providers & MCP

  • Venice defaults to Chat Completions — Direct Venice chat now uses its more compatible transport by default.
  • Local providers use stable defaults — LM Studio, llama.cpp, Ollama, Ollama Cloud, oMLX, vLLM, and other broad OpenAI-compatible providers now default to Chat Completions.
  • Compaction clears stale Responses state — Provider-side context resets when automatic or manual compaction rewrites local history.
  • Saved Venice configurations migrate cleanly — Existing Venice model slots move to Chat Completions with the Venice system prompt disabled.
  • Codex OAuth requests corrected — Proxied Responses calls now use the right request metadata and model slugs.
  • Codex continuation input normalized — Empty continuation turns retain the list-shaped Responses input expected upstream.
  • Local MCP commands parse like a shell — Values such as uvx workspace-mcp and collapsed option/value lines are split correctly before stdio clients start.

⚙️ Code Execution & Parallel Tools

  • PTY reset hangs fixed — Local shells start in a new process session and escalate from SIGTERM to SIGKILL when a foreground command refuses to exit.
  • Parallel code jobs use native badges — Code execution children now render with the proper code_exe log type.
  • All parallel child logs resolve by tool — Tool-specific log objects are selected for every child job, not only code execution.
  • Parent-visible child logs are reused — Direct parallel workers retain their native badge types through execution.

🖥️ WebUI & Maintenance

  • Faster first mount — Startup vendor scripts load with defer, and Bootstrap is served locally instead of through parser-blocking CDN requests.
  • Modal layering corrected — Toasts and tooltips appear above modals while confirmation dialogs remain on top.
  • Cached component imports are awaited — Deferred markup no longer races Alpine bindings when modules come from cache.
  • Runtime guidance expanded — The agent prompt now explains the separate framework and task Python runtimes plus the WebUI JSON API's CSRF flow.
  • Lean self-update backups — Time Travel history is excluded from user-data backups.
  • Workspace races stay quiet — Transient delete and rename races no longer surface snapshot errors for removed workspaces.
  • Launcher links refreshed — README download links now point to Launcher v1.2.
  • README redesigned — Positioning, feature scanning, Launcher-first setup, and basic troubleshooting are clearer.