Hullcare Marine

Generative Assets · Industry Demos · how it was made

How the Hullcare Marine demo was built

Hullcare Marine is a fictional Henderson antifoul, haul-out and hull care yard — power boats, yachts and catamarans to 15 m lifted, washed, antifouled and relaunched. The page exists for one reader: the owner due for the annual slip who wants the boat, grade and extras priced and a days-on-the-hard figure before they bring her round. Its single job is a slip booking with the scenario already attached.

The Slipway Quoter

The signature element is a drawn SVG boat standing in a hardstand cradle at the Henderson slipway: the water band and jetty behind, the tide lapping at the slipway edge, a gull-shadow crossing the wet concrete, the hull in profile with its copper-red antifoul band below the boot-top. Every control redraws the scene honestly and reprices the slip from the pinned per-metre rates:

Pinned anchors (GST inclusive, per metre of LOA)

HullHaul-out, wash, 2 nights & relaunchStandard ablativePremium self-polishingPropsAnode setFloor (5 m, standard, nothing)
Power monohull$60 / m$150 / m$195 / m1$140$1,050
Sailing keelboat$65 / m$165 / m$215 / m1$140$1,150
Catamaran (to 12 m)$95 / m$240 / m$310 / m2$220$1,675

Prop speed coating is $180 per prop and multiplies the hull's actual prop count; the anode set is flat per hull; topsides cut & polish is $55 per metre of LOA and adds a day; extra hardstand days are $60 each, 0–5. Osmosis and blister repair, rudder bearings, through-hulls and skin fittings carry no number anywhere — "quoted after haul-out" on the badge footnote, the ledger, the screen-reader mirror and the FAQ. Every rate is a whole dollar and length is a whole metre, so no total ever needs rounding.

Worked examples measured from the running page

ScenarioArithmeticTotalDaysNote
Rest state — keelboat, 10 m, premium, prop speed, anodes, cut & polish, 0 extra650 + 2,150 + 180 + 140 + 550$3,6703absent
Power, 5 m, standard, nothing (grid floor)300 + 750$1,0502absent
Catamaran, 12 m, premium, 2 props, anodes, polish, 2 extra days1,140 + 3,720 + 360 + 220 + 660 + 120$6,2205absent (cat)
Power, 8 m, standard, polish480 + 1,200 + 440$2,1203absent
Sail, 13 m, standard, nothing845 + 2,145$2,9902present
Sail, 12 m, standard, nothing (boundary pair)780 + 1,980$2,7602absent
Power, 14 m, standard → cat chip → forced to 12 → power chip2,940 → 1,140 + 2,880 → restored 14 m$2,940 → $4,020 → $2,9402present → absent → present
Rapid-fire: length 5 → 15 → 9, hull power → sail → power in one evaluate540 + 1,350$1,8902absent

All eleven worked figures, the cheapest-output floors ($1,050 / $1,150 / $1,675, equal to the services grid), the 180 ↔ 360 prop-count reprice and the 140 ↔ 220 anode reprice were cross-checked against an oracle reimplemented from the anchors in the verification harness, not from the page's own code — 250 assertions in the final pass (236 on the site, 14 on this guide), all green.

Palette — argued from Cockburn Sound haze

Sea-haze ground, navy ink and navy CTAs, an antifoul copper-red band for the hull below the waterline and for the marks, and the grey-blue of a wet hardstand. Contrast ratios below were computed with WCAG arithmetic from the shipped tokens in Pass 1 (role, hex and ratio from the same script row).

Sea haze#EAF0F2 page ground; cards #FFFFFF, soft cards #F3F7F9
Navy ink#1C2A33 body ink · 12.77:1 on haze, 14.70:1 on white
Hull navy#1F3A5A CTAs & the job tag · white on it 11.60:1 (hover #18304B 13.43:1); as link ink 10.07:1 on haze
Antifoul copper-red#B5543A the band, boot-top, rules, chip outlines · 4.25:1 on haze → lines, marks and large display only
Red-ink#8E3F2A copper-red small copy · 6.30:1 on haze, 7.25:1 on white, 5.83:1 on the copper tint
Wet-concrete blue#5E8A9E water band, cradle lines, hardstand tints · 3.26:1 on haze — never text
Sea-ink#3F6477 blue-grey small copy · 5.53:1 on haze, 6.36:1 on white, 5.90:1 on soft cards, 4.99:1 on the navy tint
Tag pale#DCE6EC secondary lines on the navy job tag and trust strip · 9.15:1 on hull navy
Tag copper-light#F0B8A6 the big-lift note and tally strokes on the tag · 6.69:1 on hull navy

