---
title: "Studio product shot — Meleon Skill"
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."
url: https://meleon.ai/skills/studio-product-shot/
author: "Meleon AI"
---

# Studio product shot

> Turn any product photo into a clean, marketplace-ready shot on pure white.

- Type: Image Skill
- Category: Product photos
- Version: 1.0.0 (updated 2026-10-16)
- Made by: Meleon AI (official)
- Price: Free to download. Outside costs: Background removal costs about one cent per photo on fal. Everything else runs locally for free.
- Runs in: Claude Code, Codex and Cursor
- Page: https://meleon.ai/skills/studio-product-shot/
- Download: https://meleon.ai/downloads/studio-product-shot.zip
- Manifest: https://meleon.ai/skills/studio-product-shot.json

## What it does

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.

## Made for

- E-commerce sellers
- Brands
- Marketplace sellers
- Agencies

## Before you start

- You give it: Product photo
- You need: 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.
- Cost per run: Background removal costs about one cent per photo on fal. Everything else runs locally for free.
- Makes: Background removal (fal-ai/birefnet/v2) and local compositing, 1:1 or 4:5

## Install

Run the command for your agent in a terminal. It downloads https://meleon.ai/downloads/studio-product-shot.zip and unzips it into the agent's personal Skills folder.

### Claude Code

```sh
mkdir -p ~/.claude/skills && curl -fsSL https://meleon.ai/downloads/studio-product-shot.zip -o /tmp/studio-product-shot.zip && unzip -o /tmp/studio-product-shot.zip -d ~/.claude/skills
```

Then ask Claude Code to use it: `/studio-product-shot`.

### Codex

```sh
mkdir -p ~/.agents/skills && curl -fsSL https://meleon.ai/downloads/studio-product-shot.zip -o /tmp/studio-product-shot.zip && unzip -o /tmp/studio-product-shot.zip -d ~/.agents/skills
```

Then ask Codex to use it: `$studio-product-shot`.

### Cursor

```sh
mkdir -p ~/.cursor/skills && curl -fsSL https://meleon.ai/downloads/studio-product-shot.zip -o /tmp/studio-product-shot.zip && unzip -o /tmp/studio-product-shot.zip -d ~/.cursor/skills
```

Then ask Cursor to use it: `/studio-product-shot`.

## Example request

```text
/studio-product-shot my sneaker photo, square, for an Amazon listing
```

In Codex, start with `$studio-product-shot` instead of `/studio-product-shot`.

## Files

Every file in the package, readable before you install:

- [SKILL.md](https://meleon.ai/skills/studio-product-shot/files/SKILL.md) (5.4 KB)
- [references/output-spec.md](https://meleon.ai/skills/studio-product-shot/files/references/output-spec.md) (1.2 KB)
- [references/shot-guide.md](https://meleon.ai/skills/studio-product-shot/files/references/shot-guide.md) (5.0 KB)
- [assets/example-input.webp](https://meleon.ai/skills/studio-product-shot/files/assets/example-input.webp) (101.0 KB)
- [assets/generation-input.json](https://meleon.ai/skills/studio-product-shot/files/assets/generation-input.json) (706 bytes)
- [assets/preview.webp](https://meleon.ai/skills/studio-product-shot/files/assets/preview.webp) (71.1 KB)
- [assets/prompt-template.md](https://meleon.ai/skills/studio-product-shot/files/assets/prompt-template.md) (551 bytes)
- [scripts/build-cutout-input.mjs](https://meleon.ai/skills/studio-product-shot/files/scripts/build-cutout-input.mjs) (1.0 KB)
- [scripts/check-spec.mjs](https://meleon.ai/skills/studio-product-shot/files/scripts/check-spec.mjs) (4.0 KB)
- [scripts/compose-white.mjs](https://meleon.ai/skills/studio-product-shot/files/scripts/compose-white.mjs) (7.3 KB)

## Versions

- 1.0.0 (2026-10-16)

## Instructions (SKILL.md)

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 <public https URL>`. 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 `<output>.json` with the product box. Needs `sharp`.
- `scripts/check-spec.mjs`: checks the white border, fill, ratio and size. Needs `sharp`.

## Related

- [Lifestyle product scene](https://meleon.ai/skills/lifestyle-product-scene.md): Put your real product into a believable lifestyle scene without a photoshoot.
- [Packaging mockup](https://meleon.ai/skills/packaging-mockup.md): See your flat packaging art as a real, photographed product.
- [Product colour variants](https://meleon.ai/skills/product-colour-variants.md): Turn one product photo into a set of colourways with everything else locked.
- [All Meleon Skills](https://meleon.ai/skills/) (index as JSON: https://meleon.ai/skills.json; site guide: https://meleon.ai/llms.txt)
