{"schema_version":"1","site":"https://decosa.ai","id":"honest-product-imagery","num":"77","name":"Honest product imagery","tool_name":"Check generated product images","short":"Product imagery check","blurb":"For e-commerce sellers and brands that make product and lifestyle images with AI. Send photos of the real product and the AI image: it checks the net quantity, colour, pack text and claims, logo, warnings, and features or extra units the product does not have, with deterministic measurements (colour difference in Lab, the document reader for the pack text, logo and unit matching) plus a side-by-side open-model comparison. Any person in the image must be a consent-ledger identity whose consent covers this advertising use. An image that passes gets the AI metadata and label each marketplace or law you pick asks for, a C2PA credential and a signed record. It checks images made anywhere; it does not generate them. Not legal advice.","status":"preview","labels":{"industry":["sales-marketing","compliance-trust"],"job":["review","attest"],"input":["files"],"deploy":["hosted","selfhost"],"status":"preview","output":["media","record"],"data":["pii","confidential"],"hardware":"gpu-96","licence":"permissive"},"industries":["sales-marketing","compliance-trust"],"runs_in":["hosted","selfhost"],"part_of":["studio-brand"],"built_from":["document-reader","consent-gate","content-credentials","signed-record"],"models":"Qwen3.8-27B (finds the product, logo and people; compares the two images) · document reader block: Docling layout + PaddleOCR-VL-1.6 (pack text)","where":"Hosted or self-host","hardware":"1x RTX PRO 6000 (96 GB) for Qwen3.8-27B with its vision tower; the document reader's layout model and parser run beside it; the checks, credential and record on CPU","final_artifact":"A verdict with each misrepresentation found, the consent decisions, the disclosure per target with sources, the approved JPEG with IPTC metadata and a C2PA credential, and a signed record.","self_host_first":false,"verification":{"receipt_coverage":"partial","summary":"Receipt per model call and per page-parse call; signed consent decisions; C2PA credential with the fidelity result; signed hash-chained record","manual_qa":{"hosted":{"date":"2026-09-27","result":"pass","p50_ms":12900,"p95_ms":null,"runs":null,"receipts_per_run":10,"cost_per_run_usd":0.0018},"selfhost":{"date":"2026-09-27","result":"pass","method":"Fresh clone of the branch into a clean directory, docker build of the api image (45 s), the api with named volumes on host networking against the running local Qwen3.8-27B (vision, direct route) and document reader, the C2PA dev certificate from the prompt's step; then torn down.","notes":"The rehearsal bundle passed 11 of 11 in 17 s (750 ml refused, a person without consent refused after two calls, a faithful image approved with IPTC metadata and a C2PA credential, the record verifies and a tampered copy fails); receipts attested; no product text in the logs. The first try without the C2PA step approved the image with no credential, which the bundle caught. The model and document-reader servers' own startup was not re-verified (no new GPU load)."},"known_limits":["Hosted verification ran on the pre-release server (decosa-api the pre-release branch on our server, gateway route); production gets this tool when the branch merges.","Measured on six made-up products with scenes drawn by one image model; real product photos and other generators were not tested.","The alignment handles upright shots and small tilts; strong perspective or a product held at an angle skips the colour and logo checks.","A generated hand or body part counts as a person, so it needs an identity (a synthetic performer can be enrolled as a fictional identity).","The C2PA credential uses a development certificate; public validators show it as untrusted."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Planted misrepresentations flagged","value":"48 / 48","unit":null,"n":48,"split":"test","note":"44 refused, 4 sent to a person; size, colour, text, logo, warning and feature, 8 each. Thresholds were frozen before the test ran; fixes followed (below)."},{"name":"Faithful images flagged","value":"3 / 24","unit":null,"n":24,"split":"test","note":"2 where the model boxed no product (now found by a template search), 1 carton the generator drew 12% taller. 2 / 25 after the fixes."},{"name":"Generator misrepresentations flagged (not planted)","value":"5 / 5","unit":null,"n":5,"split":"test","note":"The image model swapped a screw cap for a pump or spray top, added cartons, redrew a carton as a bottle."},{"name":"Planted flagged by Qwen3.8 alone / Claude Opus 5.5 alone","value":"46 / 47 and 47 / 47","unit":null,"n":47,"split":"test","note":"Opus 5.5 is an eval-only reference judge (same prompt and images); the colour check closed Qwen's one miss."},{"name":"Generator-garbled small text caught","value":"0 / 17 (Opus 5.5: 15 / 17)","unit":null,"n":17,"split":"synthetic","note":"Found after the test run: re-labelled by eye, prompted by Opus's flags. The main gap."},{"name":"Consent refusals","value":"7 / 7","unit":null,"n":7,"split":"synthetic","note":"No identity, bystanders, other campaign, withdrawn, expired, not enrolled, territory; each before the comparison, with a signed decision."},{"name":"Dev: planted flagged / faithful flagged","value":"24 / 24 and 0 / 12","unit":null,"n":36,"split":"dev","note":"Thresholds set here in three rounds."}],"dataset":"Six made-up products (2 dev, 4 test, split by product); 22 lifestyle scenes drawn by Wan2.2-VACE-Fun-A14B around the packs; each faithful render in three versions plus six planted misrepresentations; the raw renders hand-labelled.","held_out":false,"caveats":["Same author made the products, the plants, the checker and the labels; one image generator; synthetic products only.","Small: 48 planted and 24 faithful test images from 8 renders of 4 products, and 5 generator misrepresentations.","The test split was used after the frozen run to fix four things; those re-run numbers are not held out.","The first hand labels missed generator-garbled warnings on 5 of 13 faithful renders; the checker passed all of them.","Any person, including generator-drawn bystanders and hands, needs a consent-ledger identity: strict by design."],"date":"2026-09-27","doc_url":"https://decosa.ai/metrics/evals/honest-product-imagery"},"stack":{"summary":"Send photos of the real product, the AI image and, optionally, what the product is (net quantity, claims, warnings, features). Code measures the colour difference in Lab after a white balance, reads the pack text with the document reader, matches the logo and counts units; Qwen3.8-27B compares the two images per category. A misrepresentation (750 ml for a 500 ml bottle, a shifted colour, a changed claim, a redrawn logo, a missing warning, a pump or extra unit the product lacks) stops the image. Any person in it must be a consent-ledger identity whose consent covers this advertising use. An image that passes gets IPTC metadata, a label where New York or the EU asks for one, a C2PA credential and a signed record. For e-commerce sellers, DTC brands and the agencies that make their images.","tagline":"Check an AI-made product or lifestyle image against the real product, stop it if a person in it has no consent for this ad, and ship the AI label and metadata each marketplace asks for, with a C2PA credential and a signed record.","deployment":"hosted-or-self-host","regulatory_note":"Not legal advice or a determination that a listing or ad is lawful; sources read on the primary pages on 27 Sep 2026 unless marked. Misrepresentation: FTC Act s.5 and the FTC Policy Statement on Deception (14 Oct 1983, https://www.ftc.gov/legal-library/browse/ftc-policy-statement-deception); EU Unfair Commercial Practices Directive 2005/29/EC Art. 6(1)(b) (main characteristics such as composition, accessories, quantity; https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32005L0029). AI marking and deep fakes: EU AI Act (Regulation (EU) 2024/1689) Art. 50(2) and 50(4), applying from 2 Aug 2026 (Art. 113); generators on the market before that date have until 2 Dec 2026 for 50(2) (Art. 111(4), added by Regulation (EU) 2026/1744, OJ 24 Jul 2026). Synthetic performers: New York GBL s.396-b (https://www.nysenate.gov/legislation/laws/GBS/396-B) requires an advertiser with actual knowledge to disclose a synthetic performer conspicuously; in force from 9 Jun 2026 per the disclosure pre-flight's reading of chapter 617 of 2025 (exact date not re-verified). Model consent: New York Fashion Workers Act, Labor Law Art. 36, s.1037(7) (clear and conspicuous prior written consent to create or use a model's digital replica, stating scope, purpose, rate of pay and duration; https://www.nysenate.gov/legislation/laws/LAB/1037), effective 19 Jun 2025 per the NY Department of Labor FAQ. Marketplaces: Amazon's product image guide (G1881) asks images to represent the product accurately and to tag photorealistic AI-generated people (keyword contains-synthetic-performer); Google Merchant Center asks for AI metadata such as IPTC DigitalSourceType TrainedAlgorithmicMedia; Etsy's Creativity Standards (10 Jun 2025) require disclosure for items made with AI, not for AI photos of real items; Meta labels images carrying C2PA or IPTC AI indicators, and whether it requires AI disclosure in ads outside political and social-issue ads was not verified. Model licences: Apache-2.0 (Qwen3.8-27B, PaddleOCR-VL-1.6, the Heron layout weights), MIT (Docling).","components":[{"id":"llm","role":"Finds the product units, the logo and label, and every person or human likeness in the reference photo and the AI image; compares the two side by side with the seller's facts, per category (size, colour, text, logo, warning, feature)","name":"Qwen3.8-27B (NVIDIA NVFP4)","hf_repo":"nvidia/Qwen3.8-27B-NVFP4","license":"Apache-2.0","params":"27.8B","quant":"NVFP4 (MLP) + FP8 (attention/GDN), FP8 KV cache, MTP speculative decoding k=3","vram_gb":57,"memory_gb_estimate":null,"engine":"vLLM 0.29.0, served with its vision tower","receipt_coverage":"strong","in_hosted_demo":true,"tiers":["lite","standard"],"alternative_to":null},{"id":"layout","role":"Pack text, step 1: finds the text regions on crops of the product (the document reader block)","name":"Docling 2.130 with the Heron layout model","hf_repo":"docling-project/docling-layout-heron","license":"MIT (Docling) + Apache-2.0 (weights)","params":null,"quant":"FP32","vram_gb":1,"memory_gb_estimate":null,"engine":"docling-ibm-models in the docreader service (services/docreader)","receipt_coverage":"partial","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"parser","role":"Pack text, step 2: reads each region (name, variant, claims, quantity, warnings)","name":"PaddleOCR-VL-1.6 (0.9B)","hf_repo":"PaddlePaddle/PaddleOCR-VL-1.6","license":"Apache-2.0","params":"0.9B","quant":"BF16","vram_gb":4.4,"memory_gb_estimate":null,"engine":"OpenAI-compatible server behind the docreader service","receipt_coverage":"partial","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"check","role":"Alignment (NCC on edges over scale and a few degrees of rotation), colour (CIEDE2000 after white balance on the pack's neutral areas), logo match, unit count, changed pack area, the quantity and text comparisons, the verdict rules, the consent gate, XMP, the burned-in label and its OCR read-back, the C2PA credential and the signed record (no model; CPU)","name":"decosa-api imagery module (decosa_api/verticals/imagery)","hf_repo":null,"license":"AGPL-3.0-or-later","params":null,"quant":null,"vram_gb":0,"memory_gb_estimate":null,"engine":"Python 3.12, NumPy, Pillow, Tesseract 5, c2pa-python","receipt_coverage":"partial","in_hosted_demo":true,"tiers":["lite","standard"],"alternative_to":null},{"id":"render","role":"Not part of the service: drew the demo and eval lifestyle scenes around synthetic packs (one job at a time on the shared studio GPU)","name":"Wan2.2-VACE-Fun-A14B","hf_repo":"alibaba-pai/Wan2.2-VACE-Fun-A14B","license":"Apache-2.0","params":"A14B (two 14B experts, high and low noise)","quant":"fp8_e4m3fn weights","vram_gb":null,"memory_gb_estimate":null,"engine":"ComfyUI, core WanVaceToVideo (length 1), the virtual-staging still graph","receipt_coverage":"none","in_hosted_demo":false,"tiers":["alternates"],"alternative_to":null}],"tiers":[{"id":"lite","label":"Lite · pixels and the model, no document reader","summary":"Alignment, colour, logo and unit checks in code plus the model's comparison; the quantity, claim and warning text is judged by the model only, so those findings stay warnings.","components":["llm","check"],"hardware":"1x RTX 5090 32 GB for the model (not measured) or the hosted gateway","quality_evidence":[{"metric":"not measured as a separate tier (the standard tier was measured)","value":"not measured","source":"decosa-api docs/evals/honest-product-imagery.md"}],"latency_note":"estimate: three image calls per check","in_hosted_demo":false,"receipt_coverage":"strong","receipt_note":"Gateway receipt per image call on the hosted route.","hosting":null},{"id":"standard","label":"Standard · pixels, pack text and the model (hosted demo)","summary":"Adds the document reader: printed quantities, claims and warnings compared in code, so a 750 ml label on a 500 ml product fails without the model's say-so.","components":["llm","layout","parser","check"],"hardware":"Qwen3.8-27B on one 96 GB card; the document reader beside it (about 6 GB)","quality_evidence":[{"metric":"held-out test (thresholds frozen): planted misrepresentations flagged / faithful images flagged","value":"48 of 48 (44 refused, 4 for review) / 3 of 24","source":"decosa-api docs/evals/honest-product-imagery.md, measured on our server 2026-09-27, gateway route"}],"latency_note":"measured: seconds for a full check under load","in_hosted_demo":true,"receipt_coverage":"partial","receipt_note":"Model calls are receipted by the gateway; page parses carry model-call receipts signed by decosa-api (attested).","hosting":null}],"alternates":[{"id":"demo-scenes","label":"Lifestyle scenes for demos (not part of the service)","components":["render"],"hardware":"shared studio GPU, one job at a time; about 30-45 s per 1152x768 still (measured)","use":"Wan2.2-VACE-Fun-A14B drew the demo and eval scenes around synthetic packs. The service checks images from any generator; it does not generate them.","status":"self-host only"}],"services":[{"name":"decosa-api","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:0.1.0","purpose":"GET /imagery/info, /imagery/samples; POST /imagery/runs (SSE or JSON); GET /imagery/runs/{id}[/image|/export]. No GPU; Tesseract and c2pa inside."},{"name":"decosa-llm","port":8000,"image":"${DECOSA_REGISTRY}/decosa-llm:0.1.0","purpose":"vLLM OpenAI endpoint for Qwen3.8-27B, served with its vision tower (image input). Internal to the compose network."},{"name":"docreader","port":8497,"image":null,"purpose":"The document reader service (services/docreader in decosa-api): Docling layout plus the PaddleOCR-VL-1.6 parser. No published image yet; build it from the repo."}],"tools":[{"name":"decosa consent ledger (tool 47)","url":"https://decosa.ai/apps/consent-ledger","license":"AGPL-3.0-or-later (decosa-api)","purpose":"consent.check per person for face / advertising / project / territory / date; signed decisions. The demo uses a private ledger of fictional id_demo-* identities."},{"name":"decosa disclosure pre-flight (tool 49)","url":"https://decosa.ai/apps/disclosure-preflight","license":"AGPL-3.0-or-later (decosa-api)","purpose":"Its rule code decides the NY s.396-b and EU AI Act Art. 50(2)/50(4) statuses from the performers, the credential and the label read-back."},{"name":"C2PA via c2pa-python (provenance kit)","url":"https://github.com/contentauth/c2pa-python","license":"MIT OR Apache-2.0","purpose":"The credential on the approved image: c2pa.created (or c2pa.edited) with the IPTC digital source type, the fidelity result and the consent decisions; the reference photos as ingredients."},{"name":"IPTC Digital Source Type vocabulary","url":"https://cv.iptc.org/newscodes/digitalsourcetype/","license":"CC BY 4.0 (IPTC)","purpose":"trainedAlgorithmicMedia or compositeWithTrainedAlgorithmicMedia written into the image's XMP, as Google Merchant Center and Meta read it."},{"name":"Tesseract OCR 5","url":"https://github.com/tesseract-ocr/tesseract","license":"Apache-2.0","purpose":"Reads the burned-in label back from the delivered pixels."},{"name":"decosa record (vertical 07) and POST /record/verify","url":"https://decosa.ai/apps/record","license":"AGPL-3.0-or-later (decosa-api)","purpose":"The signed record anyone can re-check."},{"name":"scripts/imagery_eval.py and scripts/imagery_scenes.py","url":null,"license":"Apache-2.0","purpose":"Six made-up products drawn with Pillow (Lato and DejaVu fonts), lifestyle scenes drawn around them by Wan2.2-VACE-Fun-A14B, planted misrepresentations, split by product into dev and test."}],"hardware":[{"tier":"1x RTX PRO 6000 96 GB","fits":true,"notes":"Measured on the hosted setup: Qwen3.8-27B NVFP4 with its vision tower on one card; the docreader layout model (about 1 GB) and parser (4.4 GB) on the other shared card."},{"tier":"CPU only","fits":null,"notes":"The pixel checks, label, credential and record run on CPU; locating and comparing need the vision model (hosted gateway or your GPU). The parser on CPU was not measured here."}],"latency":[{"lane":"one full check (3 image calls, pack text read), hosted gateway route","typical_ms":12900,"source":"measured on our server 2026-09-27: median of 3 recorded full checks on the pre-release server (7.7, 12.9 and 13.1 s), under load from the eval"},{"lane":"consent refusal (2 locate calls, nothing else runs)","typical_ms":5200,"source":"measured on our server 2026-09-27: 2 recorded runs (4.9 and 5.5 s)"}],"benchmark":null,"notes":[]},"buyer_facts":[{"label":"What it checks","value":"Net quantity and count, product colour, pack text and claims, the logo, warnings, and parts, accessories or extra units the product does not have, against your own product photos and the facts you state. Any person or human likeness in the image needs a consent-ledger identity whose consent covers this advertising use."},{"label":"What it does not do","value":"It does not generate images, give legal advice or say a listing or ad is lawful. It cannot know about a product change you did not tell it about. It misses small warning or claim text that the image model garbled: in the eval it passed all 17 such images (a frontier model caught 15). It does not identify people: it only checks the identities you name."},{"label":"Data retention","value":"Images are held in memory and a temporary folder for the run and deleted when it ends; an approved image is kept with the run for one hour for the token or key that made it, so you can download it. Consent decisions on the demo go to a private in-memory ledger. Logs carry ids, verdicts and counts, never images or product facts."},{"label":"What leaves the box (hosted demo)","value":"The images go to Qwen3.8-27B through our gateway and to the document reader service, both operated by Decosa. Self-hosted, nothing leaves the machine."},{"label":"Cost per image","value":"A fraction of a cent of model calls for a full check (a few image calls) and less for a consent refusal, at the gateway list price (measured)."},{"label":"Output","value":"A verdict with each misrepresentation found and how, the consent decisions, the disclosure per marketplace or law with its source, the approved JPEG with IPTC metadata (and Amazon's synthetic-performer keyword when it applies), a burned-in label where one is required, a C2PA credential, and a signed record (verify at /record/verify)."}],"hosted_now":{"needs":["document-reader","qwen3.8-27b"],"off":["document-reader"],"live_by_default":false,"live_status":"https://api.decosa.ai/status"},"data_handling":{"page":"/data#honest-product-imagery","self_host":{"level":"confidential","leaves":"nothing","summary":"Runs on your machine; nothing is sent to Decosa or a third party by default."},"hosted":{"level":"operator-processed","demo_only":false,"summary":"TLS to Decosa's server, then decrypted and processed by Decosa's API server, with the open models run by NEAR AI through OpenRouter, with Reka AI as the only fallback under Decosa's account.","gpus":"operator-contracted","third_parties":[],"retention":"Images are held in memory and a temporary folder for the run and deleted when it ends; an approved image is kept with the run for one hour for the token or key that made it, so you can download it. Consent decisions on the demo go to a private in-memory ledger. Logs carry ids, verdicts and counts, never images or product facts.","used_for_training":false,"encrypted_while_processed":false},"sealed_tier":{"applies":false,"note":"The sealed tier (raw chat only, never use-case pipelines) is paused at launch (/docs/sealed-tier)."},"external_calls":[]},"console":{"href":"/tools/media/honest-product-imagery","input":"imagery","lanes":[{"id":"consent","title":"Consent gate","kind":"list"},{"id":"fidelity","title":"Product fidelity","kind":"list"},{"id":"disclosure","title":"Disclosure per target","kind":"list"},{"id":"record","title":"Credential and record","kind":"json"}],"samples":[{"n":1,"id":"faithful-shelf","title":"Faithful shelf","deep_link":"/tools/media/honest-product-imagery?sample=1&autorun=0"},{"n":2,"id":"bystanders","title":"Bystanders","deep_link":"/tools/media/honest-product-imagery?sample=2&autorun=0"},{"n":3,"id":"pump-swap","title":"Pump swap","deep_link":"/tools/media/honest-product-imagery?sample=3&autorun=0"},{"n":4,"id":"size-750ml","title":"Size 750ml","deep_link":"/tools/media/honest-product-imagery?sample=4&autorun=0"},{"n":5,"id":"colour-shift","title":"Colour shift","deep_link":"/tools/media/honest-product-imagery?sample=5&autorun=0"},{"n":6,"id":"warning-dropped","title":"Warning dropped","deep_link":"/tools/media/honest-product-imagery?sample=6&autorun=0"},{"n":7,"id":"extra-units","title":"Extra units","deep_link":"/tools/media/honest-product-imagery?sample=7&autorun=0"},{"n":8,"id":"synthetic-model","title":"Synthetic model","deep_link":"/tools/media/honest-product-imagery?sample=8&autorun=0"},{"n":9,"id":"wrong-campaign","title":"Wrong campaign","deep_link":"/tools/media/honest-product-imagery?sample=9&autorun=0"},{"n":10,"id":"no-identity","title":"No identity","deep_link":"/tools/media/honest-product-imagery?sample=10&autorun=0"},{"n":11,"id":"withdrawn-consent","title":"Withdrawn consent","deep_link":"/tools/media/honest-product-imagery?sample=11&autorun=0"},{"n":12,"id":"consented-but-wrong-cap","title":"Consented but wrong cap","deep_link":"/tools/media/honest-product-imagery?sample=12&autorun=0"}],"deep_link_params":{"sample":"1-based index into samples, or a sample id","autorun":"1 = start the run once the sample is loaded; 0 (default) = only preselect","reduce-motion":"1 = turn off animations"}},"api":{"base":"https://api.decosa.ai","contract":"/api/contract.json","contract_markdown":"/api/contract.md","reference":"/docs/api","keys":"/account/keys"},"prompts":{"hosted":"/prompts/honest-product-imagery-hosted.md","selfhost":"/prompts/honest-product-imagery-selfhost.md","assemble":"/prompts/honest-product-imagery-assemble.md","mac":null},"rehearsal":{"bundle":"/samples/honest-product-imagery.zip","bundle_url":"https://decosa.ai/samples/honest-product-imagery.zip","folder":"/samples/honest-product-imagery/","expected":"/samples/honest-product-imagery/expected.json","files":["/samples/honest-product-imagery/expected.json","/samples/honest-product-imagery/inputs/can-person.jpg","/samples/honest-product-imagery/inputs/facts-can.json","/samples/honest-product-imagery/inputs/facts-handwash.json","/samples/honest-product-imagery/inputs/facts-jar.json","/samples/honest-product-imagery/inputs/handwash-750.jpg","/samples/honest-product-imagery/inputs/jar-shelf.jpg","/samples/honest-product-imagery/inputs/ref-can.jpg","/samples/honest-product-imagery/inputs/ref-handwash.jpg","/samples/honest-product-imagery/inputs/ref-jar.jpg"],"bytes":413230,"checks":["the 750 ml image is not approved","the size misrepresentation is named","no image is released for it","a person with no consent record is refused","the refusal comes before the comparison (two locate calls only)","the faithful image is approved","it carries the IPTC DigitalSourceType Google and others read","it carries a C2PA credential","the record verifies","a record with the image hash changed no longer verifies","every model call has a signed receipt"],"licence":"Synthetic products and brands made up for Decosa; packshots drawn with Pillow (Lato, SIL OFL 1.1; DejaVu fonts); scenes drawn by Wan2.2-VACE-Fun-A14B (Apache-2.0) in decosa-api, 27 Sep 2026. Part of decosa-api, which will be released under AGPL-3.0-or-later; until then the source is on request.","about":"Three made-up products (a hand-wash bottle, a drink can and a vitamin jar), each with the seller's own packshot. An AI lifestyle image of the bottle whose label says 750 ml must be not approved with a size violation. An AI ad image of the can with a person in it and no consent-ledger identity must be refused by the consent gate before any comparison. A faithful AI lifestyle image of a vitamin jar must be approved with the IPTC DigitalSourceType in XMP, a C2PA credential and a signed record that verifies, and fails once the image hash in the record is changed.","run":{"containers":"docker compose exec api python scripts/rehearse.py honest-product-imagery","checkout":"python scripts/rehearse.py honest-product-imagery --bundle honest-product-imagery.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py honest-product-imagery"},"guidance":"Set up with a coding agent (we recommend Claude Code with Claude Opus 5.5; any capable coding agent works) on mock data only, run the rehearsal until every check passes, then run your own data locally yourself. Never give the agent real data during setup."},"hardware_fit":{"check":"/self-host/hardware?use=honest-product-imagery","data":"/api/hardware.json","tiers":[{"id":"lite","gpu_gb":57.6,"basis":"stack","unknown":[]},{"id":"standard","gpu_gb":63,"basis":"stack","unknown":[]},{"id":"alternate-demo-scenes","gpu_gb":34,"basis":"stack","unknown":[]}],"mac":null},"links":{"page":"/tools/media/honest-product-imagery","json":"/use-cases/honest-product-imagery.json","metrics":"/metrics/honest-product-imagery","console":"/tools/media/honest-product-imagery","console_sample":"/tools/media/honest-product-imagery?sample=1&autorun=0","stack":"/tools/media/honest-product-imagery#stack","try_live":"/tools/media/honest-product-imagery","watch":"/tools/media/honest-product-imagery","build":"/tools/media/honest-product-imagery#build","self_host":"/tools/media/honest-product-imagery#self-host","prompts":{"hosted":"/prompts/honest-product-imagery-hosted.md","selfhost":"/prompts/honest-product-imagery-selfhost.md","assemble":"/prompts/honest-product-imagery-assemble.md","mac":null}}}