Curated Formatv1.0.0

Soft Glow Filter

Give one existing photo a realistic soft cinematic glow, gentle film texture, and a few restrained handwritten memory captions without changing the subject or scene.

By Wiggly Studio · Updated July 2026

Soft cinematic filter: Make an outdoor memory feel worth savingReference for Make an outdoor memory feel worth saving

Shared recipe family

One family. 31 recipes.

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

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.
  • The source guide names GPT Image 2; Wiggly's runnable lanes use Nano Banana 2 Lite, Nano Banana 2, and Nano Banana Pro.
  • 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.

Creator style reference

Creator style reference

The title cover does not contain a before image, so Discover adds exactly one reference inset extracted from the first native comparison. Each nested source example already contains its own native inset. The two CTA slides are intentionally excluded.

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 original subject, face, pose, and expression
  • The background, framing, crop, and perspective
  • Clothing, objects, and other key details
  • A realistic and natural photographic finish

What you bring

  • One 3:4 JPEG, PNG, or WebP photo 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.

Soft cinematic filter: Make an outdoor memory feel worth savingReference for Make an outdoor memory feel worth saving

Example 01 · Soft cinematic filter

Make an outdoor memory feel worth saving

Open finished ad
SKAI source example: Turn a summit photo into a saved memory

Example 02 · SKAI source example

Turn a summit photo into a saved memory

Open finished ad
SKAI source example: Let a wide landscape keep its scale

Example 03 · SKAI source example

Let a wide landscape keep its scale

Open finished ad
SKAI source example: Keep the playful pose inside the treatment

Example 04 · SKAI source example

Keep the playful pose inside the treatment

Open finished ad
SKAI source example: Make a group ride feel archival

Example 05 · SKAI source example

Make a group ride feel archival

Open finished ad
SKAI source example: Give a quiet forest stop a gentle glow

Example 06 · SKAI source example

Give a quiet forest stop a gentle glow

Open finished ad
SKAI source example: Keep texture alive in a darker scene

Example 07 · SKAI source example

Keep texture alive in a darker scene

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 3:4 image and prompt contract checked locally.

  3. Step 03 · approval · provider

    Transform

    One realistic soft-glow film image with restrained handwritten captions 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 source preservation, realistic soft glow, restrained blur and film grain, clean handwritten memory captions, readable placement, and natural photographic detail.

The delivered Google Doc supplied the exact GPT Image 2 prompt. The Instagram carousel supplied one native 3:4 title cover and six native 3:4 transformation examples.

The title cover does not contain a before image, so Discover adds exactly one reference inset extracted from the first native comparison. Each nested source example already contains its own native inset. The two CTA slides are intentionally excluded.

Saved reference

Make the format readable in one glance

  • The title and primary result explain the visual recipe immediately
  • The subject and mountain setting remain photographic
  • Soft texture and small handwritten notes preview the finished treatment

Saved reference

Turn a summit photo into a saved memory

  • The source inset proves the person, pose, clothing, and location stay recognizable
  • Glow and film softness change the mood without replacing the scene
  • Three short captions sit in readable areas and support the photograph

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 subject, face, pose, background, framing, and key details remain recognizable
  • Soft glow, gentle blur, dot grain, and vintage film texture remain restrained and photographic
  • The image contains only 2–5 clean handwritten captions of 1–3 words each
  • Every caption comes from the supplied phrase list and sits on a readable background area
  • Lettering is thin pastel white, cream, or butter yellow with only subtle sketch arrows
  • There are no emojis, hashtags, long captions, cheesy quotes, or obviously synthetic details
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 Soft Glow Filter Format

This runnable Repo preserves the exact prompt delivered by @skaigenerated, the
native title cover, six native before-and-after examples, and one extracted
source inset for a truthful hero comparison. The final two carousel CTA slides
are intentionally excluded.

Run from `v3`:

```bash
npm install
npm run format:skai-image -- check --format=soft-glow-filter
npm run format:skai-image -- smoke --format=soft-glow-filter
npm run format:skai-image -- init --format=soft-glow-filter --run=my-soft-glow --input=/absolute/path/to/3-by-4-image.jpg
npm run format:skai-image -- validate --format=soft-glow-filter --run=my-soft-glow
npm run format:skai-image -- estimate --format=soft-glow-filter --run=my-soft-glow
```

