Tour Dash
Report · 2 September 2026

The Landing Page

Until today a logged-out visitor was redirected straight to /login. Tour Dash had no front door at all. It now has one: a dark, WebGL landing page composed from the GetLayers library and skinned entirely in the estate amber kit. It is built and verified locally and is not yet deployed.

Route / for logged-out visitors Status V1 pinned, V2 built at /v2 Deployed No
01

What it is

Every page in the GetLayers model is compositions plus one style plus assets. The style is Obsidian Luxe, chosen because its own description reads like our kit written by a stranger: near-black ground, warm platinum ink, a single restrained gold rationed to one action per screen. Its colour roles were then overridden with our exact validated hexes, so nothing on the page is a GetLayers colour.

SectionCompositionWhat it does
LoaderHouse choreographyA counter that tracks real readiness and parks at 92 until the shader has actually drawn a frame. It leaves on the true signal at about 1.4s, with a 6s cap so a stall can never trap a visitor.
Herogring-x-heroHeadline high-left in the map's empty upper field; a bottom band carrying the pitch and the one amber call to action on the left, and a four-cell fact grid on the right.
How a job gets coveredhelion-timelineFour stations on a shared baseline: post it, they apply, you pick, it's covered.
What's coveredhelion-servicesFour cells pushed to the far left and right edges so the contour map breathes through the open channel between them.
Who goesclarix-featureA full-height left column on choosing who opens your client's door; the right half is left open for the scene.
Closenegantropy-persistThe page switches from corner-loaded to dead centre, which is what signals arrival and gives the last action its authority.
02

The scene, and why the amber is where it is

The hero runs one WebGL scene: a living topographic contour map, drawn as glowing iso-lines over a height field that flows and re-forms. It was chosen over the prettier gold-corona option because it actually means something here. It reads as territory and demand density, which is the business.

The re-tint is the part worth understanding. The obvious move was to make the whole map amber. That would have been wrong, because the kit reserves amber for the primary action, and a glowing amber field directly behind an amber button destroys the one thing the accent is for. So the contour lines take the warm platinum ink ramp, and the accent lands only on the sparkle dots, where it reads as demand points scattered across a map. There is exactly one amber action per surface on the finished page.

Three changes were made to the library scene, all outside its artwork shader. Two of its three render passes were rendering empty targets and adding black to the result, so they were removed, which saves two full-screen passes a frame and lets the canvas keep a real alpha channel so our own void shows through instead of the scene's hard-coded black. And its entrance now runs on time the page was actually visible rather than wall clock, so a tab opened in the background no longer burns its camera move unseen.

The first pass came out too soft, and the fix is worth recording because it is counter-intuitive. Every contour line is drawn as a crisp antialiased core wrapped in a halo, and the halo's falloff was set wide enough that it out-weighed the core, so the field read as haze rather than as drawn line. Pulling the halo back and tightening its falloff is what made the contours sharp. It also helped legibility rather than hurting it, because a tight line covers far fewer pixels behind a glyph than a soft one does.

03

The page has no numbers on it, deliberately

The plan included a statistics band with four counting figures. It was cut, and this is the one thing on this page that needs your decision.

There is no traction figure anywhere in the repository that could honestly be printed. No jobs-covered count, no agent count, no median fill time, no rating. Tour Dash has never had a landing page, so there is nothing to cite. Inventing four confident-looking numbers would have been the easy way to fill the section and would have put false claims in front of every visitor, so the section came out instead.

Everything that did stay is verifiable against the code. The nine job types and the three families they collapse into come straight from opportunity-adapter.ts. Give me four real figures and the composition drops back in above the closing call to action without disturbing anything around it.

04

How it was verified

05

Two things to decide

The display type is scaled well past the text-2xl heading rule in the design conventions. That rule governs the dashboard shell, where it is right, and a hero headline set at text-2xl is not a viable landing page. Sentence case and the tight tracking are kept. Say the word if you want that rule read literally everywhere.

The footer tagline is rendered in sentence case to match the design conventions. The commit that introduced it capitalised it as "Every Showing. Every Task. We got you Covered." One of the two should give.

06

Review: what the page does not yet do for this market

The page sells the mechanism well — post it, they apply, you pick, it's covered. What it does not yet do is answer the two questions an agent actually decides on. Ranked by how much each one is costing us.

