Curated Formatv1.0.0

Halo Effect

Turn one portrait into a clean, dramatic semi-silhouette with a bright rim-light halo against black.

By Wiggly Studio · Updated July 2026

Studio portrait: Make the edge light carry the whole frameReference for Make the edge light carry the whole frame

Shared recipe family

One family. 31 recipes.

Halo Effect 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.
  • The creator examples were labeled Nano Banana Pro; the packaged Replicate runtime keeps Pro as premium and uses Nano Banana 2 as the cheaper default.
  • 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 subject's recognizable face and identity
  • The original pose, body proportions, clothing, and accessories
  • The source framing and point of view
  • A realistic photographic finish

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.

Studio portrait: Make the edge light carry the whole frameReference for Make the edge light carry the whole frame

Example 01 · Studio portrait

Make the edge light carry the whole frame

Open finished ad
Seated portrait: Turn an outdoor pose into low-key studio dramaReference for Turn an outdoor pose into low-key studio drama

Example 02 · Seated portrait

Turn an outdoor pose into low-key studio drama

Open finished ad
Fashion portrait: Let the silhouette stay recognizableReference for Let the silhouette stay recognizable

Example 03 · Fashion portrait

Let the silhouette stay recognizable

Open finished ad
Body portrait: Sculpt the shoulders with a clean haloReference for Sculpt the shoulders with a clean halo

Example 04 · Body portrait

Sculpt the shoulders with a clean halo

Open finished ad
Candid portrait: Pull daylight into a black-box studioReference for Pull daylight into a black-box studio

Example 05 · Candid portrait

Pull daylight into a black-box studio

Open finished ad
Full-body portrait: Keep the full pose, lose the environmentReference for Keep the full pose, lose the environment

Example 06 · Full-body portrait

Keep the full pose, lose the environment

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

  2. Step 02

    Validate

    The photo and prompt contract checked locally.

  3. Step 03 · approval · provider

    Transform

    One Halo Effect 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, clean rim-light separation, controlled semi-silhouette exposure, black-background discipline, and cinematic contrast.

The Instagram DM delivered the public Google Doc with the exact Nano Banana Pro prompt. The original carousel supplied its cover and six native output examples; two promotional slides were omitted.

Each source example includes its original inset at bottom left. The packaged reference files are exact crops from those insets so Wiggly can place the original at the top right of the consumer Format page.

Saved reference

Football Rim Glow

  • The footballer, jersey, ball, and frontal pose remain recognizable
  • Bright edge light cleanly separates the body from the black background
  • The controlled facial shadow creates a dramatic semi-silhouette

Saved reference

Alpine Rim Portrait

  • The seated pose, dark technical outfit, and body proportions remain intact
  • A crisp halo traces the hair, shoulders, and arms
  • The low-key studio treatment stays photographic and clean

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 · 5 checks
  • The subject, face, pose, clothing, composition, and key details remain recognizable
  • Strong backlight forms a bright, continuous halo around the visible silhouette
  • The subject reads as a controlled semi-silhouette rather than an underexposed mistake
  • The background stays black and the contrast feels cinematic and studio-made
  • The image remains clean and photographic without warped anatomy, logos, or watermarks
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 Halo Effect Format

