Hermes-Android Roadmap

August 27, 2026 · View on GitHub

Maintenance-focused Android wrapper for Hermes Web UI. The core wrapper is good as-is; product UI and workflow changes belong in Hermes WebUI.

Last updated: 2026-08-13


Status snapshot

SurfaceStatus
Secure WebView shellDone - HTTP/HTTPS navigation, host allowlist, hardened defaults
WebUI integrationDone - first-run WebUI URL setting, WebUI-owned dashboard config, session persistence, pull-to-refresh
WebView compatibilityDone - disables forced darkening, patches Android viewport-unit collapse, respects system-bar safe insets, uses browser-managed cache defaults, smooths reload rendering, restores touch-and-hold context-menu dispatch for conversation actions, and forces WebUI microphone input onto the Android-compatible MediaRecorder path
Official dashboard linkDone - Android no longer writes WebUI's Official Hermes Dashboard config, opens explicitly configured dashboard-origin requests in a Chrome Custom Tab with minimal browser UI, and avoids persisting dashboard pages as startup state
Android sharingDone - share-to-app intake for text and files
FilesDone - WebView upload/download integration
MicrophoneDone - allowlisted WebView audio capture with Android runtime permission plus WebUI MediaRecorder fallback
Local settingsDone - encrypted settings storage
Native navigationDone - WebUI-owned dashboard link integration and deep links
Server health probingDone - /api/status probe to distinguish server-down from content errors
Browser notificationsDone - WebUI Notification API bridge, Android runtime permission, notification channel, and trusted WebUI tap routing
App update alertsDone - shared settings/notification UX with build-selected Google Play or GitHub Releases update providers; Play shows "Update now" in-app update flow, GitHub uses stateful Check -> Download -> Install actions
Native distribution polishDone - app identity and signed GitHub APK plus Play AAB release automation are wired for local builds plus GitHub Actions
Google Play ProductionDone - approved for production release; shipping as v1.0.0
Maintenance postureStable - accept Android-wrapper fixes, compatibility updates, dependency updates, and release maintenance
Native feature expansionDeferred - revisit only for Android-specific needs with a clear WebUI/API boundary

Feature checklist

MVP shell

  • Secure WebView opens a configured Hermes WebUI URL
  • First-run WebUI URL prompt and settings surface
  • HTTP/HTTPS URL validation
  • Host allowlist for in-app navigation
  • External handoff for non-allowlisted HTTP/HTTPS links
  • Cleartext traffic permitted for configured HTTP deployments
  • Back handling and WebView history behavior
  • Pull-to-refresh
  • Default WebView HTTP/service-worker cache behavior
  • Loading, error, and offline states
  • Cookie-backed session persistence
  • Encrypted local settings

