Shipping a Seasonal AI Side Project on Cloudflare Workers: Lessons from a Pet Halloween Photo App A developer shipped HallowPaws, a seasonal AI pet-portrait app built on Cloudflare Workers, where users upload a dog or cat photo and pick from 16 fixed costume presets to generate an HD Halloween portrait that preserves the animal's identity. The build uses scale-to-zero pricing, stamps watermarked 768px previews inside the Worker with Photon (Rust compiled to WASM) before writing to R2, and runs generation as a job with a single failure rule that marks jobs failed and refunds reserved credits exactly once. The developer reports that fixed presets, guest previews without sign-up, and one-time credit packs rather than subscriptions were the decisions that mattered for a three-week seasonal window. Most side-project advice assumes you have time: launch, iterate, grow slowly. A Halloween product gets about three weeks. If people can't find it, trust it and pay for it in that window, the next chance is a year away. This October I shipped HallowPaws https://hallowpaws.com?utm source=devto . You upload a photo of your dog or cat, pick a costume, and get an HD Halloween portrait that still looks like your pet. Below are the engineering and product decisions that mattered for a short seasonal window. Most of them would apply to any AI photo side project. For a product that's busy for a few weeks and quiet the rest of the year, scale-to-zero pricing matters more than anything else on this list. Nothing sits idle and costs money in February. The users are pet parents, not prompt engineers. So there is no free-text input anywhere. The only prompts that can run are 16 costume presets in one config file vampire, witch, pumpkin, ghost, skeleton, pirate, wizard, mummy and so on . Each preset has just two creative fields, costume and scene , which get dropped into one shared template: Edit the reference photo: create a Halloween costume portrait of the pet from the reference photo. Keep the exact same animal identity: same species, breed, fur color and pattern, markings, eye color, ear shape, face proportions and expression, so the owner instantly recognizes their pet. Dress the pet in {costume}. The costume must fit the animal's anatomy naturally... Background: {scene}. Style: photorealistic professional pet photography, sharp focus on the eyes, detailed fur texture, shallow depth of field, vertical 4:5 portrait composition. Do not add any humans, people, hands, text, captions, logos or brand marks... The identity line comes before the costume line on purpose. For this kind of product, the quality bar isn't "nice AI art". It's whether a friend scrolling past would say "that's Max". Fixed presets also make results reproducible, so when a costume underperforms I fix one string in one file. Adding a costume or an SEO landing page means adding one entry, and the picker, sitemap and llms.txt all update from that config. The free tier is a low-res, watermarked preview. My first instinct was to ask the model to draw the watermark. Don't do that: the model treats it as a suggestion. Instead, previews get stamped inside the Worker with Photon Rust compiled to WASM before anything is written to R2. The image is downscaled to 768px wide and a tiled overlay is applied. The clean original never exists in storage, so there's no URL for anyone to guess. HD images skip this step completely. Two workerd gotchas: .wasm file has to be imported as a precompiled module ?module , because compiling from bytes at runtime is blocked. Image-edit calls regularly take longer than Cloudflare's ~100-second proxy timeout. Run them inside the request and users see HTTP 524. So generation became a job: POST /generate validates the photos JPEG/PNG/WebP, up to 10 MB each , Every failure path goes through one rule: mark the job failed and refund the reserved credits, exactly once. A sweeper fails and refunds anything stuck for more than 10 minutes. The provider wrapper also has a per-call timeout, so a hung primary model still leaves time to retry on the fallback model. Users never pay for a failed image, and that one rule removed a whole category of support emails. Asking for an account before showing any result kills a seasonal funnel. HallowPaws gives guests one free watermarked preview with no sign-up : A monthly subscription for something people use for two weeks a year feels hostile. So HallowPaws sells one-time packs: Pack definitions live server-side as the single source of truth. The client only sends a pack key. Checkout ignores any price or credit count in the request body and records the server's numbers on the order, and that order is what the webhook grants. Before/after examples are the most persuasive part of the landing page. They're also the easiest place to cut corners. The ones on HallowPaws come from royalty-free CC0 pet photos, run through the same presets customers get, and the page says so. If your product is "it still looks like your pet", the demo can't use cherry-picked outputs from a different pipeline. If you have a dog or cat and five minutes, you can try a free preview at hallowpaws.com https://hallowpaws.com?utm source=devto . I'm happy to answer questions about the Workers + Queue + Photon setup in the comments.