
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
Wiggly / Format Lab /
Turn one portrait into a centered, sculptural silhouette with a white-to-gray halo and fine rim light catching the hair.
One source image in. 1 inspected image out.
Judge identity preservation, centered portrait geometry, a clean white-to-gray halo, deep sculptural shadow, fine hair rim light, and photographic realism.







Exact gathered prompt
Front-facing chest-up portrait of the subject from the reference image, maintaining exact identity. The pose is relaxed yet upright with a slight head tilt, centered in perfect symmetry. The background features a clean white-to-gray gradient creating a subtle halo glow. Lighting is minimal and high-contrast, with a strong backlight forming a deep silhouette. Fine hair strands catch soft rim light, adding texture, while clothing remains barely visible. The look is cinematic, sculptural, and mysterious.
Source: @skaigenerated · model shown: Nano Banana Pro
Prepare -> Validate -> Transform -> Inspect
One run pinned to the portrait, exact gathered prompt, and selected model route.
The portrait and prompt contract checked locally.
One rim-lit portrait from one approved prediction.
Explicit approval required
Automatic file checks plus an actual visual review.
Explicit approval required
SKILL.md--- 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{
"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{
"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{
"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
}
]
}
prompts/transform.txtFront-facing chest-up portrait of the subject from the reference image, maintaining exact identity. The pose is relaxed yet upright with a slight head tilt, centered in perfect symmetry. The background features a clean white-to-gray gradient creating a subtle halo glow. Lighting is minimal and high-contrast, with a strong backlight forming a deep silhouette. Fine hair strands catch soft rim light, adding texture, while clothing remains barely visible. The look is cinematic, sculptural, and mysterious.
quality.json{
"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"
}
}