Curated Formatv1.0.0

Cinematic Portrait Pack

Turn one portrait into one or all eight distinct cinematic editorial looks while preserving the same recognizable person.

By Wiggly Studio · Updated July 2026

Eight-look portrait pack: Turn one portrait into eight cinematic worlds

Shared recipe family

One family. 31 recipes.

Cinematic Portrait Pack belongs to Image Filters. These recipes share a runtime; adjacent examples are not separate Repos. The download on this page packages this specific recipe.

See the full recipe family

Before you start

Services & costs

Replicate

google/nano-banana-2-lite · google/nano-banana-2 · google/nano-banana-pro

Generate the approved media in this recipe.

REPLICATE_API_TOKEN

Local runtime

Setup, validation & inspection

Node.js >=22 · npm

Typical run estimate

One provider prediction per selected look; the estimate command prints the exact route before approval

Estimates describe the saved recipe, not a price guarantee. Confirm current provider pricing and approve any spend before generation. Your coding agent may have its own fees or usage limits. Never paste API keys into chat.

Setup notes from requirements.json
  • All smoke and validation commands are local.
  • No proof generation was purchased for this package.
  • Each selected look is one independent paid prediction.
  • The complete eight-image pack therefore uses eight predictions.
  • The estimate command prints the selected route before approval.
  • Paid generation requires explicit approval and is capped at three attempts per look.

Included assets

The ingredients behind the format.

The published package includes its agent instructions, input contract, and quality rules, plus 10 viewable asset references below. Reference media teaches the recipe; it is not a new result for your input.

Creator style reference

Creator style reference

The native hero is a four-output collage. Carousel slides 2 through 9 each already contain exactly one original-photo inset, so Wiggly must not add another. CTA slides 10 and 11 are intentionally excluded from the Format gallery.

Local smoke-test input

Local smoke-test input

The native hero is a four-output collage. Carousel slides 2 through 9 each already contain exactly one original-photo inset, so Wiggly must not add another. CTA slides 10 and 11 are intentionally excluded from the Format gallery.

Mirror selfie

Mirror selfie

Supplied creator reference—not a new Wiggly-generated result.

Rain mask

Rain mask

Supplied creator reference—not a new Wiggly-generated result.

Car editorial

Car editorial

Supplied creator reference—not a new Wiggly-generated result.

Punk noir

Punk noir

Supplied creator reference—not a new Wiggly-generated result.

View all 10 asset references
Art stop sign

Art stop sign

Supplied creator reference—not a new Wiggly-generated result.

Sunroof flash

Sunroof flash

Supplied creator reference—not a new Wiggly-generated result.

Sword studio

Sword studio

Supplied creator reference—not a new Wiggly-generated result.

Cow herd sports car

Cow herd sports car

Supplied creator reference—not a new Wiggly-generated result.

What stays consistent

  • The same recognizable face and identity
  • Natural skin detail and believable anatomy
  • A photographic rather than illustrated finish
  • One portrait as the reusable source input

What you bring

  • One JPEG, PNG, or WebP portrait at least 512px on both axes
  • One look or the complete eight-image pack
  • A Replicate API token only when generation is approved
Read the included contracts and asset inventory ↓

Examples

Examples & references.

9 saved examples for this recipe—not 9 separate Repos. Each example keeps its original version and provenance.

Eight-look portrait pack: Turn one portrait into eight cinematic worlds

Example 01 · Eight-look portrait pack

Turn one portrait into eight cinematic worlds

Open finished ad
SKAI source example: Make a mirror selfie feel like a film still

Example 02 · SKAI source example

Make a mirror selfie feel like a film still

Open finished ad
SKAI source example: Catch the mask reveal in heavy rain

Example 03 · SKAI source example

Catch the mask reveal in heavy rain

Open finished ad
SKAI source example: Build a quiet fashion frame around the car

Example 04 · SKAI source example

Build a quiet fashion frame around the car

Open finished ad
SKAI source example: Push a close-up into hard punk noir

Example 05 · SKAI source example

Push a close-up into hard punk noir

Open finished ad
SKAI source example: Let one flash-lit sign own the frame

