// Build-time character generator. // // DiceBear's `open-peeps` style IS Pablo Stanley's Open Peeps artwork (CC0-1.0). // We generate deterministic per-seed SVGs OFFLINE (no runtime CDN / HTTP call) and // vendor them into public/illustrations/dicebear/, then write a license-ledger row // per file into public/illustrations/assets.json. Run: npm run gen:dicebear import { createAvatar } from "@dicebear/core"; import { openPeeps } from "@dicebear/collection"; import { writeFileSync, readFileSync, mkdirSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; const __dirname = dirname(fileURLToPath(import.meta.url)); const ILLUS = join(__dirname, "..", "public", "illustrations"); const OUT = join(ILLUS, "dicebear"); mkdirSync(OUT, { recursive: true }); const COUNT = 30; const VENDORED = "2026-06-22"; const ledger = {}; for (let i = 1; i <= COUNT; i++) { const seed = `flatrender-peep-${i}`; // idRandomizer keeps SVG ids unique so multiple avatars can be inlined // in one document without clashing (Remotion composites many in one frame). const svg = createAvatar(openPeeps, { seed, size: 400, randomizeIds: true }).toString(); const file = `openpeeps-${String(i).padStart(2, "0")}.svg`; writeFileSync(join(OUT, file), svg, "utf8"); ledger[`dicebear/${file}`] = { source: "DiceBear open-peeps (Pablo Stanley Open Peeps)", license: "CC0-1.0", license_class: "CC0", commercial_ok: true, attribution_required: false, ai_training_allowed: true, animation_fit: "swap-transform (bust/half-body micro-rig)", generator: `createAvatar(openPeeps,{seed:'${seed}'})`, url: "https://www.dicebear.com/styles/open-peeps/", vendored: VENDORED, }; } // Merge into the assets.json license ledger (preserve any existing rows). const ledgerPath = join(ILLUS, "assets.json"); let existing = {}; try { existing = JSON.parse(readFileSync(ledgerPath, "utf8")); } catch { existing = {}; } writeFileSync(ledgerPath, JSON.stringify({ ...existing, ...ledger }, null, 2) + "\n", "utf8"); console.log(`generated ${COUNT} open-peeps SVGs in ${OUT}`); console.log(`ledger now has ${Object.keys({ ...existing, ...ledger }).length} rows`);