Halewood Migration

Generative Assets · Industry Demos · how it was made

How the Halewood Migration demo was built

Halewood Migration is a fictional firm of registered migration agents on St Georges Terrace in Perth — skilled, employer sponsored, partner, student and business innovation visas, for people already in WA and for the employers bringing them here. The page exists for the Malaga fabricator whose best welder is on a 482 that expires in November, the WA Health nurse going 482 to 186, and the Como couple lodging an 820. Its single job is a consultation booking with the visa, the service level and the people on the application already priced — professional fees to the whole dollar, government charges declared and never marked up.

The Pathway Planner

The signature is a lodgement sheet drawn in SVG: an open passport at the left with a gold crest and a green subclass stamp, small figure marks for the people on the file, and a ruled route running left to right with a numbered roundel at each stage of the visa. Every control redraws the sheet and reprices the file from the pinned anchors.

Pinned anchors — professional fees, GST inclusive, whole dollars

VisaSubclassesFull representationStages drawnDocument reviewEOI & skills support
Skilled points-tested189 · 190 · 491$4,2005$850$1,900
Employer sponsored482 · 186$5,4004$850skilled only
Partner820 · 801$5,8004$850skilled only
Student500$1,6004$850skilled only
Business innovation188$14,5005$850skilled only
Partner on the applicationfull representation only+$900a figure mark$0$0
Each child on the applicationfull representation only+$450a figure mark$0$0

The child loading multiplies the actual child count; the partner loading is flat; the visa fee is flat per application and nothing multiplies by the visa. Every rate is a whole dollar and every stepper grid is a whole unit, so no total in the model can be non-integer — the whole-dollar display is arithmetic, not rounding. There is no empty state: a visa chip and a service-level chip are always selected, and the children stepper floors at zero.

Worked examples, measured from the running page

Each row was driven with the full control vector set explicitly — visa, service level, partner and children — and checked against an oracle that reimplements the model independently. The exhaustive sweep covers all 110 reachable cells (5 visas × 3 service levels, skipping EOI on non-skilled visas, × 2 partner states × 5 child counts).

VisaService levelPartnerChildrenMeasured totalFamily note / declaration
Skilled (rest state)Full representationon2$6,000note: includes $1,800 for your partner and 2 children on the same application
StudentFull representationoff0$1,600note absent
PartnerFull representationdisabled1$6,250note: includes $450 for 1 child on the same application
Any visaDocument reviewon3$850declaration: $0 — one review fee, whatever the family size
SkilledEOI & skills supporton2$1,900declaration: $0 — your partner and children go on the same EOI
Business innovationFull representationon4$17,200note: includes $2,700 for your partner and 4 children on the same application
Employer sponsoredFull representationoff3$6,750note: includes $1,350 for 3 children on the same application
SkilledFull representationon0$5,100note: includes $900 for your partner on the same application

The cheapest output of each branch is the corresponding "from" figure in the fees grid — document review $850, EOI & skills support $1,900, student $1,600, skilled $4,200, employer sponsored $5,400, partner $5,800, business innovation $14,500 — and the overall cheapest output, $850, is the floor of the grid. The page cannot argue with itself.

Locks, forces and remembered values

What prints wherever the total prints

Two declarations are always on: the Department of Home Affairs charges line and the payment split. They appear beside the total in the ledger, in the plain-text mirror screen readers get, and as full sentences directly beneath the sheet; below 641 px each swaps to its pinned short form ("DHA charges at cost", "half on engagement, half at lodgement"), and the family note swaps to "+$1,800 family". The ledger and the mirror always carry the full template at every width. The confirmation panel repeats the government-charges line, because that is where a client would otherwise assume the quoted figure was everything.

Palette — bone lodgement paper, a navy passport, a green approval stamp, gold foil

Every ratio below was measured in Pass 1 with WCAG arithmetic against the tokens the page actually ships, read from the live custom properties in the browser, not from the spec.

Bone paper#F2F1EB
The page ground: a lodgement bundle on a solicitor's desk. Cards sit on it in plain #FFFFFF, banded sections in #EAE8DE, hairlines in #E4E1D6.
Visa navy#1D2B4F
Body ink and the primary CTA. 12.28:1 on the ground, 13.90:1 on white cards, 11.32:1 on the band, 12.85:1 on the drawn sheet. White labels on the navy fill measure 13.90:1, and 15.89:1 on the #16213E hover.
Approval green#1F7A5C
The stamp, the inked route, chip outlines, the secondary CTA. White labels on it measure 5.25:1 (6.98:1 on the #19654C hover). As text on the ground it is only 4.64:1 — so it never sets small type.
Green ink#116049
The pre-minted deeper twin for every green word on the page: 6.64:1 on the ground, 7.52:1 on white, 6.12:1 on the band, 6.51:1 on the green wash, 6.95:1 on the sheet.
Slate#4C5670
Secondary copy and scene captions: 6.46:1 on the ground, 7.31:1 on white, 5.95:1 on the band, 6.76:1 on the sheet, 5.68:1 over the map's ocean fill.
Foil gold#C79A3F
2.28:1 on the ground — so it is a mark, never type and never chrome: the passport crest, the stamp card's foil edge, the map's CBD star, and the sponsor figure's outline.

The service-area map obeys the same rule: its suburb labels are set in the body navy with a ground-coloured halo (paint-order: stroke) and measure 10.79:1 over the ocean fill and 8.06:1 where a label crosses the Swan River band; the "St Georges Tce office" and "Regional WA by video" labels use the green ink at 6.95:1, and the rotated "Indian Ocean" label uses the slate at 5.68:1 against the ocean fill. The greyed, not-yet-ours stage labels on the sheet are #6E6A5C at exactly 5.00:1. The error ink #9A2A1A measures 7.72:1 on white, and the form's placeholder ink #646C82 5.02:1 on the field fill — placeholders are not content, but a demo page that shows a worked example in the placeholder should let you read it. The footer's body and quiet inks measure 9.93:1 and 7.62:1 on the navy.

This palette is held off the cream-plus-terracotta AI default by the navy and by a green rather than an orange accent, and off the broadsheet default by having no hairline column rules anywhere — the page's structure is the drawn pathway.

Type

$6,000 · Skilled
Newsreader 600 — a document serif with reading-room warmth, argued from statutory paper and forms rather than from a law-firm Trajan cliché. It sets the h1, every section head, the totals and the stage numbers. The typographic moment is the rest-state total set huge above the sheet: $6,000 · SKILLED · FULL REPRESENTATION, in caps with positive tracking so the figure reads as a docket line rather than a headline.
Registered migration agent MARN 0000000 — fees in writing before we start.
Public Sans — literally a government-form workhorse, which is exactly the register a migration page wants: neutral, legible at 16 px on a phone, and unbothered by long strings of subclass numbers. It carries all body copy, every control, the ledger, the map labels and the scene captions.

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 agency must not mark itself up as a real one, and fictional reviews must never become structured review data. For the real client we would ship the block below. schema.org has no migration-agent subtype, so the top-level type is ProfessionalService — an actual organisation type in the LocalBusiness family — with the specialty named through additionalType, knowsAbout and a hasOfferCatalog. Reviews would come from the live Google Business Profile feed, with the client's consent, never hand-written.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "ProfessionalService",
  "additionalType": "https://www.wikidata.org/wiki/Q17102529",
  "name": "Halewood Migration",
  "description": "Registered migration agents in Perth — skilled, employer sponsored, partner, student and business innovation visas.",
  "url": "https://www.example-halewood.com.au/",
  "telephone": "+61 8 9000 0371",
  "image": "https://www.example-halewood.com.au/office.jpg",
  "priceRange": "$$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Level 9, 000 St Georges Terrace",
    "addressLocality": "Perth",
    "addressRegion": "WA",
    "postalCode": "6000",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -31.955, "longitude": 115.856 },
  "areaServed": ["Perth", "Joondalup", "Malaga", "Midland", "Victoria Park", "Fremantle", "Rockingham", "Mandurah", "Western Australia"],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "08:30", "closes": "17:30" }
  ],
  "knowsAbout": ["skilled migration", "employer sponsored visas", "partner visas", "student visas", "business innovation visas", "skills assessment", "SkillSelect expressions of interest"],
  "hasCredential": {
    "@type": "EducationalOccupationalCredential",
    "credentialCategory": "Registered Migration Agent",
    "recognizedBy": { "@type": "GovernmentOrganization", "name": "Office of the Migration Agents Registration Authority" },
    "identifier": "MARN 0000000"
  },
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Migration services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Document review" }, "priceSpecification": { "@type": "PriceSpecification", "price": "850", "priceCurrency": "AUD", "description": "flat professional fee, any visa, any family size" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "EOI & skills-assessment support" }, "priceSpecification": { "@type": "PriceSpecification", "price": "1900", "priceCurrency": "AUD", "description": "flat professional fee, skilled visas" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Skilled points-tested visa — full representation" }, "priceSpecification": { "@type": "PriceSpecification", "price": "4200", "priceCurrency": "AUD", "description": "from; Department of Home Affairs charges at cost" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Partner visa (820/801) — full representation" }, "priceSpecification": { "@type": "PriceSpecification", "price": "5800", "priceCurrency": "AUD", "description": "from; Department of Home Affairs charges at cost" } }
    ]
  },
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "168" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Real client, with consent" },
      "datePublished": "2026-06-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 St Georges Terrace suite pinned and the consult link wired; "registered migration agent Perth", "482 visa Perth", "partner visa Perth" and "skilled visa WA" as the page's core phrases with the suburbs above as secondary; NAP consistency across the professional and community directories that migration clients actually search; and a reviews feed that updates without anyone touching the page. We would also publish the Department's current charge schedule as a dated page rather than baking figures into the landing copy, so the honest "at cost" promise stays true after 1 July.

What changes for the real client

Iteration log

Two things the concept left to composition were resolved here. The stamp card's anchor is a constraint, not a coordinate: the sheet reserves the box x ≥ 430, y ≤ 270 in scene units and nothing drawn is ever composed into it — every drawn element sits either left of x 285 or below y 356 — which is what makes "never over the drawn subject" survivable at 641 px, where the fixed-pixel card is 41 % of the sheet's drawn width. The concept's figure cap was the other one: its enumeration (you, your partner, up to four children) sums to six marks rather than the five the line labelled it, so the sheet draws six and the caption counts the file honestly. And the phone layout is a second composition rather than a crop — the proportional route is honest at any width, but below 641 px it stops being legible, so it stacks.