Example 06 · SKAI source example

Let one flash-lit sign own the frame

Open finished ad
SKAI source example: Hold a supernatural pose inside a real studio

Example 08 · SKAI source example

Hold a supernatural pose inside a real studio

Open finished ad
SKAI source example: Put luxury in the middle of rural chaos

Example 09 · SKAI source example

Put luxury in the middle of rural chaos

Open finished ad

From input to output

How the run works.

From the published pipeline.json. The agent follows the packaged runtime and its approval gates.

  1. Step 01

    Prepare

    One run pinned to the portrait, selected look prompt, and model route.

  2. Step 02

    Validate

    The portrait and selected prompt contract checked locally.

  3. Step 03 · approval · provider

    Transform

    One selected look per paid prediction; repeat only for approved variants.

  4. Step 04 · approval

    Inspect

    Automatic file checks plus an actual visual review for every look.

Proof & quality

What a good result looks like.

Judge identity preservation, prompt fidelity, scene geometry, controlled cinematic lighting, and photographic realism across all eight gathered looks.

The Instagram carousel supplied the native 1080x1440 hero and eight prompt cards. The public Google Doc supplied the same eight full prompts and clean example outputs.

The native hero is a four-output collage. Carousel slides 2 through 9 each already contain exactly one original-photo inset, so Wiggly must not add another. CTA slides 10 and 11 are intentionally excluded from the Format gallery.

Saved reference

The Mirror Selfie

  • The source face remains recognizable
  • Skin, smoke, glasses, shirt, and red marks feel tactile
  • Moody indoor light still reads like a casual phone photo

Saved reference

The Rain Mask Reveal

  • Rain, tears, and wet fabric remain physically convincing
  • The half-lifted mask creates a clear action
  • Cool moonlight preserves detail without warm contamination

Quality gates

These are the acceptance criteria in quality.json—not a claim that every pictured example passed the current version. Inspect each new output before finalizing.

Automatic · 4 checks
  • Exactly 1 decodable JPG, PNG, or WebP output per run
  • At least 640x800 pixels
  • Aspect ratio within 0.02 of 3:4
  • At least 50 KB
Visual · 5 checks
  • The same person remains recognizable without face drift
  • The selected look matches its exact packaged prompt
  • Face, hands, clothing, props, and scene geometry are coherent
  • Lighting, lens behavior, grain, and texture remain photographic
  • The image reads as a finished cinematic editorial portrait
Finalization · 4 checks
  • Automatic Pass Required: true
  • Visual Pass Required: true
  • Review Notes Required: true
  • Explicit Approval Flag: --approve-final

Open the package

Readable Repo files.

Actual files from the published v1.0.0 package. Expand any file to inspect the instructions, requirements, or evidence before sending the Repo to your agent.

README.md
Open raw file ↗
# Cinematic Portrait Pack Format Kit

This is the runnable Wiggly Repo for the eight-look portrait pack gathered from
@skaigenerated. It includes the exact prompts, native source hero, eight source
proof cards, clean guide examples, contracts, free smoke test, official runner,
and finalization gates.

Run from the `v3` directory:

```bash
npm run format:skai-image -- check --format=cinematic-portrait-pack
npm run format:skai-image -- smoke --format=cinematic-portrait-pack
npm run format:skai-image -- init --format=cinematic-portrait-pack --run=my-look --variant=mirror-selfie --input=/absolute/path/to/portrait.jpg
npm run format:skai-image -- validate --format=cinematic-portrait-pack --run=my-look
npm run format:skai-image -- estimate --format=cinematic-portrait-pack --run=my-look
```

Those commands are free. A paid transform requires `REPLICATE_API_TOKEN` in the
environment and explicit approval:

```bash
npm run format:skai-image -- render --format=cinematic-portrait-pack --run=my-look --approve-paid
```

Then inspect the actual output, record specific visual notes, and finalize only
after both automatic and visual checks pass. Use a separate run id for each
look. The complete eight-image pack uses eight independent predictions.

