One photo in. A 3D game hero out.
A personalized Christmas gift: the buyer uploads a photo, AI turns it into a rigged, animated 3D character, and that character becomes the star of a web game with six worlds. We built the product, the AI pipeline and the order system that runs it.
In-house product · not client work
- Product
- Personalized gift game
- Plays on
- Any phone or computer, no app
- Game
- Three.js · 6 worlds
- Store
- gift.vl-games.com

The problem
A gift that is really about them
Personalized gifts are usually a name printed on a mug. We wanted something a person actually plays: a real video game where the hero looks like the person receiving it, whether that is a partner, a child, a family member or a friend. That meant three hard problems at once. The 3D character had to be made from one ordinary photo, without a 3D artist. The game had to run in any phone browser with a scanned QR code, with no app install. And every order had to move from payment to delivery without someone doing the same steps by hand each time.
What we built
A web game, an AI character pipeline and an order system
- The game. A Three.js endless runner with six worlds (Snowy Town, Lapland Forest, Santa's Workshop, Frozen Ice Caves, Gingerbread Land and Santa's Village), a hub with Gift Week, missions, a wardrobe and power-ups, and a sleigh flight with Santa.
- The hero. The recipient appears as a rigged 3D character with six animations: idle, run, jump, slide, wave and cheer.
- The delivery. Each gift gets a private link with a random token, an optional lock until a set time (for example Christmas morning) and printable cards with a QR code.




From one photo to a game-ready 3D character
The AI part runs in two stages, with a person approving the result in between so paid 3D credits are never spent on a bad drawing.
- Turnaround sheetAn image model (Gemini, with OpenAI's image model as a fallback) draws the person as a character from four sides. Real customer photos only go to these first-party APIs.
- Human checkThe operator approves the sheet in a private admin panel, or asks for a new one.
- 3D modelThe four views go to Tripo's multiview-to-3D model, which builds the character.
- Rig and animateThe model is rigged as a biped and given six animation clips.
- Pack and gateA Node script merges everything into one GLB file. Automatic gates reject it unless every clip is present, it has at most 16k triangles and weighs at most 1.6 MB, so it loads fast on a phone.
The order pipeline
Every step after payment is automated or reduced to one button. The order state is saved on disk, so the system can stop at any point and pick up where it left off.
- Checkout webhookThe store sends a paid-order webhook. We verify its HMAC signature, and the intake link is derived from the order ID, so a repeated webhook cannot create a second order.
- Photo intakeThe buyer gets an email with a private upload page for photos, names and (on higher tiers) a short voice note. Consent is required, plus a guardian confirmation when the recipient is a child or teen.
- 3D generationThe two-stage hero pipeline above, with a credit cap per build and every paid step logged.
- Automated QAA scripted browser plays the whole game on a phone-sized screen, takes screenshots of each set piece and records console errors and failed requests. A spoken line with the recipient's name is checked by turning it into speech and back into text.
- Owner approvalNothing goes out until the operator approves the order in the admin panel. Publishing is blocked if the 3D hero, consent, photos or captions are missing.
- PublishThe game goes live at its private link, optionally locked with a countdown until the gift date.
- Email with QR cardsThe buyer gets the link plus a print-ready PDF on US Letter with crop marks: a 5×7 "Player 1 Ready" card, a tree hang-tag and an envelope insert, each with the 3D hero and a QR code.

Built to survive failures
- Emails are idempotent. Each email has "sending" and "sent" flags stored on the order under a lock, and the email provider receives an idempotency key, so a retry or a restart never sends the same email twice. Sends retry with backoff, and reminders are capped.
- Paid work is never repeated. 3D task IDs are recorded as soon as they start, so a retry re-checks or re-downloads the existing model instead of paying again.
- Restarts are safe. Jobs interrupted by a restart are reset to a state they can resume from.
- Photos are not kept. Original uploads are deleted automatically 7 days after the order is approved.
How it is built
No database: order state lives in files outside the web root, written atomically. That keeps a seasonal product cheap to run and easy to back up.
All heroes shown here (Sofia, Max) are demo characters made from AI-generated sample photos of people who do not exist. This is a new product, so we don't quote sales numbers.
We can build this for you
The same pieces work for other businesses: a branded web game with your customer as the hero, an AI step that turns uploads into 3D or images, and an order pipeline that runs itself from payment to delivery. Web apps start from $12,000 and branded mini-games from $8,000, with a fixed quote before we start.