← AstriaCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Astria
Snapshot Sep 30, 2026 · 23:16 UTC · version 1.5.4
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "store-photoshoot",
"description": "Use when turning a brand's whole online store (Shopify or WooCommerce) into a reusable Astria AI photoshoot — crawl the catalog, extract the brand's DNA, cast avatars, and build packs that re-shoot the entire collection (and every future drop) in the brand's own look. Trigger phrases — \"build a photoshoot from my store\", \"crawl STORE_URL and make packs\", \"AI product photography for BRAND\", \"re-shoot our catalog\".",
"included_files": [],
"skill_md_contents": "---\nname: store-photoshoot\ndescription: Use when turning a brand's whole online store (Shopify or WooCommerce) into a reusable Astria AI photoshoot — crawl the catalog, extract the brand's DNA, cast avatars, and build packs that re-shoot the entire collection (and every future drop) in the brand's own look. Trigger phrases — \"build a photoshoot from my store\", \"crawl STORE_URL and make packs\", \"AI product photography for BRAND\", \"re-shoot our catalog\".\nallowed-tools: Bash(astria:*), Bash(python3:*), Bash(curl:*), Read, Write, AskUserQuestion\n---\n\n# Store Photoshoot Builder\n\nGiven a brand's storefront URL, crawl the shop, extract its brand DNA, and build\na complete, reusable AI photoshoot system in an Astria workspace: a casting\nboard of brand avatars (when on-model shots are needed), product reference\ntunes, and a set of **packs** (prompt templates) that can re-shoot the brand's\nentire catalog — and every future collection — in the brand's own visual\nlanguage.\n\nAll Astria operations go through the `astria` CLI (see the **astria-api**\nskill) — never raw API calls, never tokens in skill text. Scope every command\nwith `-w <workspace_id>`. Everything you register in Astria — faces, garments,\nshoes, jewels, poses, backgrounds, props, logo lockups — is a **single-image\nfaceid reference tune** whose `name` is a controlled class noun (`woman`, `man`,\n`boy`, `girl`, `dress`, `shirt`, `pants`, `shoes`, `ring`, `necklace`, `chain`,\n`earrings`, `bracelet`, `pose`, `background`, `outfit`, `bottle`, …) and whose\n`title` is the human/SKU label. Prompts address them as `<faceid:ID:1>\n<class-noun>` — the class noun immediately after the token is the routing\nmechanism that tells the model what to take from that reference.\n\n**Deliverable of a full run:** a workspace containing (1) a confirmed Brand DNA\nbrief, (2) a 2–5 avatar casting board (on-model only), (3) product reference\ntunes, (4) one pack per item-type / outfit formula with a fixed shot battery,\n(5) a QA'd pilot render, then the scaled catalog, and (6) a workspace landing\npage.\n\nRelated skills: **astria-api** (the CLI), **unique-headshot** (avatar casting),\n**prompt-writing** (prompt grammar & parameters), **packs-guide** (packs),\n**landing-page-editor** (the `/w/:slug` page).\n\n---\n\n## Phase 1 — Crawl the store\n\n**Detect the platform first**, then use its public JSON endpoints. Crawl\npolitely: sequential requests, a normal browser User-Agent.\n\n**Shopify** — `{store}/products.json` returns JSON:\n```\nGET {store}/products.json?limit=250&page=N # loop N=1,2,3… until \"products\" is empty\nGET {store}/collections.json?limit=250 # collections + products_count\nGET {store}/collections/{handle}/products.json # per-collection membership\nGET {store}/pages.json?limit=100 # About / editorial / brand-story pages\n```\nPer product capture: `title`, `product_type`, `tags`, `vendor`, `body_html`\n(strip HTML), `variants[].price`, `images[].src` (CDN URLs — the tune training\nsource), `options` (sizes → audience signal).\n\n**WooCommerce** — `{store}/products.json` returns the homepage, not JSON. Use\nthe Store API instead:\n```\nGET {store}/wp-json/wc/store/v1/products?per_page=100&page=N # loop until empty\nGET {store}/wp-json/wc/store/v1/products/categories?per_page=100\n```\nPer product: `id`, `name`, `sku`, `type` (`simple`|`variable`),\n`prices.price` (÷ 10^`currency_minor_unit`), `images[].src`, `categories[].name`,\n`variations`. Homepage `og:` meta and `/product-sitemap.xml` give the brand\nname, logo, and a full product-URL list if the Store API is disabled.\n\n**Fallbacks** — if JSON is gated (password/B2B): `{store}/sitemap.xml` →\n`sitemap_products_*.xml`, or ask the customer for a product-export CSV, or for\ndirect image URLs.\n\n**Image audit (critical).** Download 20–40 product images across categories and\n*look at them* (actually view each image). Record, per category: shot style (on-model vs\npackshot vs flat-lay vs atmosphere); angle coverage (front/back/side/detail);\nthe house background hex (sample corner pixels); model casting (age, gender mix,\nethnicity, styling); lighting fingerprint (softbox-even vs flash vs daylight).\nThe photoshoot you build must be recognizably *the same brand* — these\nobservations become the pack defaults. Front+back product photos also decide\nwhich items can support back-view templates.\n\n## Phase 2 — Extract the Brand DNA brief\n\nSynthesize a structured brief and **confirm it with the customer before\nbuilding** — one round with your ask-user question tool (`AskUserQuestion` in\nClaude Code, `ask_user` in the Astria chat agent): brand read, shoot register,\ncasting direction. Capture:\n\n- `brand`, `vertical` (fashion | footwear | jewelry | beauty | supplements | home-decor | mixed)\n- `categories`: product_type histogram → tune classes, SKU counts, back-photo availability\n- `sku_scale`: boutique(<100) | catalog(100–1K) | factory(1K–10K) | enterprise(10K+)\n- `audience`: gender (women/men/both/kids/family), age band (from sizes, copy, collection names), a **body-guard** line for prompts (see Phase 5)\n- `positioning`: mass/family | contemporary | premium | luxury — from price stats (median/max variant price) and About/collection copy tone\n- `aesthetic`: `background_hex` (from the image audit), lighting, brand comps\n- `shoot_plan`: which registers (Phase 3), how many avatars\n- `pilot_skus`: 8–15 products spanning the top categories\n\n**SKU scale drives the architecture:** boutique → hand-picked hero looks, richer\neditorial per look; catalog → pack-per-outfit-formula factory, `--create_crops`\nfor detail shots, one avatar per pack; factory+ → hardened templates run as\nnamed batches (3 angles/look, per-colorway tunes) — prioritize best-sellers and\nthe newest collection, never try to shoot the whole 10K in the pilot.\n\n## Phase 3 — Choose the photoshoot registers\n\nA brand usually gets one primary register + one or two supporting. Ask the\ncustomer which they want as the lead when the vertical supports several\n(a single ask-user question). Avatars are cast **only** for on-model registers.\n\n| Vertical | Primary | Supporting |\n|---|---|---|\n| Fashion (garments) | Studio lookbook on-model (front/45°/back battery) | Ghost/3D packshots; location campaign |\n| Footwear | Product packshot 5-angle battery | On-model legs-down crops; atmosphere still-life |\n| Jewelry | Still-life on tactile surfaces + worn close-ups | Extreme macro; hand-model for rings |\n| Beauty (bottles/cremes/sprays) | Packshots on seamless + atmosphere (marble, stone, water, botanicals) | Texture macro; application close-ups |\n| Supplements | Clean packshots + kitchen/gym lifestyle | Ingredient still-life; hand-holding product |\n| Home decor | In-room styled atmosphere | Detail/texture macro; ghost packshot |\n\n## Phase 4 — Create / target the workspace\n\nUse the customer's existing workspace when they name one (`astria workspaces\nlist` → target with `-w <id>`); otherwise create one named after the brand\n(via the workspace UI, or `astria api POST /workspaces` if available — confirm\nthe id with `astria workspaces list`). Note the house background hex — every\nstudio template pins it twice (in prose and via `--background_color`).\n\nTwo-greys convention: packshots on `#F2F2F2` (luminance-flattened), on-model\nstudio on `#F5F5F5`/`#e9e9e9`-family off-whites, luxury lookbooks on pure\n`#FFFFFF` + flash — unless the brand's own photography says otherwise.\n\n## Phase 5 — Cast the avatars (on-model registers only)\n\nAvatars are synthetic faces generated from trait-dense prompts, **no reference\ntune** — the **unique-headshot** method. Generate with\n`astria generate --model recraft-4-1 --num-images 2 --aspect-ratio 1:1`, bare\nshoulders, hair pulled back, **no jewelry on the face ref** (critical for\njewelry brands — earrings on a face ref contaminate every render), ≥1 unique\ndistinguishing feature, never repeat an ethnicity in a batch. Match casting to\nthe Brand DNA (audience age, ethnicity mix, positioning). Present a candidate\nboard (ask-user question with thumbnails), then register each winner:\n\n```\nastria tunes create -w <id> --title \"<Name> — <brand>\" --name woman|man|boy|girl --image-url <winner.jpg>\n```\n\n**Casting board size: 2–5 faces.** Production brands run one avatar per\nethnicity and hold **one avatar constant across all shots of a pack** —\nconsistency beats variety. Attach the brand's **body-guard** text (rides after\nthe person token in every prompt):\n- kids/tween: `boy 1.30 high` / `girl 1.30 high`; toddler: `girl 1.5 yo toddler, proportional head`\n- womenswear luxury: `tall supermodel proportions, elongated legs, long neck, narrow waist` + `sleek, low, slicked-back bun`\n- menswear premium: `tall male supermodel proportions, elongated athletic body, broad shoulders narrow waist, masculine confident posture`\n- explicit age when relevant: `11 y o teen girl`, `teen 15 y o man`\n\nFootwear legs-down crops, pure packshot, and atmosphere plans skip avatars —\nthe model (if any) is described verbally and the face is cropped out.\n\n## Phase 6 — Ingest product references\n\nFor each pilot SKU, create a faceid tune from the shop's CDN images:\n\n```\nastria tunes create -w <id> --title \"<SKU or product title>\" --name <class> \\\n --image-url <front.jpg> [--image-url <back.jpg>]\n```\n\n- Map `product_type` → tune class with a controlled vocabulary. The class must\n be the *actual subject* — \"jewelry\" is a poor name; use `ring`/`necklace`/\n `chain`/`earrings`. Rename + retrain if wrong (`astria tunes update <id> --name ring`).\n- **Variant products (`type: variable`):** do NOT blindly take `images[0]` — it\n is often the wrong colorway/variant. Match the chosen image to the intended\n variant (or ingest one tune per variant). A mismatch trains a faithful render\n of the *wrong* product.\n- **Non-ASCII image URLs** (Hebrew/RTL/Cyrillic paths) must be\n **percent-encoded** before `--image-url`, or Astria returns HTTP 422 \"could\n not download\".\n- Prefer clean product-only images over on-model shots for garment fidelity.\n Include the back photo only when the battery has back views. One tune per\n colorway. Keep the SKU code in the title — it's the join key back to the shop.\n- Optionally register support tunes: a `background` set plate, `pose` refs\n (OpenPose skeletons or black product silhouettes),\n brand `label`/`text` lockups for print fidelity, props (`chair`, `car`).\n\n## Phase 7 — Author the packs (the core)\n\n**A pack = one item-type or outfit formula × a fixed shot battery.** Shot\nvariety lives in the templates; per-SKU variety comes from swapping the\nreference tokens. Create with `astria packs create --title \"<Brand> — <Formula>\"`\nand author each template into the pack (see **astria-api** for pack-authoring).\nIterate until the pilot passes QA.\n\n### 7.1 House prompt grammar (studio lookbook)\n\n```\n<shot/pose line: framing + angle + stance>\n<faceid:AVATAR:1> woman <body-guard text>\n<faceid:GARMENT_TOP:1> shirt <fit & layering directives>\n<faceid:GARMENT_BOTTOM:1> pants <coverage directives>\n<faceid:SHOES:1> shoes\n[<faceid:BACKGROUND:1> background] plain background {HEX} softbox --background_color {HEX} [--create_crops 70]\n```\n\n- Weight is always `1.0`.\n- Free text after each garment's class noun does the **fit/layering** work:\n `shirt over size, sleeves reach just past the elbow, shirt out of the pants`,\n `front shirt half tucked inside the pants`, `pants cover the shoes`,\n `buttoned shirt worn open over the shirt, top two buttons open, untucked hem`,\n `pants reach the shoes, no socks visible`.\n- **Layer-visibility clauses** control partial garments: `visible hem of`,\n `visible waistband of`, `only the bottom hem is visible at the top of the frame`,\n `Absolutely no part of the dress fabric is visible` (for shoe macros).\n- **Fidelity guards** where reference photos are messy: `ignore back label`,\n `don't change the color of the pants`, `Use the outfit reference only for the\n clothing: garment shape, fabric, color, print, trims, sleeve length…`,\n `Model identity, face, body, hands, nails and hair come from the model\n reference`, plus a negative tail (`Avoid hair down, bangs, copied room\n background, rug, carpet, barefoot, missing shoes; no plastic skin, no beauty\n filter, no extra limbs`).\n- Params: **3:4, 4K, num_images 1** (2–4 for the hero front shot). Discover the\n default model with `astria models`. Detail shots come free via\n `--create_crops 66–72` (full frame + 2 crops) instead of separate prompts.\n\n### 7.2 Shot batteries per item type\n\nAuthor one pack per formula the shop actually sells; each bullet = one template.\n\n- **Tops (shirt/polo/tee/sweater)** — front full · 35–45° front-side · back full · half-body front · waist/tuck detail · optional walking / left profile.\n- **Coat / jacket / blazer** — front closed · front open over inner top · 45° · back (highlight structure) · half-body back over-shoulder · collar/shoulder macro.\n- **Pants / jeans / shorts** — front · 45° · back · waistline crop · lower-half at 45° (`weight shifted to back leg, showcasing drape`) · walking.\n- **Dress / skirt** — front · 45° · back · walking/movement (`fabric swishes`) · half-body · fabric macro · optional seated.\n- **Footwear — packshots (no model):** strict side elevation (toe right, heel left, camera level with centerline) · straight-on front from low camera · rear three-quarter · overhead flat-lay · pair at 3/4 one shoe staggered · tight macro on stitching. Every template carries `no foot, no model, no extra objects, seamless light neutral grey studio background, realistic contact shadow beneath the product, natural scale, no compression or squashing` + `--background_color`.\n- **Footwear — on-model:** lower-half 45° · legs-down crop (`close shot from the knees down, always focus on the shoes`) · low-angle shoe close-up (`see only hem of pants above the footwear`) · seated with shoes in foreground.\n- **Bags & accessories** — 3-framing trio: front centered with negative space · three-quarter for depth · tight macro on hardware · plus one on-model hold/wear. Eyewear: `45 degree side-profile fully open, showing the temple arms` + front + worn close-up.\n- **Jewelry** — three families (1:1): *still life* on smooth white fabric / silk / matte stone / sculpted ceramic, `not a close-up, medium distance framing` for negative space; *worn close-ups* `<faceid:WOMAN:1> woman wearing <faceid:JEWEL:1> earrings` with strict crops — necklace bust `upper chest and neck` or `cropped just below the eyes`; earrings `tight close-up, crop from ear to collarbone, side profile`; ring on a hand model (`hand resting on a stone tray beside an espresso`, always `manicured nails`); chain worn on bare chest/neck; *macro* 100mm. House stanza: `soft neutral-warm studio lighting, diffused directional light from front-side, very soft highlights, no yellow cast, balanced white tones, natural beige palette slightly warm but desaturated`. Rotate skin tone across templates.\n- **Beauty (cremes/bottles/sprays/lotions)** — *packshot* front label-centered · 45° · back (label legible — register a `label` text tune if type fidelity matters) · line family shot; *atmosphere* product on marble/travertine/wet stone with droplets · botanical styling · backlit translucency · texture macro (cream smear, spray mist); optional application close-ups (hands/cheek/collarbone, no face identity). Surfaces & lighting borrow the jewelry vocabulary (`no yellow cast` for golds/ambers).\n- **Supplements** — packshot battery + lifestyle atmosphere (morning kitchen with citrus and water; gym-bag still life; hand holding the jar label-forward) + ingredient flat-lay.\n- **Home decor** — in-room atmosphere (one coherent interior per collection, palette-matched) · straight-on packshot on seamless · texture/detail macro · scale shot with a human element (hand on ceramic, figure near the lamp — face optional).\n\n### 7.3 Campaign register (hero content, optional)\n\nNot pack templates first — long-form prompts in the brand's language, promoted\nto a pack once a scene wins. Structure with labeled sections\n(`LOCATION / FOREGROUND / SUBJECT / BACKGROUND / CAMERA / LIGHTING / MOOD / STYLE`),\none coherent location vocabulary per campaign (reuse the same scene description\nverbatim across the set; pin it with a `background`/`location` tune). Film/camera\nvocabulary is the realism lever matched to positioning: luxury `85mm, shallow\ndepth of field, Kodak Portra 400 film grain`; street-cool `35mm, f/8, hard\ndirect on-camera flash, ISO 400`; family-candid `soft diffused overcast\ndaylight`. For premium work add an anti-CGI block (`visible pores, no smoothing,\nnatural fabric behavior, imperfect drape, soft analog 35mm grain`). Formats\n9:16 / 16:9, 4K, num_images 2–3.\n\n### 7.4 Pose control ladder\n\n1. **Text first** (default): terse angle line, escalate to full photographic\n paragraphs (weight distribution, gaze, camera height, 20–30° body angle) when\n stances drift.\n2. **Skeleton pose tunes**: train OpenPose stick-figure renders as `pose` tunes\n (front / 45° / back), lead the prompt with `<faceid:POSE:1> pose`, refine verbally.\n3. **Silhouette lock** (to clone the brand's *existing* photography stance-for-\n stance): threshold a real catalog photo to a black silhouette, register as\n `pose`, prompt `replace the <faceid:POSE:1> pose … Keep the pose exactly as\n in the silhouette. Ignore the pose from the outfit.`\n\n### 7.5 Video add-on (optional)\n\n- Runway loop per look: Seedance, 16:9, 8–9s, three timestamped beats — walk in\n from left → stop center & pose → walk past camera and exit; `Static camera,\n continuous motion, no cuts`.\n- Product turntable: one storyboard prompt, `slow smooth 360-degree rotation over\n 8 seconds`, per-second angle checkpoints, a negative block (`avoid fast\n spinning, deformation, extra objects, text, logo`).\n\n## Phase 8 — Pilot, QA, scale\n\n1. Render the pilot: each pack × 2–3 SKUs of its category, one avatar held\n constant per pack. Keep it modest (≤ ~40 images).\n2. QA each render: garment/jewel shape·color·print fidelity; layering (tucks,\n hems, waistbands); face = avatar (no drift); background exactly the house hex;\n anatomy (hands, feet); no leaked artifacts (room backgrounds, mannequin\n stands, care labels); `no yellow cast` on golds; brand text/logos legible.\n3. **Stop and get sign-off before scaling** — mass generation is real spend.\n Fix by tightening the responsible clause (add a guard or negative), not by\n rerolling blindly. If an item renders wrong repeatedly, inspect the tune's\n training images (bad crops / wrong class / wrong variant are the usual cause).\n4. Scale in phases: best-sellers/newest first for sign-off, then the rest.\n Iterate over the crawled product list — `tunes create` per SKU, one generate\n per template with the SKU's tokens swapped in. Name batches\n (`<BRAND> BATCH1 LOOK 1–N`).\n5. Post-production at volume: background-removal passes for cutouts, 16:9\n recrops for banners, upscale passes for hero shots.\n\n## Phase 9 — Landing page & handoff\n\nGenerate the workspace landing page from the brief (see **landing-page-editor**):\n`astria landing set -w <id> --brief \"<positioning, palette, collections, packs to feature>\"`.\nReport to the customer: workspace link, the casting board, each pack (`/p/<slug>`)\nwith its battery, pilot images, and the one-step instruction for future\ncollections — *point us at the new products; the packs re-shoot the whole drop\nautomatically.*\n\n---\n\n## Appendix — Style presets by positioning\n\n| Positioning | Background | Lighting | Body / styling | Suffix vocabulary |\n|---|---|---|---|---|\n| Kids / family mass | `#e9e9e9` softbox | even softbox, `small smile` | height guard, playful poses | clean e-com, `--create_crops` |\n| Contemporary basics | `#F5F5F5` seamless | soft studio light | natural relaxed stance | `Kodak film 400 grain` |\n| Premium menswear | `#E7E7E7` / light gray | professional fashion editorial lighting | tall supermodel proportions | quiet-luxury comps (`COS / ARKET… Minimal. Architectural. Retail-ready.`) |\n| Luxury womenswear | pure `#FFFFFF`, no floor | **direct on-camera flash** | sleek slicked-back bun, elongated legs | sharp e-commerce catalog image |\n| Street / cool | dark or night urban | hard flash, underexposed bg, ISO 400 grain | candid mid-stride, `not posing` | `by William Eggleston` / Tillmans |\n| Jewelry / beauty | cream-beige, tactile surfaces | soft neutral-warm, **no yellow cast** | manicured hands, rotated skin tones | quiet luxury product photography, 4K clarity |\n\nKeep the preset reasoning inside the Brand DNA brief — the customer confirms it\nonce, and every template inherits it.\n"
}SHA-256: f8c6b9a731f31d02ee6298444cbc233a548b47ebd23425b72938e9850252cbe6