fix(client): use the Carol web icon for the Android app icon #305

Merged
james merged 1 commit from 303-android-app-icon into main 2026-06-26 23:41:18 +00:00
Owner

The Android app shipped with the default Expo launcher icon because app.json set no icon — so prebuild had nothing to generate Android mipmaps from. The web app/PWA, meanwhile, uses the blue Carol "C" (public/icon-512.png, declared maskable in manifest.webmanifest).

Fix

Wire the same icon into the native config in app.json:

  • expo.icon./public/icon-512.png (single source of truth shared with the web bundle — no separate asset to drift).
  • expo.android.adaptiveIcon.foregroundImage → the same icon, with backgroundColor: "#2f6bff" (the icon's own blue, matching the manifest theme_color). The icon's transparent rounded corners then mask seamlessly under any launcher shape (circle/squircle/rounded-square).

Verification

  • app.json valid JSON; expo config --type public resolves icon and android.adaptiveIcon correctly (no errors).
  • Visual confirmation needs a prebuild + Android build: the launcher icon should be the blue Carol "C", matching the PWA install icon.

Note: the source raster is 512×512 (Expo prefers 1024×1024). Adequate for Android launcher densities; a future option is rendering a 1024 PNG from assets/carol-icon.svg if we want extra crispness, but that's a separate enhancement and would risk drifting from the web icon.

Closes #303

🤖 Generated with Claude Code

The Android app shipped with the **default Expo launcher icon** because `app.json` set no `icon` — so prebuild had nothing to generate Android mipmaps from. The web app/PWA, meanwhile, uses the blue Carol "C" (`public/icon-512.png`, declared `maskable` in `manifest.webmanifest`). ## Fix Wire the same icon into the native config in `app.json`: - `expo.icon` → `./public/icon-512.png` (single source of truth shared with the web bundle — no separate asset to drift). - `expo.android.adaptiveIcon.foregroundImage` → the same icon, with `backgroundColor: "#2f6bff"` (the icon's own blue, matching the manifest `theme_color`). The icon's transparent rounded corners then mask seamlessly under any launcher shape (circle/squircle/rounded-square). ## Verification - `app.json` valid JSON; `expo config --type public` resolves `icon` and `android.adaptiveIcon` correctly (no errors). - Visual confirmation needs a prebuild + Android build: the launcher icon should be the blue Carol "C", matching the PWA install icon. Note: the source raster is 512×512 (Expo prefers 1024×1024). Adequate for Android launcher densities; a future option is rendering a 1024 PNG from `assets/carol-icon.svg` if we want extra crispness, but that's a separate enhancement and would risk drifting from the web icon. Closes #303 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(client): use the Carol web icon for the Android app icon
All checks were successful
Commits / Conventional Commits (pull_request) Successful in 10s
PR / OSV-Scanner (pull_request) Successful in 1m3s
PR / Static analysis (pull_request) Successful in 1m28s
PR / Client (web export smoke) (pull_request) Successful in 2m53s
PR / pnpm audit (pull_request) Successful in 3m15s
PR / OpenAPI (pull_request) Successful in 3m25s
PR / Package age policy (soft) (pull_request) Successful in 32s
PR / Trivy (image) (pull_request) Successful in 2m21s
PR / Test (postgres) (pull_request) Successful in 3m45s
PR / Lint (pull_request) Successful in 3m57s
PR / Build (pull_request) Successful in 3m56s
Secrets / gitleaks (pull_request) Successful in 40s
PR / Test (sqlite) (pull_request) Successful in 4m4s
PR / Coverage (soft) (pull_request) Successful in 2m44s
PR / Typecheck (pull_request) Successful in 4m20s
fe68633f16
app.json set no `icon`, so prebuild generated the default Expo launcher
icon on Android. Point `expo.icon` and a new `android.adaptiveIcon` at
the same icon the web app/PWA uses (public/icon-512.png — the blue Carol
"C", already declared maskable in manifest.webmanifest). The adaptive
background is the icon's blue (#2f6bff) so the transparent rounded
corners mask seamlessly under any launcher shape.

Closes #303

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

📊 Test coverage

Patch coverage: no testable lines changed.

Overall (app/, lib/, db/, excluding UI per ADR-0019):

Metric Value Soft target
Lines 81.6% ≥ 50%
Branches 72.8% ⚠️ ≥ 75%
Functions 91.1% informational

Soft thresholds per ADR-0019. Coverage is informational and does not block merge.

<!-- coverage-comment --> ## 📊 Test coverage **Patch coverage:** no testable lines changed. **Overall** (`app/`, `lib/`, `db/`, excluding UI per ADR-0019): | Metric | Value | Soft target | |---|---|---| | Lines | 81.6% ✅ | ≥ 50% | | Branches | 72.8% ⚠️ | ≥ 75% | | Functions | 91.1% | informational | Soft thresholds per [ADR-0019](docs/adr/0019-coverage-soft-targets.md). Coverage is informational and does not block merge.
james merged commit 3ac635d82f into main 2026-06-26 23:41:18 +00:00
james deleted branch 303-android-app-icon 2026-06-26 23:41:18 +00:00
Sign in to join this conversation.
No description provided.