DJ Von Frank AI Implementation

Co-founded · July 2026

GreenRoom

A booking platform for touring comedians, built with three friends. The generation where the constitution nearly halved, and where the build script stopped generating pages and started asserting they were correct.

137
venues, hand-researched
33
countries
80
line constitution
28
logged changes, each with its reason
What is shown, and what never will be

I co-own this, so the brand stays. What does not appear anywhere on this site, in any form, is the data itself. The directory contains 83 named individuals with 63 email addresses and 41 phone numbers, hand-researched. Those people did not consent to being on my portfolio. You get the schema and the counts. You do not get the rows, and no amount of it being impressive changes that.

Click any folder to open it, any file to see what it holds and why it exists. This is the real structure, with the contents described rather than reproduced.

Eighty lines. The same eight sections, with everything company-specific stripped out of the general rules.

§1

Who this brain serves

The product, the audience, and the founding team.

§2

Confirm first

Before any substantive task, restate what is about to be built in one line and get agreement.

New in this build, and the only section that does not exist in the one before it. Four founders with different mental models of the same product generate a lot of confidently wrong work, and one restated line kills most of it.

§3

The folders

One line each.

§4

Trust order

Approved beats facts beats drafts.

§5

Routing

Request type to exact file list.

§6

Hard rules

Sixteen of them. The ones that matter most here: never publish a real person’s contact details, never invent a venue or a capacity, and never claim a booking relationship that does not exist.

§7

Output checklist

Run before anything is delivered.

§8

Governance

Four founders, named approvers, and a rule that nothing reaches the public site without one.

The guardrails, framed the way they actually work: as things the system refuses to do.

NO

Publish a real person's contact details.The directory is the product. The contact rows are not content, and they do not leave the tool.

NO

Invent a venue, a capacity or a contact.Every row is hand-researched. A fabricated venue is worse than a missing one, because a comedian will act on it.

NO

Claim a relationship that does not exist.Being listed in the directory is not an endorsement, and the copy never implies otherwise.

NO

Ship with mismatched chrome.The build asserts the header and footer are byte-identical across every page and exits non-zero if not.

NO

Ship a dead internal link.Every href is resolved against disk at build time.

NO

Take generated output at its word.The changelog records design output being checked against the source data and corrected before ship. Generated content gets verified, not trusted.

NO

Add an external dependency for the map.Public-domain geometry, no key, no vendor.

The tail of the hub build. Everything above this point generates pages. Everything from here down refuses to let them ship if they are wrong. Copied out of the repository as it stands, with the one trimmed section marked.

Hub/build-hub.mjs GreenRoom brain · lines 169 to 222 of 222

This is the moment described in the changelog as the build script growing teeth. A generator that only generates is a suggestion. The assertions are what make one template, every page a fact about the output rather than an intention in someone’s head.

