Replicate
google/nano-banana-2-lite · google/nano-banana-2 · google/nano-banana-pro · openai/gpt-image-2
Generate the approved media in this recipe.
REPLICATE_API_TOKENTurn one existing photo into an authentic late-2000s consumer-camera JPEG while preserving its subject, composition, framing, lighting, and colors.
By Wiggly Studio · Updated July 2026


Shared recipe family
CCD JPEG 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 familyBefore you start
google/nano-banana-2-lite · google/nano-banana-2 · google/nano-banana-pro · openai/gpt-image-2
Generate the approved media in this recipe.
REPLICATE_API_TOKENSetup, 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.
Included assets
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.

The exact prompt, negative prompt, GPT Image 2 label, guide, five examples, and matching before insets were gathered through the creator's Android Instagram comment and DM flow and visually checked. The reference fixture is cropped directly from the creator's before inset for the matching lakeside example; no provider generation was run.

The exact prompt, negative prompt, GPT Image 2 label, guide, five examples, and matching before insets were gathered through the creator's Android Instagram comment and DM flow and visually checked. The reference fixture is cropped directly from the creator's before inset for the matching lakeside example; no provider generation was run.

Supplied creator reference—not a new Wiggly-generated result.

Supplied creator reference—not a new Wiggly-generated result.

Supplied creator reference—not a new Wiggly-generated result.

Supplied creator reference—not a new Wiggly-generated result.
Examples
5 saved examples for this recipe—not 5 separate Repos. Each example keeps its original version and provenance.






