

Full-body pose proof
- Identity and seated pose remain recognizable
- Visible hands, tattoos, watch, and clothing survive
- The silhouette has cinematic 3D volume
- It passed automatic and recorded visual inspection
Wiggly / Format Lab /
Turn one portrait into a realistic, cinematic Fortnite-style 3D character image.
One portrait in. One inspected 3:4 JPG out.
Compare resemblance, pose retention, cinematic 3D styling, and output consistency across distinct portraits.





Gathered source
Transform the exact photo into a Fortnite-style character with a realistic, cinematic 3D look. Keep the subject's pose, expression, and features, reinterpreting them with stylized Fortnite proportions: a clean silhouette, detailed hands and face, voluminous yet polished hair, and slightly glossy materials. The clothing should feature realistic textures but a Fortnite-inspired design. Use warm lighting with the game's signature golden rim light, soft shadows, and realistic depth of field. Add soft airborne particles (dust/light) to enhance the atmosphere. Avoid a flat cartoon style; prioritize volume, AAA-quality textures, and a photographic look.
Source guide: @skaigenerated · model shown: Nano Banana Pro
Prepare -> Validate -> Transform -> Inspect
A local run with one copied input image and selected model route.
Decoded dimensions, type, byte size, and SHA-256 stored before spending.
One 3:4 JPG from the selected official Replicate model.
Explicit approval required
Automatic media checks plus a recorded visual review.
Explicit approval required
SKILL.md--- name: wiggly-fortnite-filter description: Turn one portrait into a realistic cinematic Fortnite-style 3D character image through Replicate. --- # Fortnite Filter Use the official runner. Do not call Replicate separately, rewrite the prompt, or create a second render path. ## Conversation Ask one short question at a time. Start with: > Which photo should I turn into a Fortnite-style character? Use Nano Banana 2 by default. Offer Nano Banana 2 Lite when the user wants the lowest price, or Nano Banana Pro when they explicitly want the source guide's premium model. ## Workflow 1. Run `npm run format:fortnite-filter -- check --format=fortnite-filter`. 2. Initialize a run with one image. 3. Validate locally. 4. Show the model route and estimate. 5. Only run the paid transform with explicit user approval. 6. If polling is interrupted, use `resume`; never create a duplicate prediction. 7. Inspect the actual output with an image-viewing tool. 8. Record specific review notes and finalize only after the image passes. ```bash npm run format:fortnite-filter -- init --format=fortnite-filter --run=<id> --input=<path> npm run format:fortnite-filter -- validate --format=fortnite-filter --run=<id> npm run format:fortnite-filter -- estimate --format=fortnite-filter --run=<id> npm run format:fortnite-filter -- render --format=fortnite-filter --run=<id> --approve-paid npm run format:fortnite-filter -- inspect --format=fortnite-filter --run=<id> npm run format:fortnite-filter -- inspect --format=fortnite-filter --run=<id> --visual-pass --review-notes="<specific observations>" npm run format:fortnite-filter -- finalize --format=fortnite-filter --run=<id> --approve-final ``` Select another route during `init`: ```bash --model=nano-banana-2-lite --model=nano-banana-pro ``` ## Hard rules - Exactly one input image and one final image per run. - Keep the packaged prompt exact. - Validate before any paid call. - Require `--approve-paid`. - Persist and resume the same Replicate prediction ID. - Never exceed three paid attempts in one run. - Save the provider output locally immediately. - Require automatic checks, visual review, notes, and `--approve-final`. - Never print, store, or commit `REPLICATE_API_TOKEN`.
requirements.json{
"runtime": {
"node": ">=22",
"commands": [
"npm"
]
},
"providers": [
{
"name": "Replicate",
"purpose": "Run the selected official Google Nano Banana image model.",
"models": [
"google/nano-banana-2-lite",
"google/nano-banana-2",
"google/nano-banana-pro"
]
}
],
"environment": [
{
"name": "REPLICATE_API_TOKEN",
"requiredFor": [
"render",
"resume"
],
"secret": true
}
],
"notes": [
"check, init, validate, estimate, inspect, finalize, and smoke are local.",
"render makes exactly one Replicate prediction per attempt after --approve-paid.",
"The runner persists the prediction ID before polling and can resume the same job.",
"Maximum paid attempts per run: 3."
]
}
inputs.json{
"required": [
{
"id": "portrait",
"type": "image",
"count": 1,
"formats": [
"jpg",
"png",
"webp"
],
"minimumWidth": 512,
"minimumHeight": 512,
"maximumBytes": 26214400,
"question": "Which photo should I turn into a Fortnite-style character?"
}
],
"defaults": {
"model": "nano-banana-2",
"aspectRatio": "3:4",
"outputFormat": "jpg",
"resolution": "1K"
},
"modelRoutes": {
"economy": "google/nano-banana-2-lite",
"default": "google/nano-banana-2",
"premium": "google/nano-banana-pro"
}
}
pipeline.json{
"progress": "Prepare -> Validate -> Transform -> Inspect",
"attemptCap": 3,
"stages": [
{
"id": "prepare",
"output": "A local run with one copied input image and selected model route.",
"paid": false,
"approvalRequired": false
},
{
"id": "validate",
"output": "Decoded dimensions, type, byte size, and SHA-256 stored before spending.",
"paid": false,
"approvalRequired": false
},
{
"id": "transform",
"output": "One 3:4 JPG from the selected official Replicate model.",
"paid": true,
"approvalRequired": true
},
{
"id": "inspect",
"output": "Automatic media checks plus a recorded visual review.",
"paid": false,
"approvalRequired": true
}
]
}
prompts/transform.txtTransform the exact photo into a Fortnite-style character with a realistic, cinematic 3D look. Keep the subject's pose, expression, and features, reinterpreting them with stylized Fortnite proportions: a clean silhouette, detailed hands and face, voluminous yet polished hair, and slightly glossy materials. The clothing should feature realistic textures but a Fortnite-inspired design. Use warm lighting with the game's signature golden rim light, soft shadows, and realistic depth of field. Add soft airborne particles (dust/light) to enhance the atmosphere. Avoid a flat cartoon style; prioritize volume, AAA-quality textures, and a photographic look.
quality.json{
"automatic": [
"The output decodes as JPEG or PNG",
"The output is at least 768x1024",
"The output aspect ratio is 3:4 within 0.015",
"The output is at least 50 KB",
"The output SHA-256 is recorded"
],
"manualReview": [
"The subject remains recognizably the same person",
"The original pose and expression are preserved",
"Face, eyes, hands, and fingers do not contain obvious artifacts",
"The silhouette and hair read clearly",
"The result has cinematic 3D volume rather than a flat cartoon look",
"Warm rim light, soft shadows, depth of field, and subtle particles support the look",
"No accidental text, watermarks, duplicate limbs, or broken clothing"
],
"finalizationGate": [
"All automatic checks pass",
"A human or viewing agent inspected the actual output",
"Review notes are stored",
"The --approve-final flag is present"
],
"reject": [
"The subject is no longer recognizable",
"The pose or expression changes substantially",
"Visible face, hand, limb, or clothing artifacts",
"Flat 2D cartoon treatment",
"Malformed, undersized, or wrong-aspect output"
]
}
proofs.json{
"generatedAt": "2026-07-29",
"provider": "Replicate",
"promptPath": "prompts/transform.txt",
"proofs": [
{
"id": "proof-seated-man",
"inputPath": "fixtures/trevor-chris-hutchinson-man.jpg",
"outputPath": "goldens/nano-banana-2-seated-man.jpg",
"qualityReportPath": "goldens/nano-banana-2-seated-man.quality.json",
"model": "google/nano-banana-2",
"predictionId": "9v21s663tdrmr0cznh9rh31qc0",
"attemptsUsed": 1,
"status": "finalized",
"sha256": "ce90f7f01df202cc29a0ef3c9fc6d571ee53acb15e4e70f28911feb914bba49d"
},
{
"id": "proof-sunset-woman",
"inputPath": "fixtures/rao-qingwei-woman.jpg",
"outputPath": "goldens/nano-banana-2-lite-sunset-woman.jpg",
"qualityReportPath": "goldens/nano-banana-2-lite-sunset-woman.quality.json",
"model": "google/nano-banana-2-lite",
"predictionId": "zkwhk22bvhrmr0cznha91n4aa4",
"attemptsUsed": 1,
"status": "finalized",
"sha256": "8f1939f82f113f062ec288a574259e10cbdb1bf090d8680f8017214f4afb80db"
}
]
}