Date: 2026-07-14
Service: EventHorizon
Production image: gitea.app.lan/eventhorizon/eventhorizon:sha-4a4b3304440b
Image digest: sha256:6e8de6d26b33981a3438d7d672d0e615d17340154d625e14e94b2c913eaf3740
EventHorizon now publishes a native Android WebView application from the website menu.
https://eventhorizon.app.lan/downloads/android/eventhorizon.apkhttps://eventhorizon.app.lan/downloads/android/update.json1.0.2169 (versionCode 2169)1d392e3acdd26019b4ea4a0b05f24ee36012fe2e67294c7f55a96e73c56498a2fc8061b, 6168c9b, 753b6a4, c7652fd, 4a4b330The client checks at launch and through a persisted six-hour Android job. It downloads newer APKs with Android DownloadManager, requires a same-origin APK URL, verifies the metadata SHA-256 digest, and submits the APK through PackageInstaller.
Ordinary unmanaged Android devices require a one-time “install unknown apps” grant and user confirmation for every update. Silent installation requires a device-owner, managed, or privileged installation.
The release certificate is RSA 4096:
CN=EventHorizon Android Release, OU=EventHorizon, O=EventHorizon, L=Internal, C=DE6835064e331c0dcc0382475a4d4d3b7d493da4685742d512c19b93c27abd1beaGitea Actions secret names:
ANDROID_KEYSTORE_BASE64ANDROID_KEYSTORE_PASSWORDANDROID_KEY_ALIASANDROID_KEY_PASSWORDLocal recovery material is outside Git at:
/home/ax_julian/.codex/secrets/eventhorizon-android-release.jks/home/ax_julian/.codex/secrets/eventhorizon-android.envDo not rotate or lose this key. Android rejects updates signed by a different key.
/healthz and /readyz returned HTTP 200.update.json.apksigner verify --verbose --print-certs passed with one signer.Version 2165 was published before the PackageInstaller output stream lifecycle correction. Its automatic submission can terminate with SecurityException: Files still open. Affected clients can recover by downloading and installing the current signed APK from the website. Version 2167 and later contain the corrected installer flow and update automatically.
Rollback the service image through the repository-managed deployment workflow. Do not publish an APK with a lower versionCode; Android will reject it as an update. Preserve the signing key for every future APK.
A user reported that Android version 2169 opened to a permanently black surface. The native wrapper was treating the empty HTML shell as loaded before the WebAssembly frontend had populated #app. Network, TLS, HTTP, renderer, and frontend-startup failures were therefore indistinguishable from the normal dark background.
Commit 9286636 and Android version 1.0.2171 changed startup behavior:
#app contains rendered UI.EventHorizonWeb log tag.Verification used Android 15 in both disconnected and connected states. The disconnected test displayed the network error and Retry control; restoring connectivity and retrying rendered the existing game session. The exact production 2171 APK then passed a cold-launch test without a fatal exception.
Production image: gitea.app.lan/eventhorizon/eventhorizon:sha-9286636b4c95
Android version: 1.0.2171 (versionCode 2171)
APK SHA-256: d2e96bc325fde6559b981441bccb5cbfac4230ccd7c0a75540e82c5d3e822255