Curated Formatv1.0.0

Cinematic Photographer

Create a moody, tactile editorial portrait built around a vintage camera.

By Wiggly Studio · Updated July 2026

Editorial portrait: The camera becomes part of the characterReference for The camera becomes part of the character

Shared recipe family

One family. 31 recipes.

Cinematic Photographer 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 · 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 proof generation was purchased for this package.
  • The gathered source example is 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 1 viewable asset reference below. Reference media teaches the recipe; it is not a new result for your input.

Creator example output

Creator example output

Prompt and image extracted from the downloaded Google Doc and visually checked against the rendered guide. The style reference is a second finished example from the source Instagram carousel; this text-to-image recipe has no original input photo.

What stays consistent

  • The vintage rangefinder camera
  • Moody low-key lighting
  • Shallow editorial focus
  • Warm skin and tactile film grain

What you bring

  • Use the packaged concept as-is, or describe a subject variation
  • A Replicate API token only when generation is approved
Read the included contracts and asset inventory ↓

Examples

Examples & references.

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

Editorial portrait: The camera becomes part of the characterReference for The camera becomes part of the character

Example 01 · Editorial portrait

The camera becomes part of the character

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 exact gathered prompt and chosen model route.

  2. Step 02

    Validate

    Prompt, output contract, and provider route checked locally.

  3. Step 03 · approval · provider

    Generate

    One portrait 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 cinematic realism, camera anatomy, lighting, shallow focus, and film texture against the gathered source example.

Prompt and image extracted from the downloaded Google Doc and visually checked against the rendered guide. The style reference is a second finished example from the source Instagram carousel; this text-to-image recipe has no original input photo.

Saved reference

Cinematic photographer source proof

  • The camera and face share crisp priority
  • Low-key light still preserves warm skin detail
  • The background stays minimal and cinematic
  • Film grain supports the editorial finish

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
  • Exactly one decodable image
  • At least 640x800
  • At least 50 KB
  • Aspect ratio matches the chosen model route
  • SHA-256 provenance is recorded
Manual Review · 5 checks
  • Face, eyes, fingers, and camera geometry are coherent
  • The portrait reads as a real editorial photograph
  • Lighting is moody and low-key without losing the face
  • The subject and camera stay sharply prioritized
  • Film grain adds texture without destroying detail
Finalization Gate · 4 checks
  • Automatic checks pass
  • The actual image is viewed
  • Specific visual notes are recorded
  • --approve-final is present

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 Cinematic Photographer Format

This runnable Repo preserves the exact prompt and source example gathered from @skaigenerated. It generates one moody editorial portrait through Replicate and refuses to finalize an uninspected image.

Run from `v3`:

```bash
npm install
npm run format:skai-image -- smoke --format=cinematic-photographer
npm run format:skai-image -- init --format=cinematic-photographer --run=my-portrait
npm run format:skai-image -- validate --format=cinematic-photographer --run=my-portrait
npm run format:skai-image -- estimate --format=cinematic-photographer --run=my-portrait
```

Generation requires `REPLICATE_API_TOKEN` and explicit approval:

```bash
npm run format:skai-image -- render --format=cinematic-photographer --run=my-portrait --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 4:5: `google/nano-banana-2`
- Source model: `openai/gpt-image-2` at its supported 2:3 portrait ratio

No Replicate proof call was made while packaging this Repo. The included source output and guide are the proof artifacts.
SKILL.md
Open raw file ↗
---
name: wiggly-cinematic-photographer
description: Create one moody editorial photographer portrait from the exact gathered SKAI prompt.
---

# Cinematic Photographer

Use the packaged runner and prompt. Do not call Replicate separately or create another render path.

Ask one short question first:

> Should I use the exact packaged photographer concept, or do you want to change the subject while keeping the cinematic recipe?

Use Nano Banana 2 by default, Nano Banana 2 Lite for economy, or GPT Image 2 when the user asks for the source model. The exact source prompt is the validated default.

```bash
npm run format:skai-image -- check --format=cinematic-photographer
npm run format:skai-image -- init --format=cinematic-photographer --run=<id>
npm run format:skai-image -- validate --format=cinematic-photographer --run=<id>
npm run format:skai-image -- estimate --format=cinematic-photographer --run=<id>
npm run format:skai-image -- render --format=cinematic-photographer --run=<id> --approve-paid
npm run format:skai-image -- inspect --format=cinematic-photographer --run=<id>
npm run format:skai-image -- inspect --format=cinematic-photographer --run=<id> --visual-pass --review-notes="<specific observations>"
npm run format:skai-image -- finalize --format=cinematic-photographer --run=<id> --approve-final
```

Hard rules:

- Keep the packaged prompt exact unless the user explicitly asks to change the subject.
- 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",
        "openai/gpt-image-2"
      ]
    }
  ],
  "environment": [
    {
      "name": "REPLICATE_API_TOKEN",
      "secret": true,
      "requiredFor": [
        "render",
        "resume"
      ]
    }
  ],
  "notes": [
    "All smoke and validation commands are local.",
    "No proof generation was purchased for this package.",
    "The gathered source example is the visual proof.",
    "Paid generation requires explicit approval and is capped at three attempts."
  ]
}
inputs.json
Open raw file ↗
{
  "required": [],
  "question": "Should I use the exact packaged photographer concept, or do you want to change the subject while keeping the cinematic recipe?",
  "defaults": {
    "concept": "exact packaged prompt",
    "model": "nano-banana-2",
    "aspectRatio": "4:5",
    "outputCount": 1
  },
  "modelRoutes": {
    "economy": "google/nano-banana-2-lite",
    "default": "google/nano-banana-2",
    "sourceModel": "openai/gpt-image-2"
  }
}
pipeline.json
Open raw file ↗
{
  "progress": "Prepare -> Validate -> Generate -> Inspect",
  "attemptCap": 3,
  "stages": [
    {
      "id": "prepare",
      "output": "A run pinned to the exact gathered prompt and chosen model route.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "validate",
      "output": "Prompt, output contract, and provider route checked locally.",
      "paid": false,
      "approvalRequired": false
    },
    {
      "id": "generate",
      "output": "One portrait 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/DbWAcxjDJYc/",
    "resourceUrl": "https://docs.google.com/document/d/1_78s28UMB0Qz4DT7Xpm_EpFNClUKw0oZzkJqc1vZv-4/edit",
    "guide": "assets/source/guide.pdf",
    "exampleOutput": "assets/source/example-output.png",
    "styleReference": "assets/source/style-reference.jpg",
    "promptPath": "prompts/transform.txt",
    "verification": "Prompt and image extracted from the downloaded Google Doc and visually checked against the rendered guide. The style reference is a second finished example from the source Instagram carousel; this text-to-image recipe has no original input photo."
  }
}
quality.json
Open raw file ↗
{
  "automatic": [
    "Exactly one decodable image",
    "At least 640x800",
    "At least 50 KB",
    "Aspect ratio matches the chosen model route",
    "SHA-256 provenance is recorded"
  ],
  "manualReview": [
    "Face, eyes, fingers, and camera geometry are coherent",
    "The portrait reads as a real editorial photograph",
    "Lighting is moody and low-key without losing the face",
    "The subject and camera stay sharply prioritized",
    "Film grain adds texture without destroying detail"
  ],
  "finalizationGate": [
    "Automatic checks pass",
    "The actual image is viewed",
    "Specific visual notes are recorded",
    "--approve-final is present"
  ]
}
goldens.json
Open raw file ↗
{
  "purpose": "Judge cinematic realism, camera anatomy, lighting, shallow focus, and film texture against the gathered source example.",
  "examples": [
    {
      "id": "skai-cinematic-photographer",
      "type": "source-reference",
      "title": "Cinematic photographer source proof",
      "imagePath": "assets/source/example-output.png",
      "styleReferencePath": "assets/source/style-reference.jpg",
      "guidePath": "assets/source/guide.pdf",
      "sourceUrl": "https://www.instagram.com/p/DbWAcxjDJYc/",
      "model": "GPT Image 2",
      "whyItWorks": [
        "The camera and face share crisp priority",
        "Low-key light still preserves warm skin detail",
        "The background stays minimal and cinematic",
        "Film grain supports the editorial finish"
      ]
    }
  ]
}
format.json
Open raw file ↗
{
  "id": "cinematic-photographer",
  "version": "1.0.0",
  "title": "Cinematic Photographer",
  "description": "Create a moody editorial portrait of a photographer with tactile film detail.",
  "status": "agent-ready",
  "owner": "Wiggly Studio",
  "source": {
    "creator": "@skaigenerated",
    "postUrl": "https://www.instagram.com/p/DbWAcxjDJYc/",
    "resourceUrl": "https://docs.google.com/document/d/1_78s28UMB0Qz4DT7Xpm_EpFNClUKw0oZzkJqc1vZv-4/edit",
    "ctaKeyword": "AI",
    "modelShown": "GPT Image 2"
  },
  "outputs": [
    "1 portrait image",
    "state.json with model and prediction provenance",
    "quality-report.json with automatic and visual inspection"
  ]
}
kit.package.json
Open raw file ↗
{
  "name": "wiggly-cinematic-photographer-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 && node kit-smoke.mjs"
  },
  "dependencies": {
    "image-size": "2.0.2",
    "replicate": "1.4.0",
    "tsx": "4.20.6"
  }
}
runtime.json
Open raw file ↗
{
  "slug": "cinematic-photographer",
  "version": "1.0.0",
  "promptPath": "prompts/transform.txt",
  "input": {
    "mode": "none"
  },
  "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": "4:5",
      "outputFormat": "jpg"
    },
    "nano-banana-2": {
      "label": "Nano Banana 2",
      "lane": "default",
      "model": "google/nano-banana-2",
      "family": "nano-banana",
      "aspectRatio": "4:5",
      "outputFormat": "jpg",
      "resolution": "1K"
    },
    "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"
    }
  },
  "expectedOutputs": 1,
  "maximumAttempts": 3,
  "smokeExamplePath": "assets/source/example-output.png",
  "minimumOutputWidth": 640,
  "minimumOutputHeight": 800,
  "minimumOutputBytes": 51200,
  "manualReview": [
    "face and camera anatomy",
    "moody low-key lighting",
    "shallow depth of field",
    "editorial realism",
    "film grain without muddy detail"
  ]
}
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 portraitCurrent Replicate model rate · usually under 2 min
Inspect + finalizeFree · about 1 min

One Replicate image charge and usually 2-4 min

You provide

Use the packaged concept as-is, or describe a subject variation · A Replicate API token only when generation is approved

Output

One inspected portrait image plus prediction and quality provenance