GENERATIVE ASSETS · INDUSTRY DEMO 263 · DRIVER TRAINING

How First Gear was made

First Gear Driving School is a fictional Cannington driving school, built as a conversion-first landing page demonstration. The audience is a 16-year-old with a fresh learner's permit, the parent doing the supervising, and the adult coming back after years off the road — so the page's single job is booking the first lesson, with an honest hours planner that turns WA's 50-hour log book from a chore into a plan.

Concept

Driver training sells calm, not horsepower. The whole page is designed to feel like the instructor who never raises their voice: a quiet chalk-sky morning street, soft-cornered road-sign type, and prices said plainly enough that a nervous 16-year-old (or their parent, who is really the buyer) can see the whole cost of getting licensed before anyone calls anyone.

The signature Hours Planner is the conversion engine: a 0–50 slider fills a 50-cell log-book grid, a suburban route map extends from carpark laps through lane changes to the freeway merge and test routes as the learner's stage advances, and a mono recommendation card names the honest package for that stage — including, prominently, the WA fact this trade trades on: an instructor hour counts 1:1 in the log book here. No 3-for-1 multiplier. A school that says that plainly earns the booking; one that lets you assume eastern-states arithmetic doesn't deserve it.

Palette — learner-laps suburban morning

Argued from a quiet Cannington backstreet at 9am: chalk sky, fresh bitumen, the L-plate in the window, and the instructor's calm. Deliberately distinct from skipbins' industrial gal-yard yellow — this yellow always reads as an L-plate, often literally framed as one (the favicon, the wordmark, the map base marker, even the slider thumb).

#F2F4F1 · chalk sky

Ground — a quiet morning street, pale and unthreatening.

#33383B · bitumen soft

Structure and primary ink — fresh quiet-street asphalt. 10.7:1 on chalk sky.

#EFBE1D · L-plate yellow

LINE/MARK only — route lines, grid fills, CTA plates. Black-on-yellow is THE learner's colour; never body text on sky.

#3E7BA6 · dual-control blue

Secondary — the instructor's calm: active chips, focus rings, the map's suburb dots.

#5A6165 · derived dim ink

Derived muted ink for secondary copy — 5.7:1 on chalk sky, keeping yellow for marks (the W2/W5 ink/line split).

#2E6488 · derived blue-ink

Raw dual-control blue only clears ~4.1:1 as small text, so links and mono labels get their own darker ink at 5.8:1.

Type

From carpark laps to the test route

RUBIK · DISPLAY

Road-sign geometry with soft corners — confident but kind, which is the brand. The hero's one typographic flourish is an L-yellow highlight bar under "test route"; the wordmark frames its L in an actual L-plate square.

The brake on my side means the mistake on yours is safe to make.

KARLA · BODY & UI

A warm workhorse grotesque — legible at 16px on a parent's phone, friendly without being cute.

$740 + $170 = $910 · 15 / 50 HRS

DM MONO · HOURS, LESSON COUNTS, PRICES

Every number on the page is mono — the log book aesthetic. If the promise is honest hours, the numerals should look like entries.

The Hours Planner — technique

The progress board is one hand-built SVG (640×460) in two halves. The top is a 50-cell log-book grid — ten columns by five rows, cells built in JS and styled ONLY via CSS classes (never presentation attributes, the W16/W17 discipline), so the yellow fill transitions cleanly as the slider climbs. The bottom is a suburban route map: a carpark with a practice loop, a two-lane street with a lane-change weave, an on-ramp merging onto a stylised Roe Hwy, and a dashed test-route branch past the (real) Cannington DoT centre.

The planner exposes window.__drivingschool (hours, stage, transmission, plan items, total, single-lesson option, cells filled, form status) as the QA state probe, and every interaction pre-fills the booking form's transmission, starting-point and notes fields — the estimator becomes a warmer lead (the W12 handoff contract). Pre-fill fires only on interaction, so a fresh load still fails an empty submit on all seven fields (W15).

Pricing model — shape and derivation

Pinned anchors from the spec: single lesson $80 (60 minutes, pick-up and drop-off included, no call-out fee — the single lesson IS the pinned minimum), 5-pack $380 ($76/lesson), 10-pack $740 ($74/lesson), manual +$5/lesson (packs +$25/+$50), practical test package $170. Stage logic: 0–10 h recommends the 5-pack, 10–35 h the building plan, 35–50 h the test-ready plan.

ScenarioModelMeasured
Rest state — building, 15 h, auto740 + 170$910 ✓
Building, manual740 + 50 + 170$960 ✓
First lessons, auto380 (single 80 shown)$380 ✓ · $80 = grid floor
First lessons, manual380 + 25 (single 85)$405 ✓
Test-ready, auto380 + 170$550 ✓
Test-ready, manual380 + 25 + 170$575 ✓

