# Art plan - THE LIVERAMP CRYPTS

> **Production model: FLUX Schnell (`fal-ai/flux/schnell`) for boss / monster portraits.** 2 head-to-head tests confirmed FLUX wins on D&D rulebook character art: the "many eyes" and "four arms" details that nano-banana 2 normalizes away, FLUX renders. Caveat: FLUX literalizes weird prompts in uncanny ways (fused head+tablets in one test). When that happens, fall back to nano-banana 2 (`fal-ai/nano-banana-2`). For environment/background art with text or specific compositional rules, prefer nano-banana 2 by default. See [`../../ART-VALIDATION-WORKFLOW.md`](../../ART-VALIDATION-WORKFLOW.md).

V1 ships with CSS-drawn placeholder portraits and a parchment-textured background, so the variant runs with zero API keys. This file is the recipe for swapping in real fantasy art when keys are available.

## Recommended API: fal.ai (FLUX-based)

Picked fal.ai for:

- **Quality**: hosts FLUX and SDXL pipelines that handle "fantasy painting, parchment, D&D style" prompts well without LoRA fiddling.
- **Cost**: ~$0.01-0.05 per image on the standard endpoints. 25 images per full art pack is roughly $0.25-$1.25.
- **Simple HTTP**: a single POST with prompt + image dims returns either an image URL or base64. No model hosting, no GPU rental.
- **One vendor**: keeps the regen script and credentials surface area small.

Alternatives considered: Replicate (similar pricing, more model sprawl), Recraft (excellent for illustration, no in-house fantasy LoRA reputation), Stability AI direct (cheaper per call but rougher API ergonomics). fal.ai wins on developer ergonomics for this scope.

## Style guide (applies to every prompt)

Append this to every prompt as the trailing style block so the pack feels cohesive:

> oil painting, dramatic chiaroscuro, parchment-aged palette, muted golds and deep browns, hand-painted D&D rulebook illustration, no text, no watermark, no border, centered subject

Suggested negative prompt:

> text, watermark, signature, ui, hud, blurry, modern clothing, photo, anime, low quality, deformed hands

## Asset list

All images go in `assets/img/`. The placeholder pipeline reads these paths if present and falls back to CSS art if missing. Recommend 768x768 for portraits, 1536x768 for banners.

### Title banner (1 image)

- **Path**: `assets/img/title-banner.png`
- **Dims**: 1536x512
- **Prompt**: `A vast subterranean crypt entrance hewn from black stone, torchlight, seven descending arches numbered I through VII fading into darkness, a heavy iron-bound door at the threshold, the words "THE LIVERAMP CRYPTS" carved in serif Roman capitals on a stone lintel`

### Dungeon level backgrounds (7 images, one per week)

- **Path**: `assets/img/level-{1..7}-bg.png`
- **Dims**: 1536x768
- **Prompts**:
  - W1 `assets/img/level-1-bg.png`: `Candlelit underground temple lined with floating scrolls, a stone altar at the center inscribed with the words "PREDICT, DO NOT RECALL," wisps of golden text drifting in the air`
  - W2 `assets/img/level-2-bg.png`: `An endless library carved into rough stone, shelves climbing into shadow, books bound in cracked leather, scattered loose pages curling on the floor, a single librarian's lectern lit by green flame`
  - W3 `assets/img/level-3-bg.png`: `A dwarven foundry deep in the crypts, anvils stamping rune-engraved tablets reading "CLAUDE.md," sparks raining over a half-built cathedral of code`
  - W4 `assets/img/level-4-bg.png`: `A circular warding chamber, three glowing runes (one silver for private data, one purple for untrusted content, one crimson for external comms) burning at the points of a triangle on the floor, smoke curling toward an iron grate`
  - W5 `assets/img/level-5-bg.png`: `A guild hall hung with banners of different orders, several robed figures arguing over a great round table strewn with maps and tool icons, one figure pointing decisively at a single map`
  - W6 `assets/img/level-6-bg.png`: `A marble courtroom carved underground, twelve judges' chairs raised on a dais, a single scroll spread on the central podium, gavels of obsidian glinting in cold blue light`
  - W7 `assets/img/level-7-bg.png`: `A sunlit overworld vista seen through the cracked ceiling of the final crypt, banners with OKR sigils flapping in the wind, a path winding away into farmland and merchant towns`

### Monster portraits (9 reusable, 3x3 difficulty x type)

All `assets/img/monster-{slug}.png`, 768x768.

