Curated Formatv1.0.0

Dark Studio Portrait

Turn 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

Monochrome portrait: Let the rim light draw the whole faceReference for Let the rim light draw the whole face

Shared recipe family

One family. 31 recipes.

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 family

Before you start

Services & costs

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_TOKEN

Local runtime

Setup, 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.

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

Included assets

The ingredients behind the format.

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.

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.

What stays consistent

  • The source person's recognizable identity
  • A calm forward-facing expression
  • Natural skin and hair texture
  • Photographic portrait anatomy

What you bring

  • One JPEG, PNG, or WebP portrait 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.

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

Monochrome portrait: Let the rim light draw the whole faceReference for Let the rim light draw the whole face

Example 01 · Monochrome portrait

Let the rim light draw the whole face

Open finished ad
Editorial cover: Put the calm stare inside the darknessReference for Put the calm stare inside the darkness

Example 02 · Editorial cover

Put the calm stare inside the darkness

Open finished ad
Textured close-up: Make every curl catch the backlightReference for Make every curl catch the backlight

Example 05 · Textured close-up

Make every curl catch the backlight

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

  2. Step 02

    Validate

    The portrait and prompt contract checked locally.

  3. Step 03 · approval · provider

    Transform

    One dark-studio portrait 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 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

Rim Light Through Glasses

  • 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

Saved reference

The Quiet Cover Portrait

  • The off-center crop creates immediate editorial tension
  • A serious gaze survives the heavy facial shadow
  • The black suit disappears naturally into the studio

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, 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 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 · 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 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`
SKILL.md
Open raw file ↗
---
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`.
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",
        "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."
  ]
}
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 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"
  }
}
pipeline.json
Open raw file ↗
{
  "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
    }
  ]
}
assets.json
Open raw file ↗
{
  "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" }
  ]
}
quality.json
Open raw file ↗
{
  "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"
  }
}
goldens.json
Open raw file ↗
{
  "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"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "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"
  ]
}
kit.package.json
Open raw file ↗
{
  "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"
  }
}
runtime.json
Open raw file ↗
{
  "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"
  ]
}
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 portraitCurrent Replicate model rate · usually under 2 min
Inspect + finalizeFree · about 1 min

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