About this site
A small tool built by one person: turn a still photo into a looping portrait that breathes and blinks, running entirely on a graphics card at home.
Why build it
It started with a family album. A yellowed group photo at the back of a drawer; the only surviving picture of a grandparent as a young person. You look at it long enough and you start to wonder what it would feel like if they blinked once more, or smiled again. Current image generation models can already do that, but to use one you first have to install Python, install ComfyUI, download tens of gigabytes of weights and learn to wire up a node graph. That barrier isn't a technical problem; it's a "nobody has packaged it" problem.
So this site reduces the whole thing to three steps: pick a photo, pick a motion, wait forty seconds. The prompt wording, output dimensions, looping method and failure guards are already tuned for you.
About the author
I'm William Hsu, a full-stack engineer who builds complete systems from zero to one — product design, architecture, development, deployment and commercialisation. My portfolio is at lazebot.com, with a dozen or so projects including ERP systems, game server infrastructure and AI system integrations.
This is one of the more enjoyable ones: part practical exercise in video generation models, part experiment in taking an awkward technology and packaging it so anyone can use it.
What building it taught me
Most of the work wasn't getting the model to run — it was handling what the real world does to it:
- Telling the model "don't move the camera" makes the shot push in harder (measured displacement went from 6.6 to 39.2)
- Ask the model to draw a picture frame and the frame comes out crooked — so the page draws it instead
- Say "the person" when the photo is a bird, and the model invents a person
- The pipeline is slow, and the slow part isn't the maths — it's moving 30GB of weights onto a 16GB card
- A phone freezing a background tab made the frontend conclude it had lost the job, when the backend had finished it perfectly
The details are written up in how it works and the guide — both of those pages have more substance than this one.
Three design principles
1. If a choice can be removed, remove it
There is no free-text prompt box — you pick from eleven presets. Not because free text is hard, but because loosely worded prompts sharply raise the odds of something strange appearing. "The photo is a bird, the prompt says the person, so a person appears" is the perfect example. Narrowing the options to combinations we know work has a much higher success rate than handing you a text box.
2. Failure should be legible
When the model does badly, you shouldn't just see "generation failed". Hence the failure cases page, which lays out what each common failure looks like, why it happens and how to avoid it — using clips that were actually generated.
3. Don't quietly do things with people's photos
Everything runs on our own hardware, no third-party AI API is involved, there is no training, no face matching, and files are deleted after seven days. That isn't marketing copy — the implementation details are in how it works.
What's next
- Selectable output length (currently a fixed 6-second loop)
- More motions, especially for animals (only five so far)
- Cutting the 11-second VAE decode down, aiming for under 30 seconds per run
- Batch processing: upload a whole album at once
If you want something specific, tell me.
See my other work → lazebot.com