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
| Area | What it offers | Protection | Limit |
|---|---|---|---|
| Model connection | OpenAI-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.js | Vision and reasoning are inferred from what the server publishes or from the adapter. |
| Context and cache | Reads 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.js | An assumed capacity is marked with * and adjusts the thresholds. |
| Reasoning | Collapsible 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.js | The server must separate reasoning in its response for it to be forwarded. |
| Tools and agent | 12 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.js | A loop with ever-changing arguments needs the Stop button. |
| Documents | Word, 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.js | Caps per sheet and per file, with a truncation notice. |
| Generation and export | HTML, 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.js | Documents open in a Blob with noopener. |
| Web | DuckDuckGo 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.py | Without the local server, reading depends on an external service. |
| Local server | Files, 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.js | No Playwright on Android (Termux). |
| Live state and reconnection | The 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.js | With --keep-server the state is reread when returning to the tab, not every 10 s. |
| Model browsing | browser_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.js | The extension asks to accept each connection unless its token is set. |
| Configuration profiles | Provider, 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.js | API keys are protected by the encryption password when it is enabled. |
| Unattended runs | zerochat --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.js | Needs a desktop browser; the hidden window is best effort. |
| Remote connection | Settings › 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.js | A single system account: the one running zerochat. |
| Project mode | Memory in .zerochat/ (plan, decisions and state) that the model keeps with task.py. | [test] test_project_context.js, test_task_helper.js | Depends on the model following the protocol. |
| Lexical RAG | Orama index in IndexedDB with branches, document images and filtered search. | [test] test_rag_index.js, test_rag_service.js, test_ingestion_engine.js | Lexical search, no embeddings. |
| Debugging | An interceptor that pauses every request to the model to review or edit the JSON before sending it. | [test] test_api_utils.js | It does not intercept traffic with the local server. |
| WebLLM | In-browser inference with WebGPU in a Web Worker. | [test] test_webllm.js | For compact models. |
3. Good practices with a local model server
| Aspect | Recommendation | Benefit in ZeroChat |
|---|---|---|
| Context capacity | Publish 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. |
| Reasoning | Turn on the server's reasoning parser. | Reasoning goes to its own block and is forwarded between steps without mixing into the answer. |
| Tool calls | Turn on the server's tool template (for example, --jinja). | Structured calls; without it, ZeroChat extracts <tool_call> blocks from the text. |
| Streaming | Streamed responses. | Token-by-token text and immediate cancellation. |
| Remote access | SSH 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:
- Tools and agent: the 12 built-in tools, the agent with no step cap and subagents.
- Local server and MCP: startup, connection, commands, external services and permissions.
- Model browsing, profiles and unattended runs: they match the 9.11.0 options, without
--print-url. - SSH tunnel from Android and reverse proxy: Settings › Connection and sign-in with the system account.
- Composer and documents and reasoning and telemetry.
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
170ee03and the test suite.