See `SKILL.md` for the agent workflow and `runtime.json` for supported looks and
model routes.
SKILL.md
Open raw file ↗
---
name: wiggly-cinematic-portrait-pack
description: Turn one portrait into one or all eight cinematic editorial looks using the exact gathered SKAI prompts and the packaged Wiggly runtime.
---

# Cinematic Portrait Pack

Use the packaged runner and prompt variants. Do not call Replicate separately,
rewrite the gathered prompts, or create another render path.

Ask one short question at a time:

1. Which portrait should I use?
2. Do you want one look or the complete eight-image pack?
3. If one look, which: `mirror-selfie`, `rain-mask`, `car-editorial`,
   `punk-noir`, `art-stop-sign`, `sunroof-flash`, `sword-studio`, or
   `cow-herd-sports-car`?
4. Use Nano Banana 2 by default, Lite for economy, or Pro for premium?

Before paid work:

```bash
npm run format:skai-image -- check --format=cinematic-portrait-pack
npm run format:skai-image -- smoke --format=cinematic-portrait-pack
```

For every selected look, use a unique run id:

```bash
npm run format:skai-image -- init --format=cinematic-portrait-pack --run=<id> --variant=<look> --input=<absolute-image-path> [--model=<route>]
npm run format:skai-image -- validate --format=cinematic-portrait-pack --run=<id>
npm run format:skai-image -- estimate --format=cinematic-portrait-pack --run=<id>
```

Stop and ask once before spending. After explicit approval:

```bash
npm run format:skai-image -- render --format=cinematic-portrait-pack --run=<id> --approve-paid
npm run format:skai-image -- inspect --format=cinematic-portrait-pack --run=<id>
npm run format:skai-image -- inspect --format=cinematic-portrait-pack --run=<id> --visual-pass --review-notes="<specific observations>"
npm run format:skai-image -- finalize --format=cinematic-portrait-pack --run=<id> --approve-final
```

Hard rules:

