Simplifies signing: the keystore is stored in the repo so every release
workflow run uses the same certificate. This fixes "App not installed"
when updating via GitHub releases.
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- Generate pixel10.keystore and store as KEYSTORE_BASE64 GitHub secret
- Release workflow decodes keystore and signs every APK with same key
- build.gradle.kts: signingConfig reads from env (CI) or local keystore
- Bump versionCode 8 / versionName 1.8.0
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
Delete GeminiCloudModel.kt entirely. All inference now runs through
Gemini Nano on the Tensor G5 TPU via ML Kit, with MediaPipe as fallback
for custom local model files. No data leaves the device.
- OnDeviceModel.create() reverts to Nano → MediaPipe chain, no apiKey param
- Removed: API key UI, SharedPreferences key storage, cloud model routing
- Removed: thinking mode (cloud-only feature)
- Removed: pixel10-fast / pixel10-thinking model IDs → single "pixel10" model
- /v1/models now reports honest on-device limits (4096 ctx, 1024 output)
- CI smoke test updated: installs APK on emulator and verifies package,
no inference tests (require real Pixel hardware with Tensor chip)
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
- Add GeminiCloudModel: proxies inference to Gemini 2.0 Flash via HTTPS
using HttpURLConnection (no new deps). Supports both blocking and SSE
streaming. Works from any context — background, emulator, CI.
- Fix background inference: OnDeviceModel.create() now accepts an apiKey;
when set, GeminiCloudModel is selected immediately, bypassing Gemini
Nano's foreground-only restriction. ApiServerService reads the key from
SharedPreferences at startup.
- Add API key UI: password field in MainActivity saved to SharedPreferences
before the service starts; disabled while server is running.
- Add GitHub Actions CI (.github/workflows/ci.yml): build job produces a
debug APK artifact; test job spins up a KVM-accelerated Android 31
emulator, installs the APK, writes the GEMINI_API_KEY secret into
SharedPreferences via adb run-as, starts the service, and runs curl
assertions against /health, /v1/models, /v1/chat/completions, and the
SSE streaming endpoint.
- Add release workflow (.github/workflows/release.yml): triggered on v*
tags, builds the APK and creates a GitHub Release with it attached.
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>