Deep Research Report · 27 October 2026
Both are MIT-licensed TypeScript monorepos with a browser interface. They are built with completely different frameworks, at completely different scales, and that decides how much work your own branding, layout and features will cost you.
There is no Next.js, no Vue, no PHP and no hand-written HTML app in either project. Both interfaces are TypeScript single-page applications built with Vite. The real difference is the UI library and the amount of product surface you inherit:
| Question | OpenCode | OpenChamber |
|---|---|---|
| UI framework | SolidJS 1.9 (fine-grained reactivity) | React 19.1 |
| UI source size | ~680 files / 7.2 MB app | ~4,388 files / 40.6 MB ui |
| Who serves the page | The OpenCode binary itself (opencode web) | A separate Express 5 server (openchamber serve) |
| Branding / theme change | Easy — CSS token file + preload script | Easiest — JSON theme files, live reload, VS Code theme import |
| Add a real panel or feature | Hard — SolidJS, private UI-plugin package, rebuild binary | Medium — React, large codebase, SDK extension surface |
| Host it for other people | Basic auth + CORS flags | Purpose-built: PWA, WebAuthn, relay, tunnels, reverse proxy |
| Verdict for "I want my own version" | Best as the engine, not the skin | Best as the product you rebrand and host |
If you want to change how the agent works → fork OpenCode core and keep its UI. If you want a custom workspace you host for yourself or a team → fork OpenChamber and change its theme and a dozen components. If you want your own product UI → do not fork either one; build a thin frontend against the OpenCode HTTP/SSE API. That last path is the one most people actually want and it is the least painful.
| Layer | OpenCode (anomalyco/opencode) | OpenChamber (openchamber/openchamber) |
|---|---|---|
| Primary language | TypeScript (frontend, server, CLI, TUI) | TypeScript; compiled JS in the server bundle |
| UI framework | SolidJS 1.9.15 + @solidjs/router | React 19.1 + react-dom |
| App bundler | Vite 8.2.2 (rolldown) + vite-plugin-solid | Vite 7.1 + @vitejs/plugin-react |
| Styling | Tailwind CSS 4.3.3 + CSS custom-property tokens (--v2-*) | Tailwind CSS 4 + a token-based design system CSS |
| Component primitives | Kobalte, Corvu drawer, DnD Kit Solid | Base UI 1.4, Radix primitives, cmdk, sonner |
| Data / state | TanStack Solid Query, Effect | Zustand 5, TanStack Virtual |
| Server | TypeScript server in packages/server, Bun runtime | Express 5 on Node ≥ 24.14, ws, http-proxy-middleware |
| Desktop shell | Electron 44 (electron-vite) | Electron (separate package) |
| Mobile | — (PWA only) | Capacitor 8 (iOS + Android) |
| VS Code | Editor extension in sdks/vscode | Full webview extension package |
| Docs / marketing site | Astro 5 + Starlight + Solid islands (packages/web, 560 MDX pages) | Docs inside the same monorepo |
| Package manager / runtime | Bun 1.4.4, Turborepo | Bun 1.4.4 for build, Node ≥ 24.14 to run |
| License | MIT | MIT |
| Repo scale (blobs) | ~9,964 files · ~606 MB | ~7,945 files · ~439 MB |
Two things surprise most people:
packages/web is the opencode.ai documentation website (Astro + Starlight). The actual product UI is packages/app. Do not confuse them when planning edits.This is the single most important structural difference for customisation, because it decides what you have to rebuild and redeploy.
OpenCode ships one artifact that is both UI host and API. OpenChamber is a separate application server that talks to OpenCode from outside.
Practical consequence: in OpenCode, changing the UI means rebuilding the app and repackaging it into the binary (or running the Vite dev server against a live server). In OpenChamber, the UI is a static bundle served by a normal Node process — you can drop a rebuilt dist/ in, run it behind Nginx or Cloudflare, restart the process, and you are done. That is a big operational difference if you intend to run this for more than one machine.
| Package | Role | Files / size |
|---|---|---|
packages/app | The web application: routes, session timeline, composer, settings, i18n for ~30 locales | 680 · 7.2 MB |
packages/ui | Shared component library + design tokens + 1,213 SVG icons + sounds | 1,691 · 7.1 MB |
packages/session-ui | Chat timeline, tool renderers, diffs, markdown rendering | 159 · 1.1 MB |
packages/gui-plugins | Browser-side plugin host (browser panel, Office previews) | internal, not published |
packages/server | HTTP API, SSE, runtime composition | 55 · 0.2 MB |
packages/web | Documentation site (Astro/Starlight) — not the app | 627 · 11 MB |
The honest scale note: the average file is small (7.2 MB over 680 files), the biggest frontend files are translation dictionaries, and the component library is mostly icons. That makes the app less intimidating than the numbers suggest — but it is still SolidJS, which many developers have never written.
# use it
opencode web --port 4096 # UI + API on one origin
OPENCODE_SERVER_PASSWORD=secret opencode web --hostname 0.0.0.0
opencode serve --cors https://my-ui.example # API only, for your own frontend
# develop it (two terminals, from the repo root)
bun install
bun dev serve --port 4096 # backend
bun run dev:web # Vite dev server for packages/app
bun run dev:desktop # Electron shell
bun run dev:www # docs site
Colours are not hard-coded into components. The app imports @opencode/ui/styles/tokens and styles everything from semantic variables such as --v2-background-bg-base, --v2-text-text-base, --v2-border-border-base and --v2-icon-icon-accent. A compact theme preload script (packages/app/public/oc-theme-preload.js, inlined at build time) applies the saved theme before first paint, so a rebrand does not flash.
This means a visual rebrand is genuinely a small job: edit packages/ui/src/styles/tokens/theme.css (or override the variables), swap the logo and fonts in packages/app/src/index.css, rebuild. No component surgery required.
@opencode/plugin is a published server/TUI plugin API, with an Effect-based variant and an RPC contract.gui-plugins) exists, but the package is marked private — it is the maintainers' internal surface, not a stable public contract for your own web panels.So: you can extend the engine cleanly without touching its UI, but you cannot plug arbitrary new UI panels into the stock web client without forking packages/app.
opencode serve exposes the full agent (sessions, streaming tokens, tool events, permissions) over HTTP + SSE, with generated TypeScript clients in packages/client, and the documented --cors flag exists specifically for custom frontends. That is an invitation to write your own UI instead of fighting someone else's.
| Package | Role | Notes |
|---|---|---|
packages/ui | All shared UI: chat, files, diffs, terminal, settings, themes, i18n | 4,388 files / 40.6 MB — the biggest piece by far |
packages/web | Express server + Vite build + the openchamber CLI | 1,272 files; server side is mostly compiled JS |
packages/electron | Desktop app | Reuses the same UI bundle |
packages/mobile | Capacitor 8 iOS/Android | Same UI, native bridge |
packages/vscode | VS Code webview extension | Same UI |
packages/sdk | Public extension SDK + docs | Panels, services, guest services |
packages/extensions | Built-in extension registry | Registry currently empty, contract in place |
# install / run
bunx @openchamber/web serve --port 3001 # or: openchamber serve
# it connects to your local OpenCode server, then proxies sessions to the browser
# develop it (from the repo root)
bun install
bun run dev # HMR: UI on :5180, API on :3902
bun run build:web # production UI bundle
node ./scripts/dev-web-hmr.mjs
This is where OpenChamber clearly wins. Themes are data, not code:
packages/ui/src/lib/theme/themes/*.json), each with light and dark variants.~/.config/openchamber/themes/my-theme-dark.json, press Settings → Appearance → Reload themes, and it appears in the dropdown. No rebuild..json/.jsonc file — the importer maps surfaces, syntax tokens and diff colours onto OpenChamber's roles.{
"metadata": { "id": "my-theme", "name": "My theme", "variant": "dark" },
"colors": {
"primary": { "base": "#da7c47" },
"surface": {
"background": "#120f0e",
"foreground": "#c9c5ba",
"muted": "#0e0c0b",
"mutedForeground": "#8f8b81",
"elevated": "#181715"
},
"interactive": { "border": "#242323" },
"status": { "error": "#da5b4a", "warning": "#c67f13", "success": "#76ad4f", "info": "#479fe6" }
}
}
@openchamber/sdk (browser IIFE panels + Node services). The built-in registry is empty today, so this is a real but young surface.4,388 UI files and 40 MB is not a small codebase to learn. Themes and small component tweaks are cheap; understanding the session store, streaming bridge and settings registry well enough to add a feature takes real time. It also pins a specific OpenCode client version, so upstream API changes can require upgrades on your side.
Scores are my assessment from source structure, build configuration and dependency weight — 1 is painful, 5 is easy. They are opinion, not upstream data.
| Criterion | OpenCode | OpenChamber | Why |
|---|---|---|---|
| Rebrand colours / logo | 4 | 5 | Token CSS either way; OpenChamber's JSON themes need no rebuild |
| Adjust an existing screen | 3 | 4 | SolidJS vs React familiarity; both componentised |
| Add a new panel / feature | 2 | 4 | OpenCode's web plugin API is private; OpenChamber has a public SDK |
| Build & dev friction | 2 | 3 | OpenCode rebuilds into a Bun binary; OpenChamber is a Node server |
| Learning curve | 2 | 4 | SolidJS is niche; React 19 is mainstream |
| Host for other people | 2 | 5 | Auth, PWA, relay, proxy and mobile are already there |
| Extend without forking | 3 | 4 | OpenCode: engine plugins only. OpenChamber: SDK panels + services |
| Upstream churn risk | 2 | 3 | OpenCode moves fast on dev with 222k stars; OpenChamber pins versions |
| Total | 20 / 40 | 32 / 40 | For "make it mine", OpenChamber is the easier base |
A third option beats both on control and is often overlooked: your own frontend on top of opencode serve. You write exactly the screens you want in whatever framework you like, and you inherit zero UI debt. It scores ~34/40 on these criteria but costs more upfront than a theme change.
packages/ui/src/styles/tokens/theme.css
packages/ui/src/styles/colors.css
packages/app/src/index.css (fonts)
packages/app/public/oc-theme-preload.js
packages/app/src (routes, shell)
packages/session-ui/src (chat, tools)
packages/ui/src (primitives)
packages/ui/src/styles/design-system.css
packages/ui/src/lib/theme/themes/*.json
~/.config/openchamber/themes/*.json (no rebuild)
packages/ui/src/App.tsx
packages/ui/src/components/…
packages/web/server (auth, proxy, API)
Two editing rules that will save you days on either repo:
main/dev. Keep your changes in a small set of theme files and a handful of components, so upstream pulls stay trivial. The moment you rewrite the session layer, you have adopted the project.| What you actually want | Pick | Effort |
|---|---|---|
| "I just want it to look like my brand" | Either — OpenChamber if you also want themes to be editable at runtime | hours |
| "I want to host it and use it from my phone / another machine" | OpenChamber | days |
| "I want to add my own sidebar, dashboard or workflow screen" | OpenChamber fork, or your own frontend | 1–2 weeks |
| "I want a completely different UI, my own design language" | Own SPA on opencode serve | 2–4 weeks |
| "I want to change how the agent thinks: tools, prompts, providers" | OpenCode core fork | varies |
| "I want to embed the agent inside my existing product" | OpenCode API/SDK — do not ship their UI | days |
You would take on SolidJS, a private UI-plugin surface, and a build that produces a Bun binary — all to get a UI you still have to design. If your goal is your own interface, forking the smallest polished React app (OpenChamber) or writing a thin client is strictly less work.
Write down which of these you actually need: colours/logo, layout changes, new screens, different agent behaviour, multi-user hosting. The answer selects the path; mixing them is how projects stall.
~/.config/openchamber/themes/, reload, screenshot.opencode web, override the --v2-* tokens, screenshot.custom/ branch with only theme + component changes.If, after two weeks of forking, you keep fighting the original layout, stop and build the thin client. The API is stable enough, the streaming model is documented, and you keep the agent while owning the interface.
| Item | Status |
|---|---|
| Versions, file counts, dependencies | Read from the repositories and package manifests on 27 Oct 2026 (dev and main) |
| Theme mechanics in OpenCode / OpenChamber | Verified in source files and official theme documentation |
| Actual runtime behaviour of both apps | Not executed here — this is source-level research, not a hands-on benchmark |
| Build times, bundle sizes, memory use | Not measured; do not quote as fact |
| Scorecard numbers | My judgement, weighted for a solo developer rebranding and hosting |
| Upstream velocity | Both repos were pushed within minutes of this report; APIs can move under you. Pin tags. |
package.json, packages/app/package.json, packages/web/package.json, packages/desktop/package.json, packages/app/vite.config.ts, packages/ui/src/styles/tokens/theme.css, tree counts via the GitHub API.package.json, packages/web/package.json, packages/ui/package.json, packages/ui/src/index.css, docs/CUSTOM_THEMES.md, packages/ui/src/lib/theme/DOCUMENTATION.md, packages/extensions/README.md.packages/web/src/content/docs/web.mdx (web flags, CORS, auth, terminal attach) and themes.mdx.CONTRIBUTING.md — package map and the documented web dev workflow (bun dev serve --port 4096 + bun run dev:web).