Skip to content

fix(mobile): restore brand artwork in the Android adaptive icon - #10598

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-android-icon-cropping
Sep 7, 2026
Merged

fix(mobile): restore brand artwork in the Android adaptive icon#10598
juliusmarminge merged 1 commit into
mainfrom
t3code/fix-android-icon-cropping

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Sep 7, 2026

Copy link
Copy Markdown
Member

What Changed

The Android adaptive icon lost the brand artwork: #4332 fixed the cropped, double-framed launcher icon by swapping the foreground for a flat white mark on a solid color, which reads as a generic placeholder next to the iOS icon.

This renders the Android layers from the same Icon Composer SVG sources the other platforms use, via a new scripts/export-android-icons.ts (vp run icons:export:android):

  • a shared transparent wordmark foreground sized to Android's 66dp safe zone
  • full-bleed per-variant background images for development (blueprint grid and annotations) and nightly (night sky and clouds); production keeps its solid black background
  • app.config.ts passes the background image to both the launcher adaptiveIcon and the expo-quick-actions shortcut icon so they match

sharp is added to scripts for the SVG rasterization. The hand-maintained android-icon-foreground.svg and its rsvg-convert instructions are removed.

Why

Android masks the central 72dp of a 108dp canvas and only guarantees 66dp is visible, so the Icon Composer exports (which already contain a rounded-square silhouette) cannot be used as an adaptive foreground. Splitting the artwork into a full-bleed background and a safe-zone wordmark gives the mask something to crop that is meant to be cropped.

UI Changes

Development variant on an Android 16 (API 36) emulator. Top: the old cropped icon. Middle: current main. Bottom: this PR.

Notification shade: old cropped icon, current main flat mark, and this PR's blueprint artwork

Launcher, Pixel Launcher circular mask:

Launcher icon before and after

All three variants rendered through circle and squircle masks (offline preview from the generated layers):

Development, nightly, and production variants under circle and squircle masks

Verification

  • node scripts/export-android-icons.ts regenerates the three PNGs byte-for-byte
  • vp lint, vp fmt --check, and tsgo --noEmit for scripts on the changed files
  • expo prebuild --clean --platform android with APP_VARIANT=development emits ic_launcher_background.webp and the adaptive XML references it
  • debug APK installed on an API 36 emulator; a local notification and the launcher both show the new icon

Written by Claude Fable 5 via Claude Code.

Note

Restore brand artwork in Android adaptive icon for dev and nightly variants

  • Adds scripts/export-android-icons.ts, a Node/Effect workflow that rasterizes Icon Composer SVG sources into the shared 432px foreground, dev background, and nightly background PNGs using Sharp
  • Updates apps/mobile/app.config.ts to conditionally set adaptiveIcon.backgroundImage and the expo-quick-actions shortcut icon background image from the selected variant; release builds keep the solid color and omit the image
  • Adds the icons:export:android script to root package.json, adds sharp to scripts/package.json, and replaces the standalone foreground SVG docs in assets/README.md with instructions to run the new export command
  • Risk: the nightly background renderer in scripts/export-android-icons.ts uses hardcoded cloud scale/translate values and removes the named blur filter; drift between the Icon Composer nightly SVG and these constants can produce misaligned artwork

Macroscope summarized 99745aa.

Summary by CodeRabbit

  • New Features

    • Updated Android app icons with variant-specific backgrounds for development and preview builds.
    • Production Android icons now use a solid-color background.
    • Applied consistent background styling to Android quick-action shortcut icons.
    • Added support for generating Android icon assets from shared design sources, including full-bleed backgrounds and nightly overlays.
  • Documentation

    • Updated Android icon export guidance, including source assets, safe zones, and regeneration steps.

The Android launcher and notification icons previously either cropped the
Icon Composer export inside Android's mask or fell back to a flat white mark
on a solid color, losing the blueprint and nightly artwork.

Render the adaptive layers from the Icon Composer SVG sources instead: a
shared transparent wordmark sized to the safe zone, plus full-bleed
per-variant background images for development and nightly. Production keeps
its solid black background. A new scripts/export-android-icons.ts owns the
generation so the layers stay in sync with the icon sources.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Sep 7, 2026
@macroscopeapp

macroscopeapp Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR changes the baked-in Android launcher and quick-action artwork, adds new variant-specific background assets, and modifies native build inputs. Although the scope is limited to branding and asset generation, these are user-visible product defaults with native-app impact.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All clear

Posted via Macroscope — Effect Service Conventions

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.6 KiB 13.6 KiB −5 B (−0.0%) 15.1 KiB
Codex Thread snapshot wire 7.0 KiB 7.0 KiB 0 B (0.0%) 7.3 KiB
Codex Live turn WebSocket wire 6.6 KiB 6.6 KiB −5 B (−0.1%) 7.8 KiB
Codex Live turn WebSocket decoded 57.1 KiB 57.1 KiB 0 B (0.0%) 66.4 KiB
Codex Live turn messages 10 10 0 (0.0%) 21
Claude Total thread wire 13.6 KiB 13.6 KiB +41 B (+0.3%) 15.1 KiB
Claude Thread snapshot wire 7.1 KiB 7.0 KiB −3 B (−0.0%) 7.3 KiB
Claude Live turn WebSocket wire 6.5 KiB 6.5 KiB +44 B (+0.7%) 7.8 KiB
Claude Live turn WebSocket decoded 57.8 KiB 57.9 KiB +88 B (+0.1%) 66.4 KiB
Claude Live turn messages 8 10 +2 (+25.0%) 21

Baseline: 5ec6f77 · PR result: 99745aa · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.9 KiB
  • Claude decoded thread snapshot: 114.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@juliusmarminge
juliusmarminge merged commit c0cad74 into main Sep 7, 2026
21 of 22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/fix-android-icon-cropping branch September 7, 2026 22:34
@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: 9fb0d856-3a29-4798-8ea7-c4489ccc5116

📥 Commits

Reviewing files that changed from the base of the PR and between 5ec6f77 and 99745aa.

⛔ Files ignored due to path filters (5)
  • apps/mobile/assets/android-icon-background-dev.png is excluded by !**/*.png
  • apps/mobile/assets/android-icon-background-nightly.png is excluded by !**/*.png
  • apps/mobile/assets/android-icon-foreground.png is excluded by !**/*.png
  • apps/mobile/assets/android-icon-foreground.svg is excluded by !**/*.svg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (5)
  • apps/mobile/app.config.ts
  • assets/README.md
  • package.json
  • scripts/export-android-icons.ts
  • scripts/package.json

📝 Walkthrough

Walkthrough

Changes

Android adaptive icons

Layer / File(s) Summary
Icon layer rendering
scripts/export-android-icons.ts
The new Effect script extracts Icon Composer layers, renders the shared foreground, creates development and nightly backgrounds, and handles rendering errors.
Export command and asset generation
package.json, scripts/package.json, scripts/export-android-icons.ts, assets/README.md
The repository adds the Android icon export command, the sharp dependency, generated asset output, and export instructions.
Variant icon configuration
apps/mobile/app.config.ts
Development and preview variants use generated background images. Production omits the adaptive background image. Quick-action icons use the selected variant background when available.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PackageScript
  participant ExportScript
  participant IconComposerSources
  participant Sharp
  participant AndroidAssets
  participant MobileConfig
  PackageScript->>ExportScript: invoke icons:export:android
  ExportScript->>IconComposerSources: load SVG layers
  ExportScript->>Sharp: rasterize and composite layers
  Sharp->>AndroidAssets: write Android PNG assets
  MobileConfig->>AndroidAssets: select variant background images
Loading

Suggested reviewers: t3dotgg

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/fix-android-icon-cropping

Comment @coderabbitai help to get the list of available commands.

