Review 2: Features

ZeroChat 9.11.0 as the single frontend for local models. Updated on 24 October 2026.

1. Goal and method

The project's goal is for ZeroChat to be the single frontend for local models served separately through OpenAI-compatible APIs (vLLM, llama.cpp, LM Studio, SGLang) or Ollama. This review goes through the capabilities of version 9.11.0 (commit 170ee03) in the code, not in the documentation.

The most relevant additions since 9.2.3 are unattended runs (zerochat --prompt), configuration profiles with their MCP services and browser, Playwright MCP with its own engines or the user's browser, the diff viewer, live local server state with automatic reconnection, and remote connection with sign-in through the system account.

Each capability shows what protects it: [test] an automated test or [reading] code review.

2. Capabilities

AreaWhat it offersProtectionLimit
Model connectionOpenAI-compatible, Ollama, OpenRouter, Claude, Gemini, WebLLM and Mirror adapters; model discovery and capability diagnosis with the inspector.[test] test_providers.js, test_inspector.js, browser_inspector.test.jsVision and reasoning are inferred from what the server publishes or from the adapter.
Context and cacheReads the published capacity (n_ctx, max_model_len…) or a manual setting; history compaction and a stable prefix for the context cache.[test] test_context_manager.js, test_token_telemetry.js, test_context_cache_architecture.jsAn assumed capacity is marked with * and adjusts the thresholds.
ReasoningCollapsible block, levels from None to Maximum, <think> tags and reasoning forwarded between agent steps.[test] test_providers.js, test_agent_runtime.js, test_api_utils.jsThe server must separate reasoning in its response for it to be forwarded.
Tools and agent12 built-in tools, native or text tool calls (<tool_call>), an agent with no step cap and loop detection, and read-only subagents (delegate_task).[test] test_builtin_tools.js, test_text_tool_calls.js, test_agent_core.js, test_delegate_task.jsA loop with ever-changing arguments needs the Stop button.
DocumentsWord, PowerPoint, Excel (native XLSX reader), OpenDocument, legacy binary .doc and .xls, and PDF with its own extractor, as attachments and in RAG.[test] test_office_parser.js, test_office_documents.js, test_file_parser.js, browser_documents.test.jsCaps per sheet and per file, with a truncation notice.
Generation and exportHTML, SVG and CSV documents in the chat with an isolated viewer; conversation export (also as HTML, as shown).[test] test_export.js, browser_conversation.test.jsDocuments open in a Blob with noopener.
WebDuckDuckGo search and page reading through the local server or, without it, Jina Reader; downloads of web documents and images for vision models.[test] test_web_tools.js, py/test_network.pyWithout the local server, reading depends on an external service.
Local serverFiles, run_command and check_command with a live card and background runs, a graphical diff viewer with guided setup, and managed external MCP services.[test] py/test_run_command.py, py/test_file_tools.py, py/test_diff_tool.py, py/test_mcp_services.py, test_local_server.jsNo Playwright on Android (Termux).
Live state and reconnectionThe server reports the directory, running commands, Playwright and external services; the page reconnects by itself when the server returns, without reloading.[test] test_mcp.js, test_ui_mcp.js, browser_mcp_panel.test.jsWith --keep-server the state is reread when returning to the tab, not every 10 s.
Model browsingbrowser_action or Playwright MCP, with its own engines (Chromium, Firefox, WebKit) installed and removed from Settings, or the user's Chrome, Edge or Chromium through the extension.[test] py/test_browser.py, py/test_browser_config.py, test_ui_browser.jsThe extension asks to accept each connection unless its token is set.
Configuration profilesProvider, model and behavior per profile, with the MCP services it starts and the browser it requires; encrypted API keys and profile export.[test] test_profiles.js, test_ui_profiles.js, browser_profiles_settings.test.jsAPI keys are protected by the encryption password when it is enabled.
Unattended runszerochat --prompt runs a prompt in the interface and returns the answer on stdout, with profile, export, hidden window and exit codes.[test] test_backend_run_mode.js, browser_run_mode.test.js, test_run_mode.jsNeeds a desktop browser; the hidden window is best effort.
Remote connectionSettings › Connection with the server URL, SSH tunnel or reverse proxy with its key, and sign-in with the system account when the token is missing or expires.[test] test_mcp.js, browser_connection.test.js, py/test_login.py, test_local_server.jsA single system account: the one running zerochat.
Project modeMemory in .zerochat/ (plan, decisions and state) that the model keeps with task.py.[test] test_project_context.js, test_task_helper.jsDepends on the model following the protocol.
Lexical RAGOrama index in IndexedDB with branches, document images and filtered search.[test] test_rag_index.js, test_rag_service.js, test_ingestion_engine.jsLexical search, no embeddings.
DebuggingAn interceptor that pauses every request to the model to review or edit the JSON before sending it.[test] test_api_utils.jsIt does not intercept traffic with the local server.
WebLLMIn-browser inference with WebGPU in a Web Worker.[test] test_webllm.jsFor compact models.

3. Good practices with a local model server

AspectRecommendationBenefit in ZeroChat
Context capacityPublish the real context (meta.n_ctx in llama.cpp, max_model_len in vLLM).Compaction thresholds are computed on the real limit, not an assumed one.
ReasoningTurn on the server's reasoning parser.Reasoning goes to its own block and is forwarded between steps without mixing into the answer.
Tool callsTurn on the server's tool template (for example, --jinja).Structured calls; without it, ZeroChat extracts <tool_call> blocks from the text.
StreamingStreamed responses.Token-by-token text and immediate cancellation.
Remote accessSSH tunnel or HTTPS reverse proxy, never a public --host.The server keeps listening only on its own computer and requires sign-in.

4. Consistency with the help

The help was checked against the code:

test_help_pages.js checks that every page has its linked translation, the 10.x version series, a unique title and description, and an up-to-date sitemap.

5. Limits

  • Single user: one system account, the one running zerochat; no roles.
  • Data in the browser: conversations, profiles and RAG live in IndexedDB and localStorage; exporting them is advisable.
  • Shared origin on GitHub Pages, an accepted risk.
  • Lexical RAG, without vector similarity.
  • Browsers: Chromium and Firefox; WebKit (Safari and every browser on iPhone and iPad) is not supported.
  • Windows: it works, but its own code paths are not tested automatically.
  • Web privacy: with a local LLM the chat stays on the computer, but the web tools query external services.

6. Verdict

A mature frontend for local models, now also for a remote server. ZeroChat 9.11.0 covers daily technical work with a local model: an agent with the computer's tools, documents and PDF, browsing with Playwright, profiles that prepare each environment, and unattended runs from the terminal. The unified remote connection, by tunnel or reverse proxy, lets you use it from a phone or another computer without exposing the local server.

Authorship

  • Review and writing: Claude Opus 5.5 in Claude Code, from the code at commit 170ee03 and the test suite.