ideas.
October 02, 2026 3 min read mobilecreatorcontent

Shoot a consistent product photo set on a phone

A camera app that locks exposure and framing across a whole product catalogue, so a small seller's listings finally look like one shop.

The idea

A camera app built for one job: photographing many small objects the same way. You set up once — a window, a sheet of paper, your phone on a cheap clamp — and the app pins exposure, white balance, and focus distance for the session. Every subsequent shot reuses those settings, with a translucent ghost of the previous photo overlaid so the next item lands in the same place at the same size. When you're done, it cuts each subject out, pads it to a uniform margin, and exports the batch at whatever dimensions the marketplace demands.

Why build this

Anyone selling handmade or second-hand goods shoots their catalogue in sessions, over weeks, in changing light. The result is a grid where one mug is warm and centred, the next is blue-grey and cropped tight. It reads as amateur in a way that is entirely about consistency, not about photographic skill — and marketplaces reward consistency, because a tidy grid converts better than individually nicer photos.

The existing options miss. Native camera apps auto-adjust everything per frame, which is exactly wrong here. Pro camera apps expose manual controls but have no concept of a session you return to tomorrow. Background-removal services fix cut-outs but not exposure drift or framing. And the capability that makes this work on a phone — fast, accurate subject segmentation running on-device — shipped in the platform vision frameworks a few years ago and is now free and offline.

Stack sketch

  • iOS first: Swift, AVCaptureDevice with setExposureModeCustom, setWhiteBalanceModeLocked, and locked focus; capture to ProRAW or HEIC
  • Segmentation: Vision's VNGenerateForegroundInstanceMaskRequest on-device, with a manual brush for the 10% it gets wrong
  • Android later: CameraX Camera2Interop for the same manual locks, ML Kit Subject Segmentation for masks
  • Session state and presets in SQLite via GRDB; photos stay in the app's own container, not the camera roll, until export
  • Export pipeline in Swift with Core Image for the composite, plus per-marketplace presets (Etsy 2000×2000, Shopify square, eBay 1600px min)
  • Optional sync: a thin Cloudflare Workers + R2 backend so a session started on a phone can be exported from a laptop

Scope for v1

  • In: create a session, lock exposure/WB/focus, ghost overlay from the last capture, capture queue, subject cut-out with manual brush correction, uniform padding, batch export to three marketplace presets, export to Files or Photos
  • In: one shot per item, with retake
  • Out: multi-angle sets, turntables, video, any kind of retouching beyond cut-out and padding
  • Out: accounts, cloud, listing upload — v1 writes files and stops
  • Out: Android

Where it could go

The obvious next step is multi-angle sets: once the app knows a session's geometry, it can prompt for front, three-quarter, and detail shots per item and keep each angle consistent across the catalogue, which is the actual standard on larger marketplaces. From there, listing integration — push the exported set straight into an Etsy or Shopify draft with the SKU already attached — turns a photo app into the first step of a listing workflow, and that is where people will pay monthly rather than once.

A different direction is the shared-catalogue case: a vintage shop with three people photographing stock needs everyone's output to match. Session presets become team presets, synced, so a new volunteer's photos are indistinguishable from the owner's. That is the version a small business buys seats for.

Watch out for

The ghost overlay is the whole product and it is a UX problem, not a technical one — too faint and it's useless, too strong and people can't see what they're shooting. Build it with a real seller and a real pile of stock before writing anything else, because getting the opacity, the snap-to behaviour, and the "this item is a different size" escape hatch wrong makes the app slower than just using the camera.