# Notchlight — an iPhone 16 Pro Live Photo wallpaper

A small kid in a too-big nightshirt climbs onto a stool, clicks a brass torch,
and lights up the Dynamic Island. The film runs once when the Lock Screen wakes,
then settles on the lit frame.

Everything here is sized for **iPhone 16 Pro — 1206 × 2622 px (19.5 : 9)**.

---

## What's in the box

| File | What it is |
|---|---|
| `Notchlight_intoLive_2s.MOV` | **Start here on iPhone.** 2.0 s, 60 frames, 1206 × 2622, H.264. Exactly the 60-frame length intoLive likes for wallpaper conversion. |
| `Notchlight_Live.MOV` + `Notchlight_Live.JPG` | A proper, pre-paired Live Photo (3.0 s, 90 frames) sharing one Apple ContentIdentifier. For AirDrop from a Mac. Basenames must stay identical. |
| `Notchlight.pvt/` | The same pair as a `.pvt` package — the cleanest AirDrop route on macOS. |
| `Notchlight_Still.jpg` | The lit key frame on its own (1206 × 2622), if you just want the still. |
| `Preview.mp4` | Silent 540 × 1174 preview of the motion. |
| `Notchlight.MOV` | The clean 3.0 s master without Apple metadata. |
| `source/` | The GSAP scene, art plates and render scripts, if you want to tweak it. |

---

## Set it up — the iPhone-only route (intoLive)

1. **Get the clip into Photos.** Save `Notchlight_intoLive_2s.MOV` to the Files app,
   tap it, then Share → **Save Video**. Confirm it appears in Photos → Videos.
2. Install **intoLive** (free) from the App Store.
3. In intoLive: **+ → Video →** pick `Notchlight_intoLive_2s.MOV`.
4. Trim it to the full **2.0 s** (both handles at the ends).
5. Scrub to about **1.2 s** — the kid is lit and the beam is at the notch — and tap
   **Key Photo / Set as key frame**. This is the frame iOS shows when the screen is idle.
6. Tap **Make** → **No repeat** → **Save Live Photo**. Allow Photos access.
7. Open **Settings → Wallpaper → Add New Wallpaper → Photos → Live Photo**,
   choose the new Live Photo, and make sure the **Live Photo button (bottom left) is ON**.
8. **Add → Set as Wallpaper Pair** (or Customize Home Screen).
9. Lock the phone, then wake it. The kid clicks the torch and the notch lights up.

> Use the 2-second clip, not the 3-second one. iOS plays Live Photo wallpapers in
> slow motion; 2 s lands at roughly 3.5–4 s on screen, which is the right length for
> a wake animation. The 3 s master is the Apple-standard archive copy.

## If you have a Mac (cleanest import)

1. AirDrop **`Notchlight.pvt`** to the iPhone.
2. iPhone: **Save to Photos**. It arrives as one Live Photo, not two files.
3. Set it as the wallpaper as in step 7 above.

Do **not** route the JPG and MOV through the Files app separately — iOS will import
them as a photo and an orphan video.

> The hand-built pair carries the shared ContentIdentifier, but not Apple's
> `still-image-time` timed-metadata track (that needs CoreMedia, i.e. macOS). Photos
> will pair the two files, but it may default the key photo to frame 0. If the idle
> wallpaper looks dark, open the Live Photo → **Edit** → drag the filmstrip to ~1.8 s
> → **Make Key Photo** → Done. The intoLive route avoids this entirely.

---

## How it actually behaves (iOS 17 – 26)

- A Live Photo wallpaper plays **once when the Lock Screen wakes**, then rests on
  the key frame. It does not loop, and it does not animate on the Home Screen.
- iOS plays it in **slow motion** and crops it to fill the screen height.
- Tapping and holding the Lock Screen opens the wallpaper gallery on iOS 17+ — it
  is not the playback gesture any more.
- The key frame must sit in the **middle third** of the clip. That is why the lit
  frame is at 60 % and not at the very end.

## Troubleshooting

| Symptom | Fix |
|---|---|
| "Motion from this Live Photo is not supported as a wallpaper" | Turn off **Low Power Mode** and **Reduce Motion**, then remake with a key frame near the middle of the clip. intoLive output usually works; a hand-built pair is more likely to be rejected. |
| It set, but never moves | The **Live Photo toggle** was off in the wallpaper editor, or Low Power Mode is on. |
| It plays once then sits dark | Re-do step 5: the key frame must be at ~1.2 s, not frame 0. |
| Cropped or zoomed oddly | In the wallpaper editor, pinch out to fit the full frame before tapping Add. |
| Nothing plays on tap/hold | Expected on iOS 17+. Wake the screen instead. |

---

## How it was made

- Art: **FLUX 3 Klein** (`blackforestlabs/flux-3/klein`) on fal.ai — one
  text-to-image pass for the attic, one for the kid, plus a background-removal
  pass. Palette and grain are hand-painted gouache.
- Animation: a **GSAP** timeline at 1206 × 2622, paused and seeked frame by frame,
  captured with headless Chromium at 30 fps. The beam is a baked volumetric cone
  that scales up from the lens; the room, kid, dust and notch glow are all
  separate GSAP layers.
- Timing: click at 0.30 s, beam at the notch by 0.72 s, settle from 1.2 s.
- Pairing: Apple MakerNote `ContentIdentifier` written into the JPEG (donor
  MakerNote + exiftool) and `com.apple.quicktime.content.identifier` written into
  the MOV, so the two files share one UUID.
- The Dynamic Island sits at roughly y = 33–145 px, centred at x = 603; the beam
  terminates there.

## Re-render it yourself

```bash
cd source
npm i playwright gsap
python3 -m http.server 8099            # serve the page
node tools/render.js frames            # 90 PNGs → render/
ffmpeg -framerate 30 -i render/f_%04d.png \
  -c:v libx264 -profile:v high -pix_fmt yuv420p -crf 16 -an out/Notchlight.MOV
```

`src/index.html` + `src/scene.js` hold the whole timeline; every element is a named
layer, so colours, beam width and timing are all one-line edits.
