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 image into a handcrafted Prussian-blue contact print with real paper texture, chemical variation, and subtle X-ray detail only when the subject calls for it.
By Wiggly Studio · Updated July 2026


Shared recipe family
Cyanotype 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
About $0.067 on the default route 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 7 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
7 saved examples for this recipe—not 7 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 source image, exact gathered prompt, and selected model route.
Step 02
The image and prompt contract checked locally.
Step 03 · approval · provider
One cyanotype print from one approved prediction.
Step 04 · approval
Automatic file checks plus an actual visual review.
Proof & quality
Judge subject and composition preservation, Prussian-blue tonality, real paper and chemistry texture, subtle X-ray detail when relevant, and an authentic analogue contact-print finish.
The delivered Google Doc supplied the exact Nano Banana Pro prompt. The Instagram carousel supplied six native 3:4 source outputs.
The creator did not publish the original inputs. The clearly identified Wiggly proof uses a separate fixture portrait so Discover can show one honest before-and-after pair; the six SKAI outputs remain unchanged source examples.
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 Cyanotype Format This runnable Repo preserves the exact prompt and six native source examples gathered from @skaigenerated. The separate Wiggly proof uses one fixture image so the public hero can show a truthful before-and-after pair. Run from `v3`: ```bash npm install npm run format:skai-image -- check --format=cyanotype npm run format:skai-image -- smoke --format=cyanotype npm run format:skai-image -- init --format=cyanotype --run=my-cyanotype --input=/absolute/path/to/3-by-4-image.jpg npm run format:skai-image -- validate --format=cyanotype --run=my-cyanotype npm run format:skai-image -- estimate --format=cyanotype --run=my-cyanotype ``` The input must already be 3:4 so the fixed 3:4 output route can honor the source prompt's composition-preservation rule. Add `--model=nano-banana-2-lite` or `--model=nano-banana-pro` to `init` to select the economy or premium route. Generation requires `REPLICATE_API_TOKEN`. Stop after `estimate` and get the user's explicit approval before supplying the paid flag: ```bash npm run format:skai-image -- render --format=cyanotype --run=my-cyanotype --approve-paid ``` No Replicate proof call was made while packaging this Repo. - Economy: `google/nano-banana-2-lite` - Default: `google/nano-banana-2` - Premium and source: `google/nano-banana-pro` At the Replicate rates checked while packaging, those routes estimate about $0.034, $0.067, and $0.15 per 1K output image respectively. Re-run `estimate` immediately before approval because provider pricing can change.
--- name: wiggly-cyanotype description: Turn one image into a handcrafted Prussian-blue contact print using the exact gathered SKAI cyanotype prompt. --- # Cyanotype Use the packaged runner and exact prompt. Do not call Replicate separately or create another render path. From the extracted kit's `v3` directory, prepare the local runner first: ```bash npm install npm run format:skai-image -- check --format=cyanotype npm run format:skai-image -- smoke --format=cyanotype ``` Ask one short question: > Which 3:4 image should I turn into a handcrafted cyanotype? Then initialize the free run. Omit `--model` for Nano Banana 2, or add `--model=nano-banana-2-lite` for economy or `--model=nano-banana-pro` for premium: ```bash npm run format:skai-image -- init --format=cyanotype --run=<id> --input=<absolute-image-path> [--model=<route>] npm run format:skai-image -- validate --format=cyanotype --run=<id> npm run format:skai-image -- estimate --format=cyanotype --run=<id> ``` Stop after `estimate` and ask the user to approve the paid prediction. Only after the user explicitly approves the cost should you supply `--approve-paid`: ```bash npm run format:skai-image -- render --format=cyanotype --run=<id> --approve-paid npm run format:skai-image -- inspect --format=cyanotype --run=<id> npm run format:skai-image -- inspect --format=cyanotype --run=<id> --visual-pass --review-notes="<specific observations>" npm run format:skai-image -- finalize --format=cyanotype --run=<id> --approve-final ``` Hard rules: - Preserve the source subject and composition. - Reject or crop to a user-approved 3:4 input before validation so the fixed 3:4 route can preserve composition honestly. - Keep the exact gathered prompt unless the user explicitly requests a change. - Use Nano Banana 2 by default, Lite for economy, or Pro for premium and the creator's source route. - Add subtle skeletal detail only for a moving person or animal. - Validate and estimate before spending, pause for explicit user approval, 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"
]
}
],
"environment": [
{
"name": "REPLICATE_API_TOKEN",
"secret": true,
"requiredFor": ["render", "resume"]
}
],
"notes": [
"All smoke and validation commands are local.",
"No Replicate proof call was made for this package.",
"One render attempt is one paid prediction.",
"Paid generation requires explicit approval and is capped at three attempts."
]
}
{
"required": [
{
"id": "image",
"type": "image",
"formats": ["jpg", "png", "webp"],
"minimumWidth": 512,
"minimumHeight": 512,
"maximumBytes": 26214400,
"aspectRatio": "3:4",
"aspectRatioTolerance": 0.02
}
],
"question": "Which 3:4 image should I turn into a handcrafted cyanotype?",
"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": "google/nano-banana-pro"
}
}
{
"progress": "Prepare -> Validate -> Transform -> Inspect",
"attemptCap": 3,
"stages": [
{
"id": "prepare",
"output": "One run pinned to the source image, exact gathered prompt, and selected model route.",
"paid": false,
"approvalRequired": false
},
{
"id": "validate",
"output": "The image and prompt contract checked locally.",
"paid": false,
"approvalRequired": false
},
{
"id": "transform",
"output": "One cyanotype print 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/DbbjJsQin69/",
"resourceUrl": "https://docs.google.com/document/d/1tqmgf_xU2DiCAcl30qX3-a5li_Sx8xY64NB4Emem7DY/mobilebasic",
"guide": "assets/source/guide.txt",
"referenceInset": "assets/source/reference-input.jpg",
"verification": "The delivered Google Doc supplied the exact Nano Banana Pro prompt. The Instagram carousel supplied six native 3:4 source outputs.",
"referenceNote": "The creator did not publish the original inputs. The clearly identified Wiggly proof uses a separate fixture portrait so Discover can show one honest before-and-after pair; the six SKAI outputs remain unchanged source examples."
},
"examples": [
{ "id": "wiggly-proof", "path": "assets/source/wiggly-proof.jpg", "provenance": "Wiggly built-in image-generation proof" },
{ "id": "skull-portrait", "path": "assets/source/skai-example-01.jpg", "provenance": "@skaigenerated carousel" },
{ "id": "woman-and-dog", "path": "assets/source/skai-example-02.jpg", "provenance": "@skaigenerated carousel" },
{ "id": "costume-embrace", "path": "assets/source/skai-example-03.jpg", "provenance": "@skaigenerated carousel" },
{ "id": "beach-skeleton", "path": "assets/source/skai-example-04.jpg", "provenance": "@skaigenerated carousel" },
{ "id": "cat-portrait", "path": "assets/source/skai-example-05.jpg", "provenance": "@skaigenerated carousel" },
{ "id": "boxer-skeleton", "path": "assets/source/skai-example-06.jpg", "provenance": "@skaigenerated carousel" }
]
}
{
"automatic": [
"The source input is 3:4 within 0.02 so composition can be preserved",
"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 subject, framing, and perspective remain recognizable",
"The palette is deep Prussian blue with soft natural highlights",
"Watercolor paper, chemical staining, grain, and edge falloff feel physical",
"Any skeletal reveal is anatomically plausible, subtle, and only used for a moving person or animal",
"Tonal separation comes from luminance rather than a flat blue tint",
"The result looks like an analogue contact print rather than a digital filter"
],
"finalization": {
"automaticPassRequired": true,
"visualPassRequired": true,
"reviewNotesRequired": true,
"explicitApprovalFlag": "--approve-final"
}
}
{
"purpose": "Judge subject and composition preservation, Prussian-blue tonality, real paper and chemistry texture, subtle X-ray detail when relevant, and an authentic analogue contact-print finish.",
"examples": [
{
"id": "wiggly-proof",
"title": "Prove a real portrait survives the chemistry",
"imagePath": "assets/source/wiggly-proof.jpg",
"model": "Wiggly built-in proof",
"whyItWorks": [
"The fixture identity, expression, clothing, and crop remain recognizable",
"Paper fibers and uneven exposure make the blue feel physically printed",
"The stationary portrait stays anatomically natural without an unnecessary skeleton"
]
},
{
"id": "skull-portrait",
"title": "Layer the skull without losing the face",
"imagePath": "assets/source/skai-example-01.jpg",
"model": "Nano Banana Pro · SKAI source",
"whyItWorks": [
"The sunglasses, chain, face, and hair remain legible",
"The skull reads as a translucent photographic exposure",
"Soft deckled edges keep the image handmade"
]
},
{
"id": "woman-and-dog",
"title": "Keep two personalities in one print",
"imagePath": "assets/source/skai-example-02.jpg",
"model": "Nano Banana Pro · SKAI source",
"whyItWorks": [
"Both the seated woman and dog remain immediately recognizable",
"The porch and plants retain spatial depth",
"The restrained skeletal layer supports rather than dominates the scene"
]
},
{
"id": "costume-embrace",
"title": "Make texture survive a surreal embrace",
"imagePath": "assets/source/skai-example-03.jpg",
"model": "Nano Banana Pro · SKAI source",
"whyItWorks": [
"Fur, fabric, and faces separate cleanly inside one blue palette",
"The unusual pose remains readable",
"Chemical variation gives the print real tactile character"
]
},
{
"id": "beach-skeleton",
"title": "Turn a beach snapshot into an exposure study",
"imagePath": "assets/source/skai-example-04.jpg",
"model": "Nano Banana Pro · SKAI source",
"whyItWorks": [
"The person, sunglasses, shoreline, and horizon stay recognizable",
"The torso skeleton blends into the existing body",
"White sky and deep-blue shadows preserve convincing tonal range"
]
},
{
"id": "cat-portrait",
"title": "Let an animal portrait carry the X-ray idea",
"imagePath": "assets/source/skai-example-05.jpg",
"model": "Nano Banana Pro · SKAI source",
"whyItWorks": [
"The cat and person remain distinct at a glance",
"Fine whiskers, hair, and jacket texture survive the print process",
"The skeletal detail feels delicate rather than medical"
]
},
{
"id": "boxer-skeleton",
"title": "Use anatomy to amplify motion",
"imagePath": "assets/source/skai-example-06.jpg",
"model": "Nano Banana Pro · SKAI source",
"whyItWorks": [
"The gloves, trunks, stance, and arena remain intact",
"The moving body earns the strongest skeletal reveal",
"Cyanotype texture keeps the frame artistic instead of clinical"
]
}
]
}
{
"id": "cyanotype",
"version": "1.0.0",
"title": "Cyanotype",
"description": "Turn one image into a handcrafted Prussian-blue cyanotype contact print while preserving the original composition and subject.",
"status": "agent-ready",
"owner": "Wiggly Studio",
"source": {
"creator": "@skaigenerated",
"postUrl": "https://www.instagram.com/skaigenerated/p/DbbjJsQin69/",
"resourceUrl": "https://docs.google.com/document/d/1tqmgf_xU2DiCAcl30qX3-a5li_Sx8xY64NB4Emem7DY/mobilebasic",
"ctaKeyword": "AI",
"modelShown": "Nano Banana Pro"
},
"outputs": [
"1 inspected 3:4 cyanotype print",
"state.json with model and prediction provenance",
"quality-report.json with automatic and visual inspection"
]
}
{
"name": "wiggly-cyanotype-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=cyanotype && node kit-smoke.mjs"
},
"dependencies": {
"image-size": "2.0.2",
"replicate": "1.4.0",
"tsx": "4.20.6"
}
}
{
"slug": "cyanotype",
"version": "1.0.0",
"promptPath": "prompts/transform.txt",
"input": {
"mode": "image",
"formats": ["jpg", "png", "webp"],
"minimumWidth": 512,
"minimumHeight": 512,
"maximumBytes": 26214400,
"aspectRatio": "3:4",
"aspectRatioTolerance": 0.02
},
"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",
"costEstimate": "about $0.034 per output image at the current listed rate",
"timeEstimate": "usually 5-60 seconds"
},
"nano-banana-2": {
"label": "Nano Banana 2",
"lane": "default",
"model": "google/nano-banana-2",
"family": "nano-banana",
"aspectRatio": "3:4",
"outputFormat": "jpg",
"resolution": "1K",
"costEstimate": "about $0.067 per 1K output image at the current listed rate",
"timeEstimate": "usually 10-120 seconds"
},
"nano-banana-pro": {
"label": "Nano Banana Pro",
"lane": "premium and source",
"model": "google/nano-banana-pro",
"family": "nano-banana",
"aspectRatio": "3:4",
"outputFormat": "jpg",
"resolution": "1K",
"costEstimate": "about $0.15 per 1K output image at the current listed rate",
"timeEstimate": "usually 30-180 seconds"
}
},
"expectedOutputs": 1,
"maximumAttempts": 3,
"smokeInputPath": "assets/source/reference-input.jpg",
"smokeExamplePath": "assets/source/wiggly-proof.jpg",
"minimumOutputWidth": 640,
"minimumOutputHeight": 800,
"minimumOutputBytes": 51200,
"manualReview": [
"recognizable source subject and composition",
"deep Prussian-blue monochrome",
"soft white-to-pale-blue highlights",
"visible watercolor-paper texture",
"organic chemical staining and edge variation",
"accurate, subtle skeletal detail only when motion calls for it",
"authentic analogue contact-print appearance"
]
}
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
About $0.067 on the default route and usually 2-4 min
You provide
One 3:4 JPEG, PNG, or WebP image at least 512px on both axes · A Replicate API token only when generation is approved
Output
One inspected 3:4 cyanotype print plus prediction and quality provenance