Skip to content

Regenerate App Store screenshots for the redesigned remote - #192

Merged
darioalessandro merged 3 commits into
masterfrom
regen-screenshots-new-remote
Aug 2, 2026
Merged

Regenerate App Store screenshots for the redesigned remote#192
darioalessandro merged 3 commits into
masterfrom
regen-screenshots-new-remote

Conversation

@darioalessandro

Copy link
Copy Markdown
Member

PR #191 inverted the remote screen: the preview is full-bleed under floating glass chrome instead of a small image stacked above an opaque control panel. Every shipped screenshot still showed the old one — a blue Photo/Video segmented control, a "Timer: 0s" slider row, 1 / 2x / Dual lens buttons, a row of flash/torch/settings glyphs. None of that exists, so the screenshots misrepresented the app and undersold the one change users asked for.

The compositing had to be rebuilt, not just re-shot

template.html pasted a preview image into a fixed sub-rectangle of a flat UI capture. That only worked because the old chrome never overlapped the preview. Now it floats over the picture, so a pasted rect would cover the shutter, zoom pill and mode selector.

A remote screen is now three layers: black → the frame aspect-fit (the app's own letterboxing) → a straight-alpha chrome overlay.

A capture taken over a black viewfinder is the chrome premultiplied over black, so the value channel recovers it: alpha = max(R,G,B), color = pixel/alpha. That is exact over black, and over a bright frame it produces the same washed-out light glass the real app shows — dark-mode .ultraThinMaterial is additive light over its backdrop. Value channel rather than luma, so the gold accent and red record disc keep their hue.

New tools.py chrome does the keying. --disc forces the shutter opaque (a white disc with a black ring inside it would otherwise key to a hole); --blank zeroes the device status bar, which the template redraws clean.

The frame now reaches 83% of an iPhone screen where the old layout gave it 26% — which is the claim the redesign was making.

Also fixed

  • chrome: "camera" was equally stale — it drew a back chevron, a red dot and a ? button that CameraScreenView no longer has. Redrawn as what the screen is now: a full-bleed preview and a standby button, sized off the screen's short edge so it stays 44pt in landscape too.
  • A third-party brand on screen — the iPhone capture's camera chip read a USB webcam's name. Blanked; the iPad/Mac captures carry the generic Back Dual Wide Camera.
  • LIVE PREVIEW was missing from ru/hi/vi/ms/tr in translations.js. Predates this change — no slot used the label until now.
  • One Mac overlay serves the in-scene MacBooks and a second, near-square one the callout slot. The preview is composited rather than baked in, so ui-monitor-mac-cook/-remote are gone.

Release notes

Rewritten across all 17 locale directories, leading with the redesign; Stormo moves down to "Recently added". A self-review of the first draft caught calques that ran through most languages — "tray" came out as a serving tray or drawer (da bakke, fr tiroir, es/pt bandeja, vi khay), "tile" as a building material (da flise, fr tuile, tr karo), and da's strømmen går i stå read as the electricity failing rather than the video stalling. Fixed in a follow-up commit.

Verification

  • Reviewed the full en-US set plus long-string locales (ru, vi) by eye.
  • Every callout screenshot in all 15 locales checked programmatically for pill-white or ink-black pixels on the canvas border — nothing clips.
  • find confirms no APP_DESKTOP file in the iOS tree and no iPhone/iPad file in the Mac tree; Watch captures preserved.
  • cmp confirms en-GB is byte-identical to en-US and es-ES to es-MX, per the storefront cross-indexing rule.
  • Scenes are untouched — no Nano Banana generation, no new photography.

Known gaps

  • mac0 still composites the older Mac camera-screen capture. Reviewed and accepted as negligible.
  • No landscape-viewfinder slot. Landscape is the redesign's biggest win (82%), but every existing scene holds a portrait remote; it needs a new AI scene and a landscape capture. Follow-up.

🤖 Generated with Claude Code

darioalessandro and others added 3 commits August 1, 2026 23:54
PR #191 inverted the remote screen: the preview is full-bleed under floating
glass chrome instead of a small image stacked above an opaque control panel.
Every shipped screenshot still showed the old one -- a blue Photo/Video
segmented control, a "Timer: 0s" slider row, 1/2x/Dual lens buttons, a row of
flash/torch/settings glyphs. None of that exists, so the screenshots
misrepresented the app and undersold the one change users asked for.

The redesign also broke how a device screen was composited. The template pasted
a preview image into a FIXED sub-rectangle of a flat UI capture, which only
worked because the old chrome never overlapped the preview. Now it floats over
the picture, so a pasted rect would cover the shutter, zoom pill and mode
selector.

A remote screen is now three layers: black, the frame aspect-fit (the app's own
letterboxing), then a straight-alpha chrome overlay. A capture taken over a
black viewfinder IS the chrome premultiplied over black, so the value channel
recovers it -- alpha = max(R,G,B), color = pixel/alpha. That is exact over
black, and over a bright frame it produces the same washed-out light glass the
real app shows, because dark-mode .ultraThinMaterial is additive light over its
backdrop. The value channel rather than luma keeps the gold accent and red
record disc in hue. tools.py chrome does the keying; --disc forces the shutter
opaque (a white disc with a black ring inside it would otherwise key to a hole)
and --blank zeroes the device status bar, which the template redraws clean.

Consequences worth noting:

- The frame reaches 83% of an iPhone screen where the old layout gave it 26%,
  which is the claim the redesign was making.
- One Mac overlay serves the in-scene MacBooks and a second, near-square one the
  callout slot; the preview is composited rather than baked in, so
  ui-monitor-mac-cook/-remote are gone.
- chrome: "camera" was drawing a back chevron, a red dot and a "?" button that
  CameraScreenView no longer has. It is now what the screen actually is: a
  full-bleed preview and a standby button, sized off the screen's short edge so
  it stays 44pt whether the device is held portrait or landscape.
- Callout anchors were re-measured off the overlays, not estimated. The
  feature-callout slots take a preview with contrast at the edges: glass over a
  bright flat frame is legitimately near-invisible, which is accurate and
  useless for a slot whose job is labelling controls.
- The Mac callout labels route left and split vertically. Its window sits ~130px
  from the canvas edge, so an outward label clipped the moment a locale spelled
  it out (ru TAIMER, vi DEN FLASH & DEN PIN). Verified across all 15 locales by
  checking every callout screenshot's border for pill or ink pixels.
- LIVE PREVIEW was missing from ru/hi/vi/ms/tr, which predates this change --
  no slot used the label until now.

Scenes are untouched: no Nano Banana generation, no new photography. The
iPhone capture's live-frame band is blanked in assets/raw/ before anything
enters the repo, and its camera-name chip carried a USB webcam's brand name,
which is blanked too.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The notes still opened on the Stormo engine, which shipped in 9.0.x. The
viewfinder redesign is what this build is, so it takes the lead and Stormo moves
down into "Recently added" alongside Tap to Focus.

Written from what the release actually changed for someone holding the remote --
the preview is full screen, it rotates, the set-once controls are behind one tap,
the link says when the picture has gone stale, and capture feedback stopped
covering the frame you are composing. Camera standby is in there too.

All 17 locale directories. en-GB stays byte-for-byte with en-US and es-ES with
es-MX, per the storefront cross-indexing rule. Kept the existing phrasing for the
connection ("no router or network needed"), which does not contradict the app's
requirement that the Wi-Fi radio be on (2.3.1).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reviewing the lead section I wrote in the previous commit, three calques ran
through most languages:

"Tray" came out as a physical serving tray or drawer in every language that has
a word for one -- da bakke, de Fach, fr tiroir, es/pt bandeja, ms dulang, vi
khay, tr cekmece. The thing on screen is a panel, so it now says panel
everywhere, English included.

"Tile" was worse: da flise, fr tuile, ms jubin, tr karo and hi are all building
materials, and zh had Windows Metro's magnetic tile. Dropped the noun -- the
sentence reads "and each one shows its current setting", which is what it means.

"The controls out of its way" was calqued word for word into the romance
languages and Korean. Each now uses its own idiom for stepping back.

Language-specific:

- da: "stroemmen gaar i staa" reads as the electricity failing, not the video
  stalling. Now says the picture freezes. "pop op" -> "et vindue".
- it: "fuori dai piedi" is too colloquial for a store listing -> "in secondo
  piano". "live" -> "in diretta", matching the rest of the entry.
- ja: two "ga" particles in one clause. Split into two sentences.
- ko: "hwamyeon" (screen) where the picture was meant, and a small preview
  described as "pressed" rather than squeezed.
- ru: "Ozhidanie kamery" as a heading -> "Rezhim ozhidaniya kamery".
- zh: "tuiliu" is streamer jargon -> plain "send the picture".
- fr: "l'appareil qui filme" implied video only -> "qui sert de camera". Same
  fix for the clunky de "Kameraegeraet" and the vague hi/tr/ms equivalents.

Only the lead section changed. The "Recently added" tail is inherited text from
the previous release and is byte-for-byte identical, verified per locale;
en-GB still mirrors en-US and es-ES mirrors es-MX.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@darioalessandro
darioalessandro merged commit 30e52f9 into master Aug 2, 2026
2 checks passed
@darioalessandro
darioalessandro deleted the regen-screenshots-new-remote branch August 2, 2026 07:26
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

📊 Test Coverage Report

626/638 tests passed · ⏭️ 12 skipped

Metric Coverage
App code (excl. generated + vendored Theater) █████████░░░░░░░░░░░ 44.6% 🔴
Whole target █████████░░░░░░░░░░░ 45.8% 🔴

🎥 Capture & session core

File Coverage Lines
CaptureEngine.swift ██░░░░░░░░░░░░░░░░░░ 10.7% 164/1529 🔴
RecordingPipeline.swift ████████████░░░░░░░░ 59.7% 284/476 🟡
FrameStreamingCoordinator.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/124 🔴
FrameStreamer.swift ██████████████░░░░░░ 69.2% 72/104 🟡
RemoteCmdFlatBuffers.swift ███████████████████░ 96.2% 1200/1247 🟢
📁 Full report — 87 files
File Coverage Lines
CountdownTimer.swift ████████████████████ 100.0% 48/48 🟢
JPEGFrameEncoder.swift ████████████████████ 100.0% 12/12 🟢
AppActivityMonitor.swift ████████████████████ 100.0% 31/31 🟢
CameraPreviewMode.swift ████████████████████ 100.0% 13/13 🟢
AppTheme.swift ████████████████████ 100.0% 33/33 🟢
Messages.swift ████████████████████ 100.0% 7/7 🟢
ZoomScale.swift ████████████████████ 100.0% 76/76 🟢
DebugLog.swift ████████████████████ 100.0% 2/2 🟢
MonitorChrome.swift ████████████████████ 100.0% 56/56 🟢
StreamingConfig.swift ████████████████████ 100.0% 34/34 🟢
MultipeerMessages.swift ████████████████████ 100.0% 12/12 🟢
Locked.swift ████████████████████ 100.0% 19/19 🟢
ScannerLobby.swift ████████████████████ 100.0% 5/5 🟢
FrameCreditWindow.swift ████████████████████ 100.0% 9/9 🟢
AppDelegate.swift ████████████████████ 100.0% 17/17 🟢
HEICFrameEncoder.swift ████████████████████ 100.0% 17/17 🟢
PeerCompatibility.swift ████████████████████ 100.0% 42/42 🟢
DeviceScannerViewModel.swift ████████████████████ 99.1% 112/113 🟢
FrameSender.swift ████████████████████ 98.4% 187/190 🟢
FocusPointMapping.swift ████████████████████ 97.6% 40/41 🟢
RemoteCmdFlatBuffers.swift ███████████████████░ 96.2% 1200/1247 🟢
RemoteCmds.swift ███████████████████░ 95.9% 301/314 🟢
WatchSharedTypes.swift ███████████████████░ 94.0% 236/251 🟢
WatchPreviewStreamer.swift ███████████████████░ 93.6% 44/47 🟢
VP9FrameEncoder.swift ███████████████████░ 92.7% 153/165 🟢
WelcomeView.swift ██████████████████░░ 89.3% 492/551 🟢
VideoTransferProgressView.swift █████████████████░░░ 84.0% 295/351 🟢
UIImage+gif.swift █████████████████░░░ 83.2% 129/155 🟢
UIAlertController.swift █████████████████░░░ 83.0% 44/53 🟢
CameraDeviceDescriptor.swift ████████████████░░░░ 81.0% 34/42 🟢
CameraProgressOverlayView.swift ████████████████░░░░ 78.5% 186/237 🟡
MonitorView.swift ███████████████░░░░░ 76.8% 1178/1534 🟡
FlatBufferSchemas_generated.swift (excluded from app-code metric) ███████████████░░░░░ 75.6% 742/982 🟡
RolePickerView.swift ███████████████░░░░░ 75.4% 306/406 🟡
RecordingTimer.swift ███████████████░░░░░ 73.5% 61/83 🟡
CameraRecordingTimerView.swift ███████████████░░░░░ 73.4% 127/173 🟡
WelcomeViewModel.swift ███████████████░░░░░ 73.3% 96/131 🟡
SettingsViewModel.swift ██████████████░░░░░░ 70.9% 90/127 🟡
DeviceScannerView.swift ██████████████░░░░░░ 70.3% 1132/1611 🟡
SessionCoordinator.swift ██████████████░░░░░░ 69.8% 1732/2480 🟡
FrameStreamer.swift ██████████████░░░░░░ 69.2% 72/104 🟡
MonitorPresenter.swift █████████████░░░░░░░ 65.3% 154/236 🟡
WelcomeViewController.swift █████████████░░░░░░░ 64.1% 41/64 🟡
UIAlertPresenter.swift ████████████░░░░░░░░ 60.5% 26/43 🟡
RecordingPipeline.swift ████████████░░░░░░░░ 59.7% 284/476 🟡
MediaProcessors.swift ████████████░░░░░░░░ 58.3% 7/12 🟡
StoreManager.swift ███████████░░░░░░░░░ 53.2% 75/141 🟡
UICmds.swift ██████████░░░░░░░░░░ 50.0% 96/192 🟡
CameraViewModel.swift ██████████░░░░░░░░░░ 49.6% 126/254 🔴
ZoomPill.swift ██████████░░░░░░░░░░ 49.4% 168/340 🔴
UIViewController+SwiftUIHosting.swift ██████████░░░░░░░░░░ 48.4% 15/31 🔴
FrameCodecs.swift ██████████░░░░░░░░░░ 48.1% 25/52 🔴
FrameStreamReceiver.swift █████████░░░░░░░░░░░ 46.3% 238/514 🔴
SceneDelegate.swift █████████░░░░░░░░░░░ 45.8% 11/24 🔴
MonitorViewModel.swift █████████░░░░░░░░░░░ 44.1% 186/422 🔴
PurchaseManaging.swift ████████░░░░░░░░░░░░ 42.0% 21/50 🔴
HEVCFrameEncoder.swift ████████░░░░░░░░░░░░ 40.1% 93/232 🔴
MonitorViewController.swift ███████░░░░░░░░░░░░░ 37.3% 84/225 🔴
EnumExtensions.swift ███████░░░░░░░░░░░░░ 33.9% 40/118 🔴
CameraScreenView.swift ██████░░░░░░░░░░░░░░ 28.5% 148/520 🔴
DeviceScannerViewController.swift ██████░░░░░░░░░░░░░░ 28.1% 107/381 🔴
WatchSessionManager.swift ████░░░░░░░░░░░░░░░░ 20.8% 37/178 🔴
SoundManager.swift ████░░░░░░░░░░░░░░░░ 20.0% 4/20 🔴
MonitorViewController+SwiftUI.swift ███░░░░░░░░░░░░░░░░░ 14.4% 67/465 🔴
CaptureEngine.swift ██░░░░░░░░░░░░░░░░░░ 10.7% 164/1529 🔴
SwiftConstants.swift ██░░░░░░░░░░░░░░░░░░ 10.3% 6/58 🔴
RolePickerController.swift ██░░░░░░░░░░░░░░░░░░ 10.2% 23/226 🔴
PeerLinkStatus.swift █░░░░░░░░░░░░░░░░░░░ 7.1% 10/141 🔴
WatchRemoteCameraController.swift █░░░░░░░░░░░░░░░░░░░ 3.2% 9/279 🔴
CameraPermissionsView.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/640 🔴
CameraHostController.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/197 🔴
RemoteShutterHelpView.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/1373 🔴
CameraPermissionErrorView.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/416 🔴
PhotosAccessDeniedView.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/606 🔴
FrameStreamingCoordinator.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/124 🔴
MicrophonePermissionPromptView.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/347 🔴
SettingsView.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/760 🔴
Photos.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/12 🔴
LocalNetworkPermissionView.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/747 🔴
OrientationUtils.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/18 🔴
PermissionManager.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/159 🔴
PhotosAccessHelper.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/324 🔴
CameraRig.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/574 🔴
StreamLog.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/1 🔴
MultipeerService.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/116 🔴
Data+MD5.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/4 🔴
CameraCountdownTorch.swift ░░░░░░░░░░░░░░░░░░░░ 0.0% 0/61 🔴

Generated from 87f0038 · workflow run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant