Releases: hermes-webui/hermes-desktop-rust
Releases · hermes-webui/hermes-desktop-rust
Hermes WebUI Desktop v0.3.8
Fixed
- macOS: multiple tabs on different profiles bled into each other (the
v0.3.7 fix only covered the Windows/Linux tab strip). macOS uses native
window tabs, which shared one cookie store, so switching profile in one tab
switched the others too. Each tab opened from an existing one now gets its own
isolated (ephemeral) cookie store, seeded with the opener tab's profile +
login so it still opens on your current profile and only diverges when you
switch it — the same behavior the Windows/Linux fix gives. The first window
keeps the persistent store, so a single-window setup still remembers your
profile and login across restarts. (#3, reported by the maintainer on macOS.) - A new tab now reliably inherits the current tab's profile. The seed copied
the opener's cookies via a URL-filtered lookup, but that lookup drops
host-only cookies on macOS — and the WebUI sets the profile cookie host-only —
so a new tab fell back to the default profile instead of the one you were on.
Seeding now copies the opener's whole cookie store (a tab only ever loads one
origin), so the profile cookie transfers on every platform.
Hermes WebUI Desktop v0.3.7
Fixed
- Windows/Linux: multiple tabs on different profiles no longer bleed into
each other. The WebUI scopes the active profile to a per-client HttpOnly
hermes_profilecookie, but every tab shared one cookie jar — so switching
profile in one tab flipped it for all of them: the sidebar stuck to the
last-loaded profile, other profiles' active chats went missing, and the
default workspace intermittently failed to apply. Each tab now gets its own
isolated data partition (its own cookie jar), so profile selection is
genuinely per-tab — the same isolation you get from separate browser windows.
A new tab is seeded with the opener tab's profile + login cookies, so it still
opens on your current profile (and stays logged in) and only diverges when you
switch it. Partitions are session-scoped and cleared on tab close and at
startup. (#3, reported by b3nw and Lemz.)
Hermes WebUI Desktop v0.3.6
Added
- Windows/Linux: tabs now badge when a session is waiting on you. When a
background tab raises a tool-approval or clarify/question popup, you used to
see only a momentary flash and had to click through every tab to find the
blocked one. Such tabs now show an amber attention dot (and a subtle tint) in
the tab strip, so the session waiting for input is obvious at a glance. The
signal is the WebUI's existing pending-prompt title marker, read per-tab
through the native title hook — no extra polling. (#14, reported by b3nw.)
Hermes WebUI Desktop v0.3.5
Fixed
- Windows/Linux: tabs were stuck on "New Tab" and never showed the active
session (and titles could "reset" toHermes WebUI ● <host>). The custom
tab strip derived each tab's title from an injected script that posted the
page'sdocument.titleback over the JS event IPC (window.__TAURI__). That
IPC isn't reliably available in remote-origin content webviews, so the title
report silently no-op'd and the tab kept its placeholder. Titles are now read
from the webview engine directly via a native title-changed hook
(WebView2/WebKitGTK/WKWebView), independent of page JS, the IPC global, and
the page's CSP — the same "don't depend on the remote webview's IPC" approach
the link-opening fix used. (#15, reported by Deor and b3nw.) - A transient blank title no longer wipes a good tab title. While a tab is
mid-load (or briefly reports a separator-only title), the strip used to fall
back to theHermes WebUI ● <host>placeholder. A known-good title (or the
initial "New Tab" seed) is now kept until a real title arrives. - Tab titles now strip the trailing name suffix for custom bot names and
non-default profiles. The WebUI appends a " — name" suffix where the name is
the configured bot name or the profile name — not always "Hermes". The suffix
is now removed generically (only the last separator-delimited segment, so an
em-dash inside the session title itself is preserved) instead of matching the
literal "Hermes". - Direct-mode connections to a non-localhost HTTP server now get the bridge
again. The content-webview capability listedhttps://*but no plain
http://*, so for a Direct connection to e.g.http://192.168.x.x:8787
every bridge emit (theme sync, the "response is ready" notification) was
silently dropped. Plain-HTTP remote origins are now covered (still
event-emit-only — no command access).
Hermes WebUI Desktop v0.3.4
Fixed
- Clicking a link in chat did nothing instead of opening the browser.
The WebUI renders chat links withtarget="_blank", and our injected script
forwarded those clicks to native by emitting anopen-externalIPC event.
That emit posts toipc.localhost, which the remote page's own CSP
connect-srcblocks (the WebUI server governs the page's CSP, not the shell),
so the event never reached Rust and the click was a no-op. External links
(andwindow.open) now navigate the top frame instead: the native
on_navigationhook — which is not subject to the page CSP — opens external
hosts in the system browser and cancels the navigation so the page stays put,
exactly as plain links already did. No server-side change required.
(#12, reported by Deor; cross-ref hermes-webui#4040.) - White flash when opening a new tab (Windows/Linux). A new tab is a child
webview added to an already-visible window, so it painted white until its
first paint — the window-level anti-flash (build hidden, reveal on load)
couldn't cover it. New tab webviews now get an opaque native background in the
cached theme color, so they come up theme-colored instead of white. (#4,
reported by Rod.)
Hermes WebUI Desktop v0.3.3
Fixed
- macOS: app froze ("crashed") every time a new tab was opened. Cmd+T
built the window fine, but the native tab attach (addTabbedWindow) ran
inside the event loop's dispatch, where AppKit may force the other tab's
window to redraw synchronously — and that redraw re-enters the windowing
layer's non-reentrant lock, deadlocking the main thread on itself. The app
froze instantly and forever (no crash report — it never crashes, it hangs;
confirmed by macOS hang diagnostics on v0.3.1 and v0.3.2). The freeze only
triggers when the two windows' sizes differ, which is why default-size dev
windows masked it and real resized windows hit it 100% of the time. Tab
attach (and the Cmd+N tabbing-mode dance) now runs via the GCD main queue —
outside the event dispatch — and Cmd+T/Cmd+N window creation runs inline on
the main thread on macOS, like the original prototype. Verified live: tab
attach plus continued main-thread heartbeats on the previously-freezing
setup.
Hermes WebUI Desktop v0.3.2
Fixed
- Linux: intermittent crash at launch. WebKitGTK's internal threads talk
X11 directly; without Xlib's thread-safe mode they race the GTK main loop
and the app could abort during startup ([xcb] Unknown sequence number while awaiting reply) or die silently with no window — roughly two out of
three launches in the CI smoke harness, timing-dependent on real desktops.
The app now callsXInitThreadsbefore anything else on Linux. Wayland-only
systems without libX11 are unaffected (the call is skipped). Found by the
Linux smoke harness flaking on identical builds.
Hermes WebUI Desktop v0.3.1
The first release that arrives as an in-app update for v0.3.0 users — and the
first signed and notarized macOS build (Developer ID + hardened runtime +
stapled notarization: no more right-click-to-open ritual; microphone and network
entitlements mirror hermes-swift-mac so voice input keeps working under the
hardened runtime).
Added
- Platform-labeled release artifacts (tester request: "label the binaries to
be clear about platform"): every asset now states its platform —
…_win_x64-setup.exe,…_lin_x86_64.AppImage,…_macos_universal.dmg,
and the formerly ambiguousuniversal.app.tar.gzis now
…_macos_universal.app.tar.gz. The update manifest's URLs are rewritten to
match automatically, while the release is still a draft. - Portable Windows build (tester request: "be nice to have a non-installer
.exe"):…_win_x64_portable.zip— unzip anywhere and run, no installer, no
admin rights. The bundledportable.txtmarker keeps the app in portable mode:
self-update is disabled there (it would silently convert the portable copy into
an installed app) and points at Releases instead. Requires the WebView2 runtime
(preinstalled on Windows 11). - SSH tunnel auto-recovery (Swift app NWPathMonitor parity): while the tunnel
is down — laptop slept, Wi-Fi dropped, VPN flapped — the app probes the SSH
host's port every 10 s and reconnects the moment it answers, with a blind retry
every 60 s forssh_config-mapped ports. No more manually clicking Reconnect
after every sleep/wake. - Downloads on macOS and Linux: session exports and other in-app downloads
(which WKWebView/WebKitGTK silently drop) are intercepted, saved into
~/Downloads with collision-safe names, and announced with a notification.
Windows keeps WebView2's native Save As dialog. - Reveal Log File in the macOS app menu and the tab bar's ⋯ menu — opens the
live log in Finder/Explorer/Files for bug reports.
Fixed
- The update-check failure dialog now gives actionable guidance instead of a raw
plugin error string. - Linux stability hardening from the new CI smoke harness (which launches the
real app on Ubuntu under Xvfb and screenshots it): window centering no longer
relies on GTK's no-opcenter()for hidden windows, the tab strip's buttons
use font-safe glyphs, and tab operations avoid re-fitting GTK child webview
geometry — which crashes natively in Tauri's multi-webview on Linux. Known
cosmetic limits on Linux for now: extra strip padding, and window resizes
don't re-fit webview bounds (upstream wry/GTK work, tracked).
Hermes WebUI Desktop v0.3.0
Added
- Auto-update (the Sparkle-parity feature). The app now checks GitHub Releases
about ten seconds after launch — silently unless an update actually exists — and
on demand via Check for Updates… (app menu on macOS, the tab bar's ⋯ menu on
Windows/Linux). When a new version is found you get a native "Install and
Relaunch / Later" prompt; the download is verified against a signing key pinned
in the app before anything is installed. Coverage: Windows installer builds
(the installer runs and relaunches), Linux AppImage (replaced in place),
and macOS (.app replaced in place)..debinstalls can't self-update by design —
the interactive check tells those users to grab the new package from Releases.
Release builds now ship signed updater artifacts and alatest.jsonmanifest;
because releases are published from drafts, installed apps only ever see
smoke-tested builds. This release is the first carrying the manifest, so
v0.3.0 is the last manual download — every release after this arrives
in-app.
Hermes WebUI Desktop v0.2.0
Added
- Tabs on Windows and Linux (tester report: "there's no indicator that there is
a functionality for new tabs or windows"). Every window now has a browser-style
tab bar: + orCtrl+Topens a tab, click to switch, hover × /
middle-click /Ctrl+Wcloses,Ctrl+Tab/Ctrl+Shift+Tabcycle, and tab
titles follow the active conversation (same "— Hermes"-stripping pipeline as the
macOS native tabs). Each tab is its own live webview — switching tabs never
reloads the page or interrupts a streaming response, matching what macOS gets
from one-WKWebView-per-native-tab. Built on Tauri's multi-webview support: the
window hosts a 38px shell strip plus one content webview per tab; the strip is a
bundled page with full IPC while tab content keeps the event-emit-only
capability. The connection status (tunnel state with Reconnect, or the direct
health dot) moved from the injected page footer into the strip's status area. - A native ⋯ menu in the tab bar (Windows/Linux) — the discoverability surface
the first build lacked: New Tab, New Window, Reload, Find in Page, Zoom,
Preferences, Open in Browser and Quit, each listed with its keyboard shortcut, as
a real OS context menu. - prefs.json is seeded with the full default settings schema on first launch
(it previously showed{}until something was saved — Swift
seedDefaultsIfNeededparity).
Fixed
- Windows/Linux:
Ctrl+Tpreviously opened the new window at the OS default
position instead of cascading from the current one (superseded by real tabs, but
the cascade also applies toCtrl+Nwindows).