async function exists(f) { try { await stat(f); return true; } catch { return false; } }if (!await exists(path.join(hubDir, "_shared/brain.css"))) errors.push("missing _shared/brain.css");if (!await exists(path.join(hubDir, "favicon.svg"))) errors.push("missing favicon.svg");let refNav = null, refFoot = null;for (const page of pages) {  const file = path.join(hubDir, page);  if (!await exists(file)) { errors.push(`missing page: ${page}`); continue; }  const html = await readFile(file, "utf8");  const nav = html.match(/<header class="brainbar">[\s\S]*?<\/header>/)?.[0];  const foot = html.match(/<footer class="brainfoot">[\s\S]*?<\/footer>/)?.[0];  if (nav && refNav === null) refNav = nav; else if (nav !== refNav) errors.push(`${page}: brainbar differs`);  if (foot && refFoot === null) refFoot = foot; else if (foot !== refFoot) errors.push(`${page}: brainfoot differs`);  const pageTitle = titleOf(html);  if (!pageTitle) errors.push(`${page}: missing <title>`);  else if (PLACEHOLDER_TITLES.has(pageTitle.toLowerCase())) errors.push(`${page}: placeholder <title> "${pageTitle}"`);  if (!/name="robots" content="noindex,nofollow"/.test(html)) errors.push(`${page}: missing noindex`);  for (const [, href] of html.matchAll(/href="(\.\/[^"#]+)/g)) {    if (!await exists(path.join(hubDir, href.slice(2)))) errors.push(`${page}: broken relative link ${href}`);  }} // ... 24 lines trimmed: the standalone Brand System export, which carries no hub// chrome by design and is therefore checked separately: it must carry a real// title, a real description and share-card tags, and stay noindex, but it is// never chrome-matched ... for (const slug of toolSlugs) {  const f = path.join(hubDir, "tools", slug, "index.html");  if (!await exists(f)) { errors.push(`tools/${slug}: missing`); continue; }  const h = await readFile(f, "utf8");  if (!/name="robots" content="noindex,nofollow"/.test(h)) errors.push(`tools/${slug}: missing noindex`);  if (h.includes("freebrandtools.com")) errors.push(`tools/${slug}: leftover freebrandtools.com reference`);  if (!h.includes("/assets/js/gr-defaults.js")) errors.push(`tools/${slug}: brand seed not wired`);}if (errors.length) { console.error(`Hub QA FAILED:\n- ${errors.join("\n- ")}`); process.exit(1); }console.log(`Hub QA passed: ${pages.length} pages + ${toolSlugs.length} ported tools.`);

One installed skill. The engineering in this build went into the product and the build pipeline rather than into generators, and the count here matches the repository rather than the section.

quality-control

The maintenance and verification pass: regenerates the constitution twin, rebuilds the generated pages, and audits for stale references.

The engineering worth showing here is in the product and the pipeline, not an agent fleet.

The self-asserting build

Generates the portal and then checks it: byte-identical chrome across every page, every internal link resolving on disk, noindex present, the shared stylesheet linked everywhere, every tool page wired to its brand seed.

It runs on every deploy and exits non-zero on any failure.

Passwordless sign-in

Google or an emailed magic link, as edge functions. No password store, no signing secret, and honest degradation when the mail path fails rather than a false success.

The no-dependency map

An interactive world map rendered from public-domain geometry. No key, no vendor, no repricing risk, and it works offline.

Accessibility as a pass, not an afterthought

A dedicated batch: 16px form inputs so iOS stops zooming on focus, aria-labels on every icon-only button, explicit label and field associations, and a mobile pass across the product.

Plus a brand refinement round that replaced the text tokens with WCAG-passing values rather than arguing the old ones were close enough.

Brand System v1.1, adopted after three complete identities in two days. Every superseded version is archived rather than deleted.

Blackout
#08110F
Primary dark ground. 19.1:1 on white.
Backstage
#0C1F1A
Secondary dark surface: cards, sidebar.
Green
#0FA47C
The primary. Spruce rather than leaf, deliberately.
Signal
#3FD9A4
Accent on dark only. Links and the tagline.
Cue
#F2A93B
Warm signal. Never carries text on white at 2.0:1.
Spotlight
#F7F3EA
Warm paper. 17.3:1 on Blackout.

Every change is logged with its reason. A change is not done until the system agrees with it.

2026-07-29Sign-in built: Google and email magic links, no passwords

Built to the brand system spec. No password store to breach and no signing secret to leak.

2026-07-29Brand System v1.1 adopted and rolled out everywhere

The third full identity in two days, and the one that stuck. The system itself became a tab in the hub rather than a document, so the team reads it where they work.

2026-07-29Root-caused the margins instead of adjusting them

A review round flagged the spacing as a taste problem. It was not. The margins were a CSS bug.

The entry is in the log under that heading because the distinction is the lesson: a layout that looks wrong is usually broken rather than badly judged, and nudging values hides the fault instead of removing it.

2026-07-28Three homepage directions built full-size and clickable

All three comparable at real scale rather than as thumbnails. Choosing between finished pages is a far easier question than imagining one.

2026-07-28The rails went live

Two Cloudflare Pages projects building from main automatically. Nothing is deployed by hand any more.

2026-07-28Rebuilt on the starter kit

The whole workspace reorganized onto the plain-English folder structure: rules, facts, brand, templates, skills, website, hub, drafts, approved, log, archive.

Second build on the architecture. The first one took weeks. This took a day.

2026-07-02Accessibility and mobile batch

16px form inputs so iOS stops zooming on focus. Aria-labels on every icon-only button. Explicit label and field associations. A full mobile pass across the product.

2026-07-02Brand refinement: WCAG-passing text tokens

The text tokens were replaced with values that actually pass, rather than arguing the existing ones were close enough. A hardcoded color that had escaped the system was mapped back to a token.

2026-06-27Initial build

Marketing site, marketplace demo, and the CRM with 137 clubs researched by hand.

PathWhat it holdsSize

Next

What came next

The build after this one went back up in length, deliberately, because the client was new to AI. That was where prose rules became executable gates.

The layer under it

How every one of them runs.

The operating loop, the guardrails, the agent roster and the rest of the machinery, in one place.