Curated Formatv1.0.0

Rim Portrait Filter

Turn one portrait into a centered, sculptural silhouette drawn by a clean white halo and fine rim light.

By Wiggly Studio · Updated July 2026

Rim-light portrait: Let one halo draw the whole portraitReference for Let one halo draw the whole portrait

Shared recipe family

One family. 31 recipes.

Rim Portrait Filter 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

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 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 person's recognizable identity
  • Natural facial structure and hair texture
  • A chest-up photographic portrait
  • A calm, direct presence

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.

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

Rim-light portrait: Let one halo draw the whole portraitReference for Let one halo draw the whole portrait

Example 01 · Rim-light portrait

Let one halo draw the whole portrait

Open finished ad
SKAI source example: Break symmetry without losing the light

Example 05 · SKAI source example

Break symmetry without losing the light

Open finished ad
SKAI source example: Hold detail inside the darkness

Example 07 · SKAI source example

Hold detail inside the darkness

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 rim-lit 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, centered portrait geometry, a clean white-to-gray halo, deep sculptural shadow, fine hair rim light, and photographic realism.

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

Proof the halo can preserve identity

  • The fixture identity and distinctive hair remain recognizable
  • Backlight separates every strand from the gray halo
  • The face and shirt fall into one controlled sculptural shadow

Saved reference

Let the curls carry the rim

  • The dense curls create an immediate luminous outline
  • The centered crop stays monumental
  • The face remains visible without weakening the silhouette

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 portrait is front-facing, chest-up, centered, and nearly symmetrical
  • A clean white-to-gray gradient creates a controlled halo
  • Strong backlight leaves the face and clothing in deep silhouette
  • Fine hair strands catch a visible but restrained rim light
  • The result looks cinematic and photographic rather than illustrated
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 Rim Portrait Filter Format