This runnable Repo preserves the exact gathered prompt, source notes, original
carousel cover, and six native SKAI examples. 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=halo-effect
npm run format:skai-image -- smoke --format=halo-effect
npm run format:skai-image -- init --format=halo-effect --run=my-photo --input=/absolute/path/to/photo.jpg
npm run format:skai-image -- validate --format=halo-effect --run=my-photo
npm run format:skai-image -- estimate --format=halo-effect --run=my-photo
```

Generation requires `REPLICATE_API_TOKEN` and explicit approval:

```bash
npm run format:skai-image -- render --format=halo-effect --run=my-photo --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`

The creator guide labels its examples as Nano Banana Pro. That source model is
available as the premium route; the default and economy routes use cheaper
Replicate-hosted Nano Banana 2 models.
SKILL.md
Open raw file ↗
---
name: wiggly-halo-effect
description: Apply the exact gathered SKAI Halo Effect prompt to one portrait.
---

# Halo Effect

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 give the Halo Effect?

Then run:

```bash
npm run format:skai-image -- init --format=halo-effect --run=<id> --input=<absolute-image-path>
npm run format:skai-image -- validate --format=halo-effect --run=<id>
npm run format:skai-image -- estimate --format=halo-effect --run=<id>
npm run format:skai-image -- render --format=halo-effect --run=<id> --approve-paid
npm run format:skai-image -- inspect --format=halo-effect --run=<id>
npm run format:skai-image -- inspect --format=halo-effect --run=<id> --visual-pass --review-notes="<specific observations>"
npm run format:skai-image -- finalize --format=halo-effect --run=<id> --approve-final
```

Hard rules:

- 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.
- Keep Nano Banana Pro available as the creator-matched premium 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.",
    "The creator examples were labeled Nano Banana Pro; the packaged Replicate runtime keeps Pro as premium and uses Nano Banana 2 as the cheaper default.",
    "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": "photo",
      "type": "image",
      "formats": ["jpg", "png", "webp"],
      "minimumWidth": 512,
      "minimumHeight": 512,
      "maximumBytes": 26214400
    }
  ],
  "question": "Which portrait should I give the Halo Effect?",
  "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",
    "creatorShown": "Nano Banana Pro"
  }
}
pipeline.json
Open raw file ↗
{
  "progress": "Prepare -> Validate -> Transform -> Inspect",
  "attemptCap": 3,
  "stages": [
    {
      "id": "prepare",
      "output": "One run pinned to the photo, exact gathered prompt, and selected model route.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "validate",
      "output": "The photo and prompt contract checked locally.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "transform",
      "output": "One Halo Effect 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/p/Da8PpG7lpUc/",
    "resourceTitle": "HALO Effect Prompt",
    "guide": "assets/source/guide.txt",
    "cover": "assets/source/cover.jpg",
    "referenceInset": "assets/source/football-rim-glow-reference.jpg",
    "verification": "The Instagram DM delivered the public Google Doc with the exact Nano Banana Pro prompt. The original carousel supplied its cover and six native output examples; two promotional slides were omitted.",
    "referenceNote": "Each source example includes its original inset at bottom left. The packaged reference files are exact crops from those insets so Wiggly can place the original at the top right of the consumer Format page."
  },
  "examples": [
    {
      "id": "football-rim-glow",
      "path": "assets/source/football-rim-glow.jpg",
      "referencePath": "assets/source/football-rim-glow-reference.jpg"
    },
    {
      "id": "alpine-portrait",
      "path": "assets/source/alpine-portrait.jpg",
      "referencePath": "assets/source/alpine-portrait-reference.jpg"
    },
    {
      "id": "mountain-sunglasses",
      "path": "assets/source/mountain-sunglasses.jpg",
      "referencePath": "assets/source/mountain-sunglasses-reference.jpg"
    },
    {
      "id": "sea-portrait",
      "path": "assets/source/sea-portrait.jpg",
      "referencePath": "assets/source/sea-portrait-reference.jpg"
    },
    {
      "id": "city-candid",
      "path": "assets/source/city-candid.jpg",
      "referencePath": "assets/source/city-candid-reference.jpg"
    },
    {
      "id": "golf-silhouette",
      "path": "assets/source/golf-silhouette.jpg",
      "referencePath": "assets/source/golf-silhouette-reference.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 subject, face, pose, clothing, composition, and key details remain recognizable",
    "Strong backlight forms a bright, continuous halo around the visible silhouette",
    "The subject reads as a controlled semi-silhouette rather than an underexposed mistake",
    "The background stays black and the contrast feels cinematic and studio-made",
    "The image remains clean and photographic without warped anatomy, logos, or watermarks"
  ],
  "finalization": {
    "automaticPassRequired": true,
    "visualPassRequired": true,
    "reviewNotesRequired": true,
    "explicitApprovalFlag": "--approve-final"
  }
}
goldens.json
Open raw file ↗
{
  "purpose": "Judge identity preservation, clean rim-light separation, controlled semi-silhouette exposure, black-background discipline, and cinematic contrast.",
  "examples": [
    {
      "id": "football-rim-glow",
      "title": "Football Rim Glow",
      "imagePath": "assets/source/football-rim-glow.jpg",
      "referencePath": "assets/source/football-rim-glow-reference.jpg",
      "model": "Nano Banana Pro",
      "whyItWorks": [
        "The footballer, jersey, ball, and frontal pose remain recognizable",
        "Bright edge light cleanly separates the body from the black background",
        "The controlled facial shadow creates a dramatic semi-silhouette"
      ]
    },
    {
      "id": "alpine-portrait",
      "title": "Alpine Rim Portrait",
      "imagePath": "assets/source/alpine-portrait.jpg",
      "referencePath": "assets/source/alpine-portrait-reference.jpg",
      "model": "Nano Banana Pro",
      "whyItWorks": [
        "The seated pose, dark technical outfit, and body proportions remain intact",
        "A crisp halo traces the hair, shoulders, and arms",
        "The low-key studio treatment stays photographic and clean"
      ]
    },
    {
      "id": "mountain-sunglasses",
      "title": "Sunglasses Halo Portrait",
      "imagePath": "assets/source/mountain-sunglasses.jpg",
      "referencePath": "assets/source/mountain-sunglasses-reference.jpg",
      "model": "Nano Banana Pro",
      "whyItWorks": [
        "The sunglasses, hair, knit top, and three-quarter pose remain recognizable",
        "Strong backlight outlines the head and shoulders without flattening the subject",
        "The black background turns an outdoor portrait into a convincing studio frame"
      ]
    },
    {
      "id": "sea-portrait",
      "title": "Sea Portrait Halo",
      "imagePath": "assets/source/sea-portrait.jpg",
      "referencePath": "assets/source/sea-portrait-reference.jpg",
      "model": "Nano Banana Pro",
      "whyItWorks": [
        "The subject's face, wet hair, crossed-arm pose, and physique remain recognizable",
        "Rim light traces both shoulders and creates sculptural separation",
        "The semi-silhouette stays moody without losing the portrait"
      ]
    },
    {
      "id": "city-candid",
      "title": "City Candid Halo",
      "imagePath": "assets/source/city-candid.jpg",
      "referencePath": "assets/source/city-candid-reference.jpg",
      "model": "Nano Banana Pro",
      "whyItWorks": [
        "The loose shirt, shoulder bag, stance, and facial structure remain readable",
        "A bright contour follows the hair and shoulders against pure black",
        "The lighting turns a daylight candid into a dramatic studio portrait"
      ]
    },
    {
      "id": "golf-silhouette",
      "title": "Golf Silhouette",
      "imagePath": "assets/source/golf-silhouette.jpg",
      "referencePath": "assets/source/golf-silhouette-reference.jpg",
      "model": "Nano Banana Pro",
      "whyItWorks": [
        "The cap, fitted black outfit, standing pose, and proportions remain recognizable",
        "A narrow halo separates the full body from the dark background",
        "The restrained exposure creates a clean, cinematic silhouette"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "id": "halo-effect",
  "version": "1.0.0",
  "title": "Halo Effect",
  "description": "Turn one portrait into a dramatic, high-contrast studio image with a bright rim-light halo and a near-black background.",
  "status": "agent-ready",
  "owner": "Wiggly Studio",
  "source": {
    "creator": "@skaigenerated",
    "postUrl": "https://www.instagram.com/p/Da8PpG7lpUc/",
    "resourceTitle": "HALO Effect Prompt",
    "resourceAccess": "Instagram DM to public Google Doc",
    "ctaKeyword": "AI",
    "modelShown": "Nano Banana Pro"
  },
  "outputs": [
    "1 inspected Halo Effect portrait",
    "state.json with model and prediction provenance",
    "quality-report.json with automatic and visual inspection"
  ]
}
kit.package.json
Open raw file ↗
{
  "name": "wiggly-halo-effect-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=halo-effect && node kit-smoke.mjs"
  },
  "dependencies": {
    "image-size": "2.0.2",
    "replicate": "1.4.0",
    "tsx": "4.20.6"
  }
}
runtime.json
Open raw file ↗
{
  "slug": "halo-effect",
  "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"
    }
  },
  "expectedOutputs": 1,
  "maximumAttempts": 3,
  "smokeInputPath": "assets/source/football-rim-glow-reference.jpg",
  "smokeExamplePath": "assets/source/football-rim-glow.jpg",
  "minimumOutputWidth": 640,
  "minimumOutputHeight": 800,
  "minimumOutputBytes": 51200,
  "manualReview": [
    "the subject, pose, clothing, and recognizable details stay intact",
    "strong backlight creates a clean halo around the visible silhouette",
    "the face and body fall into a controlled semi-silhouette",
    "the background remains black and the contrast feels cinematic",
    "the result stays photographic, clean, and free of obvious AI artifacts"
  ]
}
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 Halo Effect portrait plus prediction and quality provenance