The dome — mechanics
The fork in this look
The first interaction is touching the drawing: the vertex under a pointer or finger lights, its session title becomes the display word, its first portrait drops into the cell. "Touch a vertex" itself steps through the lit day's faces for touch and keyboard; / or any typed letter lands in the rule.
The doors weigh differently: reading moves only the scroll, the stage following whichever section head crosses the rule. Asking moves the stage first, then adds a numbered section atop the ledger. Answer 01 is baked at publish and labelled so.
"Or read the week in order" is a same-document view transition with the canvas under its own unanimated name, so the camera's move from Tuesday's 20° to Monday's 12° plays live rather than crossfading; pageswap and pagereveal carry the pose between pages.
The standard route
Nav is the ledger's lettered outline (A theme, B lineup, C days, D tickets, E place, F partners), one label-face line under the chrome sentence (on phones, the footer's first line), current letter teal; latitude names link to day pages. Each letter is a static page under the same stage, posed by the markup's data (days 12° to 40°, place 64° in plan). A speaker page holds that person in the cell; a session URL lights its vertex. Days fold at six rows like answer 01. Tickets stay two 34 px rows and the Eventbrite link; partners are tier rows, never a logo wall.
Asking the mind
The rule posts {message, mode: "standard", page}, page naming up to 12 on-screen ids (lit vertices, the cell's person, rows in view) for the surface note.
Thinking is a survey: on send the question becomes heading 02 and takes the stage, then a teal "+" sighting steps vertex to vertex every 90 ms, a latitude higher each turn, the camera yawing 8° a second. The first closed component resolves it into its pose; without one by six seconds it halts. say streams throughout.
- Text:
sayin the 400 italic, 54ch, unboxed;text_blockandfaqas one row; the stage holds. - Speakers: people rows; their vertices fill teal, the camera turns to their busiest day, the first portrait drops in;
speaker_cardis the cell itself. - Sessions: agenda rows, times pinned to their vertices;
session_cardis a touched vertex. - Agenda day: the band lights, the camera climbs to that day's pitch; a track fills only its squares.
- Venue: plan view, cell emptied, city names up, Austin lit; the venue gets its crosshair once located.
- Tickets: price rows by tier id; all four latitudes light at 40 %; a pass buys the whole dome.
- Choices: up to four phrases replace "It knows…", each sending itself; phones show them under the answer.
- Sources: the em-ruled mono line, page links and snapshot date;
partialadds "partly known",not_in_snapshot"not known yet". - Fallbacks: sanitizer-emptied components drop; a portrait-less session empties the cell; truncation keeps what closed; busy, unavailable or refused turns fall to the mock's keyword router, signed "composed without the mind", which also answers no-JavaScript posts to /ask; no WebGL gets an SVG stage baked per pose.
The assistant in the chrome
The composer is the rule: 1 px ink atop the ledger, along the stage's foot on phones, tickets at its right end. The mock's caret blinks forever (WCAG 2.2.2): hold it solid, colour the native caret teal. While streaming, "stop" sits left of tickets.
The edge-parked card is one label-face line at the stage's bottom-right, against the mask at 54 %: "asked here today — where to stay — not known yet", counted from router topics, since visitor text is never logged.
The state line is the footer's: "snapshot 2026-10-13 — 77 speakers — 50 sessions — sample data — mind on", or "mind resting".
Data, performance and accessibility
The fixture has 77 speakers (58 usable portraits), 50 sessions (13, 15, 13, 9 a day), four ticket tiers, 39 partners and eight FAQ; data.js and the face boxes derive from it. Whova must add the ETS27 programme with rooms (0 of 50) and descriptions (3 of 50) under an official credential; WordPress, the Event record with venue coordinates. The sync computes face boxes, self-hosts portraits with baked duotones (not 58 SVG filters) and draws the ground from ERCOT's published geometry.
Ten draw calls, rendered only when dirty. The vendored three.js is 397 KB gzipped: tree-shake or port to raw WebGL2 under 60 KB. The camera eases 0.075 per frame, twice as fast at 120 Hz: make it time-based. After the 2.3 s entry only visitors move anything; reduced motion gets end states, no sighting.
Keyboard: 50 hidden vertex buttons, roving tabindex, arrows along and between latitudes, focus drawn as the "+". The hover-driven word goes aria-hidden behind a stable h1 in the ledger; a status region announces each answer once. Teal text is 4.22:1 on the paper: teal type needs #1C7166 (4.77:1). Thursday's vertices sit about 20 px apart on phones, so taps snap to the lit day.
Build plan
Carries over: server.py's SSE contract, sanitizer, cached prefix, fallbacks and budgets (in production, the wiring's tested handler); the fixture and its builder; the seven components widened to the brief's catalogue; mind.html's stream reader, stop, timeout and status region, with the dome's rows for cards; from the mock, the scene, collision pass and keyword router.
New, in engineer-days: poseFor(component) and the sighting 3, static pages and transitions 6, access 2, SVG stage 2, sync 3, WebGL diet 2, edge line 1, QA 3; about 22.
Risks
"From $299" is the pre-fee base; buyers pay $320.89, and US all-in pricing rules likely cover event tickets: show that figure, confirm with Zpryme. A sighting that never lands reads as a spinner. ETS26's 68 sessions would crowd the latitudes past what the collision pass can label. Hotlinked portraits fail silently; three current-site images already return 401.