Derived (not spec-pinned), documented per W15: the spec's stage list names the 10-pack for the building stage, but its own pinned rest figure ($910) is 10-pack PLUS test package — so the building recommendation includes the test package, itemised on-card, on the logic that ten lessons from mid-book lands you at the test window with a date worth booking. The test package is deliberately flat across transmission — test day is one drive either way; the +$5 covers pack-lesson clutch wear — shipped as a stated flatness, not an invented gradient. Stage boundaries are half-open: 10 h is building, 35 h is test-ready. All figures were verified against an independently reimplemented oracle at rest and across eleven driven scenarios, including both boundaries and the manual pack arithmetic.

Cheapest-output contract (W12): at the first-lessons stage the card visibly offers the single lesson at $80 — "no lock-in, no call-out fee" — which equals the services grid's "lessons from $80" floor. The page never argues with itself.

Conversion decisions

Local SEO we'd implement for the real business

This demo ships only WebPage schema naming itself a demonstration — fictional LocalBusiness/Review markup in a real index would be dishonest. For a real school we'd ship:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "additionalType": "https://en.wikipedia.org/wiki/Driving_school",
  "name": "Real Driving School",
  "telephone": "+61 8 XXXX XXXX",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Cannington",
    "addressRegion": "WA",
    "postalCode": "6107",
    "addressCountry": "AU"
  },
  "areaServed": "Perth south-east corridor",
  "openingHoursSpecification": {
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
    "opens": "07:00", "closes": "19:00"
  },
  "priceRange": "$$",
  "makesOffer": [{
    "@type": "Offer",
    "name": "Driving lesson (60 min)",
    "price": "80", "priceCurrency": "AUD"
  }],
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.9", "reviewCount": "214"
  },
  "review": [{
    "@type": "Review",
    "author": { "@type": "Person", "name": "Real Parent" },
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "reviewBody": "Fed from the live Google reviews profile."
  }]
}
</script>

Plus a Google Business Profile wired to the review flow, suburb-level pages for "driving lessons [suburb]" across the corridor, and the test-centre head terms ("driving test Cannington") — the queries this trade actually wins on.

What would change for the real client

Iteration log

Pass 1 — Craft

Drove the full harness against an independently reimplemented pricing oracle: rest state measured $910 (10-pack $740 + test package $170, matching the spec's pinned example), eleven driven scenarios green including the manual pack arithmetic (+$25 → $405 five-pack, +$50 → $790 ten-pack, building manual $960), both stage boundaries (10 h → building, 35 h → test-ready), the 50-hour stamp, and the first-stage single-lesson $80 floor. Empty submit on a fresh load flagged all seven fields; filled submit confirmed inside the lexicon. Two finds: the 375×667 fold check put the trust line 6px below the fold — compacted the mobile hero rhythm (26px hero padding, tighter h1/sub/CTA gaps) and it landed at 604px; and my own harness serialised DOMRects to NaN — fixed the harness, never the site (W12 family).

Pass 2 — Depth

The screenshot review caught what the asserts couldn't: the sticky call bar's phone number wrapped to two lines at 375, and the trust line sat BEHIND the sticky bar — dropped the ghost CTA on mobile (the sticky bar carries its "Plan hours" twin, the towing pattern), set nowrap compact labels, and re-verified the fold. Added the in-board live readout ("BUILDING · $910") after the 1200×750 review showed the price card starting below the thumbnail cut — the thumbnail now sells the meter. Added the desktop three-step strip ($80 first lesson → reassessed every five → $170 test day) to balance the hero's short left column, and the price-tick micro-interaction on the plan total.

Pass 3 — Hardening

Masthead first at 375 (W18): wordmark right edge 174px, call button 260–351px — one row, no collision, screenshot confirmed. Hid the slider's visible label at 375 (the input keeps its aria-label) after the planner screenshot showed it crowding the value readout. Chanel rule: removed the hero's radial yellow wash — it earned nothing the L-plate highlight wasn't already doing. Final sweep 73/73: scrollWidth 375/768 clean, exactly one h1 per page, reserved-phone positive sweep (5 × (08) 9000 0263, no other 9xxx exchange), WebPage-only live JSON-LD, planner top at 117px inside the 750px thumbnail, phone pattern v-flag-safe, zero console errors on every run, and the reduced-motion pass rendered the rest state fully settled with the blinker animation off. Final copy read: no display line ends in punctuation, all prices cross-checked against the planner's measured outputs.