The wallpaper that keeps its still
Fridays here are for what shipped and what broke. This week's story is about something that broke a while ago (in July, during the engine sprint) but is still instructive — and it's the one I promised its own Friday: the day I learned why iOS will never animate my Live Photos as wallpapers. Undocumented metadata, three trips to the device, and a workaround I tried… and deleted the same day.
The dream, sized honestly
Camaïeu makes living compositions, so the export feature writes itself: take the composition with you. A video for sharing, and a Live Photo, because since iOS 17, a Live Photo set as a wallpaper animates when you wake your phone. Your lock screen takes one breath. That was the idea, and it's a small dream: not "live wallpaper," just that one breath.
Round one: Photos won't play it
The pipeline itself is the part I'm proud of. An export isn't a screen capture: the app re-renders the exact look offscreen, through the same shaders and the same palette, anchored to the loop phase that was on screen when you tapped. What you see is what you carry. A Live Photo is really a pair — a still image and a short movie joined by a shared identifier — so we (Claude and I) wrote both, one seamless loop, and Photos accepted them. It just refused to play the "Live" part.
The culprit was placement: the camera puts its still mid-movie, and ours sat at the very start. Because the loop is seamless, the fix cost nothing: start the movie half a loop early, and the middle frame is exactly what was on screen. Second trip to the device: it played, and it played beautifully.
Round two: "Motion Not Available"
Then I set it as my wallpaper, and the picker said Motion Not Available.
Claude went digging and came back with the outline of the problem: iOS decides wallpaper motion based on metadata that isn't documented anywhere, chiefly an opaque track that only the camera writes. An Apple engineer on the developer forums confirms the requirements are undocumented, and that workarounds aren't supported. I can see the logic: the lock screen has strict battery and reliability guarantees, and only trusting files produced by the system itself is one way to keep them. It's a clear answer. Just not the one I wanted.
Round three: the workaround
There is a known recipe, used by an entire class of apps: take a real camera Live Photo, extract its metadata tracks, and transplant them into your own movie. An open-source implementation exists. Claude ported it in an evening — template file, movie under a second long, the camera's exact geometry, tracks copied over. Cheap to try.
Third trip to the device: still Motion Not Available. The gate clearly checks more than anyone has reverse-engineered. And the attempt had already cost something: to fit the template's constraints, the Live Photo had shrunk from a full seamless loop to a 0.9-second clip.
Deleting it the same day
That evening, I removed the entire experiment from the codebase. Not just because it failed, but because of what it would have meant if it had half-worked. Shipping behavior that Apple won't support means shipping something any iOS update could silently break. That's not a fragility I want built in.
What shipped instead
The clean pipeline: one full seamless loop, plays on long-press in Photos, still frame exactly what was on your screen. And one honest sentence in the export sheet, where the promise would have been: iOS only animates Live Photos as wallpapers when they come from its own camera. An app about calm shouldn't overpromise — including to itself.
At least, that was the ending until this week. Re-checking on my phone while writing this post, the long-press play no longer runs the full loop: it stops after a couple of seconds, and the Loop effect in Photos bridges the gap with a cross-fade. I can't say exactly what changed, or whether it behaves differently on another device or another iOS. That uncertainty is rather the point. A Live Photo is built for a three-second camera moment; Camaïeu's loops have their own duration, and how Photos chooses to play them was never mine to control.
So the Live Photo export is retiring. In its place, two exports the app can stand behind on any device: a still of exactly what is on your screen, which is what a wallpaper was always going to be anyway, and a video of the loop, which plays perfectly everywhere. The pairing code stays in the project, dormant.
Maybe I'll file Feedback asking for a public API. If one ever ships, Camaïeu adopts it the same day. Until then, your wallpaper holds its still — and inside the app, nothing ever stops moving.
Next post Monday: two icon candidates — which one still reads as alive when it's standing still?
Camaïeu is built for RevenueCat's Shipaton 2026. #Shipaton #BuildInPublic