Switch the Play Store / Android runtime identity from
`com.hermesandroid.relay` to `com.axiomlabs.hermesrelay` as part of the
move from a personal Play Console account to the Axiom-Labs, LLC
DUNS-verified org account. The Kotlin namespace stays at
`com.hermesandroid.relay` — `namespace` and `applicationId` are
decoupled, so all 130+ source files, class FQCNs, Class.forName
lookups, and broadcast action strings keep working unchanged.
Why: the DUNS-verified org account is exempt from Google Play's 14-day
/ 12-tester closed-testing rule that applies to new personal dev
accounts, unblocking straight-to-production rollout. Play Store
package names are permanently reserved once used, so the old
`com.hermesandroid.relay` listing on the personal account is being
retired rather than transferred.
Changes:
- app/build.gradle.kts: applicationId → com.axiomlabs.hermesrelay;
update flavor-split + migration comments
- scripts/dev.{bat,sh}: `adb shell am start` now uses explicit FQCN
`com.axiomlabs.hermesrelay/com.hermesandroid.relay.MainActivity` —
the `.MainActivity` shorthand breaks once applicationId ≠ namespace
- README.md, user-docs/guide/{getting-started,release-tracks}.md:
Play Store links → new package ID
- CLAUDE.md: split "Package" into explicit Namespace vs applicationId
entries documenting the decoupling
- RELEASE.md: rewrite Play Console section with Axiom-Labs org-account
context, 14-day-rule exemption, keystore-continuity note, and
historical migration callout
- build.gradle.kts: AGP 9.1.0 → 9.1.1 (Android Studio catalog update,
rolled in for convenience)
Runtime verification: FileProvider auto-follows via
`\${applicationId}.fileprovider`; BridgeViewModel's a11y service check
uses `ComponentName(ctx.packageName, A11Y_SERVICE_CLASS)` which adapts
at runtime; proguard `-keep class com.hermesandroid.relay.**` rule is
namespace-based and still matches. Upload keystore + SHA256 fingerprint
are preserved — existing GitHub Secrets need no changes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rename "Hermes Relay" -> "Hermes-Relay" across docs, app strings,
scripts, workflows, plugin, and relay server (~57 files)
- Redesign user-docs landing: install section moved above features
via home-hero-after slot (InstallSection.vue), hero image replaced
with phone-framed demo video that crossfades to brand logo after
12s of playback (HeroDemo.vue). Fix dead /guide/getting-started
links in raw HTML hrefs that VitePress base-rewriting skipped.
- Add chat demo to README, docs landing hero, and Getting Started's
Verify Connection section. Re-encode 20MB / 102fps source capture
to 1.95MB / 30fps with extracted poster frame for instant LCP.
- Add smooth auto-scroll for streaming chat with Settings toggle --
follows new tokens at the bottom, pauses when user scrolls up.
- Migrate SettingsScreen clipboard from deprecated LocalClipboardManager
to LocalClipboard suspend API (Compose 1.7+).
- Migrate scripts/screenshots from monolithic .bat to thin wrapper
+ screenshots.py for Play Store screenshot capture.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add user-docs/ VitePress site with Nothing-Inspired theme (purple brand),
Space Grotesk/Mono fonts, interactive Vue Flow architecture diagrams,
clean SVG feature icons (replacing emojis), and doc footer CTAs
- Rewrite README with centered header, shields.io badges, feature table,
Axiom-Labs attribution, and Ko-Fi support link
- Add relay_server/ (renamed from companion_relay/) with updated references
- Update all docs (spec, decisions, CLAUDE.md, AGENTS.md, DEVLOG.md) for
Hermes Relay rename and direct API architecture
- Add HERMES-WEBAPI-REFERENCE.md with full SSE event documentation
- Add CHANGELOG.md, RELEASE_NOTES.md, PR template, dependabot config
- Fix stale references: companion_relay → relay_server, API key now optional,
SSE events updated to Hermes-native names, token field names corrected
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Splash screen:
- Android 12+ SplashScreen API with wing-H icon on dark background
- installSplashScreen() before super.onCreate()
UX improvements:
- Wire onboarding Connect page URL into ConnectionViewModel (was local-only)
- Empty state for Chat screen when no messages + disconnected hint
- Insecure mode toggle in Settings — allows ws:// for local dev/testing
- Warning banner when connected over insecure ws://
- Insecure mode persisted in DataStore, logged with clear warnings
Build:
- ProGuard rules for kotlinx.serialization, OkHttp, Tink, Compose
- Stack trace preservation for release crash reports
Dev tooling:
- Self-signed TLS cert generator (scripts/gen-dev-cert.sh + .bat)
- relay-tls dev script command (auto-generates certs if missing)
- certs/ added to .gitignore
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>