From input to output
From the published pipeline.json. The agent follows the packaged runtime and its approval gates.
Step 01
A run pinned to the source photo, exact gathered prompt, and chosen model route.
Step 02
The image and complete provider contract checked locally.
Step 03 · approval · provider
One scene-preserving CCD JPEG-style image from the selected Replicate model.
Step 04 · approval
Automatic file checks plus an actual visual review.
Proof & quality
Judge scene preservation, dense electronic noise, realistic JPEG compression, soft consumer optics, imperfect exposure, and early-social-media authenticity against five gathered examples.
The exact prompt, negative prompt, GPT Image 2 label, guide, five examples, and matching before insets were gathered through the creator's Android Instagram comment and DM flow and visually checked. The reference fixture is cropped directly from the creator's before inset for the matching lakeside example; no provider generation was run.
Saved reference
Saved reference
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.
Open the package
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.
# Wiggly CCD JPEG Filter Format This runnable Repo preserves the exact prompt and five transformation examples gathered from @skaigenerated. It keeps the source scene intact while changing only the photographic rendering into a noisy, compressed late-2000s CCD JPEG through Replicate. Run from `v3`: ```bash npm install npm run format:skai-image -- smoke --format=ccd-jpeg-filter npm run format:skai-image -- init --format=ccd-jpeg-filter --run=my-ccd-jpeg --input=/absolute/path/to/photo.jpg npm run format:skai-image -- validate --format=ccd-jpeg-filter --run=my-ccd-jpeg npm run format:skai-image -- estimate --format=ccd-jpeg-filter --run=my-ccd-jpeg ``` Generation requires `REPLICATE_API_TOKEN` and explicit approval: ```bash npm run format:skai-image -- render --format=ccd-jpeg-filter --run=my-ccd-jpeg --approve-paid ``` View the output, record visual notes with `inspect --visual-pass --review-notes="..."`, then use `finalize --approve-final`. Model routes: - Economy: `google/nano-banana-2-lite` - Default: `google/nano-banana-2` - Premium alternative: `google/nano-banana-pro` - Source model: `openai/gpt-image-2` at its supported 2:3 portrait ratio No Replicate proof call was made while packaging this Repo. The five included source examples and guide are the proof artifacts.
--- name: wiggly-ccd-jpeg-filter description: Give one existing photo an authentic noisy, compressed late-2000s consumer-camera rendering while preserving its composition, subject, lighting, and colors using the exact gathered SKAI prompt. --- # CCD JPEG Filter Use the packaged runner and prompt. Do not call Replicate separately or create another render path. Ask one short question first: > Which photo should I give the CCD JPEG look? Use Nano Banana 2 by default, Nano Banana 2 Lite for economy, or Nano Banana Pro for the premium route. Use GPT Image 2 for the source-model route. ```bash npm run format:skai-image -- check --format=ccd-jpeg-filter npm run format:skai-image -- init --format=ccd-jpeg-filter --run=<id> --input=<absolute-image-path> npm run format:skai-image -- validate --format=ccd-jpeg-filter --run=<id> npm run format:skai-image -- estimate --format=ccd-jpeg-filter --run=<id> npm run format:skai-image -- render --format=ccd-jpeg-filter --run=<id> --approve-paid npm run format:skai-image -- inspect --format=ccd-jpeg-filter --run=<id> npm run format:skai-image -- inspect --format=ccd-jpeg-filter --run=<id> --visual-pass --review-notes="<specific observations>" npm run format:skai-image -- finalize --format=ccd-jpeg-filter --run=<id> --approve-final ``` Hard rules: - Preserve the original composition, framing, perspective, lighting, subject, and colors. - Change only the photographic rendering; do not add, remove, or restage scene content. - Require dense electronic sensor noise, realistic JPEG artifacts, reduced micro-detail, weak sharpening, and low dynamic range. - Keep the result accidental and consumer-digital, never cinematic film grain or an obvious retro overlay. - Validate before spending. - Never generate without `--approve-paid`. - Persist and resume the same prediction ID. - Never exceed three attempts. - View the actual output and record notes before `--approve-final`. - Never print, store, or commit `REPLICATE_API_TOKEN`.
{
"runtime": {
"node": ">=22",
"commands": ["npm"]
},
"providers": [
{
"name": "Replicate",
"models": [
"google/nano-banana-2-lite",
"google/nano-banana-2",
"google/nano-banana-pro",
"openai/gpt-image-2"
]
}
],
"environment": [
{
"name": "REPLICATE_API_TOKEN",
"secret": true,
"requiredFor": ["render", "resume"]
}
],
"notes": [
"All smoke and validation commands are local.",
"No Replicate proof generation was purchased for this package.",
"The gathered source examples are the visual proof.",
"Paid generation requires explicit approval and is capped at three attempts."
]
}
{
"required": [
{
"id": "photo",
"type": "image",
"formats": ["jpg", "png", "webp"],
"minimumWidth": 512,
"minimumHeight": 512,
"maximumBytes": 26214400
}
],
"question": "Which photo should I give the CCD JPEG look?",
"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"
}
}
{
"progress": "Prepare -> Validate -> Transform -> Inspect",
"attemptCap": 3,
"stages": [
{
"id": "prepare",
"output": "A run pinned to the source photo, exact gathered prompt, and chosen model route.",
"paid": false,
"approvalRequired": false
},
{
"id": "validate",
"output": "The image and complete provider contract checked locally.",
"paid": false,
"approvalRequired": false
},
{
"id": "transform",
"output": "One scene-preserving CCD JPEG-style image from the selected Replicate model.",
"paid": true,
"approvalRequired": true
},
{
"id": "inspect",
"output": "Automatic file checks plus an actual visual review.",
"paid": false,
"approvalRequired": true
}
]
}
{
"sourceReference": {
"creator": "@skaigenerated",
"postUrl": "https://www.instagram.com/p/DbQ10eICvPo/",
"resourceUrl": "https://docs.google.com/document/d/1VK39fnwcHtReiXfzf7lPN0OQLMqiW98Zz1JlTkdv66I/edit",
"guide": "assets/source/guide.pdf",
"exampleOutput": "assets/source/example-output.jpg",
"hero": "assets/source/hero-with-reference.jpg",
"referenceInput": "assets/source/reference-input.jpg",
"carouselExamples": [
"assets/source/example-output.jpg",
"assets/source/example-02.jpg",
"assets/source/example-03.jpg",
"assets/source/example-04.jpg",
"assets/source/example-05.jpg"
],
"promptPath": "prompts/transform.txt",
"verification": "The exact prompt, negative prompt, GPT Image 2 label, guide, five examples, and matching before insets were gathered through the creator's Android Instagram comment and DM flow and visually checked. The reference fixture is cropped directly from the creator's before inset for the matching lakeside example; no provider generation was run."
},
"fixture": {
"path": "assets/source/reference-input.jpg",
"purpose": "Creator-provided lakeside before inset used for local validation, hero comparison, and free smoke input only; no provider call was made."
}
}
{
"automatic": [
"Exactly 1 decodable JPG, PNG, or WebP output",
"At least 640x800 pixels",
"Aspect ratio within 0.02 of the selected route",
"At least 50 KB"
],
"visual": [
"The original composition, framing, perspective, lighting, subject, and colors remain recognizable",
"Dense fine electronic noise covers smooth surfaces and shadows without reading as cinematic film grain",
"JPEG blockiness, smearing, reduced micro-detail, and weak sharpening feel naturally accumulated",
"Crushed noisy shadows, softly clipped highlights, and imperfect automatic exposure lower the dynamic range",
"The result feels like a cheap late-2000s camera file repeatedly uploaded and reshared, not a clean modern image with a retro overlay"
],
"finalization": {
"automaticPassRequired": true,
"visualPassRequired": true,
"reviewNotesRequired": true,
"explicitApprovalFlag": "--approve-final"
}
}
{
"purpose": "Judge scene preservation, dense electronic noise, realistic JPEG compression, soft consumer optics, imperfect exposure, and early-social-media authenticity against five gathered examples.",
"examples": [
{
"id": "lakeside-speedboat",
"title": "A clean lakeside snapshot becomes a compressed archive find",
"imagePath": "assets/source/hero-with-reference.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The person, boat interior, lake, mountain, and background speedboat remain in the same composition",
"Dense sensor noise, cyan contamination, crushed shadows, and soft detail feel native to an old CCD camera"
]
},
{
"id": "red-car-night",
"title": "Night flash keeps the pose and car while degrading the file",
"imagePath": "assets/source/example-02.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The subject, black outfit, red car, and parking-lot framing remain unchanged",
"Highlight clipping, hard flash, chroma noise, and JPEG smearing create believable cheap-camera rendering"
]
},
{
"id": "phone-booth",
"title": "A phone-booth portrait gets true early-social compression",
"imagePath": "assets/source/example-03.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The phone, suit, booth, graffiti, and original framing remain recognizable",
"Texture smearing and noisy shadows degrade the image without turning into film grain"
]
},
{
"id": "parking-lot-lighter",
"title": "A simple flash portrait feels downloaded and reshared",
"imagePath": "assets/source/example-04.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The lighter, jacket, jewelry, subject, and open parking lot stay fixed",
"Underexposed midtones, electronic grain, and weak sharpening feel accidental rather than stylized"
]
},
{
"id": "airport-flowers",
"title": "A daylight airport photo still reads through heavy compression",
"imagePath": "assets/source/example-05.jpg",
"model": "GPT Image 2",
"whyItWorks": [
"The flowers, cap, clothing, airplane, and tarmac framing remain intact",
"Compression artifacts, soft optics, and noisy low-range exposure create an archived-internet finish"
]
}
]
}
{
"id": "ccd-jpeg-filter",
"version": "1.0.0",
"title": "CCD JPEG Filter",
"description": "Turn one existing photo into an authentically noisy, compressed late-2000s consumer-camera image while preserving the original scene.",
"status": "agent-ready",
"owner": "Wiggly Studio",
"source": {
"creator": "@skaigenerated",
"postUrl": "https://www.instagram.com/p/DbQ10eICvPo/",
"resourceUrl": "https://docs.google.com/document/d/1VK39fnwcHtReiXfzf7lPN0OQLMqiW98Zz1JlTkdv66I/edit",
"ctaKeyword": "AI",
"modelShown": "GPT Image 2"
},
"outputs": [
"1 authentic CCD JPEG-style image",
"state.json with model and prediction provenance",
"quality-report.json with automatic and visual inspection"
]
}
{
"name": "wiggly-ccd-jpeg-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=ccd-jpeg-filter && node kit-smoke.mjs"
},
"dependencies": {
"image-size": "2.0.2",
"replicate": "1.4.0",
"tsx": "4.20.6"
}
}
{
"slug": "ccd-jpeg-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",
"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"
},
"gpt-image-2": {
"label": "GPT Image 2",
"lane": "source model",
"model": "openai/gpt-image-2",
"family": "gpt-image",
"aspectRatio": "2:3",
"outputFormat": "jpeg",
"quality": "medium",
"costEstimate": "current Replicate GPT Image 2 rate",
"timeEstimate": "usually 20-120 seconds"
}
},
"expectedOutputs": 1,
"maximumAttempts": 3,
"smokeInputPath": "assets/source/reference-input.jpg",
"smokeExamplePath": "assets/source/example-output.jpg",
"minimumOutputWidth": 640,
"minimumOutputHeight": 800,
"minimumOutputBytes": 51200,
"manualReview": [
"preserved composition, subject, lighting, and colors",
"dense fine electronic sensor noise rather than cinematic film grain",
"realistic JPEG artifacts and reduced micro-detail",
"low dynamic range with noisy shadows and soft highlight clipping",
"authentic accidental late-2000s consumer-camera rendering"
]
}
Run it with a coding agent
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
One Replicate image charge and usually 2-4 min
You provide
One JPEG, PNG, or WebP photo at least 512px on both axes · A Replicate API token only when generation is approved
Output
One inspected CCD JPEG image plus prediction and quality provenance