--- name: studio-product-shot description: Turn a casual product photo into a marketplace-ready pack shot on pure white, with the product kept pixel-for-pixel as photographed. Removes the background, scales the product to fill 85% of the frame, adds a soft natural contact shadow, and checks the result against Amazon and Shopify rules. Square 1:1 and 4:5, 2000 px. metadata: type: image version: 1.0.0 category: Product photos tagline: Use this Skill to turn any product photo into a clean, marketplace-ready shot on pure white. made-for: E-commerce sellers, Brands, Marketplace sellers, Agencies generates-with: Background removal (fal-ai/birefnet/v2) and local compositing, 1:1 or 4:5 requires: Node.js 20.9 or newer (sharp needs it); run `npm install sharp` in the Skill folder for compose-white.mjs and check-spec.mjs. A background-removal model, or your own FAL_KEY to call the one named in assets/generation-input.json. outside-costs: Background removal costs about one cent per photo on fal. Everything else runs locally for free. updated: 2026-10-16 title: Studio product shot availability: live summary: Turn a casual product photo into a marketplace-ready pack shot on pure white, with the product kept pixel-for-pixel as photographed. command: /studio-product-shot my sneaker photo, square, for an Amazon listing output: JPEG ยท 1:1 or 4:5, 2000 px, pure white required-input: Product photo creator: meleon --- # Studio product shot Use this skill when someone has a casual photo of a real product and needs a marketplace listing image: the product on pure white, large in the frame, with a believable soft shadow, exactly as it looks in real life. The product is never redrawn. A model cuts it out of the photo, and a script places those same pixels on white. Labels, stitching and colours cannot drift. ## What you need - One product photo, as a file or public URL. Whole product in frame, in focus, ideally on a surface that contrasts with it. - The ratio: 1:1 (default) or 4:5. - Optional: no shadow, for platforms that forbid it. If the photo is missing, ask for it. Do not invent the product. ## What you make - A 2000 x 2000 JPEG on pure white (#FFFFFF), product filling about 85%, with a soft contact shadow. Default. - A 2000 x 2500 4:5 JPEG, when asked. - A pass/fail spec check for the file. ## How to run it 1. Read `references/shot-guide.md` for source-photo advice, marketplace rules and the product-type notes (shiny, transparent, white-on-white, dark, tiny). If the photo has hands, stickers or clutter touching the product, tell the person before you start. 2. Make the photo reachable. If it is a local file, upload it to a temporary host you control to get a public https URL (or send it as a data URI), and delete it afterwards. Run `node scripts/build-cutout-input.mjs --image `. POST the printed JSON `input` to fal model `fal-ai/birefnet/v2` with the person's own `FAL_KEY` (this Skill never stores keys). The response holds the transparent PNG at `image.url`: download that file. Without a key, use any background-removal tool that returns a transparent PNG (rembg or BiRefNet class) and go to step 3. 3. Look at the cut-out. Check the edge: no halo, nothing missing, nothing extra. 4. Run `node scripts/compose-white.mjs --input cutout.png --output shot.jpg`. Add `--ratio 4:5` for portrait, `--shadow 0` for no shadow, `--normalise` for a dull, underexposed photo of a light product (one gain on all channels, hue unchanged; look at the product colour afterwards and drop the flag if it shifted). The defaults (2000 px, 85% fill, shadow 0.45, no normalise) are what produced `assets/preview.webp`. 5. Run `node scripts/check-spec.mjs shot.jpg`. The five required checks must pass; the shadow line is a note. Fill is measured from `shot.jpg.json`, which compose-white.mjs writes next to the shot. For white-on-white products judge the edge and fill by eye. 6. Compare the shot with the original photo side by side (`references/output-spec.md`, checks 6 to 9). The product must be the same. 7. If a check fails: max 3 attempts, change one thing per attempt (the fix from `references/shot-guide.md`, or the cleanup fallback in `assets/generation-input.json`, and say what you changed), view each output beside the input, then return the best one and say what still differs. Never return a shot that misrepresents the product. 8. Return the file and say which checks passed. ## Limits - The photo's exposure is kept. A dull phone photo gives greyish whites. `--normalise` lifts light products a little; it cannot fix a badly lit photo. - The cleanup fallback regenerates the product pixels. The result is no longer a photographic cut-out: say so when you return it. ## Files - `references/shot-guide.md`: source photos, marketplace rules, shadow and fill settings, fixes for bad cut-outs. - `references/output-spec.md`: sizes, format and the pass/fail checklist. - `assets/generation-input.json`: the cut-out model and its settings. - `assets/prompt-template.md`: the optional cleanup prompt, for the rare case the matte cannot fix. - `assets/example-input.webp` and `assets/preview.webp`: a real input photo and the shot made from it. - `scripts/build-cutout-input.mjs`: prints the background-removal request. It does not call any API. - `scripts/compose-white.mjs`: places the cut-out on pure white with a shadow, and writes `.json` with the product box. Needs `sharp`. - `scripts/check-spec.mjs`: checks the white border, fill, ratio and size. Needs `sharp`.