I built a daily selfie timelapse app. The hard part wasn't the camera, it was making 365 photos line up
The app is simple to describe: one selfie a day, and after a few months you get a video of your own face changing. Android, free, no account, nothing leaves the phone. What I didn't expect was where the work would be. Nobody holds a phone the same way twice. Distance changes, the head tilts, the frame drifts. Stitch raw daily selfies together and you get a shaking, zooming blur where the actual change is invisible under the wobble. So every photo gets aligned: on-device face detection finds the two eyes, then the frame is rotated to level them, scaled to a fixed distance between them, and shifted so the eye line always lands at the same height. After that the head stays still and only the face moves. The bug that took me longest. I added a live guide in the camera — it tells you to move closer, tilt less, and goes green when you match. In testing, it only went green when my face was about 18 cm from the lens. Absurdly close. The cause: the camera analyses a 4:3 frame, but the preview on a tall phone crops the sides to fill the screen. On a 1080×2340 display only about 61% of the frame's width is actually visible. My target was defined in frame coordinates, so "eyes a third of the width apart" meant a third of an image that's much wider than what you see — which is more than half the visible screen. Converting everything to screen coordinates first fixed it, and as a side effect let me draw exactly where your eyes should go. A second, subtler one. The guide originally used yesterday's photo as today's target. Sounds right, but it's a random walk: you land within tolerance of yesterday, that becomes tomorrow's target, and the error accumulates. Over a year the target drifts off. Fixed target, no drift. Where it's at. Launched recently, went from ~30 to ~60 installs after a showcase post. Small, but real people are taking a photo every day, which is the only number I actually care about for an app like this. Stack: Kotlin, Jetpack Compose, CameraX, ML Kit face detection (on-device, eyes only — no recognition), MediaCodec for encoding, WorkManager for optional backup to the user's own Google Drive. Monetisation is an optional one-time purchase for extra export formats. The core is free permanently and has no ads. I'd genuinely like feedback, especially on the first-run experience. For a daily habit app, whether people come back on day 2 matters more than anything else, and I'm not sure I've got that right.