github nesquena/hermes-webui v0.50.253
v0.50.253 — May 1 2026

4 hours ago

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

  • /branch slash 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_KEY error (closes #1384) — when model.base_url pointed at an OpenAI-compatible loopback that didn't match the keyword classifier (llama.cpp on 127.0.0.1:8080, vLLM, TabbyAPI, custom proxies), _build_available_models_uncached was persisting provider: "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)

  • /branch endpoint validates input types and ranges — rejects non-string session_id with a clear 400 (was raising TypeError → 500), rejects negative keep_count (Python slice semantics on negative is "all but last N", confusing fork behavior).
  • Stripped 9 orphan wiki_* i18n keys (72 lines) from static/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:

  1. Reverted #1342's del sys.modules test rewrite — corrupted module state and broke v0.50.252's test_live_models_cache_is_profile_scoped (cross-test contamination only visible in full-suite runs)
  2. Gated compact() parent_session_id on truthiness#1342 was emitting parent_session_id: None for all non-fork sessions, which broke v0.50.251's lineage end_reason gating
  3. 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)
  4. 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

Don't miss a new hermes-webui release

NewReleases is sending notifications on new releases.