Rainbow Paw
ENESPT

Methodology: how a photo becomes a tribute video

By Shangyi Duan · Last verified 2026-11-02 · Sources: src/worker.js, build.py, content.py · Report an error

This page shows what happens to a photo between the upload and the finished MP4, which files hold the numbers the site publishes, and what the method cannot do. Everything below comes from the site’s own code — src/worker.js, build.py and content.py — not from an outside study.

Sources

The site quotes no outside publication for facts about pet loss or about our own product, so the “Sources” line on each page names the repo file that holds the value shown. This table is the complete list, including the one manual step. No row is an outside dataset.

SourceURLUsed forLast checked
Scene prompts, safety check and preview capssrc/worker.js (repo file, not a public URL)The four scene prompts, the moderation order, 3 previews per day per visitor and 150 per day site-wide2026-11-02
Page copy, FAQs and comparison rowscontent.py (repo file)Every paragraph, FAQ answer and the seven competitor rows2026-11-02
Prices, credit packs and sitemapbuild.py (repo file)$9.99, $19.99 and $39.99 packs; 1 credit standard, 2 HD; the 28 URLs in the sitemap2026-11-02
Launch and payment recordREPORT.md (repo file)Dodo product IDs, the webhook path and the launch-day test results2026-11-02
Other tools’ priceseach listed tool’s own pricing page, read by handThe comparison page; read in October 2026 and not automatedOctober 2026 (read by hand)

How the video is made

  1. Resize in the browser. src/app.js shrinks the chosen photo to 1280 px on its long edge and sends it as a JPEG data URL, so the original file never leaves the visitor’s device at full size.
  2. Validate the request. /api/preview accepts only the four scene keys, checks that the image is JPEG, PNG or WebP and under the stated size limit, and applies the preview caps: 3 per visitor per day and 150 per day for the whole site, for visitors without credits.
  3. Check the photo before anything is generated. Two models run together: an NSFW classifier (fal-ai/imageutils/nsfw) and a vision classifier (openrouter/router/vision, running Gemini 2.5 Flash) that returns a JSON verdict on people, minors, gore, hate symbols and whether an animal is visible at all. Each is retried up to three times; if either check cannot run, the request fails with a 503 and nothing is generated — the check never fails open.
  4. Paint the still. The scene’s still prompt goes to fal-ai/nano-banana/edit together with the photo. The prompt asks for the same breed, coat colours, markings and face, and for no people and no text.
  5. Choose the quality. Standard is 720p and costs 1 credit; HD is 1080p and costs 2. Both are 10 seconds with generated music.
  6. Queue the movement. /api/render deducts the credits, then sends the approved still and the scene’s motion and audio prompts to alibaba/wan-3.0/image-to-video. If the queue call itself fails, the credits go back automatically.
  7. Watch the queue. The page polls /api/render/:id. A completed job returns the MP4 URL; an error, or more than 20 minutes without a result, marks the job failed and refunds the credits.
  8. Download. /api/download/:id streams the finished file as rainbow-paw-memorial.mp4.
  9. Expiry. The preview job record lives 3 days and the render record 7 days, which is why the site tells people to download within a week.

One step is manual: the prices in the comparison table were read from each tool’s public page by hand in October 2026. Nothing else is typed page by page — the pages, the sitemap and llms.txt are generated by build.py on every build.

Known limitations