Three laptops fanned out on a dark desk, each showing the same page layout in a different brand palette — amber, teal and violet.

    The platform, not the school

    This whole school is one file away from being yours.

    Everything you are looking at — the palette, the name, the catalogue, the certificate wording, the pricing table, the voice tutor — comes out of a single configuration file. Change it and the site, the signed-in application and the issued PDF all follow. No fork, no find-and-replace, and nothing else in the codebase names a school.

    The mechanism

    One file in, four surfaces out.

    What one config file changesA single file, shared/brand.config.ts, supplies the identity, the palette, the catalogue, the certificate wording, the pricing and the voice agent. At runtime it writes the CSS custom properties the whole site reads, names the courses the catalogue shows, fills the certificate template, renders the pricing table, and points the voice tutor at the buyer's own agent. Everything downstream is generated; nothing else in the codebase names a school.brand.config.tsone file, ~200 valuesEvery colour on the siteCSS custom propertiesThe cataloguewhich courses existThe certificatewording, seal, ID prefixMarketing pageshero, pricing, catalogueThe signed-in appstudent + adminPDF + verify pageissued artefactsYour schoolyour domain, your StripeNothing else inclient/, server/ or api/names a school.

    What a buyer actually edits

    shared/brand.config.ts, and nothing else.

    A maritime school, a franchise operator, a manufacturer inducting line staff — the same code, a different config. The snippet beside this is a complete, working configuration for a different school; drop it in and the deployment you are reading becomes that school on the next build.

    The certificate is the tell. Its title, preamble, attestation, seal, identifier prefix and verification URL are all in that file — and the accreditation line is an empty string by default, so a school that holds no accreditation prints none. You cannot claim a regulator's approval by leaving a placeholder in.

    shared/brand.config.ts
    export const BRAND: BrandConfig = {
      key: "harbourline",
      name: "Harbourline Maritime Academy",
      tagline: "Crew training that holds up at sea.",
      domain: "academy.harbourline.example",
    
      logo: { wordmark: "Harbourline", monogram: "HM" },
    
      palette: {
        bg: "#07161C", surface: "#0D2530",
        ink: "#EAF4F6", ink2: "#B4CBD2", ink3: "#89A4AD",
        accent: "#4FC3D9", accentDeep: "#1E7E96", accentOn: "#04121A",
        accent2: "#E8B44A", trim: "#C6A15B",
        /* ...statuses, rule, sheen, shade, radius, grain... */
      },
    
      catalogue: ["deck-safety", "engine-watch", "cargo-handling"],
    
      certificate: {
        title: "Statement of Attainment",
        accreditationLine: "",     // print nothing unless you hold one
        idPrefix: "HM",
        verifyUrlPattern: "https://academy.harbourline.example/verify/{id}",
        seal: "trim",
      },
    
      voice: { enabled: true, agentId: "agent_...", tutorName: "Mate" },
    };

    The token contract, measured

    Every text tier is computed against the surface it sits on, not eyeballed.

    These ratios are calculated in the browser from the palette currently loaded. Change the config, reload, and this table changes with it — which is how a buyer finds out their brand colour fails on a label before their customers do.

    TokenValueUsed forContrast on surfaceWCAG
    ink#F4F1F7Body text and headings15.55 : 1AAA
    ink-2#C3BAD2Secondary text and every field label9.34 : 1AAA
    ink-3#9A90ACEyebrows, captions, table meta5.77 : 1AA
    accent#A98CFFPrimary action6.53 : 1AA
    trim#C7CBD8Corner ticks, rules, rings, seal10.74 : 1AAA
    ok#5CD6A0Passed9.60 : 1AAA
    warn#F0B84ERetake9.67 : 1AAA
    bad#FF7A6EFailed6.85 : 1AA
    info#7BC5F0Informational9.19 : 1AAA

    accent-deep is not listed because it never carries text — it is a pressed and wipe ground only, which is why it is allowed to be darker than a text tier may be.

    What comes with it

    • The platform

      Courses, modules, written lessons, worksheets as CSV, module checks, a final assessment, certificates with public verification, student progress, an admin dashboard, bulk enrolment and analytics.

    • The demo school

      4 courses, 32 modules and 131 lessons of real material, loaded, so the platform is never shown empty. Keep it, replace it, or hide it by deleting four strings from the catalogue array.

    • The voice tutor

      An ElevenLabs Agents session handed the exact lesson the student is reading. Point it at your own agent in your own workspace; voice minutes are billed to you, not resold by us.

    • Your Stripe

      Your students pay into your own Stripe account on your own deployment. The money never touches ours, and that is a property of the architecture rather than a promise.

    • Your domain, your database

      One Vercel project and one Postgres database per school. Nothing is multi-tenant, so there is no other school's data anywhere near yours.

    • The runbook

      PROVISION.md: the exact sequence to stand a school up, the env block, the seed, the handover, and the deprovision steps with a date.

    The certificate, as this config renders it

    The School of Life Hacks
    Certificate of Completion

    This certifies that

    Dana Whitfield

    has completed every lesson and passed the written assessment for every module of this course.

    The Occupancy Course
    Rob Yeager, Instructor
    Issued 8 September 2026
    LH-2026-0184
    school-of-life-hacks.vercel.app/verify/LH-2026-0184

    Same component, same markup as the PDF. A buyer's screenshots are correct the moment their config lands — nobody has to redraw a certificate in a design tool.

    What this is not: it is not a hosted platform with a monthly seat fee, and we are not trying to be one. It is a single-tenant deployment you own, on your infrastructure, with your Stripe keys, priced as a build. If what you want is a subscription with a support desk behind it, one of the hosted platforms is a better answer and we will say so on the call.

    School of Life Hacks

    The things nobody teaches you.

    Nothing here is legal, tax, financial or engineering advice. Every course tells you plainly where to stop and call a professional, and names which one.

    © 2026 Fusion Data Company. Refundable in full for 14 days, for any reason, whether or not you have read the course. Email the address in the footer and it is done the same day.

    Card checkout is not switched on yet. Prices on this site are the prices seats will be sold at, and reserving a seat holds one at today's price and costs nothing — no card, no account, one email address.