- Preserve the same face and identity in every selected look.
- Keep the exact packaged prompt unless the user explicitly requests a change.
- State that one look is one paid prediction; the complete pack uses eight.
- Validate every run before spending.
- Never generate without `--approve-paid`.
- Persist and resume each prediction id instead of replacing timed-out jobs.
- Never exceed three attempts for any look.
- View every output and record look-specific notes before finalizing.
- Never print, store, or commit `REPLICATE_API_TOKEN`.
requirements.json
Open raw file ↗
{
  "runtime": {
    "node": ">=22",
    "commands": ["npm"]
  },
  "providers": [
    {
      "name": "Replicate",
      "models": [
        "google/nano-banana-2-lite",
        "google/nano-banana-2",
        "google/nano-banana-pro"
      ]
    }
  ],
  "environment": [
    {
      "name": "REPLICATE_API_TOKEN",
      "secret": true,
      "requiredFor": ["render", "resume"]
    }
  ],
  "notes": [
    "All smoke and validation commands are local.",
    "No proof generation was purchased for this package.",
    "Each selected look is one independent paid prediction.",
    "The complete eight-image pack therefore uses eight predictions.",
    "The estimate command prints the selected route before approval.",
    "Paid generation requires explicit approval and is capped at three attempts per look."
  ]
}
inputs.json
Open raw file ↗
{
  "required": [
    {
      "id": "portrait",
      "type": "image",
      "formats": ["jpg", "png", "webp"],
      "minimumWidth": 512,
      "minimumHeight": 512,
      "maximumBytes": 26214400
    }
  ],
  "question": "Which portrait should I use, and do you want one look or the complete eight-image pack?",
  "variants": [
    "mirror-selfie",
    "rain-mask",
    "car-editorial",
    "punk-noir",
    "art-stop-sign",
    "sunroof-flash",
    "sword-studio",
    "cow-herd-sports-car"
  ],
  "defaults": {
    "model": "nano-banana-2",
    "variant": "mirror-selfie",
    "aspectRatio": "3:4",
    "outputCountPerRun": 1
  },
  "modelRoutes": {
    "economy": "google/nano-banana-2-lite",
    "default": "google/nano-banana-2",
    "premium": "google/nano-banana-pro"
  }
}
pipeline.json
Open raw file ↗
{
  "progress": "Prepare -> Validate -> Transform -> Inspect",
  "attemptCapPerLook": 3,
  "stages": [
    {
      "id": "prepare",
      "output": "One run pinned to the portrait, selected look prompt, and model route.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "validate",
      "output": "The portrait and selected prompt contract checked locally.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "transform",
      "output": "One selected look per paid prediction; repeat only for approved variants.",
      "paid": true,
      "approvalRequired": true
    },
    {
      "id": "inspect",
      "output": "Automatic file checks plus an actual visual review for every look.",
      "paid": false,
      "approvalRequired": true
    }
  ]
}
assets.json
Open raw file ↗
{
  "sourceReference": {
    "creator": "@skaigenerated",
    "postUrl": "https://www.instagram.com/skaigenerated/p/DW68x5ojE6X/",
    "resourceUrl": "https://docs.google.com/document/d/1eTB2e0XNjsiEDj8Qa0iUHBJviwdHQ0GPO6rxCkO_SS4/mobilebasic",
    "guide": "assets/source/guide.txt",
    "nativeHero": "assets/source/skai-carousel-01.jpg",
    "smokeInput": "assets/source/smoke-input.jpg",
    "modelShown": "Nano Banana 2",
    "commentsAtCollection": 39600,
    "collectedAt": "2026-07-31",
    "verification": "The Instagram carousel supplied the native 1080x1440 hero and eight prompt cards. The public Google Doc supplied the same eight full prompts and clean example outputs.",
    "referenceNote": "The native hero is a four-output collage. Carousel slides 2 through 9 each already contain exactly one original-photo inset, so Wiggly must not add another. CTA slides 10 and 11 are intentionally excluded from the Format gallery."
  },
  "examples": [
    {
      "variant": "mirror-selfie",
      "path": "assets/source/skai-carousel-02.jpg",
      "cleanPath": "assets/source/guide-example-01.png"
    },
    {
      "variant": "rain-mask",
      "path": "assets/source/skai-carousel-03.jpg",
      "cleanPath": "assets/source/guide-example-04.png"
    },
    {
      "variant": "car-editorial",
      "path": "assets/source/skai-carousel-04.jpg",
      "cleanPath": "assets/source/guide-example-02.png"
    },
    {
      "variant": "punk-noir",
      "path": "assets/source/skai-carousel-05.jpg",
      "cleanPath": "assets/source/guide-example-03.png"
    },
    {
      "variant": "art-stop-sign",
      "path": "assets/source/skai-carousel-06.jpg",
      "cleanPath": "assets/source/guide-example-06.png"
    },
    {
      "variant": "sunroof-flash",
      "path": "assets/source/skai-carousel-07.jpg",
      "cleanPath": "assets/source/guide-example-07.png"
    },
    {
      "variant": "sword-studio",
      "path": "assets/source/skai-carousel-08.jpg",
      "cleanPath": "assets/source/guide-example-05.png"
    },
    {
      "variant": "cow-herd-sports-car",
      "path": "assets/source/skai-carousel-09.jpg",
      "cleanPath": "assets/source/guide-example-08.png"
    }
  ],
  "excluded": [
    {
      "path": "assets/source/skai-carousel-10.jpg",
      "reason": "Comment CTA, not a proof image"
    },
    {
      "path": "assets/source/skai-carousel-11.jpg",
      "reason": "Follow CTA, not a proof image"
    }
  ]
}
quality.json
Open raw file ↗
{
  "automatic": [
    "Exactly 1 decodable JPG, PNG, or WebP output per run",
    "At least 640x800 pixels",
    "Aspect ratio within 0.02 of 3:4",
    "At least 50 KB"
  ],
  "visual": [
    "The same person remains recognizable without face drift",
    "The selected look matches its exact packaged prompt",
    "Face, hands, clothing, props, and scene geometry are coherent",
    "Lighting, lens behavior, grain, and texture remain photographic",
    "The image reads as a finished cinematic editorial portrait"
  ],
  "finalization": {
    "automaticPassRequired": true,
    "visualPassRequired": true,
    "reviewNotesRequired": true,
    "explicitApprovalFlag": "--approve-final"
  }
}
goldens.json
Open raw file ↗
{
  "purpose": "Judge identity preservation, prompt fidelity, scene geometry, controlled cinematic lighting, and photographic realism across all eight gathered looks.",
  "examples": [
    {
      "id": "mirror-selfie",
      "title": "The Mirror Selfie",
      "imagePath": "assets/source/skai-carousel-02.jpg",
      "cleanImagePath": "assets/source/guide-example-01.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "The source face remains recognizable",
        "Skin, smoke, glasses, shirt, and red marks feel tactile",
        "Moody indoor light still reads like a casual phone photo"
      ]
    },
    {
      "id": "rain-mask",
      "title": "The Rain Mask Reveal",
      "imagePath": "assets/source/skai-carousel-03.jpg",
      "cleanImagePath": "assets/source/guide-example-04.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "Rain, tears, and wet fabric remain physically convincing",
        "The half-lifted mask creates a clear action",
        "Cool moonlight preserves detail without warm contamination"
      ]
    },
    {
      "id": "car-editorial",
      "title": "The Open-Car Editorial",
      "imagePath": "assets/source/skai-carousel-04.jpg",
      "cleanImagePath": "assets/source/guide-example-02.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "The low seated pose fits the open car naturally",
        "Oversized dark tailoring carries the editorial mood",
        "Wild grass and bright negative space keep the frame restrained"
      ]
    },
    {
      "id": "punk-noir",
      "title": "The Punk-Noir Close-up",
      "imagePath": "assets/source/skai-carousel-05.jpg",
      "cleanImagePath": "assets/source/guide-example-03.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "The two-finger gesture frames the eye cleanly",
        "Rings and pearls stay sharp without losing the face",
        "Hard monochrome contrast and grain sell the film look"
      ]
    },
    {
      "id": "art-stop-sign",
      "title": "The ART Stop Sign",
      "imagePath": "assets/source/skai-carousel-06.jpg",
      "cleanImagePath": "assets/source/guide-example-06.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "The low angle gives the sign and subject equal graphic weight",
        "Direct flash keeps the face and hoodie crisp against navy sky",
        "The relaxed lean reads naturally"
      ]
    },
    {
      "id": "sunroof-flash",
      "title": "The Sunroof Flash",
      "imagePath": "assets/source/skai-carousel-07.jpg",
      "cleanImagePath": "assets/source/guide-example-07.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "The roof opening creates a strong natural frame",
        "Both figures look upward with coherent perspective",
        "Teal interior light and direct flash feel like one real exposure"
      ]
    },
    {
      "id": "sword-studio",
      "title": "The Sword Studio",
      "imagePath": "assets/source/skai-carousel-08.jpg",
      "cleanImagePath": "assets/source/guide-example-05.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "The strong kneeling posture avoids helpless body language",
        "Tattoo, skin, metal, and soft spotlight hold believable texture",
        "The sword alignment reads clearly without gore"
      ]
    },
    {
      "id": "cow-herd-sports-car",
      "title": "The Cow-Herd Sports Car",
      "imagePath": "assets/source/skai-carousel-09.jpg",
      "cleanImagePath": "assets/source/guide-example-08.png",
      "model": "Nano Banana 2",
      "whyItWorks": [
        "Cows fill the frame without obvious repetition",
        "The subject sits naturally on the reflective car",
        "Luxury and rural chaos remain readable in one editorial image"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "id": "cinematic-portrait-pack",
  "version": "1.0.0",
  "title": "Cinematic Portrait Pack",
  "description": "Turn one portrait into eight distinct cinematic editorial scenes with the exact gathered SKAI prompts.",
  "status": "agent-ready",
  "owner": "Wiggly Studio",
  "source": {
    "creator": "@skaigenerated",
    "postUrl": "https://www.instagram.com/skaigenerated/p/DW68x5ojE6X/",
    "resourceUrl": "https://docs.google.com/document/d/1eTB2e0XNjsiEDj8Qa0iUHBJviwdHQ0GPO6rxCkO_SS4/mobilebasic",
    "ctaKeyword": "AI",
    "modelShown": "Nano Banana 2",
    "commentsAtCollection": 39600,
    "collectedAt": "2026-07-31"
  },
  "outputs": [
    "1 inspected 3:4 image per selected look",
    "up to 8 finalized runs for the complete portrait pack",
    "state.json and quality-report.json for every look"
  ]
}
kit.package.json
Open raw file ↗
{
  "name": "wiggly-cinematic-portrait-pack-format-kit",
  "private": true,
  "version": "1.0.0",
  "type": "module",
  "engines": {
    "node": ">=22"
  },
  "scripts": {
    "check:kit": "node kit-smoke.mjs",
    "format:skai-image": "tsx scripts/skai-image-format.ts",
    "test": "tsx tests/skai-image-format-runner.test.ts --format=cinematic-portrait-pack && node kit-smoke.mjs"
  },
  "dependencies": {
    "image-size": "2.0.2",
    "replicate": "1.4.0",
    "tsx": "4.20.6"
  }
}
runtime.json
Open raw file ↗
{
  "slug": "cinematic-portrait-pack",
  "version": "1.0.0",
  "promptPath": "prompts/mirror-selfie.txt",
  "promptVariants": {
    "mirror-selfie": "prompts/mirror-selfie.txt",
    "rain-mask": "prompts/rain-mask.txt",
    "car-editorial": "prompts/car-editorial.txt",
    "punk-noir": "prompts/punk-noir.txt",
    "art-stop-sign": "prompts/art-stop-sign.txt",
    "sunroof-flash": "prompts/sunroof-flash.txt",
    "sword-studio": "prompts/sword-studio.txt",
    "cow-herd-sports-car": "prompts/cow-herd-sports-car.txt"
  },
  "input": {
    "mode": "image",
    "formats": ["jpg", "png", "webp"],
    "minimumWidth": 512,
    "minimumHeight": 512,
    "maximumBytes": 26214400
  },
  "defaultModel": "nano-banana-2",
  "modelRoutes": {
    "nano-banana-2-lite": {
      "label": "Nano Banana 2 Lite",
      "lane": "economy",
      "model": "google/nano-banana-2-lite",
      "family": "nano-banana",
      "aspectRatio": "3:4",
      "outputFormat": "jpg"
    },
    "nano-banana-2": {
      "label": "Nano Banana 2",
      "lane": "default / source model",
      "model": "google/nano-banana-2",
      "family": "nano-banana",
      "aspectRatio": "3:4",
      "outputFormat": "jpg",
      "resolution": "1K"
    },
    "nano-banana-pro": {
      "label": "Nano Banana Pro",
      "lane": "premium",
      "model": "google/nano-banana-pro",
      "family": "nano-banana",
      "aspectRatio": "3:4",
      "outputFormat": "jpg",
      "resolution": "1K"
    }
  },
  "expectedOutputs": 1,
  "maximumAttempts": 3,
  "smokeInputPath": "assets/source/smoke-input.jpg",
  "smokeExamplePath": "assets/source/skai-carousel-02.jpg",
  "minimumOutputWidth": 640,
  "minimumOutputHeight": 800,
  "minimumOutputBytes": 51200,
  "manualReview": [
    "the same person remains recognizable",
    "the selected look matches its packaged prompt",
    "face, hands, clothing, props, and scene geometry are coherent",
    "lighting, lens behavior, and texture remain photographic",
    "the result is useful as a finished cinematic portrait"
  ]
}
Technical proof archive ↗

Run it with a coding agent

Know the run before you start.

The agent reads this version’s instructions, checks the requirements, and walks you through the approved workflow. Review the inputs and estimate before starting.

Typical run

Prepare + validateFree · under 1 min per look
Image transformCurrent selected Replicate route · usually under 2 min per look
Inspect + finalizeFree · about 1 min per look

One provider prediction per selected look; the estimate command prints the exact route before approval

You provide

One JPEG, PNG, or WebP portrait at least 512px on both axes · One look or the complete eight-image pack · A Replicate API token only when generation is approved

Output

One inspected 3:4 image per selected look plus prediction and quality provenance