# comply.gg

A satirical government "wellness platform" brand campaign. The humor lives entirely
in the production value — it looks like a $2M sincerity-maxxing brand film, and
everything described as a *benefit* is quietly a horror.

Live at **k8r.food/comply.gg/** (served from this directory by nginx).

---

## What's in here

| File | What it is |
|---|---|
| `CONCEPT.md` | The creative bible — tone, brand world, the Score, the benefits, the citizens, visual treatment. Read this first. |
| `SCRIPT.md` | The 90s master spot (full shot list) + social cutdowns + b-roll bank + VO direction. |
| `scenes.json` | Machine-readable scene list. Source of truth for the render pipeline. Edit prompts here. |
| `render.mjs` | The pipeline. Generates stills (gpt-image-1) + animates them (302.ai Ark) into `assets/`. |
| `index.html` | The brand landing page. |
| `watch.html` | The film room — plays the master cut + cutdowns once rendered. |
| `assets/style.css` | The brand system (mint / cream / plum). |
| `assets/app.js` | The calm interaction layer (harmony log, enroll modal, score checker, reassurance tones, behavioral nudges). |
| `assets/testimonials.js` | Citizen testimonial data. |
| `assets/watch.js` | Film-room playlist logic. |
| `assets/manifest.json` | Written by `render.mjs`. The site reads this to fill imagery/video. |

---

## Running the render pipeline

No secrets live in this repo. The pipeline reads the **same** `settings.json` the
monster-arena project uses (it has the 302.ai key):

```bash
# from this directory
node render.mjs --dry                 # see the plan, spend nothing
node render.mjs --still-only          # cheap: just the stills (gpt-image-1)
node render.mjs --only tamika,linda   # render specific scenes (still + video)
node render.mjs                       # everything, still + video
```

Flags:
- `--only a,b,c` — limit to specific scene ids
- `--still-only` — skip video (image gen only)
- `--video-only` — only animate (stills must already exist)
- `--force` — re-render even if output exists
- `--dry` — print the plan and exit
- `--settings /path/to/settings.json` — override the settings file

Outputs:
- `assets/img/<id>.png` — the stills
- `assets/vid/<id>.mp4` — the clips
- `assets/manifest.json` — the index the site reads

The pipeline is **resumable** — existing files are skipped (use `--force` to redo).
Video renders take minutes each and cost real money; `--still-only` first is the
sane way to iterate on the look.

### How it works
1. **Still:** `POST api.302.ai/v1/images/generations` with `gpt-image-1` → base64 → save PNG.
2. **Reference:** the still is already public at `k8r.food/comply.gg/assets/img/<id>.png` — the pipeline hands that URL to 302.ai.
3. **Video:** `POST api.302.ai/volcengine/api/v3/contents/generations/tasks` (Ark reference-to-video) with the still as a `reference_image` → poll → download MP4.

This mirrors the working patterns in `monster-arena/monster-arena-v2/server/video302Service.js`.

---

## Editing the campaign

- **Change the look:** edit the `stylePrefix` / `styleSuffix` in `scenes.json` (applies to every still).
- **Change motion:** edit `motionPrefix` (applies to every clip) or per-scene `videoPrompt`.
- **Add a scene:** append to `scenes.still[]` in `scenes.json` and add a card in `assets/testimonials.js` if it's a citizen.
- **Change copy:** `index.html` / `SCRIPT.md` / `CONCEPT.md`.

---

## The bit, in one line

> comply.gg — **Because you were going to anyway.**