#FindingWhy it matters here
1Nothing proves anyone is near youLiquidity is the whole decision in a local marketplace. An agent in a county with no supply gets nothing, so "nearby" is a promise the page never backs. The hero is literally a map and it carries no real information — the single biggest available upgrade is making that map mean something, whether that is named markets, a ZIP check, or real recent jobs.
2The best trust asset is unusedEvery agent account already requires a brokerage name and a licence number, contractors supply a trade licence, and there is a working ratings and reviews system. The section headed "You choose who opens your client's door" raises the objection and then answers it with only "every application shows you who is asking." The real answer is far stronger and it is already true.
3No price anywhereAn agent cannot evaluate this without knowing what it costs them or what Tour Dash takes. The page says the fee is "yours" to set and never mentions the platform's own economics.
4Only one side has a doorSign-up already supports a contractor account type, but the landing page speaks exclusively to agents. Supply is what makes finding #1 true, and right now nobody is invited to be supply.
5"Browse contractors" is mislabeledIt promises a directory and delivers the sign-up account-type picker. Either the label or the destination has to change.
6No navigation on a phoneThe section nav is hidden below the medium breakpoint with nothing in its place. This audience works from a phone in a car, so that is the primary case, not the edge case.
7Speed is never claimedCoverage is usually urgent — a showing this afternoon, an inspection tomorrow. If same-day coverage is real, it is the emotional benefit and it appears nowhere.
8The hero fact grid is vague"Yours", "Nearby" and "Wallet" are one-word abstractions. A skimming agent gets nothing concrete from three of the four cells.
9The real objections go unansweredHow does the person get in, lockbox or Supra or a key handoff; what happens on a no-show; who carries liability. These are the questions that decide it, and there is no FAQ.
07

The line weight bug, and the measurement that found it

The contours still read soft after the first sharpening pass, and the cause turned out to be a resolution bug rather than a taste decision. The shader derives its distance to the nearest contour from screen-space derivatives, which means the line width is specified in device pixels. On a 2× display a width of 1.5 draws a line 0.75 CSS pixels across, thinner than a hairline, which is exactly what reads as blur. The reference on getlayers.ai renders at 1×, so it never showed the problem. Both the line width and the halo falloff now scale with the live pixel ratio, so the line has the same apparent weight on every display.

One claim made during that pass was wrong and is worth correcting. The scene measured about 50fps and that was read as a cost of the mesh. Hiding the canvas entirely produced the same 50fps, so the ceiling was the ultrawide display and browser overhead, and the scene was costing nothing measurable. Desktop therefore keeps the full mesh. Touch devices still get a quarter of the vertices, not because a phone was measured — it could not be, from here — but because a phone GPU is a different machine and the reduction is invisible at that screen size.

08

What changed after the review

Four of the nine findings are fixed. The biggest one is blocked, and the reason matters.

FindingStatusWhat was done
Trust asset unusedFixedThe section now says the real thing: every agent registers a brokerage and a state license number, contractors register their trade, every finished job ends in a review, and you keep the people you trust in your own directory. One claim was corrected during the build — the contractor trade licence field is optional in sign-up, so the copy says "their license number where they hold one" rather than implying every contractor carries one.
Only one side had a doorFixedA supply-side band invites people who want the work. It is deliberately a quiet card rather than a full beat, so it cannot compete with the closing statement under it.
"Browse contractors" mislabeledFixedThe directory is behind auth, so the label is now "Create an agent account" and matches where it actually goes.
No navigation on a phoneFixedA real menu below the medium breakpoint, with all four sections reachable.
Vague hero fact gridFixed"Yours / Nearby / Wallet" replaced with concrete, verifiable statements. Nothing about payment is claimed, because the payout rail is still Phase 2.
Nothing proves anyone is near youBlockedThe plan was to plot real jobs on the hero map so liquidity becomes the visual itself. An anonymous client currently reads zero listings, so the landing page cannot show real work today. It also should not show exact addresses of live jobs on a public page. See below.
No price anywhereOpenUndecided, so nothing is claimed. This is now the top open item.
Speed never claimedOpenNeeds a fact about how fast coverage actually happens.
No FAQ for the real objectionsOpenKey and lockbox access, no-shows, liability.
09

Why the real-jobs map is blocked, and what would unblock it

Querying the database as an anonymous visitor returns an exact count of zero rows. Whether that is row-level security doing its job or simply an empty table, the outcome for a logged-out landing page is identical: there is nothing to plot. Building the map anyway would have produced an empty map, which proves the opposite of what it is meant to prove.

Two things are needed before it can ship, and the second is not optional. First, a way for a logged-out page to read the data at all, either a public view of anonymized open jobs or a small server endpoint that queries with a service key and returns only what is safe. Second, the positions have to be rounded to the town or ZIP centroid rather than the street address. These are live listings at real homes belonging to real clients, and a public marketing page is not the place to publish where they are and when nobody will be there.

10

V2: the product, shown

V1 is pinned as landing-v1 and still serves /. V2 lives at /v2 so the two can be read side by side. The weakness it fixes is structural rather than cosmetic: a visitor could finish V1 having never seen the thing they were being asked to sign up for.

So V2 changes the macrostructure and keeps the style. V1 was manifesto-first, a statement over an abstract map. V2 is split-narrative: the argument scrolls on the left while the application itself stays pinned on the right, swapping to the screen each step is describing. The contour map is demoted from subject to ground, and hands off to the real opportunity map, which is the same idea rendered in earnest.

StepThe screen it pins
01 Post what you can't coverThe create screen, with all nine service types visible, which is what makes the "nine job types" claim something you can see rather than something you have to believe.
02 It appears on the map near people who can take itThe opportunity map over Paterson, with showings and inspections carrying their own mark, and the radius the results were filtered to drawn on it.
03 You read who applied, and you decideMy Listings, with real applicant counts and a "view applications" action.
04 It lands on both calendarsThe calendar with confirmed appointments for the month.

Every screenshot is a real capture of the running application at /demo, which uses fictional data, and the page says so rather than leaving a visitor to work it out. That is also the only honest source available: real listings are live jobs at real clients' homes, and a public marketing page is not the place to publish them. Captured at 2× and served as webp: four screens, 367KB in total.

No fake browser chrome anywhere. Drawing a window frame with traffic lights is a way of faking a screenshot, and we have the real thing, so the shots sit in a plain bezel with a light catch and nothing else.

11

Two rules V1 was quietly breaking

Building V2 against the design checklist surfaced two failures in V1 that had gone unnoticed, and one of them affected every visitor on a phone.

Verified at 320, 375, 768, 1024, 1440 and 1920: no horizontal scroll at any width, the call to action above the fold at every width, and the pinned panel showing the correct screen at all four steps. tsc and the production build run clean, and impeccable detect reports nothing.

12

The spine showed the wrong screen for 15% of the scroll

Reported from reading the page, not from a test: the pinned panel kept showing the previous step's screen while the words had already moved on. It was real, it was measurable, and the cause is worth writing down because the broken version is the obvious one to write.

The panel picked the active step inside an IntersectionObserver callback. That callback only receives the elements whose intersection actually changed. When the step that had just become centred was not among them, there was nothing to select, so the panel held whatever it was already showing. That is why it read as stuck rather than merely late.

Measured over a continuous scroll of the sectionWrong screen on display
Before15%, in long stretches rather than brief flickers
After0% at a realistic scroll cadence

It is now driven by scroll and measures every step against the centre of the viewport on each pass, coalesced into one animation frame. Reading four rectangles is cheap, and the observer keeps the one job it is genuinely good at: telling the loop to stop when the section is nowhere near the screen.

The timing itself was also wrong, separately. The crossfade ran for 700ms, so the outgoing screen stayed the more visible of the two for about 350ms after each crossover, and the panel read as trailing the words even once the selection was correct. It is 420ms now.

13

Reshooting the screens, and why the first fix made it worse

The screens in the spine were cut off. They were viewport crops of a scrolling page, so the map was sliced through the middle, its legend lost a family, and the listing cards ran off the bottom edge.

The first attempt at legibility made that worse rather than better. The panel cropped each shot to 16/10 and then magnified a region of it, on the reasoning that a shot captured at 1800px and shown at 700px had spare resolution to spend. It did, and the type did get bigger, but the magnification cut away more of each screen than the original crop had. Legibility bought with cropping is not legibility on a page whose whole argument is that the picture matches the words.

What actually binds is height, and that took a while to see. The panel is pinned inside a viewport-height box, so a near-square shot renders small no matter how wide the column is, and the app's 14px interface type goes with it. The app's pages are tall, so a screenshot of a whole page is always near-square. Two changes together fix it:

StepWhat you can now read in it
01All nine service types, complete, under their own heading.
02The whole map, its legend, "9 jobs found", and the radius the results were filtered to, drawn as a circle.
03"3 applicants" and "View applications 3", beside the line about reading who applied.
04The month with its confirmed days marked, and 8 total against 3 confirmed.

