Repository navigation
ClawBox v3.9.0 β Hermes edition + self-healing factory reset
Highlights
- Hermes edition β a single-harness SKU locked at install time (
openclaw|hermes|dual), with the Hermes dashboard, auth proxy, skills, shared identity and browser integration. Editions cannot be switched in software. - Self-healing factory reset (Hermes) β a reset no longer removes the Hermes agent or the offline model; the installer repairs a broken agent reversibly and the in-app Update runs the repair. A box already broken by an earlier reset heals with one command:
sudo bash ~/clawbox/install.sh. - Local model hardening β Gemma 4 reasoning-effort handling, on-demand llama.cpp start, model-switch fixes.
- Security and robustness round β edition-aware updater, preference and data-guard coverage, OAuth hand-off lifecycle, input bounds and redirect policy, foreign-edition teardown, CodeQL clean-ups.
Full list of changes below.
What's Changed
- Harden gateway recovery after updates by @yalexx in #263
- fix(3.1.10): heal legacy openai/ configs on startup (OAuth 401 Missing bearer) by @yalexx in #266
- fix(3.1.10): responsive chat header pills (wrap instead of overlap on narrow chat) by @yalexx in #267
- 3.1.10 follow-ups: chat open animation, mascot polish, uniform reasoning picker, smooth provider-switch bar, gpt-5.6-sol in codex picker by @yalexx in #269
- Point all references at clawbox.com + strengthen README entity/SEO by @yalexx in #270
- fix(gateway): 3.1.11 β updates & boot never brick the box by @yalexx in #271
- fix(mascot): stop crab teleporting to the left corner on tap by @yalexx in #268
- chore(deps): bump actions/checkout from 4 to 7 by @dependabot[bot] in #239
- chore(deps): bump actions/cache from 4 to 6 by @dependabot[bot] in #240
- chore(deps): bump docker/setup-qemu-action from 3 to 4 by @dependabot[bot] in #241
- docs: point 'Get ClawBox'/store links to clawbox.com by @yalexx in #258
- fix(mascot): stop phrase-regen from swap-spiraling memory-pressured boxes by @yalexx in #256
- Add gateway recovery test coverage by @yalexx in #265
- chore(release): bump version to 3.1.11 by @yalexx in #274
- fix(codex,gemma): unblock GPT-5.6 on ChatGPT auth and stop Gemma provisioning from hanging by @yalexx in #275
- fix(codex): default ChatGPT auth to gpt-5.5, not gpt-5.4 by @yalexx in #276
- docs: correct hardware specs on beta by @yalexx in #277
- fix(codex): stop mirroring the rotating refresh token into every codex-home by @yalexx in #278
- fix(codex): restore the credential #278 broke, and migrate legacy auth profiles by @yalexx in #279
- fix(codex): route codex turns through the app-server harness so they work by @yalexx in #280
- fix(vnc): harden setup API calls against expired-auth redirects (#231) by @KrasimirKralev in #303
- fix(update): add 'Force full update' recovery action for force-update.sh (#285) by @KrasimirKralev in #305
- chore(dependabot): security-first posture β ignore majors, keep grouped patch/minor by @KrasimirKralev in #299
- fix(gateway): preserve canonical token SecretRefs (#249) by @KrasimirKralev in #306
- fix(gateway): bound permanent startup failures (#284) by @KrasimirKralev in #308
- feat(gateway): support configurable trusted control-UI origins (#232) by @KrasimirKralev in #313
- OpenRouter: stop rejecting every free model id by @yalexx in #283
- The docs only knew about one of our two editions by @yalexx in #300
- Correct Wi-Fi spec and local-model performance in hardware docs by @yalexx in #273
- fix(auth): return JSON 401 for all expired /setup-api/* requests (closes #304) by @KrasimirKralev in #316
- refactor: shared useReconnect hook for the reconnect overlays (closes #191) by @KrasimirKralev in #317
- fix(e2e): warm Turbopack before the suite (partially addresses #114) by @KrasimirKralev in #318
- fix(e2e): run the suite against a production build by @KrasimirKralev in #319
- fix(deps): patch runtime security advisories (next, undici, ws, postcss, nanoid, sharp) by @KrasimirKralev in #315
- test(e2e): re-enable mascot-context, scope desktop-selection (toward #114) by @KrasimirKralev in #320
- release: promote beta to main (runtime CVE refresh + auth/reconnect/e2e fixes) by @KrasimirKralev in #321
- fix(deps): patch vitest (critical) + vite dev-tooling advisories by @KrasimirKralev in #324
- ci: add CodeQL static analysis (JS/TS) by @KrasimirKralev in #322
- test(e2e): re-enable desktop-selection (last #114 spec) by @KrasimirKralev in #325
- Stop advertising tunnel hostnames that no longer exist by @yalexx in #326
- ci(codeql): also scan PRs targeting beta by @KrasimirKralev in #327
- security: scope the package-manager sudo grant to exact commands by @KrasimirKralev in #335
- security: tighten Files API path containment by @KrasimirKralev in #334
- security: keep provider OAuth tokens off the browser (server-side handoff) by @KrasimirKralev in #338
- security: pin the browser debug-interface allowed origin by @KrasimirKralev in #337
- security: harden the pre-authentication request surface by @KrasimirKralev in #333
- test: de-flake updater legacy-quarantine test by @KrasimirKralev in #332
- security: authentication & session hardening by @KrasimirKralev in #336
- feat(hermes): dual-harness β run the ClawBox agent on OpenClaw or Hermes by @KrasimirKralev in #329
- fix(security): harden local WS/proxy auth, secret file modes, and agent egress by @KrasimirKralev in #331
- perf(anim): reduced-motion support + drop per-frame filter repaints + mascot/ProgressBar fixes by @KrasimirKralev in #330
- chore(ci): move CodeQL to a config file; ignore only test code by @KrasimirKralev in #339
- security: guard prototype-chain keys in app-settings writer by @KrasimirKralev in #340
- chore(deps): sync package-lock.json to the patched tree (next 16.2.11) by @KrasimirKralev in #341
- fix(hermes): harness switch fails on identity-sync (invalid hermes command + CRLF) by @KrasimirKralev in #342
- fix(vnc): clipboard bridge β install xclip, graceful fallback, empty-clipboard detection by @KrasimirKralev in #343
- fix(files): stream downloads, guard fs errors, RFC5987 filename, guard client json() by @KrasimirKralev in #344
- fix(system): hardening for power, stats, vnc/terminal spawns, clipboard by @KrasimirKralev in #345
- fix(local-ai,clawkeep): robust ollama pull/delete, ClawKeep status mapping by @KrasimirKralev in #346
- fix(wizard,config): robust setup wizard, telegram/browser/clawai config paths by @KrasimirKralev in #347
- fix(harness): retry liveness probe to avoid false 'not available' by @KrasimirKralev in #348
- fix(harness): only bounce OpenClaw gateway when it's the switch target by @KrasimirKralev in #349
- fix(setup-auth): gate portal tunnel-control pre-setup + own-property provider guards by @KrasimirKralev in #350
- fix(clawkeep): scheduled backups run a real backup + correct multibyte output decoding by @KrasimirKralev in #351
- fix(mcp): cap shell output, close IPv4-mapped IPv6 SSRF bypass, guard secret paths by @KrasimirKralev in #352
- fix(browser): re-validate redirects + close IPv4-mapped IPv6 SSRF-guard bypass by @KrasimirKralev in #353
- fix(wifi): redact WiFi PSK from errors/logs + escaping-aware scan parse by @KrasimirKralev in #354
- fix(config): constrain language into persona files + bound kv writes + reject reserved keys by @KrasimirKralev in #355
- fix(system): preserve hotspot key, gate reset before cutting connectivity, fail-closed auth-profiles read by @KrasimirKralev in #356
- fix(updater,gateway): reject flag-like branch, escape token in inline script, scope asset rewrite by @KrasimirKralev in #357
- fix(agent-webapps): harden code-projects + tighten built-webapp iframe sandbox by @KrasimirKralev in #358
- fix(apps): gate apps/settings pre-setup, timeout icon fetch, reject flag-like appId, align icon path by @KrasimirKralev in #359
- fix(oauth): keep auth-code tokens off the browser via server-side handoff by @KrasimirKralev in #360
- feat: Hermes single-harness edition + premium dual, with dashboard SSO by @KrasimirKralev in #361
- fix: make the setup wizard edition-aware where it still assumed the OpenClaw gateway by @KrasimirKralev in #362
- fix: skills browse first-run state and chat provider list refresh by @KrasimirKralev in #363
- fix: hermes edition handling for status, configure, catalog and clawkeep by @KrasimirKralev in #364
- docs: hermes edition documentation by @KrasimirKralev in #366
- fix: start the on-device model on demand and stop implying it is active by @KrasimirKralev in #367
- test: fix the three E2E Install failures by @KrasimirKralev in #365
- fix: make the in-app updater edition-aware by @KrasimirKralev in #370
- fix: stop a chat message from killing its own turn, and give Gemma a thinking switch by @KrasimirKralev in #368
- fix: pin @novnc/novnc, resync package-lock.json, and switch on the coverage gate by @KrasimirKralev in #369
- fix: data-guard coverage, interrupted-flow cleanup, log-field bounds by @KrasimirKralev in #372
- fix: focus trap for the install dialog, upstream timeouts for the hermes dashboard proxy by @KrasimirKralev in #371
- fix: return tab order from focusableWithin, and stop over-filtering by @KrasimirKralev in #374
- fix: narrow when the OAuth handoff file is cleared, and check its timestamp by @KrasimirKralev in #373
- docs: record why three CodeQL refutations hold by @KrasimirKralev in #376
- docs: record why the data dir needs containment rather than name matching by @KrasimirKralev in #375
- fix: refuse an unsupported edition transition and make validation honest by @KrasimirKralev in #377
- fix: validate preference input, bound logged fields, set an explicit redirect policy by @KrasimirKralev in #378
- fix: route every direct preference write through one checked door by @KrasimirKralev in #379
- chore: stop the weekly novnc bump and report coverage on a red build by @KrasimirKralev in #380
- fix: bring the other edition's harness down instead of only reporting it by @KrasimirKralev in #381
- fix: state the browser integration honestly on the edition that has no switch by @KrasimirKralev in #383
- release: promote beta to main (3.9.0) by @KrasimirKralev in #384
- fix: make hermes dashboard-auth failures honest and propagate them by @KrasimirKralev in #386
- release: promote beta to main (hermes dashboard-auth fix) by @KrasimirKralev in #387
- docs: reasoning-effort feature + programmatic-config note; swap homepage video by @yalexx in #404
- fix: factory reset no longer destroys the Hermes agent and offline model (hotfix to main) by @KrasimirKralev in #414
New Contributors
- @dependabot[bot] made their first contribution in #239
Full Changelog: v3.1.11...v3.9.0