The input must already be 3:4 so the fixed output route can preserve the source
framing. 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=soft-glow-filter --run=my-soft-glow --approve-paid
```

No Replicate proof call was made while packaging this Repo.

- Economy: `google/nano-banana-2-lite`
- Default: `google/nano-banana-2`
- Premium: `google/nano-banana-pro`
- Model named in the source guide: `openai/gpt-image-2`

The source model is recorded for provenance. The runnable lanes use the
lower-cost Nano Banana routes requested for Wiggly and preserve the carousel's
3:4 output shape. Re-run `estimate` immediately before approval because
provider pricing can change.
SKILL.md
Open raw file ↗
---
name: wiggly-soft-glow-filter
description: Give one existing 3:4 photo a realistic soft-glow film grade and restrained handwritten memory captions using the exact gathered SKAI prompt.
---

# Soft Glow Filter

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=soft-glow-filter
npm run format:skai-image -- smoke --format=soft-glow-filter
```

Ask one short question:

> Which 3:4 photo should I turn into a soft-glow memory?

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=soft-glow-filter --run=<id> --input=<absolute-image-path> [--model=<route>]
npm run format:skai-image -- validate --format=soft-glow-filter --run=<id>
npm run format:skai-image -- estimate --format=soft-glow-filter --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=soft-glow-filter --run=<id> --approve-paid
npm run format:skai-image -- inspect --format=soft-glow-filter --run=<id>
npm run format:skai-image -- inspect --format=soft-glow-filter --run=<id> --visual-pass --review-notes="<specific observations>"
npm run format:skai-image -- finalize --format=soft-glow-filter --run=<id> --approve-final
```

Hard rules:

- Preserve the subject, face, pose, background, framing, and all key details.
- Use a user-approved 3:4 input before validation so the fixed 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.
- Add only 2–5 clean captions, each 1–3 words, chosen from the supplied list.
- Keep caption lettering thin, handwritten, and pastel white, cream, or butter yellow with only subtle sketch arrows.
- Keep the result realistic and natural; use restrained glow, blur, grain, and vintage film texture.
- Never add emojis, hashtags, long text, or cheesy quotes.
- 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.",
    "The source guide names GPT Image 2; Wiggly's runnable lanes use Nano Banana 2 Lite, Nano Banana 2, and Nano Banana Pro.",
    "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 photo should I turn into a soft-glow memory?",
  "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"
  },
  "sourceModel": "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 source image, exact gathered prompt, and selected model route.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "validate",
      "output": "The 3:4 image and prompt contract checked locally.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "transform",
      "output": "One realistic soft-glow film image with restrained handwritten captions 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/Da2XzrdCvEQ/",
    "resourceUrl": "https://docs.google.com/document/d/1r474WFlLhQfs3V1bb3l8jKr5OR9HiNJNc52xVTrjxv0/mobilebasic",
    "guide": "assets/source/guide.txt",
    "nativeHero": "assets/source/skai-hero.jpg",
    "referenceInset": "assets/source/reference-input.jpg",
    "verification": "The delivered Google Doc supplied the exact GPT Image 2 prompt. The Instagram carousel supplied one native 3:4 title cover and six native 3:4 transformation examples.",
    "referenceNote": "The title cover does not contain a before image, so Discover adds exactly one reference inset extracted from the first native comparison. Each nested source example already contains its own native inset. The two CTA slides are intentionally excluded."
  },
  "examples": [
    { "id": "native-hero", "path": "assets/source/skai-hero.jpg", "provenance": "@skaigenerated carousel title cover" },
    { "id": "mountain-seat", "path": "assets/source/skai-example-01.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "ridge-overlook", "path": "assets/source/skai-example-02.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "summit-rest", "path": "assets/source/skai-example-03.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "motorbike-road", "path": "assets/source/skai-example-04.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "forest-rock", "path": "assets/source/skai-example-05.jpg", "provenance": "@skaigenerated carousel" },
    { "id": "creek-log", "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 subject, face, pose, background, framing, and key details remain recognizable",
    "Soft glow, gentle blur, dot grain, and vintage film texture remain restrained and photographic",
    "The image contains only 2–5 clean handwritten captions of 1–3 words each",
    "Every caption comes from the supplied phrase list and sits on a readable background area",
    "Lettering is thin pastel white, cream, or butter yellow with only subtle sketch arrows",
    "There are no emojis, hashtags, long captions, cheesy quotes, or obviously synthetic details"
  ],
  "finalization": {
    "automaticPassRequired": true,
    "visualPassRequired": true,
    "reviewNotesRequired": true,
    "explicitApprovalFlag": "--approve-final"
  }
}
goldens.json
Open raw file ↗
{
  "purpose": "Judge source preservation, realistic soft glow, restrained blur and film grain, clean handwritten memory captions, readable placement, and natural photographic detail.",
  "examples": [
    {
      "id": "native-hero",
      "title": "Make the format readable in one glance",
      "imagePath": "assets/source/skai-hero.jpg",
      "model": "GPT Image 2 · SKAI source",
      "whyItWorks": [
        "The title and primary result explain the visual recipe immediately",
        "The subject and mountain setting remain photographic",
        "Soft texture and small handwritten notes preview the finished treatment"
      ]
    },
    {
      "id": "mountain-seat",
      "title": "Turn a summit photo into a saved memory",
      "imagePath": "assets/source/skai-example-01.jpg",
      "model": "GPT Image 2 · SKAI source",
      "whyItWorks": [
        "The source inset proves the person, pose, clothing, and location stay recognizable",
        "Glow and film softness change the mood without replacing the scene",
        "Three short captions sit in readable areas and support the photograph"
      ]
    },
    {
      "id": "ridge-overlook",
      "title": "Let a wide landscape keep its scale",
      "imagePath": "assets/source/skai-example-02.jpg",
      "model": "GPT Image 2 · SKAI source",
      "whyItWorks": [
        "The figure and ridge remain the same recognizable composition",
        "Muted grain and haze feel like a film treatment instead of a new illustration",
        "The sparse captions leave the landscape room to breathe"
      ]
    },
    {
      "id": "summit-rest",
      "title": "Keep a playful pose while softening the frame",
      "imagePath": "assets/source/skai-example-03.jpg",
      "model": "GPT Image 2 · SKAI source",
      "whyItWorks": [
        "Both people, their pose, and the open mountain background survive",
        "The light remains believable beneath a gentle vintage finish",
        "Caption placement avoids faces and the busiest parts of the image"
      ]
    },
    {
      "id": "motorbike-road",
      "title": "Make a group ride feel archival",
      "imagePath": "assets/source/skai-example-04.jpg",
      "model": "GPT Image 2 · SKAI source",
      "whyItWorks": [
        "The riders, bikes, road, and mountain geometry remain intact",
        "The softer palette carries a coherent memory-dump mood",
        "Short notes and arrows stay readable without covering the group"
      ]
    },
    {
      "id": "forest-rock",
      "title": "Give a quiet forest stop a gentle glow",
      "imagePath": "assets/source/skai-example-05.jpg",
      "model": "GPT Image 2 · SKAI source",
      "whyItWorks": [
        "The seated person and wooded trail preserve their source relationship",
        "Glow, grain, and subdued greens remain natural",
        "Two restrained captions add context without turning into a poster"
      ]
    },
    {
      "id": "creek-log",
      "title": "Keep texture alive in a darker scene",
      "imagePath": "assets/source/skai-example-06.jpg",
      "model": "GPT Image 2 · SKAI source",
      "whyItWorks": [
        "The person, log, creek, and foliage remain recognizable",
        "The vintage softness does not erase the environmental detail",
        "Small pale captions hold up against a busier forest background"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "id": "soft-glow-filter",
  "version": "1.0.0",
  "title": "Soft Glow Filter",
  "description": "Give one existing photo a realistic soft cinematic glow, gentle film texture, and a few restrained handwritten memory captions without changing the subject or scene.",
  "status": "agent-ready",
  "owner": "Wiggly Studio",
  "source": {
    "creator": "@skaigenerated",
    "postUrl": "https://www.instagram.com/skaigenerated/p/Da2XzrdCvEQ/",
    "resourceUrl": "https://docs.google.com/document/d/1r474WFlLhQfs3V1bb3l8jKr5OR9HiNJNc52xVTrjxv0/mobilebasic",
    "ctaKeyword": "AI",
    "modelShown": "GPT Image 2"
  },
  "outputs": [
    "1 inspected 3:4 realistic soft-glow memory image",
    "state.json with model and prediction provenance",
    "quality-report.json with automatic and visual inspection"
  ]
}
kit.package.json
Open raw file ↗
{
  "name": "wiggly-soft-glow-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=soft-glow-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": "soft-glow-filter",
  "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",
      "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/skai-example-01.jpg",
  "minimumOutputWidth": 640,
  "minimumOutputHeight": 800,
  "minimumOutputBytes": 51200,
  "manualReview": [
    "recognizable source subject, face, pose, background, framing, and key details",
    "soft cinematic glow with gentle blur, dot grain, and a restrained vintage film feel",
    "only 2–5 handwritten captions, each 1–3 words and selected from the supplied list",
    "readable text placement in thin pastel white, cream, or butter yellow",
    "subtle sketch arrows with no emojis, hashtags, long text, or cheesy quotes",
    "fully realistic and natural finish without obviously synthetic details"
  ]
}
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 photo at least 512px on both axes · A Replicate API token only when generation is approved

Output

One inspected 3:4 soft-glow memory image plus prediction and quality provenance