Reusable framework-free component (core generation engine, seeded procedural SVG art, render layer) plus a standalone app built on it. Produces two separate surfaces per briefing — Player Brief and GM Dossier — in the SLA house style with bundled local fonts. Per-band procedural artwork, deterministic from seed. NPC/monster generation left to a future companion module via a clean seam. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Blueprint News
An engine-agnostic generator for SLA Industries BPN (Blue Print News) mission briefings. It produces two clearly separated surfaces from one briefing:
- Player Brief — the official corporate dispatch the squad is allowed to see.
- GM Dossier — the handler-only truth: the twist, the withheld fact, the real threat read, the levers, and the dice state.
Every briefing is reproducible from a short seed, which also drives the procedural SVG artwork — flat, stencil/propaganda SLA styling, never photorealistic. Fonts are bundled locally, so it looks identical offline.
It deliberately owns no game-engine schema. NPC and monster generation are
left to companion modules; each briefing reserves a clean hand-off seam
(npcSeam) carrying archetype keys only.
Run the app
No build step. Serve the folder over HTTP (ES modules need it) and open it:
python3 -m http.server 8778
# then open http://localhost:8778/index.html
The app: pick a colour band / scenario frame (or leave on Any to roll), Generate, toggle Player / GM / Both, Save to a local library, Print (clean print stylesheet) or Export HTML (self-contained file).
Architecture — a component, plus an app built on it
The reusable component is three framework-free ES-module layers with no DOM or engine dependencies in the core:
core/ generation engine (pure, deterministic)
bpn-core.js generateBPN(opts) -> resolved BPN object; randomSeed()
data/colours.js the 10 colour bands + d20 issue table
data/frames.js hand-authored scenario frames (with npcSeam hints)
data/tables.js generic SLA flavour tables
art/
bpn-art.js seeded procedural SVG: crestSVG(), bannerSVG()
render/
bpn-render.js briefHTML() / dossierHTML() + mount helpers
bpn-render.css the SLA-styled, responsive, print-ready stylesheet
assets/fonts/ bundled Josefin Sans, Roboto Mono, Modesto Condensed
app/ the standalone generator UI (consumes the above)
index.html
Using the component in another engine
import { generateBPN } from "./core/bpn-core.js";
import { briefHTML, dossierHTML } from "./render/bpn-render.js";
const bpn = generateBPN({ seed: "BPN-1A2B-3C4D", colourKey: "red" });
host.innerHTML = `<div class="bpn">${briefHTML(bpn)}</div>`; // player-facing
gmPanel.innerHTML = `<div class="bpn">${dossierHTML(bpn)}</div>`; // GM-only
Include render/bpn-render.css and assets/fonts/fonts.css in the host. The
markup is plain HTML/SVG scoped under .bpn, so it drops into a Foundry journal
page, a website, or an Electron app unchanged.
generateBPN(opts) accepts: seed, colourKey, frameId, squadSize, and an
overrides object to pin any individual field. Same inputs → identical output,
art included.
The NPC / monster seam
Each briefing exposes bpn.npcSeam = { contactArchetype, threatArchetype, threatRole } — archetype keys only, no stats. A future NPC/monster module reads
these to spin up cast members in whatever engine it targets, without this module
ever importing that engine's actor schema. The GM Dossier surfaces the seam
explicitly so the handler knows which cast slots are reserved.
Colour bands
Blue · Yellow · Green · White · Grey · Silver · Jade · Red · Black · Platinum —
each with its own classification, SCL requirement, CBS pay band, media posture,
and render accent. See core/data/colours.js.
Provenance
Rebuilt from the strongest parts of the earlier Foundry-bound experiments
(sla-bpn-dispatch's mission engine and player/GM split, the sla-bpn-toolkit
data, sla-briefing-desk's output pattern), with every engine call removed and
the real SLA house fonts and palette applied.