Replicate
google/nano-banana-2-lite · google/nano-banana-2 · google/nano-banana-pro · openai/gpt-image-2
Generate the approved media in this recipe.
REPLICATE_API_TOKENTurn one portrait into a grainy black-and-white studio image defined by formal tailoring, deep shadow, and a luminous rim.
By Wiggly Studio · Updated July 2026


Shared recipe family
Dark Studio Portrait 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 · openai/gpt-image-2
Generate the approved media in this recipe.
REPLICATE_API_TOKENSetup, validation & inspection
Node.js >=22 · npm
Typical run estimate
One Replicate image charge and usually 2-4 min
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 6 viewable asset references below. Reference media teaches the recipe; it is not a new result for your input.

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
6 saved examples for this recipe—not 6 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, exact gathered prompt, and selected model route.
Step 02
The portrait and prompt contract checked locally.
Step 03 · approval · provider
One dark-studio portrait from one approved prediction.
Step 04 · approval
Automatic file checks plus an actual visual review.
Proof & quality
Judge identity preservation, formal styling, luminous rim light, controlled deep shadow, heavy analog grain, and black-and-white photographic realism.
The delivered Google Doc supplied the exact GPT Image 2 prompt. The Instagram carousel supplied six matching native source outputs.
The creator did not publish a separate original input, so the native cover portrait is reused only as Wiggly's visual identity anchor.
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.
# Wiggly Dark Studio Portrait Format This runnable Repo preserves the exact prompt, guide, and six native source examples gathered from @skaigenerated. It uses the shared Wiggly image runner, so validation, paid approval, retry caps, and visual finalization stay explicit. Run from `v3`: ```bash npm install npm run format:skai-image -- check --format=dark-studio-portrait npm run format:skai-image -- smoke --format=dark-studio-portrait npm run format:skai-image -- init --format=dark-studio-portrait --run=my-portrait --input=/absolute/path/to/portrait.jpg npm run format:skai-image -- validate --format=dark-studio-portrait --run=my-portrait npm run format:skai-image -- estimate --format=dark-studio-portrait --run=my-portrait ``` Generation requires `REPLICATE_API_TOKEN` and explicit approval: ```bash npm run format:skai-image -- render --format=dark-studio-portrait --run=my-portrait --approve-paid ``` No Replicate proof call was made while packaging this Repo. Model routes: - Economy: `google/nano-banana-2-lite` - Default: `google/nano-banana-2` - Premium: `google/nano-banana-pro` - Source: `openai/gpt-image-2`
--- name: wiggly-dark-studio-portrait description: Turn one portrait into a grainy, high-contrast monochrome studio portrait using the exact gathered SKAI prompt. --- # Dark Studio Portrait Use the packaged runner and exact prompt. Do not call Replicate separately or create another render path. Ask one short question: > Which portrait should I turn into a Dark Studio Portrait? Then run: ```bash npm run format:skai-image -- init --format=dark-studio-portrait --run=<id> --input=<absolute-image-path> npm run format:skai-image -- validate --format=dark-studio-portrait --run=<id> npm run format:skai-image -- estimate --format=dark-studio-portrait --run=<id> npm run format:skai-image -- render --format=dark-studio-portrait --run=<id> --approve-paid npm run format:skai-image -- inspect --format=dark-studio-portrait --run=<id> npm run format:skai-image -- inspect --format=dark-studio-portrait --run=<id> --visual-pass --review-notes="<specific observations>" npm run format:skai-image -- finalize --format=dark-studio-portrait --run=<id> --approve-final ``` Hard rules: - Preserve the source identity. - Keep the exact gathered prompt unless the user explicitly requests a change. - Use Nano Banana 2 by default, Lite for economy, Pro for premium, or GPT Image 2 for the creator's source route. - Validate before spending and never render without `--approve-paid`. - Persist and resume the prediction id. - Never exceed three attempts. - View the output and record specific visual-review 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",
"openai/gpt-image-2"
]
}
],
"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.",
"One render attempt is one paid prediction.",
"Paid generation requires explicit approval and is capped at three attempts."
]
}
{
"required": [
{
"id": "portrait",
"type": "image",
"formats": ["jpg", "png", "webp"],
"minimumWidth": 512,
"minimumHeight": 512,
"maximumBytes": 26214400
}
],
"question": "Which portrait should I turn into a Dark Studio Portrait?",
"defaults": {
"model": "nano-banana-2",
"aspectRatio": "3:4",
"outputCount": 1
},
"modelRoutes": {
"economy": "google/nano-banana-2-lite",
"default": "google/nano-banana-2",
"premium": "google/nano-banana-pro",
"source": "openai/gpt-image-2"
}
}
{
"progress": "Prepare -> Validate -> Transform -> Inspect",
"attemptCap": 3,
"stages": [
{
"id": "prepare",
"output": "One run pinned to the portrait, exact gathered prompt, and selected model route.",
"paid": false,
"approvalRequired": false
},
{
"id": "validate",
"output": "The portrait and prompt contract checked locally.",
"paid": false,
"approvalRequired": false
},
{
"id": "transform",
"output": "One dark-studio portrait from one approved prediction.",
"paid": true,
"approvalRequired": true
},
{
"id": "inspect",
"output": "Automatic file checks plus an actual visual review.",
"paid": false,
"approvalRequired": true
}
]
}
{
"sourceReference": {
"creator": "@skaigenerated",
"postUrl": "https://www.instagram.com/skaigenerated/p/DbA4-FuFrfs/",
"resourceUrl": "https://docs.google.com/document/d/1kWU1Pl9R7IwN3W9-o6mSmHAAk-0Rh2orF0cTUgRzIek/edit",
"guide": "assets/source/guide.pdf",
"referenceInset": "assets/source/reference-input.jpg",
"verification": "The delivered Google Doc supplied the exact GPT Image 2 prompt. The Instagram carousel supplied six matching native source outputs.",
"referenceNote": "The creator did not publish a separate original input, so the native cover portrait is reused only as Wiggly's visual identity anchor."
},
"examples": [
{ "id": "afro-glasses", "path": "assets/source/afro-glasses.jpg" },
{ "id": "cover", "path": "assets/source/cover.jpg" },
{ "id": "soft-glasses", "path": "assets/source/soft-glasses.jpg" },
{ "id": "braided-rim", "path": "assets/source/braided-rim.jpg" },
{ "id": "wet-curls-glasses", "path": "assets/source/wet-curls-glasses.jpg" },
{ "id": "shadow-fringe", "path": "assets/source/shadow-fringe.jpg" }
]
}
{
"automatic": [
"Exactly 1 decodable JPG, JPEG, PNG, or WebP output",
"At least 640x800 pixels",
"Aspect ratio matches the selected route within 0.02",
"At least 50 KB"
],
"visual": [
"The source identity remains recognizable",
"The subject wears a formal black suit and tie",
"A strong overhead or back light creates a clean halo around hair and shoulders",
"The face falls into deep shadow with smooth high-contrast falloff",
"Heavy film grain, slight softness, pores, and faint bloom feel analog",
"The result is a black-and-white photograph rather than CGI or illustration"
],
"finalization": {
"automaticPassRequired": true,
"visualPassRequired": true,
"reviewNotesRequired": true,
"explicitApprovalFlag": "--approve-final"
}
}
{
"purpose": "Judge identity preservation, formal styling, luminous rim light, controlled deep shadow, heavy analog grain, and black-and-white photographic realism.",
"examples": [
{
"id": "afro-glasses",
"title": "Rim Light Through Glasses",
"imagePath": "assets/source/afro-glasses.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The white rim cleanly separates hair and shoulders from black",
"Glasses stay readable without flattening the eye shadows",
"Film grain and soft focus keep the image analog"
]
},
{
"id": "cover",
"title": "The Quiet Cover Portrait",
"imagePath": "assets/source/cover.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The off-center crop creates immediate editorial tension",
"A serious gaze survives the heavy facial shadow",
"The black suit disappears naturally into the studio"
]
},
{
"id": "soft-glasses",
"title": "Soft Focus, Hard Contrast",
"imagePath": "assets/source/soft-glasses.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"A slight head tilt loosens the formal portrait",
"Bloom around the hair stays subtle",
"Crushed blacks retain a smooth tonal falloff"
]
},
{
"id": "braided-rim",
"title": "Braids in the Halo",
"imagePath": "assets/source/braided-rim.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The overhead light traces every braid cleanly",
"Natural pores and fine grain prevent a plastic finish",
"The centered stare feels calm rather than theatrical"
]
},
{
"id": "wet-curls-glasses",
"title": "Wet Curls, Deep Shadow",
"imagePath": "assets/source/wet-curls-glasses.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"Loose curls catch the back light strand by strand",
"Facial hair and glasses remain coherent in the darkness",
"The frame reads as a real 50mm studio photograph"
]
},
{
"id": "shadow-fringe",
"title": "Let the Face Fall Away",
"imagePath": "assets/source/shadow-fringe.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The fringe becomes a bright halo over an almost hidden face",
"The suit silhouette stays legible with minimal fill",
"High ISO texture gives the deepest blacks life"
]
}
]
}
{
"id": "dark-studio-portrait",
"version": "1.0.0",
"title": "Dark Studio Portrait",
"description": "Turn one portrait into a grainy, high-contrast black-and-white studio image with a glowing rim light, formal tailoring, and deep analog shadows.",
"status": "agent-ready",
"owner": "Wiggly Studio",
"source": {
"creator": "@skaigenerated",
"postUrl": "https://www.instagram.com/skaigenerated/p/DbA4-FuFrfs/",
"resourceUrl": "https://docs.google.com/document/d/1kWU1Pl9R7IwN3W9-o6mSmHAAk-0Rh2orF0cTUgRzIek/edit",
"ctaKeyword": "AI",
"modelShown": "GPT Image 2"
},
"outputs": [
"1 inspected monochrome dark-studio portrait",
"state.json with model and prediction provenance",
"quality-report.json with automatic and visual inspection"
]
}
{
"name": "wiggly-dark-studio-portrait-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=dark-studio-portrait && node kit-smoke.mjs"
},
"dependencies": {
"image-size": "2.0.2",
"replicate": "1.4.0",
"tsx": "4.20.6"
}
}
{
"slug": "dark-studio-portrait",
"version": "1.0.0",
"promptPath": "prompts/transform.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",
"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"
},
"gpt-image-2": {
"label": "GPT Image 2",
"lane": "source model",
"model": "openai/gpt-image-2",
"family": "gpt-image",
"aspectRatio": "2:3",
"outputFormat": "jpeg",
"quality": "medium"
}
},
"expectedOutputs": 1,
"maximumAttempts": 3,
"smokeInputPath": "assets/source/reference-input.jpg",
"smokeExamplePath": "assets/source/afro-glasses.jpg",
"minimumOutputWidth": 640,
"minimumOutputHeight": 800,
"minimumOutputBytes": 51200,
"manualReview": [
"recognizable source identity",
"formal black suit and tie",
"strong overhead or back rim light",
"deep facial shadow with smooth falloff",
"heavy analog grain and natural skin texture",
"monochrome photographic realism"
]
}
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 Replicate image charge and usually 2-4 min
You provide
One JPEG, PNG, or WebP portrait at least 512px on both axes · A Replicate API token only when generation is approved
Output
One inspected monochrome portrait plus prediction and quality provenance