Pass 1 measurement moved two tokens: the ledger's "not selected" lines were first set in a mid grey (#6B7F8A, 4.18:1 on white) and now use sea-ink (6.36:1); the map's water labels were white over the water gradient (2.35–3.75:1) and are now navy ink with a pale halo. Every other spec figure measured within 0.1 of its computed hypothesis.

Type

10 M Keelboat · $3,670
Archivo 700/800 — a wide, stencil-adjacent grotesk that reads like hull lettering. Headings, the display line over the cradle, the tag price, stepper values.
Lifted, pressure-washed, antifouled, props and anodes done — priced by the metre before you bring her round.
Albert Sans 400–700 — the workhorse: 17 px body (16 px minimum on mobile), labels, ledger, form. Eyebrows in 12.5 px caps at .14 em tracking.

The display moment is the rest-state line set over the cradle — "10 M KEELBOAT · PREMIUM · BACK IN 3 DAYS · $3,670" — rebuilt from state on every change, so the figures are always the live total and days; the separators travel with the token that follows them (a non-breaking space after each middle dot) so a wrap never strands a dot at a line end.

Techniques

Conversion decisions

Local SEO we'd implement for the real business

The live page carries only WebPage, WebSite and BreadcrumbList structured data naming it a demonstration — a fictional yard must not mark itself up as a real one. For the real client we would ship the block below. schema.org has no boat-repair or marina-services subtype, and AutoRepair would be wrong (it is a vehicle type the yard doesn't service and would mislead rich results), so the top-level type is the plain organisation type LocalBusiness with the service named through additionalType and knowsAbout. Real reviews would be pulled from Google Business Profile and marked up only with the reviewer's consent.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "additionalType": "https://www.wikidata.org/wiki/Q1050307",
  "name": "Hullcare Marine",
  "description": "Antifoul, haul-out and hull care at Henderson — power boats, yachts and catamarans to 15 m.",
  "url": "https://www.example-hullcare.com.au/",
  "telephone": "+61 8 9000 0365",
  "image": "https://www.example-hullcare.com.au/yard.jpg",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Henderson",
    "addressRegion": "WA",
    "postalCode": "6166",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -32.16, "longitude": 115.77 },
  "areaServed": ["Fremantle", "Cockburn Sound", "Rockingham", "Mandurah", "Hillarys", "Mindarie"],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "06:30", "closes": "16:00" }
  ],
  "knowsAbout": ["antifouling", "boat haul-out", "travel lift", "propeller coating", "sacrificial anodes", "gelcoat cut and polish", "osmosis repair"],
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Slipway services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Haul-out, wash and antifoul — power boats" }, "priceSpecification": { "@type": "PriceSpecification", "price": "1050", "priceCurrency": "AUD", "description": "from, 5 m LOA, standard ablative" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Haul-out, wash and antifoul — yachts" }, "priceSpecification": { "@type": "PriceSpecification", "price": "1150", "priceCurrency": "AUD", "description": "from, 5 m LOA, standard ablative" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Haul-out, wash and antifoul — catamarans to 12 m" }, "priceSpecification": { "@type": "PriceSpecification", "price": "1675", "priceCurrency": "AUD", "description": "from, 5 m LOA, standard ablative" } }
    ]
  },
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "87" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Real customer, with consent" },
      "datePublished": "2026-03-14",
      "reviewRating": { "@type": "Rating", "ratingValue": "5" },
      "reviewBody": "Pulled from the live Google Business Profile feed — never hand-written."
    }
  ]
}
</script>

Alongside the schema: a Google Business Profile with the slipway pinned, "antifoul Henderson" / "boat haul-out Fremantle" / "catamaran lift Perth" as the page's core phrases with the suburbs above as secondary, NAP consistency across the marina directories and the Boating Industry Association listing, and a reviews feed that updates without anyone touching the page.

What changes for the real client

Iteration log

One spec semantic resolved by the builder: the restore-on-unlock remembers the forced-from length only while the owner leaves the cat's length alone — if they step the length while the cat chip is active, that explicit choice wins and chipping back to power or sail keeps it. The pinned 14 → cat → 12 → power → 14 sequence is asserted as written.