This runnable Repo preserves the exact prompt and six native source examples
gathered from @skaigenerated. The separate Wiggly proof uses one fixture
portrait 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=rim-portrait-filter
npm run format:skai-image -- smoke --format=rim-portrait-filter
npm run format:skai-image -- init --format=rim-portrait-filter --run=my-portrait --input=/absolute/path/to/portrait.jpg
npm run format:skai-image -- validate --format=rim-portrait-filter --run=my-portrait
npm run format:skai-image -- estimate --format=rim-portrait-filter --run=my-portrait
```

Generation requires `REPLICATE_API_TOKEN` and explicit approval:

```bash
npm run format:skai-image -- render --format=rim-portrait-filter --run=my-portrait --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`
SKILL.md
Open raw file ↗
---
name: wiggly-rim-portrait-filter
description: Turn one portrait into a centered sculptural silhouette using the exact gathered SKAI rim-light prompt.
---

# Rim Portrait Filter

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 Rim Portrait?

Then run:

```bash
npm run format:skai-image -- init --format=rim-portrait-filter --run=<id> --input=<absolute-image-path>
npm run format:skai-image -- validate --format=rim-portrait-filter --run=<id>
npm run format:skai-image -- estimate --format=rim-portrait-filter --run=<id>
npm run format:skai-image -- render --format=rim-portrait-filter --run=<id> --approve-paid
npm run format:skai-image -- inspect --format=rim-portrait-filter --run=<id>
npm run format:skai-image -- inspect --format=rim-portrait-filter --run=<id> --visual-pass --review-notes="<specific observations>"
npm run format:skai-image -- finalize --format=rim-portrait-filter --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, or Pro for premium and 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"
      ]
    }
  ],
  "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": "portrait",
      "type": "image",
      "formats": ["jpg", "png", "webp"],
      "minimumWidth": 512,
      "minimumHeight": 512,
      "maximumBytes": 26214400
    }
  ],
  "question": "Which portrait should I turn into a Rim 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": "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 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 rim-lit 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/DbQ2VzjiuzL/",
    "resourceUrl": "https://docs.google.com/document/d/1H7nbE9_-OWiFXsDxhZqQ1D3P3ijWbIMuEwfOmqBtZvc",
    "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": "curly-halo", "path": "assets/source/skai-example-01.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "braided-halo", "path": "assets/source/skai-example-02.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "horse-hood", "path": "assets/source/skai-example-03.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "shearling-profile", "path": "assets/source/skai-example-04.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "cowboy-halo", "path": "assets/source/skai-example-05.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "hooded-halo", "path": "assets/source/skai-example-06.jpg", "provenance": "@skaigenerated carousel" }
  ]
}
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 portrait is front-facing, chest-up, centered, and nearly symmetrical",
    "A clean white-to-gray gradient creates a controlled halo",
    "Strong backlight leaves the face and clothing in deep silhouette",
    "Fine hair strands catch a visible but restrained rim light",
    "The result looks cinematic and photographic rather than illustrated"
  ],
  "finalization": {
    "automaticPassRequired": true,
    "visualPassRequired": true,
    "reviewNotesRequired": true,
    "explicitApprovalFlag": "--approve-final"
  }
}
goldens.json
Open raw file ↗
{
  "purpose": "Judge identity preservation, centered portrait geometry, a clean white-to-gray halo, deep sculptural shadow, fine hair rim light, and photographic realism.",
  "examples": [
    {
      "id": "wiggly-proof",
      "title": "Proof the halo can preserve identity",
      "imagePath": "assets/source/wiggly-proof.jpg",
      "model": "Wiggly built-in proof",
      "whyItWorks": [
        "The fixture identity and distinctive hair remain recognizable",
        "Backlight separates every strand from the gray halo",
        "The face and shirt fall into one controlled sculptural shadow"
      ]
    },
    {
      "id": "curly-halo",
      "title": "Let the curls carry the rim",
      "imagePath": "assets/source/skai-example-01.jpg",
      "model": "Nano Banana Pro · SKAI source",
      "whyItWorks": [
        "The dense curls create an immediate luminous outline",
        "The centered crop stays monumental",
        "The face remains visible without weakening the silhouette"
      ]
    },
    {
      "id": "braided-halo",
      "title": "Keep every braid legible",
      "imagePath": "assets/source/skai-example-02.jpg",
      "model": "Nano Banana Pro · SKAI source",
      "whyItWorks": [
        "Individual braids retain crisp texture against white",
        "The shoulders anchor the centered geometry",
        "Minimal fill preserves a mysterious expression"
      ]
    },
    {
      "id": "horse-hood",
      "title": "Make an unusual silhouette feel iconic",
      "imagePath": "assets/source/skai-example-03.jpg",
      "model": "Nano Banana Pro · SKAI source",
      "whyItWorks": [
        "The tall hood stays readable in one simple outline",
        "The white tank creates a restrained second value",
        "Symmetry turns the costume into a sculptural portrait"
      ]
    },
    {
      "id": "shearling-profile",
      "title": "Let profile texture break the symmetry",
      "imagePath": "assets/source/skai-example-04.jpg",
      "model": "Nano Banana Pro · SKAI source",
      "whyItWorks": [
        "The three-quarter profile proves the lighting recipe can flex",
        "Loose locs catch isolated points of rim light",
        "The jacket collar remains tactile inside deep shadow"
      ]
    },
    {
      "id": "cowboy-halo",
      "title": "Use the hat as the whole outline",
      "imagePath": "assets/source/skai-example-05.jpg",
      "model": "Nano Banana Pro · SKAI source",
      "whyItWorks": [
        "The brim produces a clean graphic silhouette",
        "The centered chest-up crop holds the original recipe",
        "A narrow rim keeps the hat and curls separated"
      ]
    },
    {
      "id": "hooded-halo",
      "title": "Hold detail inside an almost black hood",
      "imagePath": "assets/source/skai-example-06.jpg",
      "model": "Nano Banana Pro · SKAI source",
      "whyItWorks": [
        "The hood stays distinct from both hair and background",
        "Sunglasses remain barely readable without adding excess fill",
        "The tonal restraint keeps the frame cinematic"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "id": "rim-portrait-filter",
  "version": "1.0.0",
  "title": "Rim Portrait Filter",
  "description": "Turn one portrait into a centered, sculptural silhouette with a white-to-gray halo and fine rim light catching the hair.",
  "status": "agent-ready",
  "owner": "Wiggly Studio",
  "source": {
    "creator": "@skaigenerated",
    "postUrl": "https://www.instagram.com/skaigenerated/p/DbQ2VzjiuzL/",
    "resourceUrl": "https://docs.google.com/document/d/1H7nbE9_-OWiFXsDxhZqQ1D3P3ijWbIMuEwfOmqBtZvc",
    "ctaKeyword": "AI",
    "modelShown": "Nano Banana Pro"
  },
  "outputs": [
    "1 inspected 3:4 rim-lit portrait",
    "state.json with model and prediction provenance",
    "quality-report.json with automatic and visual inspection"
  ]
}
kit.package.json
Open raw file ↗
{
  "name": "wiggly-rim-portrait-filter-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=rim-portrait-filter && node kit-smoke.mjs"
  },
  "dependencies": {
    "image-size": "2.0.2",
    "replicate": "1.4.0",
    "tsx": "4.20.6"
  }
}
runtime.json
Open raw file ↗
{
  "slug": "rim-portrait-filter",
  "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 and source",
      "model": "google/nano-banana-pro",
      "family": "nano-banana",
      "aspectRatio": "3:4",
      "outputFormat": "jpg",
      "resolution": "1K"
    }
  },
  "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 identity",
    "front-facing chest-up composition",
    "relaxed upright pose with slight head tilt",
    "centered symmetry",
    "clean white-to-gray halo background",
    "deep silhouette with fine hair rim light",
    "cinematic 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 image transformCurrent 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 3:4 rim-lit portrait plus prediction and quality provenance