Curated Formatv1.0.0

Cyanotype

Turn 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

Handcrafted cyanotype: Make the chemistry feel realReference for Make the chemistry feel real

Shared recipe family

One family. 31 recipes.

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 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

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.

Setup notes from requirements.json
  • 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.

Included assets

The ingredients behind the format.

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.

Recipe reference

Recipe reference

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

Recipe reference

Recipe reference

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

Recipe reference

Recipe reference

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

Recipe reference

Recipe reference

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

Recipe reference

Recipe reference

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

Recipe reference

Recipe reference

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

View all 7 asset references
Recipe reference

Recipe reference

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

What stays consistent

  • The source subject and recognizable identity
  • The original composition, framing, and perspective
  • Facial features, clothing, objects, and environmental details
  • The original lighting direction and depth

What you bring

  • One 3:4 JPEG, PNG, or WebP image at least 512px on both axes
  • A Replicate API token only when generation is approved
Read the included contracts and asset inventory ↓

Examples

Examples & references.

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

SKAI source example: Layer the skull without losing the face

Example 02 · SKAI source example

Layer the skull without losing the face

Open finished ad
SKAI source example: Keep two personalities in one print

Example 03 · SKAI source example

Keep two personalities in one print

Open finished ad
SKAI source example: Preserve texture through a surreal embrace

Example 04 · SKAI source example

Preserve texture through a surreal embrace

Open finished ad
SKAI source example: Turn a snapshot into an exposure study

Example 05 · SKAI source example

Turn a snapshot into an exposure study

Open finished ad
SKAI source example: Make animal anatomy feel delicate

Example 06 · SKAI source example

Make animal anatomy feel delicate

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 source image, exact gathered prompt, and selected model route.

  2. Step 02

    Validate

    The image and prompt contract checked locally.

  3. Step 03 · approval · provider

    Transform

    One cyanotype print from one approved prediction.

  4. Step 04 · approval

    Inspect

    Automatic file checks plus an actual visual review.

Proof & quality

What a good result looks like.

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

Prove a real portrait survives the chemistry

  • 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

Saved reference

Layer the skull without losing the face

  • The sunglasses, chain, face, and hair remain legible
  • The skull reads as a translucent photographic exposure
  • Soft deckled edges keep the image handmade

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 · 5 checks
  • 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 · 6 checks
  • 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 · 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 ↗
# 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.
SKILL.md
Open raw file ↗
---
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`.
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 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."
  ]
}
inputs.json
Open raw file ↗
{
  "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"
  }
}
pipeline.json
Open raw file ↗
{
  "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
    }
  ]
}
assets.json
Open raw file ↗
{
  "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" }
  ]
}
quality.json
Open raw file ↗
{
  "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"
  }
}
goldens.json
Open raw file ↗
{
  "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"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "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"
  ]
}
kit.package.json
Open raw file ↗
{
  "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"
  }
}
runtime.json
Open raw file ↗
{
  "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"
  ]
}
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
One image transformAbout $0.067 on the default 1K route · usually under 2 min
Inspect + finalizeFree · about 1 min

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