Replicate
google/nano-banana-2-lite · google/nano-banana-2 · google/nano-banana-pro
Generate the approved media in this recipe.
REPLICATE_API_TOKENTurn one portrait into one or all eight distinct cinematic editorial looks while preserving the same recognizable person.
By Wiggly Studio · Updated July 2026

Shared recipe family
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 familyBefore you start
google/nano-banana-2-lite · google/nano-banana-2 · google/nano-banana-pro
Generate the approved media in this recipe.
REPLICATE_API_TOKENSetup, 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.
Included assets
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.

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.

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.

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

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

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

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

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

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

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

Supplied creator reference—not a new Wiggly-generated result.
Examples
9 saved examples for this recipe—not 9 separate Repos. Each example keeps its original version and provenance.









From input to output
From the published pipeline.json. The agent follows the packaged runtime and its approval gates.
Step 01
One run pinned to the portrait, selected look prompt, and model route.
Step 02
The portrait and selected prompt contract checked locally.
Step 03 · approval · provider
One selected look per paid prediction; repeat only for approved variants.
Step 04 · approval
Automatic file checks plus an actual visual review for every look.
Proof & quality
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
Saved reference
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.
Open the package
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.
# 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.
--- 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`.
{
"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."
]
}
{
"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"
}
}
{
"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
}
]
}
{
"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"
}
]
}
{
"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"
}
}
{
"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"
]
}
]
}
{
"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"
]
}
{
"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"
}
}
{
"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"
]
}
Run it with a coding agent
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
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