| slug                       | prompt                                                                                                                                                |
|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| `goblin-scribe`            | A small green goblin in tattered scholar robes, clutching a half-written scroll and a dripping quill, candlelit, mischievous expression               |
| `slime-archivist`          | A translucent green slime wearing tiny spectacles, sitting atop a tower of leather-bound index cards, ink dripping from its surface                   |
| `imp-apprentice`           | A small red-skinned imp juggling three glowing scenario-orbs, candle-lit, eager and chaotic                                                           |
| `kobold-loremaster`        | A wiry kobold in a moth-eaten librarian's robe, thumbing through a crumbling glossary, dim green torchlight                                           |
| `owlbear-cataloger`        | An owlbear with reading glasses, arranging four numbered relics on a stone slab, study-room background                                                |
| `shade-tinker`             | A shadowy hooded figure mid-craft, mending a broken mechanical trap in midair, sparks of dim blue light                                               |
| `wraith-of-definitions`    | A pale, half-transparent wraith drifting through stone walls, mouthing silent words, faint pale-blue aura                                             |
| `doppelganger`             | A featureless humanoid wearing three overlapping faces, each face one of a set of plausible options, eerie candlelight                                |
| `stone-golem`              | A hulking stone golem with runic carvings, holding a giant slab inscribed with a scenario, dust falling from its joints                               |

### Boss portraits (7, one per week)

All `assets/img/boss-{slug}.png`, 768x768.

| slug                  | prompt                                                                                                                                                |
|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| `boss-omniseer`       | A many-eyed celestial seer wreathed in scrolls, each eye showing a different next token, golden light, throne of vellum                               |
| `boss-librarian`      | A towering curator with a thousand scrolls braided into its robe, holding an empty thimble in one hand and a brimming chalice in the other           |
| `boss-architect`      | A four-armed architect in mason's leather, lifting a layered "cake" of stone tablets each labelled with a CLAUDE.md tier, blueprint scattered around |
| `boss-lich`           | A skeletal lich with three runes burning on its chest (silver, purple, crimson), wreathed in black salt and cold light                                |
| `boss-agent-king`     | A crowned figure in heavy robes, surrounded by tool icons orbiting like satellites, one hand on a compass, the other on a leash trailing into mist   |
| `boss-judge`          | A black-robed judge with a featureless white mask, gavel of obsidian raised, rubric scroll unrolling endlessly off the bench                          |
| `boss-executive`      | A pale executive in a tailored merchant's coat, holding a scroll of pilots in one hand and a balanced scale in the other, sunlit doorway behind      |

## Integration

The renderer assigns a CSS class `monster-<slug>` to the portrait div. To replace placeholder CSS with a real PNG, add this rule per slug to `assets/css/crypt.css`:

```css
.monster-goblin-scribe {
  background:
    url("../img/monster-goblin-scribe.png") center / cover no-repeat,
    #2a1d0a;
}
.monster-goblin-scribe::before,
.monster-goblin-scribe::after { display: none; }
```

(Or batch it: one wrapping selector that hides `::before` and `::after` plus per-slug `background-image`.) When all assets are present, the CSS-drawn placeholder hides itself.

## API keys needed

| Env var          | Service | Where to obtain                                  |
|------------------|---------|--------------------------------------------------|
| `FAL_KEY`        | fal.ai  | https://fal.ai/dashboard - create a service key  |

Optional (only if you'd rather use a different provider): `REPLICATE_API_TOKEN`, `STABILITY_API_KEY`. Generation script would need a small switch; not implemented in v1.

## Sample fal.ai call (Node, illustrative)

A regen script is not bundled in v1. Here's the call shape so it's ready to wire when needed:

```js
// scripts/generate_art.mjs (NOT included; reference only)
import fs from "node:fs/promises";
import path from "node:path";

const FAL_KEY = process.env.FAL_KEY;
if (!FAL_KEY) { console.error("FAL_KEY required"); process.exit(1); }

const STYLE = "oil painting, dramatic chiaroscuro, parchment-aged palette, muted golds and deep browns, hand-painted D&D rulebook illustration, no text, no watermark, no border, centered subject";
const NEGATIVE = "text, watermark, signature, ui, hud, blurry, modern clothing, photo, anime, low quality, deformed hands";

async function generate(prompt, outPath, w = 768, h = 768) {
  const res = await fetch("https://fal.run/fal-ai/flux/schnell", {
    method: "POST",
    headers: {
      "Authorization": `Key ${FAL_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      prompt: `${prompt}. Style: ${STYLE}.`,
      negative_prompt: NEGATIVE,
      image_size: { width: w, height: h },
      num_inference_steps: 4,
    }),
  });
  if (!res.ok) throw new Error(`fal.ai ${res.status}: ${await res.text()}`);
  const data = await res.json();
  const imageUrl = data.images?.[0]?.url;
  if (!imageUrl) throw new Error("no image url in response");
  const img = await fetch(imageUrl);
  const buf = Buffer.from(await img.arrayBuffer());
  await fs.mkdir(path.dirname(outPath), { recursive: true });
  await fs.writeFile(outPath, buf);
  console.log(`wrote ${outPath}`);
}

// Then loop the asset list above and call generate() for each.
```

## Cost estimate

25 images x $0.05 worst case = $1.25 for a full pack. Re-rolls are cheap; budget $5 to iterate on prompts.
