Generative Assets · Industry demo build notes

Counterweight Crane Hire — how it was made

A fictional Kewdale mobile-crane wet-hire operator, built as a single conversion-focused landing page. The visitor is a builder, pool company or homeowner who needs something heavy put somewhere awkward; the page’s one job is a booked lift or a free site check. Every visual is procedural — SVG, gradients and type, no photographs.

01Palette — hardstand noon

Argued from the yard at midday: sun-bleached concrete, boom steel in shadow, the stencilled counterweight, and the laminated load chart on the cab door. Signal red on warm concrete — deliberately distinct from scaffolding’s safety-orange-on-sky and every other wave palette.

#EFEDE8Hardstand concrete — the ground everything sits on
#33312DLattice iron — boom steel in shadow; structure and primary ink
#C43A2CCounterweight red — line/mark duty only: chart curve, arcs, CTA. Never body text
#39648EChart blue — the grid’s secondary: links, focus, active chips, working point

Derived inks per the collection’s ink/line split: #9A2B1F red-ink and #2E5175 blue-ink for small text (≈6.5:1 and ≈5.9:1 on concrete), #6A6459 soft body ink (≈5:1). The bright red stays on lines, fills and the one primary button.

02Type

Saira Semi Condensed — the stencil voice

Libre Franklin carries body and UI — plain, legible, trade-brochure honest.

JetBrains Mono: 25 t · 16 m · $1,300 — every tonne, metre and dollar

Saira’s semi-condensed cut in heavy caps reads like plant stencilling without being a novelty face — it IS the counterweight lettering. Franklin stays out of its way. The mono carries every number on the page so capacities and prices read as instrument output, not marketing.

03The Lift Planner — signature

Load chips (trusses 0.8 t / pool shell 2.5 t / spa 3.5 t / plant 1.2 t), a 6–26 m radius stepper and a dogman toggle drive a procedural SVG lift elevation: the pick-and-carry drawn with its boom telescoping to the chosen radius over a single-storey house profile, the load slung under the hook, the radius chalked on the concrete, and a laminated load-chart panel in the corner with the red capacity curve, the dashed 90% plan line and the working point plotted live. The whole scene is one innerHTML-built SVG group; positioning lives on outer <g transform> wrappers while CSS animates inner elements only (load sway, chalk pulse — never the same node that carries an SVG presentation attribute). First render gets the entrance stagger; subsequent chip/stepper redraws re-animate only the boom, load, chalk and chart under 600 ms, and the static scenery doesn’t re-fade.

The card under the scene is the honest half: crane class, chart capacity at the radius, utilisation, the plan-limit rule, the metered price, and — when the maths demands it — the step-up to the 60-tonner with the reason written out. The chart-honesty line ("the crane’s actual load chart on the day is the law") is always on-card. The planner’s spec pre-fills the booking form.

04The capacity model — derivation & measured figures

Illustrative of a 25 t pick-and-carry class per the spec: capacity ≈ min(25, 90 / radius) tonnes; the 60 t slew runs min(60, 260 / radius). Figures are indicative and the page says so on-card. On top of the chart sits a 90% plan margin: the planner never books a lift past 90% of chart. That margin is how real hire desks plan (a lift above ~90% is critical-lift territory), and it is also the only reading under which the spec’s own worked example computes — at 24 m the 25 t chart holds ≈3.8 t, which would technically “hold” a 3.5 t spa, but the spec’s card text says the spa needs the 60 t there. With the 90% margin (plan limit ≈3.4 t) it does. Documented correction, not a guess.

radius25 t chartplan @90%60 t chartwho lifts a 3.5 t spa
6 m15.0 t13.5 t43.3 t25-tonner, 23%
12 m7.5 t6.8 t21.7 t25-tonner, 47%
16 m5.6 t5.1 t16.3 t25-tonner, 62%
20 m4.5 t4.0 t13.0 t25-tonner, 78%
22 m4.1 t3.7 t11.8 t25-tonner, 86% — plan edge
24 m3.8 t3.4 t10.8 t60 t — past the plan limit
26 m3.5 t3.1 t10.0 t60 t — past the chart itself

Two more documented decisions. Displayed rounding: the spec’s illustrative “at 26 m ≈ 3.4 t” truncates 90/26 = 3.46; the page displays one-decimal rounding, ≈3.5 t — the measured figure ships. Pool shells past 20 m: the services grid promises “over two storeys or past 20 m it’s honestly a 60 t job”, but a 2.5 t shell never crowds the 25 t chart inside the stepper’s range — the constraint is boom height over the dwelling, not tonnes. So the planner carries an explicit height rule (pool shell + radius > 20 m → 60 t, with the boom-height reason on-card), keeping the signature and the services copy telling one story.

05The pricing model — shape & verification

  • 25 t pick-and-carry: $230/hr × 4-hr minimum = $920, + metro travel $190 each way = $380 the round trip → half-day all-in $1,300. Every load type shares this meter — the load changes the crane, never the rate. That flatness is deliberate and stated on the page.
  • 60 t slew: $340/hr × 6-hr minimum = $2,040 + $650 establishment = $2,690. It floats in, so there is no travel line — the establishment replaces it, said on-card (spec-pinned meter inheritance).
  • Dogman/rigger: $98/hr, billed for the crane’s minimum hours — 4 hr on the 25-tonner (+$392), 6 hr on the 60 (+$588). The spec pinned only a 4-hr minimum; billing the crane’s day is the honest resolution (a dogman doesn’t go home at hour four of a six-hour lift) and it’s documented on-card.
  • Floor contract: the planner’s cheapest output — any load at short radius, dogman off — is measured at $1,300, equal to the services grid’s “lifts from $1,300” floor. Asserted in the harness against an independently reimplemented oracle across 28 load × radius scenarios, plus the dogman totals ($1,692 / $3,278) and both step-up rules.
  • Worked examples, measured: trusses (0.8 t) @ 14 m → chart ≈6.4 t → 25-tonner, $1,300 ✓ (matches the spec’s arithmetic). Rest state: pool shell @ 16 m → ≈5.6 t chart, 44% utilisation, $1,300 showing ✓.

06Conversion decisions

  • Planner beside the h1, price card inside the first 750 px at 1200 wide — the signature shares the thumbnail viewport with the value proposition; the working figure ($1,300) is the first number a visitor reads.
  • Two CTAs above the fold at 375 (book + call), header tel:, and a fixed call/quote bar with ≥48 px targets on mobile — crane emergencies are phone calls.
  • Form fields match how a lift is actually booked: name, phone, suburb, a real type=date (min today) for the lift date, load select synced with the planner chips, “over what?” and access notes — the two questions every hire desk asks first. The planner’s spec line rides along read-only.
  • Local confirmation only — “we’d call you back within two business hours”, echoing the spec, suburb and date. No fake network round-trip.
  • Honesty as trust strategy: wind stand-down, power-line exclusion zones, the free site check that would rather say no on the phone — the trade’s real risk vocabulary is the credibility.

07Local SEO we’d implement for the real business

This demo ships only WebPage schema naming it a demonstration — fictional structured data in a real index is dishonest markup. For a real operator we’d ship LocalBusiness + Review schema like this (shown here as a code sample, not emitted):

Would-ship JSON-LD (sample)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Real Crane Hire Co",
  "telephone": "+61-8-xxxx-xxxx",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Kewdale",
    "addressRegion": "WA",
    "postalCode": "6105",
    "addressCountry": "AU"
  },
  "areaServed": "Perth metropolitan area",
  "openingHours": "Mo-Sa 06:00-17:00",
  "priceRange": "$$",
  "review": {
    "@type": "Review",
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "author": { "@type": "Person", "name": "Real Customer" },
    "reviewBody": "Genuine review text from a verified job."
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.9",
    "reviewCount": "87"
  }
}
</script>

Plus: Google Business Profile with service-area suburbs, per-service landing sections with honest price anchors (exactly as this page models), and review capture wired to the job-completion event.

08What would change for the real client

  • Assignar — crane and crew allocations behind the booking form, so a request lands on the actual calendar.
  • SafetyCulture (RIIHAN-aligned lift-plan templates) — the documented lift plan generated from the same radius/load inputs the planner captures.
  • Geotab — float and crane tracking; “the crane’s 20 minutes out” SMS beats any status page.
  • MYOB/Xero — hire invoicing off the docket, with the same meter lines the planner shows.
  • VOC / induction records — verification-of-competency on file per operator, licence numbers real instead of placeholders.
  • Podium — review flow replacing the demo reviews with a live feed.
  • Their photos and drone footage could replace nothing structural — the procedural scene stays as the planner; photography would join the reviews and trust strip.

09Iteration log

PASS 1Craft

  • Headless harness (puppeteer, port 6802): 27 asserts — rest state, oracle match across 28 load×radius scenarios, floor contract, dogman totals, both step-up rules, pre-fill, fresh-load empty submit (4 fields invalid), filled submit confirmation, FAQ, 375 fold/masthead/sticky bar, reduced motion, zero console errors. All green — but the screenshots found what the asserts couldn’t:
  • Chalk label collision: the morning-check caption (“10 m — checked 6:12am”) sat on the same baseline as the live “r = 16 m” label and the two overprinted into garbage. Moved the caption to its own lower row.
  • Chart panel vs boom tip: at 6 m radius the boom tip grazed the laminated chart panel’s corner — shrank the panel 8 px and re-mapped the plot axes.
  • Planner-head aside wrapped to two lines at 375 — shortened to “Chart + price, live”. Boom pivot floated above the chassis — drew the turret under it.

PASS 2Depth

  • Drove everything by keyboard as well as dispatched clicks: chips, radius stepper, dogman toggle, FAQ — all operable, focus visible.
  • Added the utilisation-coloured working point: blue while comfortable, red above 80% of chart — asserted spa @ 22 m reads 86%, “plan edge” wording on-card, red point on the curve, then steps up to the 60-tonner at 24 m with the margin arithmetic written out.
  • Dual-speed redraw fixed: the first build re-faded the entire scene on every stepper tap (the step-up screenshot caught the scene mid-refade — blank). Static scenery (ground, house) now skips the re-animation entirely; only boom, load, chalk and chart re-enter, under 600 ms. Asserted the ground group carries no animation class after a redraw.
  • Second-read details kept: the 6 m chalk note (“tight yard, watch the tail swing”), the stencilled CWT block, the 6:12am check arc.

PASS 3Hardening

  • 7-second thumbnail settle screenshot reviewed at 1200×750: hero + planner + $1,300 card all inside the frame, scene mid-demonstration; chalk pulse opacity floor asserted ≥0.4 at the capture instant.
  • 375 full-page: no horizontal overflow, masthead wordmark/phone edges measured apart, sticky bar targets ≥48 px. Mobile price-card tail wrapped with a line-height gap — set the tail display:block under 640 px.
  • Chanel rule: removed the 20 m ghost chalk arc (ground was getting busy at long radii); one morning arc remains.
  • Reduced-motion path renders the settled scene, no sway/pulse, hero at full opacity. Drive-then-diff liveness green. Zero console errors across all three passes.

Counterweight Crane Hire is a fictional business — a mobile crane hire industry demonstration. Phone number in the reserved demo pattern, licences and ABN placeholders.

Designed & built by Sapience Analytics — part of the Generative Assets collection. Techniques: procedural SVG scene built per-state in JS, CSS keyframe micro-motion split from SVG attributes, no libraries, no rasters. ← Back to the site · Index