Hermes WebUI v0.50.253 — May 1 2026
A 3-PR batch with extensive in-stage cleanup. Highlights: session forking, healed local-model crashes, and a redesigned mobile composer.
What changed
Added
/branchslash command (closes #465) — fork a conversation from any message via/branch [name]or the new "Fork from here" hover action on every message. The forked session inherits workspace, model, profile, and the title (with "(fork)" appended); message history is copied up to the fork point. — @bergeouss (#1342)
Fixed
- Local model setup no longer crashes mid-conversation with
LOCAL_API_KEYerror (closes #1384) — whenmodel.base_urlpointed at an OpenAI-compatible loopback that didn't match the keyword classifier (llama.cpp on127.0.0.1:8080, vLLM, TabbyAPI, custom proxies),_build_available_models_uncachedwas persistingprovider: "local"— which crashed the auxiliary client (compression/vision/web extraction) once context grew. Three-layer heal: (1) auto-detect now writes"custom", (2)resolve_model_provider()heals legacy"local"at read time, (3)set_hermes_default_model()refuses to persist"local". — PR #1388 - Mobile composer redesign — progressive-disclosure config panel collapses workspace/model/reasoning/context controls into a panel above the composer, keeping the primary inline row at attach + voice + profile + workspace files + config + send. Compact context badge on the config button. Top safe-area padding on the titlebar now applies only in
(display-mode: standalone), (display-mode: fullscreen)— installed/PWA mode — fixing extra spacing in normal browser/webview shells. Plus a follow-up commit for 320px legacy phones. — @starship-s (#1381)
Changed (Opus pre-release follow-ups)
/branchendpoint validates input types and ranges — rejects non-stringsession_idwith a clear 400 (was raising TypeError → 500), rejects negativekeep_count(Python slice semantics on negative is "all but last N", confusing fork behavior).- Stripped 9 orphan
wiki_*i18n keys (72 lines) fromstatic/i18n.js— leaked from a different branch with zero references outside i18n.
Pre-release verification
| Gate | Result |
|---|---|
| pytest (full suite) | 3558 passing |
| run-browser-tests.sh | 20/20 QA + 11/11 browser API |
| webui_qa_agent.sh | 23/23 (desktop + mobile + SSE liveness) |
| Comprehensive E2E browser walk (desktop 1440×900 + mobile iPhone 14) | Every interactive surface verified |
| Telegram screenshot approval | Passed (5 screenshots, including bonus mobile workspace dropdown) |
| Opus Advisor pre-release review | APPROVED |
| Independent review (@nesquena) | APPROVED with behavioral harness verification |
In-stage fixes I caught during pre-release
The release pipeline applied 4 fixes that wouldn't have been visible in CI alone:
- Reverted #1342's
del sys.modulestest rewrite — corrupted module state and broke v0.50.252'stest_live_models_cache_is_profile_scoped(cross-test contamination only visible in full-suite runs) - Gated
compact()parent_session_id on truthiness — #1342 was emittingparent_session_id: Nonefor all non-fork sessions, which broke v0.50.251's lineage end_reason gating - CSS specificity bump on
.icon-btn.composer-mobile-config-btn{display:none}— the new mobile config button was leaking into desktop view at 1440×900 (.icon-btn{display:flex}was winning the cascade by source order) - Hide kicker labels in mobile config panel — uppercase WORKSPACE/REASONING labels at 700-weight overflowed the 60px copy column on iPhone 14
Contributors
@bergeouss, @starship-s, plus the self-built #1388.
Diff stats
- 14 files changed
- +1,898 / -206 lines (net +1,692)
- 4 new test files
- 33 new tests on top of the v0.50.252 baseline
Full diff: v0.50.252...v0.50.253