Android integration

  • File upload support
  • File download support
  • Microphone capture support for WebUI voice input
  • Browser notification permission and delivery bridge for WebUI alerts
  • Share-to-app intake for text
  • Share-to-app intake for files
  • Native launcher identity
  • Splash and app theme
  • WebUI-owned Official Hermes Dashboard setting
  • Official dashboard link route
  • Deep links (hermes://session/{id})
  • Server health probing
  • Camera capture in file chooser
  • Direct share-file auto-attach flow
  • Attachment progress and retry UX

Deferred Android-only ideas

These are not active priorities. Revisit only if a specific Android platform need justifies native work. WebUI layout, styling, animations, and product workflow changes should be made in Hermes WebUI instead.

  • Deep links and verified app links to Hermes routes
  • Server health probing to refine offline/error states
  • Server profile list for multiple Hermes hosts with encrypted storage, profile CRUD, readiness validation, and session-clearing profile switches
  • Optional biometric app lock before showing WebView
  • FCM push notification plumbing
  • Notification channel strategy
  • Notification click routing to allowlisted WebUI routes
  • Expanded native settings for theme, notifications, and profiles
  • Optional native sessions list (requires authenticated API access)
  • WebUI menu shortcuts for files, kanban, and status if needed
  • [~] Instrumentation tests run in CI/releases and cover Settings, WebShell recovery, and WebView compatibility; deep-link and intent-routing coverage remains open
  • Evaluate a Trusted Web Activity (TWA) variant rendered in real Chrome, gated on Hermes WebUI serving /.well-known/assetlinks.json (draft + fingerprint in assets/twa/); accept loss of native bridges and HTTPS-only verification before pursuing
  • Final package/application ID decision before first public release
  • Release signing automation docs and snippets
  • [~] Background continuity while app is backgrounded (Issue 10): Part A is complete; Part B ongoing activity notification and initial Part C tray approvals are implemented. Remaining work is focused on B4 lifecycle/manual validation and cross-client SSE/API contract hardening.

Native improvement proposals (2026-07-02, post code-review)

Wishlist from a line-by-line committee review. Full rationale and implementation sketches are captured inline below.

  • Decide and document the cleartext posture (A1, security): runtime-configured hosts cannot be injected into static network_security_config; retain global HTTP compatibility or add an explicit HTTPS-only mode
  • Optional TLS/certificate pinning for the configured host (A2, security)
  • Optional FLAG_SECURE + hide content in the app switcher (A3, privacy)
  • Biometric app-lock before WebShell with idle timeout (A4, security — concrete plan for the existing deferred idea)
  • [~] Close the residual in-app OAuth phishing surface (A5, security): the in-flow host chip and HTTPS downgrade rejection are implemented; a configurable trusted-IdP allowlist remains a product decision
  • Native "sign out & wipe" action for shared devices (A6): the duplicate partial reset was removed from native Settings; WebUI owns normal sign-out, while Android system Clear storage remains the complete local wipe
  • [~] Instrumentation tests (deep links, exported download host, allowlist) wired into CI (B1): all current instrumentation classes now run for Android changes and releases; the listed navigation/security cases remain to be added
  • Unit tests covering the committee fixes: update-APK host allowlist, gateway enabled absent/false, profile isActive derivation (B2)
  • [~] detekt/ktlint + Android Lint gate in CI (B3): Android Lint is required; detekt/ktlint remain open
  • App shortcuts for Settings + server switch (C1)
  • Direct Share targets to recent sessions (C2)
  • Predictive-back + per-app language polish (C3)

Maintenance work

IDPriorityStatusAreaTaskNotes
M-001As neededOpenPlatformKeep Android, Gradle, Kotlin, and dependency compatibility currentWrapper stability and Play distribution maintenance
M-002As neededOpenSecurityKeep WebView, URL policy, permissions, and encrypted settings behavior hardenedPreserve HTTP/HTTPS configured-host support and host allowlist enforcement
M-003As neededOpenBugfixFix Android-wrapper regressionsScope to WebView hosting, permissions, share/download, notifications, deep links, settings, and release flow
M-004As neededOpenReleaseKeep signed release automation currentMaintain alignment between Gradle metadata, keystore.properties.example, and GitHub Actions secrets
M-005HighIn progressPlatformTriage and stage Issue 10 background-execution work (A/B/C phases)Part A is complete, Part B ongoing activity updates are implemented (with reconnect using /api/sessions/events plus polling fallback), and initial Part C tray approvals are implemented with queue-head validation through /api/approval/pending before /api/approval/respond; remaining scope is B4 lifecycle/manual validation plus broader cross-client payload/API contract hardening
UX-002MediumDoneSettingsServer health check before switchingTapping a saved non-current server now probes readiness first, shows reachable/auth-required/setup/offline/non-Hermes status, asks for confirmation before switching, blocks unsafe switches by default, and records safe diagnostic breadcrumbs for the check result
A-020-P2MediumDoneSettingsMulti-server profile storage (Issue #20 Phase 2)Encrypted profile persistence, versioned migration, profile CRUD, and active-server selection are implemented.
A-020-P3MediumDoneNavigationMulti-server profile switching (Issue #20 Phase 3)Switching validates readiness, clears prior WebView session state, rebuilds the active allowlist, and reloads the selected server without changing WebUI-owned dashboard config; broader instrumentation coverage remains under B1.

Completed work

IDDateAreaSummary
TEST-0052026-08-26CI / DocumentationAdded documentation checks for Markdown rendering breaks, dead in-repo links, and external URLs, and gave documentation-only pull requests a fail-safe fast path that skips the Gradle jobs while keeping README release-metadata assertions running.
TEST-0042026-08-26CI / TestingSplit PR CI into per-check jobs (release tooling, unit tests, Android Lint, debug APK) so a failure names the gate that broke, added job timeouts, and introduced syntax plus ESLint runtime-error gates for the JavaScript Android injects into the WebUI WebView.
REL-0282026-08-26Release / CIReworked release orchestration to build immutable reviewed versions, pin external actions, generate linked GitHub/Play changelogs once, validate retry metadata against the originating run, and verify APK/AAB signatures before publishing.
TEST-0032026-08-26CI / TestingExpanded QA with release-tool/workflow contract tests, Android API 35/36 instrumentation gates, share/deep-link/manifest/notification contracts, duplicate-profile rules, and deterministic GitHub update parsing.
BUG-0482026-08-26SettingsPrevented profile edits from creating duplicate server names or normalized URLs, matching the existing add-server invariant.
CLEANUP-0052026-08-26Settings / MaintenanceReorganized native Settings into task-based Servers, Application, Updates, Connection, Privacy, Troubleshooting, Advanced, and About sections; moved PKCS#12 client certificates into an Advanced detail dialog; removed the duplicate partial session reset and its unreachable APIs; and deleted superseded Issue 43 planning files.
BUG-0472026-08-26SecurityMade malformed or keyless PKCS#12 client-certificate files fail closed instead of throwing through the WebView callback, selected the first usable private-key entry, and removed the unsupported PEM claim from Settings.
TEST-0022026-08-26CI / TestingMade Android Lint a required CI gate, expanded PR instrumentation triggers to every Android source/build change, and removed hand-maintained class filters so all current and future instrumentation tests run before merge and release.
SEC-0032026-08-26SecurityCentralized WebView route/source/target/permission decisions in a unit-tested WebTrustPolicy and preserved public-IP OAuth scheme upgrades without allowing HTTPS callbacks to downgrade to HTTP.
BUG-0462026-08-26WebViewHardened Issue #92 dialog compatibility: initial autofocus is suppressed per Clarify request (including visible in-place replacements), validation refocus plus real touch/Tab input remain available, prompt geometry is shifted and capped inside the keyboard-constrained visual viewport, generic collapse repair preserves original overflow, and attached-WebView behavior tests now gate PRs and releases.
BUG-0452026-08-26WebViewFixed Issue #90 by narrowing dialog keyboard suppression to programmatic autofocus, allowing explicit taps to focus and type into editable modal fields such as the workspace new-folder name input.
SSE-0012026-08-09Background continuityClarified the native SSE settings and notification status: Android keeps its persistent authenticated /api/session/stream preference when optional gateway extras are unavailable, presents that distinction clearly, and logs the safe active transport state for diagnostics.
A-0012026-06-19BuildFixed Java/Gradle setup and verified test plus assembleDebug
A-0022026-06-19SecurityAdded URL policy validation and tests
A-0032026-06-19ToolingAligned AGP/Gradle to avoid Gradle 10 deprecation pressure
A-0042026-06-19UIMigrated deprecated accompanist swipe refresh to Compose pull refresh
A-0122026-06-20NavigationSuperseded native drawer experiment for Dashboard Terminal route
DOC-0012026-06-20DocsCleaned README and created this roadmap as the progress and wishlist tracker
BRAND-0012026-06-20BrandingRenamed APK output to hermes-android; replaced placeholder icon with Hermes WebUI caduceus (vector + density PNGs); icon background aligned to WebUI dark #1a1a1a
COMPAT-0012026-06-20Android compatibilityGuarded share-intent parcelable parsing across pre- and post-Android 13 APIs
A-0142026-06-20ReleaseFinalized package ID and namespace as com.hermeswebui.android before first public release
A-0052026-06-20Deep linksAdded hermes://session/{id} intent filter; navigates WebView to {serverUrl}/{id} per WebUI route contract
API-0012026-06-20API integrationAdded HermesApiClient probing /api/status (public endpoint) on WebView errors to distinguish server-down from content errors
NAV-0012026-06-20NavigationReworked native drawer with WebUI route sections (Chat, Skills, Artifacts, Agents, Scheduler, Messaging); replaced floating button with compact hamburger-in-card trigger
NAV-0022026-06-20UI integrationAdded hamburger-hiding DOM shim + user toggle to avoid visual conflict between native drawer and WebUI menu button; gracefully degrades if WebUI markup changes
NAV-0032026-06-20NavigationRemoved the temporary native drawer and menu-hiding shim; seeded WebUI's Official Hermes Dashboard config instead of adding a custom Android Terminal button
BUG-0012026-06-20UIFixed unreadable text by applying an explicit native color scheme and disabling WebView algorithmic darkening
BUG-0022026-06-20WebViewFixed Hermes WebUI text/content visibility by injecting a measured viewport-height shim when Android WebView computes 100dvh as 0px
BUG-0032026-06-20UIAdded safe-drawing system insets so WebView content and native controls do not overlap status or navigation bars
BUG-0042026-06-20NavigationFixed dashboard redirect/blue-screen recovery by normalizing stored dashboard URLs to their origin, opening dashboard-origin new-window requests in Chrome Custom Tabs, and preventing dashboard pages from becoming app startup state
BUG-0052026-06-20PermissionsFixed Android WebView dictation false-denied behavior by normalizing permission-request origins and allowing trusted main-frame fallback for null/opaque origins while still granting audio capture only
BUG-0062026-06-20PermissionsAdded Android MODIFY_AUDIO_SETTINGS permission because WebView Chromium microphone capture on emulator/device can fail device selection without it even when RECORD_AUDIO is granted
CLEANUP-0012026-06-20CleanupRemoved temporary microphone diagnostic logging/hooks from MainActivity after validation and kept only production microphone compatibility handling
CLEANUP-0022026-06-20ResourcesReplaced environment-specific default endpoint strings with placeholder HTTPS origins, removed unused strings/colors resources, and merged launcher XML resources out of unnecessary mipmap-anydpi-v26
SEC-0012026-06-20PlatformAdded Android 12+ data_extraction_rules configuration and wired it in AndroidManifest.xml while preserving allowBackup=false
BUILD-0022026-06-20ToolingUpgraded Gradle wrapper to 9.6.0, Kotlin to 2.4.0, AndroidX/Material dependencies to latest stable set, and moved app compile/target SDK to 37; lint now reports no issues
REL-0012026-06-20ReleaseUpdated Android app version metadata to 0.1.1 and incremented versionCode for the v0.1.1 release
BUILD-0012026-06-20ToolingMigrated AGP config to built-in Kotlin, removed legacy compatibility flags, and eliminated obsolete variant API plus dependency-constraints sync warnings
PERM-0012026-06-20PermissionsAdded Android RECORD_AUDIO plus an allowlisted WebView audio-capture permission bridge so WebUI microphone input can prompt and grant correctly
PERM-0022026-06-20PermissionsAdded a document-start WebUI microphone fallback flag for the configured Hermes origin so Android WebView skips the unreliable Web Speech API path and uses MediaRecorder/getUserMedia
SEC-0022026-06-20SecurityRelaxed URL policy to allow configured HTTP or HTTPS Hermes hosts while retaining host allowlist checks and non-web scheme blocking
UX-0012026-06-20SettingsChanged the first-run server URL sample from prefilled text to placeholder text that disappears on focus
REL-0022026-06-20ReleaseRenamed app to "Hermes WebUI" (Play Store branding), updated version to 0.1.2, and built hermes-android-v0.1.2-pre-release.apk for GitHub release and device testing
NOTIF-0012026-06-21NotificationsAdded Android-backed WebUI browser notifications with POST_NOTIFICATIONS, a native channel, a scoped WebView Notification API bridge, service-worker notification fallback, and allowlisted notification tap routing
REL-0032026-06-21ReleaseUpdated Android app version metadata to 0.1.3-pre-release with versionCode 4 for the next pre-release build
REL-0042026-06-21ReleaseChanged distribution artifact staging to use hermes-webui-v<version>.apk for GitHub and hermes-webui-v<version>.aab for Google Play instead of repository-name filenames
A-0112026-06-21ReleaseAdded local keystore.properties plus GitHub Actions secret-based signing so release APK/AAB builds fail fast unless they are signed and ready for distribution
CLEANUP-0032026-06-21BuildMoved staged release artifacts from root release/ into ignored build/release/ and ignored legacy root release outputs
REL-0052026-06-21ReleaseUpdated signed release workflow actions to Node 24-compatible majors to avoid GitHub Actions Node 20 deprecation warnings
REL-0062026-06-21ReleaseIncremented Android app version to 0.1.4-pre-release with versionCode 5 for the long-press menu fix validation build
PERF-0012026-06-21WebViewMade WebView and service-worker cache defaults explicit, advertised the real app version in the user agent, and kept rendered content visible during reloads after the first successful page load
CLEANUP-0042026-06-21CleanupRemoved stale in-code phase-2 TODOs already tracked in the roadmap, dropped unused Compose test catalog/debug references, and restored keystore.properties.example for documented signing setup
BUG-0072026-06-21WebViewAdded a Hermes-origin-scoped touch-and-hold compatibility shim that dispatches contextmenu so conversation long-press action menus appear in Android WebView like mobile browsers
BUG-0082026-06-21WebViewFixed invisible conversation long-press menus (Issue 6): Android WebView evaluates CSS 100vh as 0, collapsing the WebUI floating-menu max-height: calc(100vh - 16px) to a ~2px sliver. Re-capped .session-action-menu/.workspace-prefs-menu max-height with the measured viewport height in the existing viewport shim. Root-caused via on-device DevTools/CDP inspection after ruling out touch-cancel, z-index, stacking, and opacity; reverted those earlier wrong attempts
BUG-0092026-06-22WebViewFixed Issue 7 by removing Android's /api/dashboard/config write path and blanking the bundled dashboard default so opening WebUI from Android no longer changes WebUI's Official Hermes Dashboard setting from Auto-detect to Always show
REL-0072026-06-22ReleaseUpdated Android app version to 0.1.5 with versionCode 6; created debug build variant that displays app name as "Hermes DEBUG" to distinguish test builds from official releases; deployed to emulator for testing
BUG-0102026-06-22Data migrationFixed Issue 7 persistence: Added app startup migration that clears old dashboard URL from SharedPreferences on upgrade so users updating from pre-0.1.5 versions don't retain the stored dashboard URL that was previously being written to WebUI /api/dashboard/config; migration includes versioning for future data schema updates
BUG-0112026-06-22WebViewFixed Issue 5 cold-start workspace restore by persisting client-side route/history updates via WebView visited-history callbacks, so the app reopens the active Hermes session route after process death instead of falling back to a stale root URL that can show an empty workspace panel until manual re-selection
BUG-0122026-06-22WebViewAdded a resilient Issue 5 fallback: on the configured WebUI origin, if the workspace toggle is tapped from a blank root state and the panel still remains hidden, Android redirects to the last known trusted in-app session route so WebUI can rehydrate workspace state instead of no-oping
REL-0082026-06-23ReleaseUpdated Android app version metadata to 0.1.6 with versionCode 7; narrowed GitHub release automation to build and publish only hermes-webui-v0.1.6-github.apk, with tag/version validation before release upload
REL-0092026-06-23ReleaseAdded a separate manual GitHub Actions workflow (.github/workflows/play-aab.yml) that builds/signs a release AAB, renames it to hermes-webui-v<version>.aab, and uploads it as an artifact for manual Google Play Console upload until automated Play publishing is wired
REL-0102026-06-22ReleaseIncremented Android app version metadata to 0.1.7 with versionCode 8 and documented release-note scoping so app releases summarize runtime/app changes only (excluding workflow-only and docs-only updates)
BUG-0132026-06-22UIFixed Issue 8 by adding an Edit server URL recovery action to the native error screen so users can reopen Settings and correct a bad saved Hermes server URL without clearing app data
REL-0112026-06-22ReleaseUpdated Android app version metadata to 0.1.8 with versionCode 9
BUG-0142026-06-22Android compatibilityFixed WebUI update-notification generated summaries rendering as a clipped/non-scrollable sliver in Android WebView by restoring vertical page scrolling and re-capping the update summary panel's max-height: min(34vh, 260px) with the measured viewport height because Android WebView was collapsing that vh max-height to 0px
REL-0122026-06-23ReleaseWired .github/workflows/play-aab.yml to upload the signed hermes-webui-v<version>.aab artifact to the Google Play internal testing track using the configured Play service-account secret
REL-0132026-06-23ReleaseSplit GitHub APK builds into a separate github release build type with applicationIdSuffix = ".github" and versionNameSuffix = "-github" so sideloaded GitHub builds can install beside Google Play builds
BUG-0152026-06-23WebViewFixed Issue 9: added bounded auto-retry loop on server error — polls /api/status with 1 s → 2 s → 4 s → 10 s cap backoff for up to 60 s, auto-reloads when server comes back, shows "Reconnecting…" on the error screen, cancels cleanly on manual Retry / new navigation / settings save
REL-0142026-06-23ReleaseEnhanced .github/workflows/release.yml GitHub Release notes: each release now includes explicit build metadata (version/tag, commit SHA, APK filename, SHA-256, workflow run URL) followed by generated GitHub notes, for both create and update paths
REL-0152026-06-23ReleaseConsolidated release automation into numbered workflows: 1-orchestration-release.yml builds both signed artifacts, then fans out to 2-publish-github-apk.yml for GitHub Releases and play-store-beta-manual.yml for optional Google Play open testing
REL-0162026-06-23ReleaseAdded release workflow concurrency, exact-one artifact validation guards, and RELEASE.md operator guidance for manual publish retries
REL-0172026-06-23ReleaseAdded Play Store What's New changelog generation from the same GitHub generated release notes used for GitHub Releases
A-020-P12026-06-23SettingsImplemented Phase 1 of multi-server profile support (Issue #20): added native "Application Settings" entry point in Hermes WebUI sidebar below Help via WebView document-start shim, wired hermes://app/settings deep link handling to open native settings bottom sheet, injected phone-outline SVG icon for visual consistency, and validated with unit tests and emulator deployment
BUG-0162026-06-23NavigationFixed back button closing app on first press: implemented "press back again to exit" pattern that requires two back presses within 2 seconds to close app when no WebView history is available, prevents accidental app closure from stuck states, and shows "Press back again to exit" toast on first back press
BUG-0172026-06-23SettingsTightened multi-server add flow: server profile creation now rejects duplicates by normalized URL and case-insensitive name, and the Add Server dialog explicitly prompts for an optional friendly name while preserving URL fallback when blank
REL-0182026-06-23ReleaseUpdated Android app version metadata to 0.1.9 with versionCode 10
DOC-0022026-06-23DocsAdded Issue 10 execution planning docs: ISSUE_10_BACKGROUND_EXECUTION_WORKPLAN.md for staged delivery and ISSUE_10_STAGE0_DISCOVERY.md for Stage 0 contract/guardrail tracking
A-010-P12026-06-23LifecycleCompleted Issue 10 Part A resume polish: quick background/resume disconnects now keep the last rendered WebView content visible briefly while bounded reconnect probing runs, fall back to the native error screen as soon as the grace window expires, and resume reconnect polling cleanly across app background/foreground transitions
A-010-P22026-06-23LifecycleExtended Issue 10 Part A with a bounded background reconnect hold: if the app backgrounds while auto-reconnect is already running, Android starts a temporary dataSync foreground service and ongoing "Reconnecting to Hermes" notification so the 60 s retry loop is not canceled immediately on onStop
DBG-0012026-06-23TroubleshootingAdded opt-in debug logging capture toggle in native settings that runs as a foreground service with persistent notification, one-tap Stop action, and app-private logcat file capture for troubleshooting while minimizing app-switch diagnostics gaps
REL-0192026-06-24ReleaseManual orchestration releases now auto-bump appVersionName from the latest published tag before building, and Gradle derives versionCode from semantic version to keep release numbering monotonic without separate manual edits
REL-0202026-06-24ReleaseBumped Android app version metadata to 0.1.11 with derived versionCode 111 for the next GitHub + Play Store release
REL-0212026-06-24ReleaseBumped Android app version metadata to 0.1.12 with derived versionCode 112 for the next device test and GitHub + Play Store release
REL-0222026-06-25ReleaseUpdated checked-in Android app version metadata to match the currently published 0.1.15 / versionCode 115 release
REL-0232026-06-25ReleaseEnabled release native debug symbol table packaging so Play Console can symbolicate native crashes and ANRs from bundled native libraries
REL-0242026-06-25ReleaseManual orchestration releases now commit the auto-bumped Android version and README release metadata back to main, then publish artifacts from that version-bump commit so local builds stay aligned with the latest published release
REL-0252026-06-25ReleaseSynced checked-in Android app version metadata to the published 0.1.16 / versionCode 116 release so local builds match the latest internal testing build until the next automated bump
REL-0272026-07-22ReleaseUpdated orchestration fan-out to publish Play production by default (1 -> 2 + 3) and moved Play beta publishing into play-store-beta-manual.yml so it remains manual/optional for later testing
A-010-P32026-06-24LifecycleEnabled native SSE-backed reconnect transport for Issue 10: Android now probes lightweight Hermes WebUI /api/sessions/events for reconnect detection when the SSE toggle is on, falls back to /api/status polling when the stream is unavailable, and updates SSE support messaging to match current WebUI probe semantics
A-010-P42026-06-24NotificationsExtended the reconnect foreground service to consume authenticated Hermes WebUI /api/session/stream events for the active session when available, updating the ongoing background notification with summary/progress text and trusted tap targets instead of leaving it static
A-010-P52026-06-24NotificationsBroadened Issue 10 Part B into an opt-in ongoing background activity notification: the foreground service can now stay alive for trusted session routes while the app is backgrounded, reflects approval/failure/completion SSE events in addition to summaries, and exposes a user-controlled lock-screen redaction toggle for notification body text
A-010-P62026-06-24NotificationsImplemented Issue 10 Part C tray approvals: when Hermes emits approval_required with an approval_id, Android adds allow/deny notification actions, re-checks the queue head through /api/approval/pending, submits /api/approval/respond only for the matching active request, and rejects stale or duplicate taps fail-closed
BUG-0182026-06-24SettingsAdded a Hermes server-readiness preflight before first-run save, profile add/edit, and profile switching: Android now probes /api/status and rejects unreachable servers, HTTP/HTTPS mismatches, setup-mode responses, and non-Hermes pages instead of persisting a URL that traps the app on launch
BUG-0192026-06-24SettingsAdded inline settings validation state plus startup recovery for persisted servers: Android now surfaces “checking server” / error copy inside settings, and if the saved Hermes URL later becomes invalid or falls back into setup mode at launch, the app reopens settings immediately instead of driving WebView into a dead-end load
A-0062026-06-24FilesAdded direct camera capture support for WebView file uploads when the page requests image capture, using a temporary FileProvider-backed photo URI returned to the chooser callback
BUG-0202026-06-24AuthenticationFixed Issue 12 self-hosted OIDC login by tracking the authorization request redirect_uri and keeping popup auth flows alive until that exact callback returns a code or error, instead of guessing from provider-specific URL patterns
BUG-0212026-06-25SettingsFixed Play tester startup recovery for auth-protected Hermes servers: /api/status 401/403 responses no longer masquerade as initialization failures when the root page fingerprints as Hermes, reconnect liveness treats authenticated status responses as reachable, and already configured servers can continue into WebView sign-in instead of being trapped by native startup validation
BUG-0222026-06-25SettingsStopped the first-run / add-server / edit-server preflight from blocking auth-protected Hermes deployments: a 401/403 from /api/status on a reachable host is now treated as a healthy sign-in-required server and is saved immediately with a "sign in on the Hermes page to finish" toast, instead of trapping the user behind the readiness check. Also surfaces the full HTTP diagnostic block (status, content-type, server header, body snippet) under the readiness error and adds a recovery dialog with "Open in browser" + "Add/Save/Switch anyway" escape hatches for the remaining failure modes
BUG-0232026-06-25SettingsAdded per-server "Don't ask again for this server" opt-out on the server-switch "Sign-in required" confirmation: once ticked, future switches to that URL skip the prompt and load straight into the Hermes sign-in page; the silenced URL is cleared automatically when the server profile is deleted
DBG-0022026-06-25TroubleshootingDebug-build only: auto-start logcat capture in MainActivity.onCreate before any other startup work via a new DebugLogBootstrap so a crash or permission denial during launch is still captured to the same debug-logs/ directory the foreground service manages; added a draggable floating "Save log" button overlay that one-tap shares the latest captured log via the Android share sheet. No-op on release builds
BUG-0242026-06-26AuthenticationHardened Issue 12 OIDC routing: trusted authorization code-flow redirects whose redirect_uri returns to the configured Hermes WebUI origin now stay in-app even when the provider opens top-level pages, and verified callbacks load back into the primary WebView before dashboard Custom Tab matching can externalize them
BUG-0252026-06-27SettingsMoved the injected WebUI "Application Settings" entry to anchor after the regular WebUI Settings item, with Help only as a fallback, and exported hermes://app/settings as a native recovery route for stuck WebView states
REL-0262026-06-28ReleaseAdded native app update alerts for both release channels: Play builds check Google Play in-app update availability, GitHub APK builds check the latest GitHub Release with What's Changed text plus direct APK download, and both alert through the existing Hermes updates notification channel
BUG-0262026-07-03WebView / SettingsFixed Issue 38 extension compatibility by replacing the aggressive Application Settings sidebar shim with a lightweight clone-based injector that preserves sidebar layout while avoiding extension-item suppression; hardened Android WebView viewport repair so Theme Creator no longer collapses to a sliver, and added a back-button safety ladder that opens native Application Settings before final app exit when no in-app history remains
BUG-0272026-07-13WebViewFixed Issue 44 by re-capping the expanded mobile approval panel's max-height: min(60dvh, 420px) with a measured pixel height on narrow Android WebView viewports, restoring the approval details and action buttons while preserving the intentional collapsed header-only dock
BUG-0282026-07-20PermissionsFixed Issue 49 regression on OEM Android 16 builds where ACCESS_LOCAL_NETWORK requests can deny without exposing a user-togglable grant path: LAN startup/save/switch flows now treat the permission prompt as best-effort and still attempt the first WebView load, while the existing ERR_LOCAL_NETWORK_PERMISSION_MISSING recovery path remains the enforcement fallback for platforms that do require the grant
BUG-0292026-07-22WebViewReplaced the whack-a-mole viewport fix approach (20+ explicit CSS selectors) with a hybrid viewport polyfill using generic collapse detection: injects CSS custom properties (--vh, --dvh) with measured pixel values, applies baseline CSS for root/layout containers, and automatically finds/repairs ANY element collapsed by the Android WebView vh=0 bug using heuristics (tiny height + large scrollHeight + interactive content). Includes performance guards (MAX_REPAIRS=50, MIN_INTERVAL=100ms) and automatic cleanup when elements recover. Eliminates future Issue 6/44/53-style sliver UI regressions without needing new selectors
BUG-0302026-07-24Settings / ConnectivityAdded an opt-in VPN startup guard for Tailscale-addressed Hermes servers: when enabled, startup/save/switch loads for *.ts.net and Tailscale CGNAT/ULA endpoints require an active Android VPN transport, and the app attempts to open Tailscale (or VPN settings) before showing inline recovery guidance
BUG-0312026-07-24UpdatesImproved channel-specific update UX to avoid website/store-page detours: GitHub channel notifications now start direct APK download, prompt Android installer after completion, and clean up staged APKs after installer handoff; Play channel keeps using Google Play Core immediate in-app update flow
BUG-0322026-07-24Updates / ConnectivityFixed GitHub APK post-download install handoff by auto-launching installer only while Hermes is foregrounded and otherwise posting an install-ready notification that re-enters Hermes and starts install; also hardened VPN transport detection to check all networks and added an optional custom VPN app package fallback before Android VPN settings
BUG-0332026-07-25Settings / ConnectivityFixed VPN guard startup ordering so Tailscale server launch attempts open the VPN app before server readiness preflight can fail, and declared Android package-visibility queries so the searchable VPN app picker can find installed launcher apps on Android 11+
BUG-0342026-07-25Updates / ConnectivityRefined VPN/update recovery UX: while VPN guard blocks a Tailscale server, Hermes keeps a short-timeout /api/status probe running every second across the Tailscale app handoff, then auto-resumes pending server load only after VPN transport and the server are both ready. It sends Tailscale's exported com.tailscale.ipn.CONNECT_VPN broadcast as a best-effort auto-connect trigger before app/settings fallback. GitHub update flow now preserves an explicit in-app Check -> Download -> Install button progression and no longer auto-launches installer immediately on foreground download completion.
BUG-0352026-07-25ConnectivityFixed Tailscale recovery: Hermes now asks Tailscale to connect while remaining visible, retries the pending server load automatically, and only opens Tailscale/VPN settings after a 10-second auto-connect grace period. It dismisses Settings and reloads Hermes once VPN plus server are ready, posts a ready notification when the fallback app remains foregrounded, and routes pull-to-refresh, Retry, reconnect events, and current-server taps through the VPN-aware loader.
BUG-0362026-07-28Android compatibilityFixed approval gates and quoted approval context repeatedly expanding and collapsing in Android WebView by retaining generic viewport repairs while the affected panel remains visible; the repair now refreshes on viewport changes and releases only after the panel is hidden.
BUG-0372026-08-01AuthenticationFixed Issue 54 PocketID SSO usability: enabled AndroidX WebKit WEB_AUTHENTICATION_SUPPORT_FOR_APP on main/popup WebViews for passkeys, improved touch-to-focus handling so keyboard input reliably opens on code-entry forms, and temporarily enables third-party cookies only while an OAuth flow is active to preserve federated sign-in compatibility without broadening baseline cookie policy.
BUG-0382026-08-01UIFixed Issue 55 light-theme system bar contrast by applying theme-aware status bar icon appearance at runtime (dark icons in light mode, light icons in dark mode), so Android status bar text/icons remain readable over the WebView shell background.
BUG-0392026-08-09Settings / ConnectivityFixed Issue 61 false "UNREACHABLE" classification by hardening server readiness probing: when /api/status fails with a transport exception, Android now probes the root page and accepts Hermes fingerprint matches as reachable before failing closed. Also improved loopback diagnostics so localhost/127.0.0.1 clearly explain that they target the Android device itself and should be replaced with a LAN host/IP.
BUG-0402026-08-09WebViewFixed Issue 59 blank main-pane text regression by refining the Android viewport polyfill chat-surface guard: the script now keeps descendant chat nodes excluded (to avoid per-message style churn) but allows the top-level .messages container itself to be repaired when collapsed by the WebView vh/dvh bug. This restores visible conversation content while retaining anti-flicker behavior.
BUG-0412026-08-13AuthenticationReplaced the incomplete Issue 66 one-navigation OAuth callback workaround with a bounded, testable return-flow state that covers popup callbacks, callback detection through either WebView callback ordering, multi-step 302/JavaScript redirects, and final-page completion. Same-origin OAuth returns stay in the primary WebView, callback URLs are never persisted, and dashboard routing resumes after the final Hermes page finishes. Installed the WebUI viewport polyfill at document start so post-login boot code cannot measure the vh/dvh root before Android repairs it.
BUG-0422026-08-21Background continuityFixed Issue 75 SSE capability check on password/OIDC-protected servers: the /api/status, gateway-probe, and /api/sessions/events probes now attach the WebView session cookie (explicit parameter with a guarded CookieManager fallback, matching the authenticated /api/session/stream pattern), and HTTP 401/403 probe responses classify as the new SseCapability.AUTH_REQUIRED state — capability unverified, transport preserved — instead of NONE disabling the SSE transport with a failure toast
BUG-0432026-08-23WebViewFixed Issue 80 Clarify multiple-choice panel clipped behind the composer in Android WebView: the panel's max-height: clamp(180px, min(68vh, calc(100vh - 220px)), 420px) collapsed because WebView evaluates vh units as 0, and the generic collapse repair re-capped it to a viewport-derived height that ignored the app titlebar/composer and could also repair the intentionally zero-height .composer-flyout anchor, shifting the card down behind the composer. The viewport polyfill now re-caps the expanded approval/clarify panel to the measured space between the .app-titlebar bottom and the card's anchor-invariant bottom edge (which tracks the composer, not the panel height) minus an 8px gap, floored at the WebUI clamp's 180px minimum, via !important rules on the card and its inner scroller, and excludes the prompt cards plus the flyout anchor from generic repair so the measured geometry cannot oscillate. Verified on emulator via WebView DevTools/CDP injection of the real showClarifyCard() path: card renders at full 420px in portrait and landscape with all choices reachable and oversized content scrolling internally
UX-0032026-08-23WebViewIssue 83: when a hardware keyboard is attached (Bluetooth/USB/host), a plain Enter in the composer now sends the message and Shift+Enter inserts a newline (desktop convention), instead of forcing a newline and requiring a Send tap. The Issue #34 Enter→newline shim now reads a live window.__hermesAndroidHardwareKeyboard flag at keydown time and defers to WebUI's native handling when set; MainActivity detects attachment via Configuration.keyboard/hardKeyboardHidden and re-syncs the flag on page load and onConfigurationChanged. Soft-keyboard behavior (Enter=newline) is unchanged. Verified on emulator: a trusted Enter sent the message (the agent replied), and forcing the flag off restored newline insertion
BUG-0442026-08-23SettingsFixed Issue 81 Settings screen crashing instantly on open in v1.0.24: the reconnect polling-interval description passed a R.plurals quantity-resource ID to stringResource, which throws Resources.NotFoundException during composition. Switched to pluralStringResource and added an instrumented SettingsScreenTest regression that renders the screen at quantities 1 and 2 and asserts both singular/plural descriptions, so the crash is caught by the androidTest lane before release