{"schema_version":"1","site":"https://decosa.ai","id":"ugc","num":"15","name":"Disclosed UGC ads","tool_name":"Make a disclosed UGC ad","short":"UGC ads","blurb":"Short UGC-style product videos with an original AI presenter. Labelled as AI ads on screen and in a content credential. Fake reviews and claims without evidence are refused.","status":"preview","labels":{"industry":["sales-marketing","creative-media"],"job":["generate","draft"],"input":["text"],"deploy":["hosted","selfhost"],"status":"preview","output":["media","text"],"data":["none"],"hardware":"gpu-96","licence":"community"},"industries":["sales-marketing","creative-media"],"runs_in":["hosted","selfhost"],"part_of":["studio-brand"],"built_from":["studio-render","content-credentials"],"models":"Qwen3.8-27B · MiniMax H3 via fal · Kokoro-82M","where":"Hosted or self-host","hardware":"Hosted renders on fal (no local GPU); self-host: 1× RTX PRO 6000 (96 GB)","final_artifact":"A credentialed MP4 with a burned-in AI-ad label and end card.","self_host_first":false,"verification":{"receipt_coverage":"partial","summary":"Receipted lanes; signed render receipt","manual_qa":{"hosted":{"date":"2026-09-25","result":"partial","p50_ms":6695,"p95_ms":null,"runs":null,"receipts_per_run":6,"cost_per_run_usd":0.0027},"selfhost":{"date":"2026-09-25","result":"partial","method":"Fresh clone of decosa-api, api image plus the prompt's extras, compose from the assemble prompt with llm and comfy pointed at an already-running Qwen3.8-27B vLLM and ComfyUI on the same box.","notes":"Verified on 2026-09-25: images build, the service starts, /ugc/policy, the refused brief (no model call), a plain brief (seven lanes, six receipts signed by the box's key, status attested, 7.6 s) and pricing all work against local model servers equivalent to the documented ones; model-server startup was not re-verified. The Kokoro voice-over helper ran on CPU in the container (2 s line in 6 s). A Wan2.1 ad render (about 13 minutes per shot on the GPU) was not run. Fixed on the way: the image left out services/ (first render failed with 'tts exited 2'); self-hosted boxes defaulted to the fal render path; Kokoro's spaCy model download. Worked around locally (fixed in the shared self-host pass): data folders owned by root, and a curl health check the image cannot run."},"known_limits":["The same brief can plan with render_allowed true on one run and false on the next: the writer is a model. The server revises a script once; after that, plan again or add evidence.","Hosted renders need the fal account to have credit; while it is empty, plans still work and renders are refused up front with a clear message.","Hosted plan latency depends on the shared model server: about 7 s when quiet, 16-40 s when busy.","Frames are checked for brand lettering by OCR, not by a person; the published example ads were also reviewed by a person."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Watermark survival on the two example ads (metadata stripped / CRF 28 re-encode / 50% resize)","value":"receipt id recovered in all 6 checks (6/7 to 7/7 frames vote)","unit":null,"n":6,"split":"synthetic","note":null},{"name":"Brand safety, automated check (RapidOCR rule) on 12 H3 clips","value":"flagged 1 of 2 clips a person rejected, 0 of 10 approved clips","unit":null,"n":12,"split":"dev","note":"calibration set"}],"dataset":"Two example ads for watermark robustness, and 12 H3 clips reviewed by a person to calibrate the brand-lettering check (our server, 2026-09-24).","held_out":false,"caveats":["Ad quality not measured with a metric; the lite tier was judged not usable for presenter ads by owner review.","The brand check was calibrated on the same 12 clips it is scored on, and it missed 1 of 2 rejected clips.","Lip-sync quality not measured yet."],"date":"2026-09-24","doc_url":null},"stack":{"summary":"A small brand writes a brief. The lanes screen it, write hooks and a voice-over for a disclosed AI presenter, check every claim against the evidence on file, write the disclosure and storyboard the shots; a director pass turns the storyboard into precise shot prompts. The hosted render runs on MiniMax H3 Max through fal at cost: a presenter still, lip-synced presenter shots with a preset synthetic voice, B-roll that keeps the same presenter, captions, an 'AI-generated ad' label on every frame and a disclosure end card. The provenance kit signs a render receipt, embeds a C2PA credential and puts an invisible watermark in every frame. The generator is commodity; the disclosure and provenance layer is the product.","tagline":"Short UGC-style product videos with an original AI presenter: disclosed on screen and in a content credential, with no fake reviews and no claims without evidence.","deployment":"hosted-or-self-host","regulatory_note":"US: the FTC rule on consumer reviews and testimonials (16 CFR Part 465, in force 21 Oct 2024) bans reviews and testimonials that misrepresent that they come from a real consumer with real experience, including AI-generated ones; the FTC's Q&A says it does not ban virtual influencers or obviously fictional dramatizations. So this tool never writes a customer testimonial, rating or review. The FTC Endorsement Guides (16 CFR Part 255, revised 2023) cover fictitious and virtual endorsers and require clear and conspicuous disclosure. Objective claims need substantiation before they run. Platforms also require AI labels on realistic synthetic content (turn them on when posting). EU AI Act Art. 50(2) machine-readable marking is covered by the C2PA credential and watermark. Credentials use a development certificate (issuer untrusted in public validators). This is a product policy, not legal advice; the advertiser stays responsible for its claims.","components":[{"id":"llm","role":"Lane model (brief check, hooks, script, claims review, disclosure text, storyboard)","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 (3 draft tokens)","vram_gb":57.6,"memory_gb_estimate":null,"engine":"vLLM 0.29.0 (OpenAI-compatible)","receipt_coverage":"strong","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"h3","role":"Hosted default video: presenter still, lip-synced presenter shots and reference-consistent B-roll (with audio)","name":"MiniMax H3 Max (via fal)","hf_repo":null,"license":"H3's own licence excludes the US; used here only through fal's hosted endpoints, listed as commercial use under fal's MiniMax partnership","params":null,"quant":null,"vram_gb":null,"memory_gb_estimate":null,"engine":"fal queue API: minimax/h3-max/text-to-video, /lip-sync/image-to-video, /reference-to-video (1080P, 9:16, prompt expansion off)","receipt_coverage":"none","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"voice","role":"Voice-over (preset synthetic voices only)","name":"Kokoro-82M","hf_repo":"hexgrad/Kokoro-82M","license":"Apache-2.0","params":"82M","quant":"FP32","vram_gb":0,"memory_gb_estimate":null,"engine":"kokoro 0.9.4 (PyTorch, CPU)","receipt_coverage":"none","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"c2pa","role":"Content credential and render receipt (provenance kit)","name":"c2pa-rs via c2pa-python","hf_repo":null,"license":"MIT OR Apache-2.0","params":null,"quant":null,"vram_gb":0,"memory_gb_estimate":null,"engine":"c2pa-python 0.37.12, ES256, CPU","receipt_coverage":"none","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"watermark","role":"Invisible watermark on every frame (payload: the receipt id)","name":"TrustMark variant Q","hf_repo":null,"license":"MIT","params":null,"quant":"FP32","vram_gb":0,"memory_gb_estimate":null,"engine":"trustmark 0.9.2, CPU, BCH_5; detection votes over 7 sampled frames","receipt_coverage":"none","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"llm_fp8","role":"Lane model, lite tier","name":"Qwen3.8-27B FP8 (official)","hf_repo":"Qwen/Qwen3.8-27B-FP8","license":"Apache-2.0","params":"27.8B","quant":"FP8, FP8 KV cache, MTP speculative decoding (3 draft tokens)","vram_gb":33.6,"memory_gb_estimate":null,"engine":"vLLM 0.29.0 (OpenAI-compatible)","receipt_coverage":"none","in_hosted_demo":false,"tiers":["lite"],"alternative_to":null},{"id":"video","role":"Lite-tier shot renderer (silent 5 s clips, 480x832), fully open weights","name":"Wan2.1-T2V-14B","hf_repo":"Wan-AI/Wan2.1-T2V-14B","license":"Apache-2.0","params":"14B","quant":"FP8 (e4m3fn) weight cast from the FP32 checkpoint, FP16 compute","vram_gb":null,"memory_gb_estimate":null,"engine":"ComfyUI core Wan nodes (the studio's ComfyUI), uni_pc sampler, 30 steps, cfg 5, shift 5","receipt_coverage":"none","in_hosted_demo":false,"tiers":["lite"],"alternative_to":null},{"id":"ltx","role":"Self-host alternative: talking-head shots with audio and character LoRAs","name":"LTX-2.3 22B","hf_repo":"Lightricks/LTX-2","license":"LTX-2 Community License Agreement","params":"22B","quant":"BF16","vram_gb":null,"memory_gb_estimate":null,"engine":"LTX-2 pipelines (the owner's UGC pipeline)","receipt_coverage":"none","in_hosted_demo":false,"tiers":["best"],"alternative_to":null},{"id":"h3-selfhost","role":"Self-host: presenter stills, lip-synced shots and reference-consistent B-roll on your own GPU","name":"MiniMax-H3 (licence pending, self-host)","hf_repo":"MiniMaxAI/MiniMax-H3","license":"MiniMax H3 Community License today (it excludes the US, EU, UK and Korea); a licence for our use is pending","params":"33.1B (transformer) + 33.4B (text encoder)","quant":"BF16 with CPU offload","vram_gb":null,"memory_gb_estimate":133,"engine":"diffusers ModularPipeline (MiniMax-H3 blocks)","receipt_coverage":"none","in_hosted_demo":false,"tiers":["best"],"alternative_to":null}],"tiers":[{"id":"lite","label":"Lite · fully open (Apache-2.0), on your own GPU","summary":"Wan2.1-T2V-14B shots with the same planning, disclosure and provenance steps. Silent B-roll only and visibly lower quality than H3 or LTX-2.3: fine for drafts and for a stack with no third-party model or service, not for a finished presenter ad.","components":["llm_fp8","video","voice","c2pa","watermark"],"hardware":"1× 48 GB card (lanes and renders take turns), or 1× RTX PRO 6000 96 GB","quality_evidence":[{"metric":"Ad quality","value":"judged not usable next to H3 or LTX-2.3 for presenter ads (owner review, 25 Sep 2026); not measured with a metric","source":"owner review"},{"metric":"Render time","value":"788 s per 5 s shot at FP8 weights, 30 steps (one RTX PRO 6000)","source":"measured on our server 2026-09-23"}],"latency_note":"measured: many minutes per shot, so well over half an hour for a three-shot ad","in_hosted_demo":false,"receipt_coverage":"none","receipt_note":"Self-hosted: receipts are signed by your box's key.","hosting":null},{"id":"standard","label":"Standard · the hosted default, MiniMax H3 via fal at cost","summary":"Gateway lanes with receipts, a director pass, then H3 Max on fal: lip-synced presenter, consistent B-roll, 1080x1920. Billed at fal's list price with no markup; renders need an API key.","components":["llm","h3","voice","c2pa","watermark"],"hardware":"No GPU for the render (fal); the lane model runs on the gateway","quality_evidence":[{"metric":"Watermark survival on the two example ads (metadata stripped / CRF 28 re-encode / 50% resize)","value":"receipt id recovered in all 6 checks (6/7 to 7/7 frames vote)","source":"measured on our server 2026-09-24, <data>/ugc/watermark-robustness-h3.json"},{"metric":"Brand safety, automated check (RapidOCR rule) on 12 H3 clips","value":"flagged 1 of 2 clips a person rejected, 0 of 10 approved clips","source":"calibration 2026-09-24, decosa_api/verticals/ugc/brand_check.py"},{"metric":"Ad quality","value":"not measured yet","source":null}],"latency_note":"measured: seconds per fal call, a few calls per ad, plus seconds to compose and under a minute to stamp and watermark on CPU; plan lanes in seconds","in_hosted_demo":true,"receipt_coverage":"partial","receipt_note":"Lane calls carry gateway receipts. The render is a remote model call: the receipt, signed by this service, lists the fal request ids and cost.","hosting":null},{"id":"best","label":"Best for self-host · MiniMax H3 (licence pending) or LTX-2.3 on your own GPU","summary":"Joint audio-video for lip-synced presenters without a third-party service. Its licence keeps it off the hosted service; the disclosure and provenance layer is the same. Or run the open H3 weights yourself (1× 96 GB GPU + ~115 GB RAM), the same model as the hosted default; its licence doesn't currently cover the US/EU/UK/KR, so check it applies to you.","components":["llm","h3-selfhost","ltx","voice","c2pa","watermark"],"hardware":"1× RTX PRO 6000 96 GB","quality_evidence":[{"metric":"Lip-sync and ad quality","value":"not measured yet in this product","source":null}],"latency_note":"not measured yet","in_hosted_demo":false,"receipt_coverage":"none","receipt_note":"Self-hosted renders are signed by the box's own key.","hosting":null},{"id":"wanted","label":"Wanted · MiniMax H3 on two cards, no offload","summary":"Presenter ads take five H3 calls each, so throughput matters. Both halves of MiniMax-H3 in BF16 on two 96 GB cards, so nothing is offloaded to RAM: faster renders (estimate, not measured). Self-host now where H3's current licence covers you; once the pending licence lands we add this compute for the hosted tier ourselves. Not a community-provider model.","components":["llm","h3-selfhost","voice","c2pa","watermark"],"hardware":"2x RTX PRO 6000 96 GB, no CPU offload (about 133 GB of BF16 weights; estimate)","quality_evidence":[{"metric":"render time per clip against one card with offload","value":"not measured yet","source":null}],"latency_note":"not measured yet","in_hosted_demo":false,"receipt_coverage":"none","receipt_note":"Self-host: your box signs the render record. Not a community-provider model.","hosting":"own-hardware"}],"alternates":[],"services":[{"name":"decosa-api (ugc routes)","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:<tag>","purpose":"POST /ugc/plan (lanes, SSE), POST /ugc/renders, GET /ugc/policy, GET /ugc/samples; stamps the finished ad."},{"name":"Lane model (vLLM, or our gateway)","port":8114,"image":"vllm/vllm-openai:v0.29.0","purpose":"Qwen3.8-27B for the seven planning lanes."},{"name":"fal (remote, hosted tier only)","port":null,"image":null,"purpose":"MiniMax H3 Max text-to-video, lip-sync and reference-to-video; billed per second at list price."},{"name":"Studio ComfyUI (lite tier)","port":8189,"image":null,"purpose":"Wan2.1 shots when DECOSA_UGC_RENDER_BACKEND=wan."}],"tools":[{"name":"16 CFR Part 465, consumer reviews and testimonials rule","url":"https://www.ecfr.gov/current/title-16/chapter-I/subchapter-D/part-465","license":"US federal regulation","purpose":"Sec. 465.2 bans fake or false consumer reviews and testimonials, including AI-generated ones. In force 21 Oct 2024."},{"name":"FTC Q&A on the reviews and testimonials rule","url":"https://www.ftc.gov/business-guidance/resources/consumer-reviews-testimonials-rule-questions-answers","license":"FTC guidance","purpose":"Virtual influencers are not banned; an obviously fictional dramatization is not a testimonial; the standard is knew or should have known."},{"name":"16 CFR Part 255, Endorsement Guides (revised 2023)","url":"https://www.ecfr.gov/current/title-16/chapter-I/subchapter-B/part-255","license":"US federal guides","purpose":"Fictitious and virtual endorsers are covered; disclosures must be clear and conspicuous."},{"name":"C2PA content credentials","url":"https://github.com/contentauth/c2pa-rs","license":"MIT OR Apache-2.0","purpose":"Open an ad in any C2PA validator to see the credential and the embedded receipt."}],"hardware":[{"tier":"Hosted (fal)","fits":true,"notes":"No local GPU for renders; composing and watermarking a 1080x1920 ad takes about a minute of CPU."},{"tier":"1× RTX PRO 6000 96 GB","fits":true,"notes":"During one Wan2.1 shot with FP8 weights, GPU0 use rose from 70 GB to 84 GB of 96 GB; the 70 GB already included other services and ComfyUI's cached models (measured 2026-09-23). The lane model runs on the gateway or a second card."},{"tier":"1× 48 GB card","fits":null,"notes":"Not measured yet: the FP8 lane model (33.6 GB) and the render would have to take turns."}],"latency":[{"lane":"fal call (H3 still, lip-sync or 8 s B-roll)","typical_ms":16000,"source":"measured 2026-09-24 (10 calls, 5.7-21 s)"},{"lane":"compose 1080x1920 + stamp with per-frame watermark","typical_ms":61000,"source":"measured on our server 2026-09-24 (2 ads)"},{"lane":"voice-over, one 6 s line (Kokoro-82M, CPU)","typical_ms":1536,"source":"measured on our server 2026-09-23 (1 run, includes model load)"},{"lane":"brief check (patterns, before any model call)","typical_ms":0,"source":"measured on our server 2026-09-23 (refused brief in scripts/ugc_samples.py)"},{"lane":"plan: seven lanes","typical_ms":null,"source":"not measured yet (the lane model was offline during the build)"},{"lane":"lite tier: one 5 s Wan2.1 shot (FP8, 30 steps, 480x832)","typical_ms":788137,"source":"measured on our server 2026-09-23"}],"benchmark":null,"notes":["Reused from the owner's UGC pipeline: the job-queue shape and ffmpeg assembly. Not reused: LTX-2.3 (self-host only licence), the Fish Speech voice (weights licence not verified for commercial use), and the persona voice references and character LoRAs, which have no consent records on file.","The example ads are for fictional brands with fictional evidence entries.","Hosted renders are priced at fal's list price, passed through with no markup, and need an API key: at most 2 renders per key per day, and a global daily spending cap (DECOSA_FAL_DAILY_CAP_USD, default $15). Demo sessions get the recorded example ads only.","Brand safety: the published example ads were reviewed keyframe by keyframe by a person (the first H3 still put a real outdoor brand's logo on a jacket). User renders cannot be reviewed by hand, so an OCR check refuses any render that shows lettering. It does not catch logos without letters, low-confidence lettering or text in a single frame."]},"buyer_facts":[{"label":"Data retention","value":"Plans (brief, script, claims, receipt ids) are kept on the server as JSON so a render can refer to them; a rendered ad opens only through an expiring signed link given to the key that made it. No personal data is needed: presenters are invented. On fal (hosted video only): fal keeps request data (prompts and file links) for 30 days by default and serves uploaded and generated files from public CDN links until they are deleted [V: fal docs, Data Retention & Storage, read 29 Sep 2026]; Decosa downloads each result at once, and fal's no-storage and short-expiry options are not switched on yet."},{"label":"What leaves the box","value":"Hosted: the brief goes to the open model through our gateway; hosted renders send the director's shot prompts, two frames of the invented presenter (itself made on fal) and the house-voice voice-over (a stock Kokoro voice, no real person's voice) to fal, a partner GPU provider, under Decosa's account. Self-host: nothing, unless you set the H3 backend with a fal key."},{"label":"Inputs and limits","value":"JSON brief: brand (60 characters), product (80), description (600), up to 6 key points and 8 evidence entries, 2-3 shots, voices af_heart or am_michael, platform tiktok, reels or shorts."},{"label":"Outputs","value":"720x1248 MP4 (H.264 + AAC) labelled on every frame, ending on a disclosure card, with a C2PA credential, a signed render receipt and a per-frame watermark."}],"data_handling":{"page":"/data#ugc","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":["fal"],"retention":"Plans (brief, script, claims, receipt ids) are kept on the server as JSON so a render can refer to them; a rendered ad opens only through an expiring signed link given to the key that made it. No personal data is needed: presenters are invented. On fal (hosted video only): fal keeps request data (prompts and file links) for 30 days by default and serves uploaded and generated files from public CDN links until they are deleted [V: fal docs, Data Retention & Storage, read 29 Sep 2026]; Decosa downloads each result at once, and fal's no-storage and short-expiry options are not switched on yet.","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":[{"to":"fal (MiniMax H3 Max)","route":"hosted","sends":"content","what":"Hosted renders send the director's shot prompts, two frames of the invented presenter (made on fal) and the house-voice voice-over audio to fal, a partner GPU provider, under Decosa's account; fal keeps request data 30 days by default and serves files from public CDN links until deleted.","default":"always","off":null},{"to":"fal (MiniMax H3 Max)","route":"selfhost","sends":"content","what":"Only if you choose the H3 backend and set your own fal key; the default self-host render is local.","default":"off","off":null}]},"console":{"href":"/studio/brand","input":"ugc-brief","lanes":[{"id":"screen","title":"Brief check","kind":"markdown"},{"id":"hooks","title":"Hooks","kind":"list"},{"id":"script","title":"Script","kind":"markdown"},{"id":"claims","title":"Claims checklist","kind":"json"},{"id":"disclosure","title":"Disclosure","kind":"markdown"},{"id":"storyboard","title":"Storyboard","kind":"list"},{"id":"checklist","title":"Compliance checklist","kind":"list"}],"samples":[{"n":1,"id":"tidepot","title":"Tidepot","deep_link":"/studio/brand?sample=1&autorun=0"},{"n":2,"id":"lumo-loop","title":"Lumo loop","deep_link":"/studio/brand?sample=2&autorun=0"},{"n":3,"id":"fernway","title":"Fernway","deep_link":"/studio/brand?sample=3&autorun=0"},{"n":4,"id":"refused-testimonial","title":"Refused testimonial","deep_link":"/studio/brand?sample=4&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/ugc-hosted.md","selfhost":"/prompts/ugc-selfhost.md","assemble":"/prompts/ugc-assemble.md","mac":"/prompts/ugc-mac.md"},"rehearsal":{"bundle":"/samples/ugc.zip","bundle_url":"https://decosa.ai/samples/ugc.zip","folder":"/samples/ugc/","expected":"/samples/ugc/expected.json","files":["/samples/ugc/expected.json","/samples/ugc/inputs/brief-fake-testimonial.json","/samples/ugc/inputs/brief.json"],"bytes":1950,"checks":["the plan runs every lane: screen, hooks, script, claims, disclosure, storyboard, checklist","the brief passes the screen","the plan finishes with no error","at least six model calls, each with a receipt","the on-screen label says it is an AI-generated ad","the compliance checklist passes the no-testimonial rule (16 CFR 465.2)","the fake-testimonial brief is refused as a fake testimonial","the refusal happens before any model call","the plan is stored and can be fetched","pricing answers with an estimate for this plan","every model call has a signed receipt"],"licence":"Fictional: Tidepot and its brief (including the evidence entry) were written for Decosa, CC0. No real people or products.","about":"A brief for a fictional desk planter with one substantiated claim, and a brief that asks for a fake customer testimonial. The plan must run all seven lanes (screen, hooks, script, claims, disclosure, storyboard, checklist) with a signed receipt per model call and be stored; the testimonial brief must be refused by the fixed rules before any model call. No render: renders run on fal (paid) or the shared GPU, so this rehearsal stops at the plan and the price estimate.","run":{"containers":"docker compose exec api python scripts/rehearse.py ugc","checkout":"python scripts/rehearse.py ugc --bundle ugc.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py ugc"},"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=ugc","data":"/api/hardware.json","tiers":[{"id":"lite","gpu_gb":51.4,"basis":"estimate","unknown":[]},{"id":"standard","gpu_gb":57.6,"basis":"stack","unknown":[]},{"id":"best","gpu_gb":207.4,"basis":"estimate","unknown":[]},{"id":"wanted","gpu_gb":153.6,"basis":"stack","unknown":[]}],"mac":{"fit":"partial","memory_gb":32}},"links":{"page":"/studio/brand","json":"/use-cases/ugc.json","metrics":"/metrics/ugc","console":"/studio/brand","console_sample":"/studio/brand?sample=1&autorun=0","stack":"/studio/brand","try_live":"/studio/brand","watch":"/studio/brand","build":"/studio/brand","self_host":"/studio/brand","prompts":{"hosted":"/prompts/ugc-hosted.md","selfhost":"/prompts/ugc-selfhost.md","assemble":"/prompts/ugc-assemble.md","mac":"/prompts/ugc-mac.md"}}}