Four smaller things came out of doing it. The "view full size" control moved out from over the screenshot, where it collided with the app's own floating button on the calendar screen and where a pill laid over a product shot reads as though it belonged to the product. It was also hover-revealed, which on a touch device means never. The full-size view now scrolls on a phone instead of shrinking to fit, so it is a real magnification rather than the same size again. And one line of copy came down: step 02 no longer names three service families, because the sample market has no admin job open and the legend in the picture shows two.

The framing rules and the anchor for each screen are recorded in scripts/capture-marketing-shots.mjs, so the next reshoot does not have to rediscover them. Verified: no wrong-screen samples anywhere in the section, no horizontal scroll at 320, 375, 768, 1024, 1280, 1440, 1920 or 2560, no shot taller than the viewport it sits in, and the full-size view still takes focus on open and returns it on Escape.

14

V3: the background stops being a texture and becomes a place

V2's background was a procedural contour field. It was handsome, and it could have belonged to any product on earth. That is the thing worth naming, because it is the difference between a nice page and a page that could only be this company's: V3 replaces it with the actual market, and scrolling flies across it.

Every line in it is real, and that was the condition for doing it at all.

LayerSource
RoadsOpenStreetMap, via Overpass. 14,066 ways, 35,666 points after simplification. Route 24, I-78, the Garden State Parkway, and the residential grid of every town.
ContoursTraced from SRTM-derived elevation with marching squares. 5 m to 197 m of real relief, which is the Watchung ridge and the Rahway valley.
PinsThe sample market's own jobs, in the same two channels the application uses: hue for the family of work, fill for whether an agent or a contractor can take it.

The rhythm is fly, arrive, hold, fly. The camera travels in the connective sections and holds almost still behind the four steps, because there the pinned screenshots are the subject and a moving map would be a third thing competing for the same attention. Hovering a pin names the job, so the label appears because a reader asked what a dot is rather than because the page decided to tell them.

Two sections got better without being rewritten. The handoff line "the same map, from inside the app" now has something to refer to. And the section that names the three families of work has a map behind it demonstrating exactly that, in exactly those colours — which also retired the one place the brand's amber was being spent on decoration rather than on the primary action.

What it costs
Map data254 KB, 149 KB gzipped, fetched in parallel and not in the JS bundle
Frame time16.7 ms median, 17.3 ms p90 over a full scroll at 2× on an M2 — a locked 60 fps
Draw callsOne per road class. The whole county is six objects.

Four decisions are load-bearing and two of them come from earlier scars on this project:

Legibility was the risk, and it was measured rather than eyeballed: the glyphs are made invisible, the background behind them is photographed, and every text run is scored against what is actually behind it. 54 runs, none below its contrast floor, worst margin 1.35×. The first pass of that measurement was wrong in a way worth recording — it hid the whole content layer, which also hid the text veils that are the thing being given credit for.

15

The sample market moved to Short Hills

The demo had been set in Passaic County since it was relocated there from New York. It is now Short Hills and the towns around it: Millburn, Summit, Springfield, Livingston, Maplewood, Mountainside and Chatham.

This was not only a background change, and that is why it is worth its own section. The pins on the landing page are the sample market's real jobs, and the product screenshots show those same jobs, so moving the map without moving the market would have left three surfaces disagreeing with each other. All 26 jobs moved, along with the agents and contractors who post them and every string derived from them: applications, transactions, notifications, the areas people say they cover, and three brokerages that had been named after Paterson landmarks.

What was checked
Geography is realEvery ZIP is a Census ZCTA and its coordinates are that ZCTA's own internal point. Every street named in a listing is a real street in that town, taken from OpenStreetMap. Nothing was invented to sound plausible.
The five-mile rule holdsThe demo's location filter searches five miles from the user's own ZIP. The furthest job is 4.86 miles out, so they all still appear.
Nothing was left behindA search for the old market returns nothing, and every /demo route renders with no errors.

One thing improved by accident. The new market has an admin job open where the old one did not, so the opportunity map's legend now shows all three service families instead of two — which means the page can go back to naming all three, having been softened to two when the picture could only prove two.

A copy pass ran alongside it. "Everything you'd have driven across the county for" was a fragment with no subject, and after the move the county was the wrong noun as well. The hero now carries the tagline, held to two lines by breaking it at the sentence rather than wherever the width happened to run out. One line in the trust section was claiming an application shows more than it does, and now says what the card actually carries: a name, a rating, the reviews behind it, and whatever the applicant wrote.