Real detection, not a drawing. MediaPipe Pose ran on the generated frames — 32 of 33 landmarks on the side view, 33 of 33 on the reverse — and the skeleton is drawn to ios/Fitnit/PoseCameraView.swift's own spec: connections (11,12)(11,23)(12,24)(23,24) for torso plus arms and legs, joints at radius 4, face landmarks 0–10 skipped, lineWidth 3 scaled from a 390pt phone up to the plate.
The HUD I invented first was wrong in every dimension. I drew a dark rounded pill with a green number and a “SQUAT” chip at top-left. The real thing in app/workout/[exercise].tsx has no panel at all: a 98pt weight-900 white numeral, bottom-centred, with a 16pt phase line under it. The number only turns #49DE80 when you pass a challenge target, and the exercise name lives in the top header, not a chip. Corrected in E and G.
The first projection was a logic error. I warped the side-on room view onto the screen — but a phone propped facing her shows her front-on. Fixed with a Seedream edit of the same woman in the same room from the phone's position, 7¢, below. Identity, wardrobe, window, sofa and floor shadows all carried over.
The diegetic screen still cannot carry information. It is 63×120px in a 1152×2048 plate — roughly 22pt once this is a real phone screen. It reads convincingly as “she is on camera and being tracked”; you cannot read the numeral. Anything the viewer must actually read belongs on the plate, not in the phone.
The app's HUD and the slide's furniture want the same space. Both live bottom-centre. Lifting the rep block clear of the headline put it across her body and looked worse, so for the landing slide A is right — skeleton only, no HUD. Keep E for App Store screenshots, where the whole app frame is the subject.
A perspective warp alone still reads as a sticker. Five things seat it in the glass, and dropping any one puts the pasted look back: rounded corners built in source space then warped, so the radius follows the perspective; depth-of-field softening, because content sharper than the subject is the loudest tell; a grade down to ~0.9 brightness warmed toward the room; lifted blacks, since cover glass never lets screen black reach plate black; and a sheen from the window plus a little spill onto the room.
Getting the screen quad right took four attempts, and only the last one was a method. Eyeballing corners off a zoomed grid missed by 4–12px every time. Scanning luminance rows and columns for the bezel's inner edges was better but still wrong, because specular highlights on the bezel and on the shelf drag the line fits outward. What actually works is segmentation: the screen is dark and ringed by the brightest thing in the crop, so threshold the bright bezel, convex-hull its largest component to get the phone silhouette, and take the dark hole inside. Thresholding darkness directly fails outright — the screen merges with the dark sofa behind it.
Then the contour's corners are still not the corners. A phone screen is a rounded rectangle, so its polygon approximation lands points on the arc, inset from where the straight edges would actually meet. Assigning contour points to the four edges, discarding everything within 22% of a corner, fitting each edge by total least squares and intersecting adjacent pairs recovers the sharp quad — which is exactly what a perspective warp plus a rounded-rect alpha wants. measure_screen.py --check draws the result back onto the untouched plate; look at that before trusting any numbers.
Two traps in PIL's perspective transform, one build each. It point-samples, so letting it do a 3× reduction stairsteps every edge — downscale to the screen's true pixel size with LANCZOS first, then warp 1:1. And it returns nothing past the source's last pixel, which lands a hard aliased boundary exactly on the edge no matter how clean the mask is; pulling the alpha in by one pixel puts that boundary where the mask is already transparent.
The wordmark is gone. Right call — someone looking at onboarding already knows whose app they downloaded. fitnit_hud.py takes show_logo=False; it stays on for App Store screenshots, which get seen out of context.
Profile poses muddle the skeleton. Side-on, the far arm and leg are estimated roughly on top of the near ones — that is the arrow shape through her torso. The reverse angle scored 33/33 and reads cleanly, which says a three-quarter stance is worth asking for in round two.