fix(web): add installable icons for Firefox on Android#30420
Problem
Firefox for Android treats T3 Code as a browser shortcut because the manifest only lists 32px and 180px icons. Fenix requires an icon of at least 192px to install a standalone web app.
Closes https://github.com/pingdotgg/t3code/issues/30388.
Change
Add 192px and 512px PNG icons with purpose: "any". Extend the existing Icon Composer export and brand-copy mappings so development, nightly, and production builds ship the same manifest paths with their own artwork.
Scope and approval
This is a focused fix for the missing installability assets reported in https://github.com/pingdotgg/t3code/issues/30388, under the obvious-bug exception in CONTRIBUTING.md. The manifest already requests standalone display. Native mobile and Electron behavior do not change.
Verification
Tested head 5f2cae603c3c0198e92f7a1c06139b20dc262331 on corex with an isolated worktree dev server. Android evidence uses a Pixel 9 emulator on Android 35 and Mozilla's Firefox 159.0.1 arm64 release. The before run uses the current hosted app at app.t3.codes, version 0.1.6. The after run uses this commit through a temporary HTTPS tunnel.
Before, Firefox offers Add to Home screen and the launcher shortcut opens a Firefox tab. After, it offers Add app to Home screen and the launcher opens T3 Code without the address bar or tab controls.
| Before | After |
|---|---|
Installation and launcher recordings, played at 4x speed:
https://github.com/user-attachments/assets/472690fc-0d48-4ba9-b15e-14658073ef00
https://github.com/user-attachments/assets/eee72ca9-ceba-4d3c-b342-5115b2999d71
Extended the two existing brand-copy cases; both fail before the mapping fix and pass after it.
vp test run scripts/apply-web-brand-assets.test.ts scripts/lib/icon-export.test.ts: 2 files and 3 tests pass.vp run check:changed: formatting, lint, both knip checks, affected typechecks, and focused tests pass.In the running web client, the manifest returns
200 application/manifest+json, and both new icons return200 image/pngand decode at their declared dimensions. Checked source PNG dimensions and destination mappings for all three brands.New assets came from Icon Composer 27.1, build 129, using the export script's iOS rendition and design-generation 26 arguments. Development public copies match their source files byte for byte.
Ran the actual changed exporter on physical shiv at this head. All six new brand PNGs and both public copies regenerate byte for byte. The post-export check passes for all 33 assets. The same 25 older asset differences reproduce on the pre-fix parent, so unrelated tracked assets remain unchanged.
Built production and nightly web variants on corex and served both through Vite preview. Browser checks show both manifests and all four new icons return HTTP 200, decode at the declared dimensions and match the correct committed brand artwork.
Exporter output, hashes, drift comparison and served variant screenshots.
Not shown: installation on physical hardware or a deployed Vercel production/nightly build. Variant verification used locally built output on corex. The initial macOS icon check still reports the 25 pre-existing old asset differences; none of the new files differ.
Implemented by Claude Opus 5.5 through the Claude Code harness. Investigated, tested, and reviewed with GPT-6.1 Sol through the Codex harness, in T3 Code.
Checks
Added 1 commit
- fix(web): add installable icons for Firefox on Android5f2cae6
Approvability
Verdict: Approved at 5f2cae6
Macroscope's review found this PR approvable — Adds properly sized web app icons so Firefox on Android can install the existing standalone app experience. The changes are confined to branding assets and their generation/copy mappings, with reported head-specific installation verification.
You can add or adjust custom eligibility rules. Learn more.
Important
Review skipped
Review was skipped as selected files did not have any reviewable changes.
External image Files ignored due to path filters: 8
-
apps/web/public/icon-192x192.pngis excluded by!**/*.pngapps/web/public/icon-512x512.pngis excluded by!**/*.pngassets/dev/blueprint-web-icon-192x192.pngis excluded by!**/*.pngassets/dev/blueprint-web-icon-512x512.pngis excluded by!**/*.pngassets/nightly/nightly-web-icon-192x192.pngis excluded by!**/*.pngassets/nightly/nightly-web-icon-512x512.pngis excluded by!**/*.pngassets/prod/t3-black-web-icon-192x192.pngis excluded by!**/*.pngassets/prod/t3-black-web-icon-512x512.pngis excluded by!**/*.png
External image Run configuration
-
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: main
- File: .coderabbit.config.ts
- Commit: 23bdb9e
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
2ab3eaa2-b615-433b-86cb-0bcd34431053
External image Commits
-
Reviewing files that changed from the base of the PR and between 5f2cae603c3c0198e92f7a1c06139b20dc262331 and 573c74ee0d01166648b318ba8f7c1cc0e440cca7.
External image Files ignored due to path filters: 8
-
apps/web/public/icon-192x192.pngis excluded by!**/*.pngapps/web/public/icon-512x512.pngis excluded by!**/*.pngassets/dev/blueprint-web-icon-192x192.pngis excluded by!**/*.pngassets/dev/blueprint-web-icon-512x512.pngis excluded by!**/*.pngassets/nightly/nightly-web-icon-192x192.pngis excluded by!**/*.pngassets/nightly/nightly-web-icon-512x512.pngis excluded by!**/*.pngassets/prod/t3-black-web-icon-192x192.pngis excluded by!**/*.pngassets/prod/t3-black-web-icon-512x512.pngis excluded by!**/*.png
You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.
Use the checkbox below for a quick retry:
- Trigger review
No actionable comments were generated in the recent review.
Walkthrough
-
The change adds 192×192 and 512×512 PNG icons to the web manifest and brand asset export paths. It adds both filenames to the asset-copy test fixture and updates the export documentation.
Changes: Web app icons
Layer / File(s) Summary Map and export web icon assets
scripts/lib/brand-assets.ts,scripts/export-brand-icons.tsAdds 192px and 512px icon source mappings for development, nightly, and production brands. Configures the export variants to generate and write renditions at both sizes. Declare and verify manifest icons
apps/web/public/manifest.webmanifest,scripts/apply-web-brand-assets.test.ts,assets/README.mdAdds both PNG icons to the web manifest with anypurpose. Adds their filenames to the asset-copy test fixture and includes manifest icons in the export description.Estimated code review effort: 2 (Simple) | ~10 minutes
Change: Bug fix · Severity of issue fixed: Medium
Suggested labels:
bugfixSuggested reviewers:
t3dotgg
Merge Risk: External image Minimal · previous review 5f2ca
-
The icon changes are consistent and ready to merge, subject to normal deployment validation.
Pre-merge checks: Passed 4
-
Check name Status Explanation Title check Passed The title is concise, uses the required conventional format, and clearly identifies the main change: adding installable web icons for Firefox on Android. Linked Issues check Passed Issue #30388requires installable manifest icons and standalone Firefox installation. The manifest adds/icon-192x192.pngand/icon-512x512.pngwithpurpose: "any". The export script and brand m…Out of Scope Changes check Passed The changes remain within issue #30388. Manifest entries, icon export changes, brand mappings, copy-test updates, and asset documentation support the required installability assets. No unrelated produ…Description check Passed The description includes all required sections. It explains the problem, change, scope and approval basis, linked issue, detailed verification results, screenshots, recordings, limitations, and agent … Full details: Linked Issues check
-
Explanation
Issue
#30388requires installable manifest icons and standalone Firefox installation. The manifest adds/icon-192x192.pngand/icon-512x512.pngwithpurpose: "any". The export script and brand mappings provide these paths for development, nightly, and production assets. The focused tests andcheck:changedpass. The reported Firefox Android verification shows the installed app opens without browser controls. The excluded PNG files are not inspected, but the reported 200 responses, PNG types, declared dimensions, and source-to-destination checks provide independent evidence that the assets are available.
Full details: Out of Scope Changes check
-
Explanation
The changes remain within issue
#30388. Manifest entries, icon export changes, brand mappings, copy-test updates, and asset documentation support the required installability assets. No unrelated product behavior is identified. Native mobile and Electron behavior remain unchanged.
Full details: Description check
-
Explanation
The description includes all required sections. It explains the problem, change, scope and approval basis, linked issue, detailed verification results, screenshots, recordings, limitations, and agent attribution.
-
Finishing Touches
-
Generate unit tests (beta)
-
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
External image Recent review info
-
External image Run configuration
-
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: main
- File: .coderabbit.config.ts
- Commit: b183048
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
335febca-acb1-493e-9155-ab80bfd49243
External image Commits
-
Reviewing files that changed from the base of the PR and between b183048a823815175fd6991691f2acec456ea176 and 5f2cae603c3c0198e92f7a1c06139b20dc262331.
External image Files ignored due to path filters: 8
-
apps/web/public/icon-192x192.png is excluded by !**/*.pngapps/web/public/icon-512x512.png is excluded by !**/*.pngassets/dev/blueprint-web-icon-192x192.png is excluded by !**/*.pngassets/dev/blueprint-web-icon-512x512.png is excluded by !**/*.pngassets/nightly/nightly-web-icon-192x192.png is excluded by !**/*.pngassets/nightly/nightly-web-icon-512x512.png is excluded by !**/*.pngassets/prod/t3-black-web-icon-192x192.png is excluded by !**/*.pngassets/prod/t3-black-web-icon-512x512.png is excluded by !**/*.png
External image Files selected for processing: 5
-
apps/web/public/manifest.webmanifestassets/README.mdscripts/apply-web-brand-assets.test.tsscripts/export-brand-icons.tsscripts/lib/brand-assets.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.
External image Recent review info
-
External image Run configuration
-
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: main
- File: .coderabbit.config.ts
- Commit: b183048
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Advanced
- Run ID:
335febca-acb1-493e-9155-ab80bfd49243
External image Commits
-
Reviewing files that changed from the base of the PR and between b183048a823815175fd6991691f2acec456ea176 and 5f2cae603c3c0198e92f7a1c06139b20dc262331.
External image Files ignored due to path filters: 8
-
apps/web/public/icon-192x192.pngis excluded by!**/*.pngapps/web/public/icon-512x512.pngis excluded by!**/*.pngassets/dev/blueprint-web-icon-192x192.pngis excluded by!**/*.pngassets/dev/blueprint-web-icon-512x512.pngis excluded by!**/*.pngassets/nightly/nightly-web-icon-192x192.pngis excluded by!**/*.pngassets/nightly/nightly-web-icon-512x512.pngis excluded by!**/*.pngassets/prod/t3-black-web-icon-192x192.pngis excluded by!**/*.pngassets/prod/t3-black-web-icon-512x512.pngis excluded by!**/*.png
External image Files selected for processing: 5
-
apps/web/public/manifest.webmanifestassets/README.mdscripts/apply-web-brand-assets.test.tsscripts/export-brand-icons.tsscripts/lib/brand-assets.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.
-
[GPT-6.1 Sol][Codex] on behalf of shivam.
Completed the two missing verification steps at head 5f2cae603c3c0198e92f7a1c06139b20dc262331. No source files or commits changed.
Actual exporter on shiv
Ran the exact-head scripts/export-brand-icons.ts on physical shiv, macOS 27.0.1, Node 26.12.1, Icon Composer 27.1 build 129, design generation 26. The source came from a pinned git archive; existing checkout dependencies were reused, including Effect and platform-node 4.1.2. The source and output lived in an isolated temporary directory, not the installed checkout.
| Snapshot | Check before export | Export | Check after export |
|---|---|---|---|
PR head 5f2cae603c3c0198e92f7a1c06139b20dc262331 | exit 1, 25 existing assets stale | exit 0, 33 assets generated | exit 0, all 33 current |
Pre-fix parent aee76a8b473694878e820ed642b4b4018991f378 | exit 1, same 25 assets stale | exit 0, 25 assets generated | exit 0, all 25 current |
The initial check is not a pass against the committed old assets. Comparing both runs proved the same 25 paths, committed hashes and regenerated hashes differ on the parent and head. None of the eight new PNGs drift. Unrelated assets remain unchanged in this PR.
Before running the normal head export, all eight new files were removed from the temporary snapshot. The actual exporter recreated all six brand assets and both development public copies. Every recreated PNG matches the committed bytes and declared dimensions; the primary session independently checked the returned files and hashes.
| Generated asset | Dimensions | SHA-256, generated = committed |
|---|---|---|
assets/dev/blueprint-web-icon-192x192.png | 192 × 192 | 739c4be276931776259477715c1c4b0d1f0da56ec7f1c05cc04fc5eec13f1d70 |
assets/dev/blueprint-web-icon-512x512.png | 512 × 512 | 5220baf09c460ff95cabcc5f25d77ce532f73bd03df0fe5e41506f20bb1c310d |
assets/nightly/nightly-web-icon-192x192.png | 192 × 192 | 29cd36f845a07695a6dc3320c11ef823d9691e34f049cd9660202e3bb1c98dd0 |
assets/nightly/nightly-web-icon-512x512.png | 512 × 512 | 5c14507f3b5836f2f59f2a89af5a33f8736487800c65b1d78c9d371b626d9489 |
assets/prod/t3-black-web-icon-192x192.png | 192 × 192 | a96f75ed8b084f7753251df69e57dbad26bbdc35b70db0380379dd5d785cc2f9 |
assets/prod/t3-black-web-icon-512x512.png | 512 × 512 | 8eaf06fcb61e2dc07c9bd028e8914e98c9e8cbef1b073cbf30be3f3c7d8483e9 |
apps/web/public/icon-192x192.png | 192 × 192 | 739c4be276931776259477715c1c4b0d1f0da56ec7f1c05cc04fc5eec13f1d70 |
apps/web/public/icon-512x512.png | 512 × 512 | 5220baf09c460ff95cabcc5f25d77ce532f73bd03df0fe5e41506f20bb1c310d |
Comparison of the committed PNGs with the actual exporter output. The image includes dimensions and matching hashes for all six brand assets and both public copies.
Exact-head exporter output
| 1 | $ node scripts/export-brand-icons.ts --check |
| 2 | Exporting icons with Icon Composer 27.1 (129), design generation 26. |
| 3 | Rendering development from assets/dev/app-icon.icon... |
| 4 | Rendering preview from assets/nightly/app-icon.icon... |
| 5 | Rendering production from assets/prod/app-icon.icon... |
| 6 | [03:46:31.880] ERROR (#1): IconExportAssetsStaleError: Generated icon assets are stale: |
| 7 | - assets/dev/blueprint-ios-1024.png |
| 8 | - assets/dev/blueprint-universal-1024.png |
| 9 | - assets/dev/blueprint-web-apple-touch-180.png |
| 10 | - assets/dev/blueprint-web-favicon-16x16.png |
| 11 | - assets/dev/blueprint-web-favicon-32x32.png |
| 12 | - assets/dev/blueprint-web-favicon.ico |
| 13 | - assets/dev/blueprint-windows.ico |
| 14 | - assets/nightly/nightly-ios-1024.png |
| 15 | - assets/nightly/nightly-universal-1024.png |
| 16 | - assets/nightly/nightly-web-apple-touch-180.png |
| 17 | - assets/nightly/nightly-web-favicon-16x16.png |
| 18 | - assets/nightly/nightly-web-favicon-32x32.png |
| 19 | - assets/nightly/nightly-web-favicon.ico |
| 20 | - assets/nightly/nightly-windows.ico |
| 21 | - assets/prod/black-ios-1024.png |
| 22 | - assets/prod/black-universal-1024.png |
| 23 | - assets/prod/t3-black-web-apple-touch-180.png |
| 24 | - assets/prod/t3-black-web-favicon-16x16.png |
| 25 | - assets/prod/t3-black-web-favicon-32x32.png |
| 26 | - assets/prod/t3-black-web-favicon.ico |
| 27 | - assets/prod/t3-black-windows.ico |
| 28 | - apps/web/public/favicon.ico |
| 29 | - apps/web/public/favicon-16x16.png |
| 30 | - apps/web/public/favicon-32x32.png |
| 31 | - apps/web/public/apple-touch-icon.png |
| 32 | at file:///private/tmp/t3code-30388/head/scripts/export-brand-icons.ts:756:21 |
| 33 | at exportBrandIcons (file:///private/tmp/t3code-30388/head/scripts/export-brand-icons.ts:780:18) |
| 34 | at exportBrandIcons (definition) (file:///private/tmp/t3code-30388/head/scripts/export-brand-icons.ts:702:40) |
| 35 | |
| 36 | exit_status=1 |
| 37 | |
| 38 | $ node scripts/export-brand-icons.ts |
| 39 | Exporting icons with Icon Composer 27.1 (129), design generation 26. |
| 40 | Rendering development from assets/dev/app-icon.icon... |
| 41 | Rendering preview from assets/nightly/app-icon.icon... |
| 42 | Rendering production from assets/prod/app-icon.icon... |
| 43 | Updated 33 generated icon assets. |
| 44 | |
| 45 | exit_status=0 |
| 46 | |
| 47 | $ node scripts/export-brand-icons.ts --check |
| 48 | Exporting icons with Icon Composer 27.1 (129), design generation 26. |
| 49 | Rendering development from assets/dev/app-icon.icon... |
| 50 | Rendering preview from assets/nightly/app-icon.icon... |
| 51 | Rendering production from assets/prod/app-icon.icon... |
| 52 | All 33 generated icon assets are current. |
| 53 | |
| 54 | exit_status=0 |
Parent exporter output, proving the old drift predates this change
| 1 | Exporting icons with Icon Composer 27.1 (129), design generation 26. |
| 2 | Rendering development from assets/dev/app-icon.icon... |
| 3 | Rendering preview from assets/nightly/app-icon.icon... |
| 4 | Rendering production from assets/prod/app-icon.icon... |
| 5 | [03:46:40.473] ERROR (#1): IconExportAssetsStaleError: Generated icon assets are stale: |
| 6 | - assets/dev/blueprint-ios-1024.png |
| 7 | - assets/dev/blueprint-universal-1024.png |
| 8 | - assets/dev/blueprint-web-apple-touch-180.png |
| 9 | - assets/dev/blueprint-web-favicon-16x16.png |
| 10 | - assets/dev/blueprint-web-favicon-32x32.png |
| 11 | - assets/dev/blueprint-web-favicon.ico |
| 12 | - assets/dev/blueprint-windows.ico |
| 13 | - assets/nightly/nightly-ios-1024.png |
| 14 | - assets/nightly/nightly-universal-1024.png |
| 15 | - assets/nightly/nightly-web-apple-touch-180.png |
| 16 | - assets/nightly/nightly-web-favicon-16x16.png |
| 17 | - assets/nightly/nightly-web-favicon-32x32.png |
| 18 | - assets/nightly/nightly-web-favicon.ico |
| 19 | - assets/nightly/nightly-windows.ico |
| 20 | - assets/prod/black-ios-1024.png |
| 21 | - assets/prod/black-universal-1024.png |
| 22 | - assets/prod/t3-black-web-apple-touch-180.png |
| 23 | - assets/prod/t3-black-web-favicon-16x16.png |
| 24 | - assets/prod/t3-black-web-favicon-32x32.png |
| 25 | - assets/prod/t3-black-web-favicon.ico |
| 26 | - assets/prod/t3-black-windows.ico |
| 27 | - apps/web/public/favicon.ico |
| 28 | - apps/web/public/favicon-16x16.png |
| 29 | - apps/web/public/favicon-32x32.png |
| 30 | - apps/web/public/apple-touch-icon.png |
| 31 | at file:///private/tmp/t3code-30388/base/scripts/export-brand-icons.ts:746:21 |
| 32 | at exportBrandIcons (file:///private/tmp/t3code-30388/base/scripts/export-brand-icons.ts:770:18) |
| 33 | at exportBrandIcons (definition) (file:///private/tmp/t3code-30388/base/scripts/export-brand-icons.ts:692:40) |
| 34 | |
| 35 | exit_status=1 |
| 36 | |
| 37 | Exporting icons with Icon Composer 27.1 (129), design generation 26. |
| 38 | Rendering development from assets/dev/app-icon.icon... |
| 39 | Rendering preview from assets/nightly/app-icon.icon... |
| 40 | Rendering production from assets/prod/app-icon.icon... |
| 41 | Updated 25 generated icon assets. |
| 42 | |
| 43 | exit_status=0 |
| 44 | |
| 45 | Exporting icons with Icon Composer 27.1 (129), design generation 26. |
| 46 | Rendering development from assets/dev/app-icon.icon... |
| 47 | Rendering preview from assets/nightly/app-icon.icon... |
| 48 | Rendering production from assets/prod/app-icon.icon... |
| 49 | All 25 generated icon assets are current. |
| 50 | |
| 51 | exit_status=0 |
Built and served production and nightly on corex
Built both variants from the unchanged head with the repository web build, then applied the existing brand-copy entry point to each output directory. Both builds and brand-copy commands exited 0.
| 1 | VITE_HOSTED_APP_CHANNEL=latest vp run --filter @t3tools/web build --outDir /tmp/t3code-30388/production --emptyOutDir |
| 2 | node scripts/apply-web-brand-assets.ts production /tmp/t3code-30388/production |
| 3 | VITE_HOSTED_APP_CHANNEL=nightly vp run --filter @t3tools/web build --outDir /tmp/t3code-30388/nightly --emptyOutDir |
| 4 | node scripts/apply-web-brand-assets.ts nightly /tmp/t3code-30388/nightly |
Build output reported ✓ built in 17.72s for production and ✓ built in 15.66s for nightly. Served the built directories with Vite preview on corex ports 7151 and 7152. In real Browser panel tabs, fetched the manifest linked by each page, fetched both new icons, decoded them and computed their SHA-256 hashes. All four hashes equal their committed brand source files listed above. Visual inspection confirms black production artwork and purple nightly artwork.
| Variant | Manifest | 192px icon | 512px icon |
|---|---|---|---|
| Production | HTTP 200, application/manifest+json, display: standalone | HTTP 200, image/png, decoded 192 × 192, production hash matches | HTTP 200, image/png, decoded 512 × 512, production hash matches |
| Nightly | HTTP 200, application/manifest+json, display: standalone | HTTP 200, image/png, decoded 192 × 192, nightly hash matches | HTTP 200, image/png, decoded 512 × 512, nightly hash matches |
Both manifests declare purpose: "any" for both new icons.
| Production served PNG | Nightly served PNG |
|---|---|
Browser fetch and image decode results
| 1 | { |
| 2 | "head": "5f2cae603c3c0198e92f7a1c06139b20dc262331", |
| 3 | "variants": [ |
| 4 | { |
| 5 | "head": "5f2cae603c3c0198e92f7a1c06139b20dc262331", |
| 6 | "brand": "production", |
| 7 | "origin": "http://localhost:7151", |
| 8 | "manifestUrl": "http://localhost:7151/manifest.webmanifest", |
| 9 | "manifestStatus": 200, |
| 10 | "manifestType": "application/manifest+json", |
| 11 | "display": "standalone", |
| 12 | "icons": [ |
| 13 | { |
| 14 | "src": "/icon-192x192.png", |
| 15 | "sizes": "192x192", |
| 16 | "type": "image/png", |
| 17 | "purpose": "any", |
| 18 | "status": 200, |
| 19 | "contentType": "image/png", |
| 20 | "width": 192, |
| 21 | "height": 192, |
| 22 | "sha256": "a96f75ed8b084f7753251df69e57dbad26bbdc35b70db0380379dd5d785cc2f9" |
| 23 | }, |
| 24 | { |
| 25 | "src": "/icon-512x512.png", |
| 26 | "sizes": "512x512", |
| 27 | "type": "image/png", |
| 28 | "purpose": "any", |
| 29 | "status": 200, |
| 30 | "contentType": "image/png", |
| 31 | "width": 512, |
| 32 | "height": 512, |
| 33 | "sha256": "8eaf06fcb61e2dc07c9bd028e8914e98c9e8cbef1b073cbf30be3f3c7d8483e9" |
| 34 | } |
| 35 | ] |
| 36 | }, |
| 37 | { |
| 38 | "head": "5f2cae603c3c0198e92f7a1c06139b20dc262331", |
| 39 | "brand": "nightly", |
| 40 | "origin": "http://localhost:7152", |
| 41 | "manifestUrl": "http://localhost:7152/manifest.webmanifest", |
| 42 | "manifestStatus": 200, |
| 43 | "manifestType": "application/manifest+json", |
| 44 | "display": "standalone", |
| 45 | "icons": [ |
| 46 | { |
| 47 | "src": "/icon-192x192.png", |
| 48 | "sizes": "192x192", |
| 49 | "type": "image/png", |
| 50 | "purpose": "any", |
| 51 | "status": 200, |
| 52 | "contentType": "image/png", |
| 53 | "width": 192, |
| 54 | "height": 192, |
| 55 | "sha256": "29cd36f845a07695a6dc3320c11ef823d9691e34f049cd9660202e3bb1c98dd0" |
| 56 | }, |
| 57 | { |
| 58 | "src": "/icon-512x512.png", |
| 59 | "sizes": "512x512", |
| 60 | "type": "image/png", |
| 61 | "purpose": "any", |
| 62 | "status": 200, |
| 63 | "contentType": "image/png", |
| 64 | "width": 512, |
| 65 | "height": 512, |
| 66 | "sha256": "5c14507f3b5836f2f59f2a89af5a33f8736487800c65b1d78c9d371b626d9489" |
| 67 | } |
| 68 | ] |
| 69 | } |
| 70 | ] |
| 71 | } |
The Firefox Android installation proof remains embedded in the PR body at this same head. Not shown: installation on physical hardware or a deployed Vercel production/nightly build. These two variant checks used locally built output on corex.
[GPT-6.1 Sol][Codex] on behalf of shivam.
The previously pending Native fingerprint diff run completed successfully at the unchanged PR head. Verified directly through the check-run API and the job output:
| 1 | { |
| 2 | "name": "Native fingerprint diff", |
| 3 | "head_sha": "5f2cae603c3c0198e92f7a1c06139b20dc262331", |
| 4 | "status": "completed", |
| 5 | "conclusion": "success", |
| 6 | "started_at": "2026-11-03T22:20:37Z", |
| 7 | "completed_at": "2026-11-03T22:24:07Z", |
| 8 | "details_url": "https://github.com/pingdotgg/t3code/actions/runs/41729942754/job/126244342483" |
| 9 | } |
Both fingerprint generation steps, comparison, and artifact upload succeeded. CHANGED_PLATFORMS is empty. The Git exit 128 warning occurs in the later Post Checkout cleanup for a vendored submodule; the fingerprint steps and overall job succeeded.
The live ready check also confirms all required checks pass, no unresolved review threads, an open non-draft PR, no conflicts, and auto-merge disabled. Head 5f2cae603c3c0198e92f7a1c06139b20dc262331, base b183048a823815175fd6991691f2acec456ea176. Exporter and served-variant evidence still covers this head. No code changes were needed.
Note
Written by gpt-6.1-sol on behalf of Maria
Verified on Android emulator (API 35) against a real dev server
Verified unchanged head 5f2cae603c3c0198e92f7a1c06139b20dc262331 with Firefox 159.0.1 on the t3 x86_64 emulator. Both comparisons used real vp run dev servers with isolated state and temporary HTTPS tunnels.
On github/main (a445272c78), Firefox offers "Add to Home screen". I added the shortcut and launched it from the launcher: the address bar and tab controls remain visible. On the PR head, Firefox offers "Add app to Home screen". I installed it and launched it from the launcher: T3 renders standalone, without those browser controls. Dismissing the notification permission prompt leaves the paired app visible.
Before, launcher shortcut opens a browser tab:
Before: main shortcut opens with Firefox address bar and tabs
After, installed app opens standalone:
After: PR installation opens the paired app without browser controls
The matching Firefox installation menus:
Before: main offers Add to Home screen over HTTPS
After: PR offers Add app to Home screen over HTTPS
Animated copy of the installation and standalone-launch recording for GitHub. Idle and loading intervals were removed and playback accelerated; this is behavior evidence, not a timing measurement. Uploaded playback and seeking were checked.
Android installation and standalone launch recording
I also installed the matching native dev client from the shared cache, started Metro, and paired it with the isolated backend. Through the running server, I created a real project and two threads and completed two real Codex gpt-6.1-sol turns through the local proxy. In Firefox I opened the first reply, opened the thread list, switched to the second thread, and saw its completed reply. No mocks or replay data were used.
Real Codex reply rendered in Firefox on Android
Checks run here through Blacksmith: the focused icon-export/brand-copy tests passed (2 files, 3 tests), and vp run check:changed aee76a8b473694878e820ed642b4b4018991f378 passed format, lint, both knip checks, affected typechecks and focused tests. The explicit parent ref was necessary because the worker starts with shallow snapshot history. The PR status reported 29 successful checks, none pending or failing. No code changes were needed.
Not verified
- iOS cannot run on this Linux VM.
- Physical devices, deployed production/nightly installations, and the macOS Icon Composer exporter were not exercised here.
- Repeated cold-launch reliability remains unverified. The emulator had graphics freezes with SwiftShader and needed Lavapipe; some later launches stalled on a blank surface. I did not establish whether those stalls came from Firefox, the emulator renderer, or development loading. The successful standalone render above is from an actual launcher launch.
Added 1 commit
- Merge branch 'main' into issue-watch/30388573c74e