Curated Formatv1.0.0

CCD JPEG Filter

Turn 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

Archived lake night: Turn a clean snapshot into a believable CCD JPEGReference for Turn a clean snapshot into a believable CCD JPEG

Shared recipe family

One family. 31 recipes.

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 family

Before you start

Services & costs

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_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.
  • 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.

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.

Creator example output

Creator example output

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.

Creator reference input

Creator reference 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.

Creator reference 2

Creator reference 2

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

Creator reference 3

Creator reference 3

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

Creator reference 4

Creator reference 4

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

Creator reference 5

Creator reference 5

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

What stays consistent

  • The original subject and recognizable identity
  • The composition, framing, and perspective
  • The scene lighting and objects
  • The source image's natural colors

What you bring

  • One 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.

5 saved examples for this recipe—not 5 separate Repos. Each example keeps its original version and provenance.

Archived lake night: Turn a clean snapshot into a believable CCD JPEGReference for Turn a clean snapshot into a believable CCD JPEG

Example 01 · Archived lake night

Turn a clean snapshot into a believable CCD JPEG

Open finished ad
Direct-flash nightlife: Keep the pose. Break the modern polish.

Example 02 · Direct-flash nightlife

Keep the pose. Break the modern polish.

Open finished ad
Phone-booth portrait: Make compression part of the memory

Example 03 · Phone-booth portrait

Make compression part of the memory

Open finished ad
Parking-lot flash: Underexpose it like a cheap automatic camera

Example 04 · Parking-lot flash

Underexpose it like a cheap automatic camera

Open finished ad
Airport snapshot: Daylight can still feel downloaded and reshared

Example 05 · Airport snapshot

Daylight can still feel downloaded and reshared

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

    A run pinned to the source photo, exact gathered prompt, and chosen model route.

  2. Step 02

    Validate

    The image and complete provider contract checked locally.

  3. Step 03 · approval · provider

    Transform

    One scene-preserving CCD JPEG-style image from the selected Replicate model.

  4. Step 04 · approval

    Inspect

    Automatic file checks plus an actual visual review.

Proof & quality

What a good result looks like.

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

A clean lakeside snapshot becomes a compressed archive find

  • 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

Saved reference

Night flash keeps the pose and car while degrading the file

  • 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

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, PNG, or WebP output
  • At least 640x800 pixels
  • Aspect ratio within 0.02 of the selected route
  • At least 50 KB
Visual · 5 checks
  • 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 · 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 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.
SKILL.md
Open raw file ↗
---
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`.
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",
        "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."
  ]
}
inputs.json
Open raw file ↗
{
  "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"
  }
}
pipeline.json
Open raw file ↗
{
  "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
    }
  ]
}
assets.json
Open raw file ↗
{
  "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."
  }
}
quality.json
Open raw file ↗
{
  "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"
  }
}
goldens.json
Open raw file ↗
{
  "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"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "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"
  ]
}
kit.package.json
Open raw file ↗
{
  "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"
  }
}
runtime.json
Open raw file ↗
{
  "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"
  ]
}
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 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