github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 8, 2026
## What's Changed
* fix(mobile): keep pending messages in the chat timeline by @juliusmarminge in pingdotgg/t3code#10449
* fix(mobile): show connection status in the floating pill instead of a second one by @juliusmarminge in pingdotgg/t3code#10440
* fix: use Pierre icons consistently for attachments by @juliusmarminge in pingdotgg/t3code#10475
* feat(mobile): open the thread screen as soon as a new task is submitted by @juliusmarminge in pingdotgg/t3code#10435
* fix(devcontainer): make repository setup work by @saphid in pingdotgg/t3code#7875
* fix(projects): prevent invalid script IDs from crashing threads by @saphid in pingdotgg/t3code#10019
* fix(mobile): hide changed-files navigator and restore refresh in raw diff fallback by @lnieuwenhuis in pingdotgg/t3code#9828
* fix(ios): scroll short source files from blank space by @juliusmarminge in pingdotgg/t3code#10178
* feat(mobile): start a new thread on an existing branch by @StiensWout in pingdotgg/t3code#10359
* fix(mobile): improve font-size slider performance and prevent maximum update depth errors by @bbernag in pingdotgg/t3code#7138
* fix(web): keep composer toolbar controls anchored during transitions by @juliusmarminge in pingdotgg/t3code#10478
* fix(web): resize the floating preview from any edge by @juliusmarminge in pingdotgg/t3code#10467
* fix(mobile): prevent chat from disappearing when scrolling by @juliusmarminge in pingdotgg/t3code#10479
* fix(mobile): smooth composer status pill resizing by @juliusmarminge in pingdotgg/t3code#10484
* fix(mobile): release initial scroll target after dragging by @juliusmarminge in pingdotgg/t3code#10483
* fix(mobile): animate thread lifecycle transitions consistently by @juliusmarminge in pingdotgg/t3code#10487
* fix(mobile): restore assistant message bottom padding by @juliusmarminge in pingdotgg/t3code#10491
* fix(mobile): preserve chat rows when toggling commands by @juliusmarminge in pingdotgg/t3code#10492
* feat(web): group onboarding project import by repository by @t3dotgg in pingdotgg/t3code#10493
* fix(web): remove inserted citations on cancel by @extoci in pingdotgg/t3code#10518
* fix(mobile): match Working status color to desktop by @baptisteArno in pingdotgg/t3code#10515
* fix(mobile): wait for native thread scroll before reveal by @juliusmarminge in pingdotgg/t3code#10486
* fix(web): tolerate servers that predate git identity in project import by @juliusmarminge in pingdotgg/t3code#10547
* fix(web): restore settled PR colors on hover by @flamboh in pingdotgg/t3code#10023
* fix(web): keep popup triggers steady when pressed by @dominic-r in pingdotgg/t3code#10468
* fix(web): keep project favicon shape consistent across sizes by @sameerr03 in pingdotgg/t3code#10502
* fix(claude): report usage limits on retried turns by @StiensWout in pingdotgg/t3code#10549
* refactor(desktop): classify backend exports by @juliusmarminge in pingdotgg/t3code#10265
* refactor(desktop): classify electron exports by @juliusmarminge in pingdotgg/t3code#10266
* refactor(desktop): classify app exports by @juliusmarminge in pingdotgg/t3code#10267
* refactor(desktop): classify preview exports by @juliusmarminge in pingdotgg/t3code#10268
* ci(knip): enforce desktop exports by @juliusmarminge in pingdotgg/t3code#10269
* fix(web): remove excess sidebar thread spacing by @maria-rcks in pingdotgg/t3code#10569
* fix(web): make settings project scopes searchable and scrollable by @maria-rcks in pingdotgg/t3code#10570
* fix(web): use `tabular-nums` with the ui font for sidebar timer by @extoci in pingdotgg/t3code#10592
* fix(web): correct pending question attachment message by @dominic-r in pingdotgg/t3code#10599
* fix(mobile): restore brand artwork in the Android adaptive icon by @juliusmarminge in pingdotgg/t3code#10598
* fix(mobile): configure iOS Keychain access group by @VedankPurohit in pingdotgg/t3code#3665
* fix(web): remember Composer Fast mode across new chats by @aravhawk in pingdotgg/t3code#2981
* fix(server): disable executable capabilities in Claude metadata generation by @maxwellyoung in pingdotgg/t3code#4169
* Add stop thread keybinding command by @jakeleventhal in pingdotgg/t3code#4308

## New Contributors
* @bbernag made their first contribution in pingdotgg/t3code#7138
* @baptisteArno made their first contribution in pingdotgg/t3code#10515
* @aravhawk made their first contribution in pingdotgg/t3code#2981

**Full Changelog**: pingdotgg/t3code@v0.0.39...v0.0.40

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.40
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 8, 2026
## What's Changed
* fix(mobile): wait for native thread scroll before reveal by @juliusmarminge in pingdotgg/t3code#10486
* fix(web): tolerate servers that predate git identity in project import by @juliusmarminge in pingdotgg/t3code#10547
* fix(web): restore settled PR colors on hover by @flamboh in pingdotgg/t3code#10023
* fix(web): keep popup triggers steady when pressed by @dominic-r in pingdotgg/t3code#10468
* fix(web): keep project favicon shape consistent across sizes by @sameerr03 in pingdotgg/t3code#10502
* fix(claude): report usage limits on retried turns by @StiensWout in pingdotgg/t3code#10549
* refactor(desktop): classify backend exports by @juliusmarminge in pingdotgg/t3code#10265
* refactor(desktop): classify electron exports by @juliusmarminge in pingdotgg/t3code#10266
* refactor(desktop): classify app exports by @juliusmarminge in pingdotgg/t3code#10267
* refactor(desktop): classify preview exports by @juliusmarminge in pingdotgg/t3code#10268
* ci(knip): enforce desktop exports by @juliusmarminge in pingdotgg/t3code#10269
* fix(web): remove excess sidebar thread spacing by @maria-rcks in pingdotgg/t3code#10569
* fix(web): make settings project scopes searchable and scrollable by @maria-rcks in pingdotgg/t3code#10570
* fix(web): use `tabular-nums` with the ui font for sidebar timer by @extoci in pingdotgg/t3code#10592
* fix(web): correct pending question attachment message by @dominic-r in pingdotgg/t3code#10599
* fix(mobile): restore brand artwork in the Android adaptive icon by @juliusmarminge in pingdotgg/t3code#10598
* fix(mobile): configure iOS Keychain access group by @VedankPurohit in pingdotgg/t3code#3665
* fix(web): remember Composer Fast mode across new chats by @aravhawk in pingdotgg/t3code#2981
* fix(server): disable executable capabilities in Claude metadata generation by @maxwellyoung in pingdotgg/t3code#4169
* Add stop thread keybinding command by @jakeleventhal in pingdotgg/t3code#4308

## New Contributors
* @aravhawk made their first contribution in pingdotgg/t3code#2981

**Full Changelog**: pingdotgg/t3code@v0.0.40-nightly.20260907.1359...v0.0.40-nightly.20260907.1372

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.40-nightly.20260907.1372
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant