Waypoint — build notes The site Index

Generative Assets · site 418 · Industry demonstration

A page whose whole argument is a date.

Waypoint Occupational Therapy is a fictional Bassendean practice: four OTs, clinic, home and school visits across Perth’s east and north-east. Its audience is a parent whose school has just said “they should see an OT” and a daughter arranging a home assessment for her father. Both arrive frightened of two things — a waitlist and an unexplained bill — so the page answers both above the fold and books an initial assessment.

Why this converts

Five sentences, written for the business owner deciding whether to hire us.

1. The call button sits in the masthead, in the hero, and in a sticky bar that never leaves a phone screen, because an anxious parent converts on a phone call and every second tap on this page should be able to be that call.

2. The form asks five things and nothing else — name, phone, suburb, who the therapy is for, and clinic, home or school — because those five are exactly what the front desk needs to answer with a date, and every extra field is a person who closes the tab.

3. The proof element is availability, not a price calculator, because in allied health the competitor’s page says “contact us about our current waitlist” and yours says “Wednesday the 9th”; that single difference is the whole conversion argument for this trade.

4. The trust strip is specific rather than boastful — four OTs, since 2017, the therapist who assesses is the therapist who treats — because a parent is buying a relationship, and “award-winning” buys nothing.

5. The page publishes its own fees plainly and refuses to publish a single scheme figure, which reads as confidence rather than evasion: a practice that says “we will name the item and the amount in writing before we book” sounds like one that has never surprised anybody with a bill.

Why availability is the proof element

Most sites in this collection answer with money. This one answers with a day.

The obvious signature for a health practice is a fee estimator. It would have been the wrong build. A parent ringing five clinics is not weighing one fee against another — they are trying to find one that can see their child before the planning meeting. Capacity is the axis the market actually competes on, and it is the one thing nobody publishes.

So the drawn subject is a four-week roster: twenty working days for whichever of the three settings you pick, open days filled and dotted, taken days greyed, today ringed. It sits beside the headline at desktop and directly under the services grid on a phone, and it answers before a single scroll.

It is a published roster, and the page says so

The caption under the strip reads: “Sample roster. These cells are drawn from our published opening pattern, not from a live diary — a real site reads this straight out of Cliniko or Halaxy.”

That sentence is not a disclaimer bolted on afterwards; it is the reason the element is allowed to exist. A strip that implied live booking data on a demonstration page would be a lie about the most load-bearing thing on it. Saying what it is costs nothing and makes the claim underneath it — the worst-case wait — believable.

The arithmetic, and why the worst case can be stated as a fact

Each setting opens on a fixed cycle keyed to a fixed anchor (Monday 5 January 2026), counted in weekdays, so the strip is identical on every load of a given day and depends on nothing but the date:

SettingOpensOffsetWorst wait
Clinicevery 3rd weekday02 working days
Home visitevery 4th weekday13 working days
School visitevery 5th weekday24 working days

check-w52.mjs sweeps 520 consecutive weekdays and proves three things: those three worst waits are exact maxima, no setting can ever read “no availability”, and every twenty-weekday window the strip draws contains at least one open cell. That is why the page states the worst cases as facts rather than as a marketing promise — the shipped roster JS is the same rule, verified against the same reference on eight faked load dates including a Monday, a Friday, both weekend days and a year boundary.

What it exposes

window.__occupationaltherapy carries the strip state as plain numbers — setting (0/1/2), startWeekday, firstOpenWeekday, daysUntil, openCells, cellCount, weekendStart — so the verification harness reads state instead of scraping text, and every one of those figures is static from first paint onward.

What this page declined to publish

Every scheme figure considered during the build, and refused. If a number about a real scheme or regulator cannot be verified, it does not go on the page, and it does not get softened either — it gets declined and listed here.

No NDIS figure appears anywhere on either page. Not a price limit, not an item number, not a rule. The five fees on the site are Waypoint’s own private prices and are labelled as such. NDIS-funded work is described as a mechanism only: billed to the participant’s plan for the item, self-managed and plan-managed welcome, and the item named in writing before anything is booked.

  1. The hourly price limit for therapy supports in the NDIS pricing arrangements.
  2. The support item number for occupational therapy assessment, and for therapy delivery.
  3. The support item number and the rule covering report writing and other non-face-to-face time.
  4. The provider travel rule, and any cap on claimable travel time.
  5. The short-notice cancellation rule, its notice period and its charge.
  6. Remote and very remote regional loading percentages.
  7. Plan-management fee items — establishment fee and monthly fee.
  8. Whether registration is or is not required to serve a self-managed or plan-managed participant, and any claim that this practice is a registered provider.
  9. NDIS registration group numbers, the audit cycle, and the practice-standards module names.
  10. Any figure from the assistive-technology or home-modification funding tiers.
  11. The Medicare chronic-condition allied-health item number, and the number of subsidised allied-health sessions available in a calendar year.
  12. Private-health and veterans’-scheme rebate amounts for occupational therapy.
  13. The national practitioner register’s name, alongside a placeholder registration number — the footer carries a visibly patterned OT0000000 and names no regulator.
  14. Any state education-department threshold or policy figure governing therapist access to a classroom.
  15. Any normative cut-off score, percentile or age band from a named standardised assessment.
  16. Any statistic about other Perth practices’ waitlists — including the ones that would have made the headline land harder.

Two of those are worth calling out. The last one was tempting: “the average Perth paediatric OT waitlist is N months” would have been the strongest sentence available, and there is no source we could stand behind, so the page argues from its own published roster instead. And the thirteenth is the quiet one — a fictional practice quoting a real regulator beside a fake registration number is exactly the kind of plausible-looking detail that makes a demonstration dishonest, so the regulator is not named at all.

Palette

Chalk and raspberry — deliberately not clinic blue and not nursery pastel. Every ratio below is measured, quoted from the occupationaltherapy rows of contrast-w52.log, and every token declares the grounds it is allowed on.

Paper #F3F6F4the page ground
Panel #E3EBE7cards, bands, map land
Ink #16211C15.22:1 on paper · 13.64:1 on panel
Muted #47574F7.03:1 on paper · 6.31:1 on panel
Raspberry #A831535.98:1 on paper, and paper on it
Open green #1F60456.85:1 on paper · 6:1 on an open cell
Slot open #DCEAE2ink on it 13.33:1
Slot taken #CBD4CFink on it 10.93:1
Slot today #F7E3E8raspberry on it 5.3:1
Chip sub-labelpaper at 86% on raspberryblended #E9DADD — 4.81:1
Hairline #BFCFC71.49:1 on paper · 1.33:1 on panel
Field #63756C4.5:1 on paper · 4.03:1 on panel
Map water #C2D8D6coast mark on it 3.13:1
Map coast #5B7A783.85:1 on map land

Why these

Paediatric allied health defaults to two palettes: clinical blue, which reads as a hospital and frightens the exact parent this page is written for, and primary-colour nursery pastel, which reads as childcare and loses the adult home-assessment half of the practice entirely. Chalk green is neither — it is a consulting room with the blinds open. The raspberry carries the brand mark, the CTA and the today ring and nothing else; the open green carries open slots and nothing else. Two accents, each with exactly one job, which is why an open cell reads instantly without a legend.

Two tints minted during the build, both measured

Only two colours were added that the wave sweep did not already declare, and both are hover darkenings of the raspberry, so contrast strictly improves rather than degrades:

MintedWhereMeasured
#8E2946primary button hoverpaper on it 7.55:1 (rest state 5.98:1)
#9C2D4Dselected chip hoverpaper on it 6.66:1; the 86% sub-label on it 5.34:1 (rest state 4.81:1)

Three candidate treatments were measured and rejected during the hardening pass because they fell below their threshold or landed on an undeclared ground: a taken-cell dash drawn as ink at 38% opacity over the taken fill, which blends to #86908B and measures 2.17:1 against a 3:1 mark threshold; the map’s “HILLS” label set in the coast colour, which is declared as a 3:1 mark and would have been 3.85:1 text; and a 54%-opacity outer ring on the clinic marker. The dash and the ring were deleted rather than recoloured — the strip reads perfectly well with fill and dot alone.

Type

One warm serif with a job, one workhorse with everything else.

Fraunces 600 sets the headline, the wordmark, the section headings, the big working-days figure and the date numerals inside the strip cells. It is a soft optical serif with enough wobble to feel human and enough structure to avoid reading as a children’s brand — which matters, because a quarter of this practice’s work is an adult daughter arranging rails for her father, and a bouncy rounded face would lose her.

Inter 400/500/600 does body, labels, form fields, the day abbreviations and every number that has to be scanned rather than admired. Body is 17px at 375, and the scale is deliberate rather than doubled: 10 / 12.5 / 13.5 / 14.5 / 16 / 17 / 18 / 19 / 30–50, with the two ends belonging to the strip cells and the hero.

The one typographic move is the working-days figure: the numeral set in Fraunces at up to 56px, baseline-aligned with a 12.5px uppercase unit label and a 16px sentence naming the actual date. Nothing else on the page comes near that size, so the answer to the visitor’s real question is also the largest thing in the frame. When the answer is zero the numeral is replaced by the word “Today” at a smaller size, because a large 0 reads as a failure state.

Technique

No libraries, no build step, no raster images, no request beyond two font files.

The strip is an inline SVG built in the DOM from the roster rule: twenty <g> groups, each a rounded <rect>, a day-or-month label, a date numeral, and — on an open day — a 3px green dot. A cell that opens a new month replaces its day abbreviation with the month abbreviation, because the column already tells you the day and nothing else would tell you that “1” means October. Today, if today is a weekday, gets a 2.6px raspberry ring; on a weekend the strip simply starts on Monday and the sentence says so.

There is no animation loop anywhere on this page. The only motion is CSS: a 620ms rise on the hero and the strip card, and a 420ms fade per cell staggered 16ms apart when the setting changes. Both are finite CSS keyframes, so they are wall-clock by construction and cannot be stretched by a thin frame budget — the failure mode that shipped a nearly-empty preview elsewhere in this collection. Everything is settled well inside a second, every probe field is byte-identical at 7 seconds and 15 seconds, and prefers-reduced-motion: reduce collapses both to nothing.

The service-area map is hand-plotted SVG: a stylised Swan as a 26px round-capped stroke with a dashed centreline, a dashed hills edge, eight suburb marks and the Bassendean clinic drawn as a ringed target. The tick marks in the why-us row and the favicon are inline SVG too. Total payload is two HTML files and two font families.

The three passes

Each pass drove the enquiry form — empty, then filled — and drove the strip through all three settings, asserting daysUntil against the roster rule in check-w52.mjs. All driving was done in headless Chrome against a private port, with the load date faked so the roster could be tested on days that are not today.

Pass 1 — Craft

The masthead was 18px too wide at 375, measured rather than guessed: wordmark 146.0px + phone pill 132.4px + Book button 60.8px + two 9px gaps = 357.1px inside a 339px content box. Dropping the CTA out of the masthead would have been the easy fix and the wrong one, so instead the sub-wordmark went from 9.2px/0.145em to 8.5px/0.115em and the header buttons from 13.3px to 12.4px with tighter padding — 129.1 + 119.5 + 52.6, which fits with room to spare and keeps the whole phone number visible on a phone. Both sizes step back up above 560px.

The last row of the strip read 29, 30, 1, 2 with nothing anywhere saying those last two were October. Month-change cells now name the month in place of the day. The hero’s two buttons were ragged at different widths below 480px and now share the full column width, which also makes them fatter tap targets.

Driven: 8 faked load dates × 3 settings = 24 strip states asserted against the reference roster; form empty (5 field errors, error summary shown, no confirmation) and filled (confirmation shown, 0 errors).

Pass 2 — Depth

The confirmation panel was a thank-you note; it now answers with the actual first open day for the setting the visitor chose in the form, read from the same roster function the strip uses. That is the second-read detail: choose “home visit” in the form and the confirmation names a different date than the strip was showing, because the strip was showing the clinic. Asserted in the harness — a filled submit with setting=home on a faked Tuesday 8 September confirms Wednesday 9 September, which is the home roster’s first open cell, not the clinic’s.

A measurement then forced a better decision. At 1200×750 — the frame the collection’s thumbnails are cut from — not one dollar figure was inside the frame: the fee line sat at the bottom of the strip card at y 853, and the services grid sits in the second grid row at desktop. Rather than shrink the card, the fee line moved above the roster and became setting-dependent, so it now reads “Initial assessment $340 at the clinic” for clinic and “Initial assessment at home $385 — the $340 assessment plus travel from $45” for home. The visitor gets the date and the price in the same glance, and the arithmetic behind the second one is shown rather than asserted. The school line deliberately refuses to add its two numbers together, because the total is not a licensed figure.

The funding section was rewritten from a paragraph into three claims a reader can check against their own experience — we name the item before booking, funded work is billed to the plan, this page publishes no scheme figures and here is why. The zero-day case got its own treatment: the numeral becomes the word “Today”, and on a weekend the strip starts on Monday and the unit label says “working days from Monday” rather than pretending a Saturday is a business day.

Driven: the form re-submitted for each of the three settings and the confirmation date checked against firstOpenOffset each time; the strip re-driven on a Saturday and a Sunday to confirm the sentence, the missing today-ring and the weekendStart flag all agree; the fee line asserted to differ across all three settings and to contain no unlicensed total.

Pass 3 — Hardening

Every blended and scene colour was computed by hand and checked against its threshold. Three failed or were undeclared and all three were removed rather than retinted — the 38% taken-cell dash at 2.17:1, the coast-coloured map label, and a 54% ring on the clinic marker. Losing the dash is also the excess ornament this pass is supposed to delete: fill plus dot already says open, and the legend says it in words.

The legend was three CSS squares, and the “open” one at #DCEAE2 was nearly invisible against the card’s #E3EBE7. It is now three miniature SVGs drawn with exactly the cell’s own geometry — fill, dot and ring — so the legend and the strip are the same object at two sizes.

375 / 768 / 1440 all re-measured for horizontal overflow element-by-element rather than by scrollWidth alone; the sticky bar checked for a real tel: link and a real in-page form anchor; focus-visible rings checked by tabbing twelve stops and reading the computed outline at each; the setting chips driven by keyboard as well as by mouse; both pages scanned for typographic quotes inside attribute delimiters. Console is clean on every viewport and every faked date, and the two files are 57 KB and 33 KB.

Driven: 3 viewports, 8 load dates, 24 strip states, 4 form submissions, 12 keyboard stops, a reduced-motion load, and a 1200×750 screenshot at 7 seconds inspected by eye — the page is at rest, every probe field is identical at 7 s and 15 s, and all 295 px of the strip’s height sits inside the frame (top 431, bottom 726).

Local SEO we’d implement for the real business

This page ships only WebPage and CreativeWork schema, both naming it a demonstration. Publishing LocalBusiness or Review markup for a business that does not exist would put fiction into a real search index. For a real practice, this is what we would ship — shown here as an escaped code sample, never as a live script.

{
  "@context": "https://schema.org",
  "@type": "MedicalBusiness",
  "name": "<the practice>",
  "medicalSpecialty": "OccupationalTherapy",
  "address": { "@type": "PostalAddress",
    "streetAddress": "<real street address>",
    "addressLocality": "Bassendean", "addressRegion": "WA",
    "postalCode": "6054", "addressCountry": "AU" },
  "geo": { "@type": "GeoCoordinates", "latitude": "<lat>", "longitude": "<lng>" },
  "telephone": "<real number>",
  "areaServed": ["Bassendean","Bayswater","Morley","Guildford",
                 "Midland","Ellenbrook","Mundaring"],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday"],
      "opens": "08:00", "closes": "17:00" }],
  "aggregateRating": { "@type": "AggregateRating",
    "ratingValue": "<from the live review feed>",
    "reviewCount": "<from the live review feed>" }
}

Alongside it: a Google Business Profile with the real address and hours, the same NAP block byte-identical on the site, in the profile and in every directory listing, an FAQPage block generated from the six FAQs already on the page, and suburb landing pages only where the practice genuinely serves them — a Mundaring page for a practice that will not drive to Mundaring is a page that ranks and then disappoints.

What would change for the real client

The strip stops being a pattern

The single biggest change. A real practice runs on Cliniko, Halaxy or Splose, all of which expose appointment availability by practitioner and appointment type. The strip reads that at build time or through a cached endpoint refreshed every few minutes, the caption changes from “sample roster” to a real timestamp, and clicking an open cell starts the booking rather than scrolling to a form. The honest caption exists precisely so that upgrade is a change of source, not a change of claim.

The rest

  • Photography. The clinic room, the therapy gym, the four therapists’ faces. A parent choosing a person wants to see the person; the procedural map stays, the drawn placeholders go.
  • Reviews. Pulled live from the Google Business Profile, with the Review markup that this demonstration correctly refuses to fake.
  • The form. Posted into Cliniko as an enquiry, with an SMS acknowledgement, and routed by setting so school visits land with the therapist who does school visits.
  • Fees and funding. Driven from the practice management system so the page and the service agreement can never disagree, with the scheme figures — correct, current and sourced — living in the agreement where they belong rather than on a landing page.
  • Registration and insurance. Real numbers, real regulator, in the footer, where the demonstration carries a visible placeholder pattern and names nobody.