The skin of the programme — mechanics
The fork in this look
The poster prints two verbs of unequal weight. Type heads a 730 px rule across the bottom right; Scroll ↓ is one label line under the head. The first interaction is focus (a click, /, or typing on the poster): the head turns 17° toward you and reprints against its new silhouette before you ask.
Both routes share one document: scrolling reads it in order; asking rearranges it, each answer a numbered section above the dates screen. The mind owns the first screen; the standard route, the rest.
When an answer finishes, a view transition carries the question from the rule into the section's heading while the poster leaves through a 16-step noise mask, never a crossfade. Between pages the band holds still (view-transition-name: band).
The standard route
- Nav: the band (ETS27, six-entry index, dates, orange Tickets); on phones the index wraps rather than vanishing.
- Pages: the long page, plus a static page per section in the same grammar (
/lineup,/programme/tuesday); partners (absent today) become a tiered ledger of names. - Agenda: four columns under the numerals 3 4 5 6, rows anchored by session id.
- Speakers: the contact sheet over the 77-name ledger; each speaker page prints a portrait from their session titles.
- Tickets: Bitcount prices, phase and fee lines, one Eventbrite link and the not-published footnote, from the snapshot.
Asking the mind
Type on the rule or pick a verb; Enter sends; stop replaces the verbs mid-stream. Thinking is the material emptying: the head keeps facing you as its interior falls to the 1.8 % ghost, leaving the rim. say streams in orange at width 75 where you asked (the intro's slot on the poster); each ui event adds its records' words to the head (one reprint per 400 ms at most); done reprints from the sanitised answer and the head turns back. Answer 01 stays precomposed per snapshot, seeded server-side into each session so "and Wednesday?" follows on.
Record-bearing components print into the head first, then render as rows linking to their page.
- Text:
saywith a footnote number;faqas the site's question at 500 over its answer at 300. - Speakers:
speaker_gridas a contact-sheet cut over ledger rows, meant names lit orange in the lineup;speaker_cardadds portrait, bio and sessions. - Sessions: rows as in answer 01;
session_cardopens one with description and people. - Agenda day: the day's label line and rows; a track filter prints "6 of 15".
- Venue: the mockup's place rows, "not announced" until
venue.statuschanges. - Tickets: tier rows and Eventbrite.
- Choices: verbs along the closing rule.
- Sources: the renderer-owned numbered footnote, adding "sample data" for any placeholder record.
Fallbacks: off_topic is one unnumbered line in the card, no reprint; not_in_snapshot prints the nearest real thing (student rates: the tiers and the not-published list); emptied components drop; errors keep the prototype's codes and leave the question on the rule. With the proxy down, the mockup's rule-based composer, rewritten to emit {say, ui}, answers and says so.
The assistant in the chrome
- The rule: caret, hairline, verbs, no box. On the poster and closing the answers it sends
mode: "mind"; in the band,/swaps the index for a rule (mode: "standard", the surface note naming the section and on-screen ids). - The edge-parked card: band answers must not move the reader. A 320 px hairline-framed card flush right under the band: numeral, streaming say, "read it as 03 ↑", and "marked in the programme ↓" when rows were lit in place. Non-modal and untimed; full width under the band on phones.
- The state line: the label line over each rule, read by one polite status region ("03 reading the programme"); the footer says "mind resting" when health checks fail.
Data, performance and accessibility
The fixture holds everything the head and rows print (77 speakers, 50 sessions, tickets, venue, partners, FAQ), all flagged placeholder. Still needed: base prices (the fixture has only fee-inclusive ones) and one phase 2 date (Government 19 November, Industry 20); from Whova, rooms, descriptions (3 of 50) and permission to re-host 33 portraits; seven unconfirmed FAQ answers. Visitor text is never logged, so "asked on this page" becomes a staff-written WordPress field fed by not_in_snapshot counts.
Motion: one loop, only while the poster is visible; 1.3 s per reprint; the SVG develop on numeral and heading only, never a whole article. Without WebGL2 the left half is black today: bake a per-breakpoint light map for the dates screen's 2D painter, plus a no-JS still. Reduced motion: one frame, instant reprints, no transitions.
Keyboard: /, type-to-ask, Escape, and visible focus (the mockup strips outlines). Screen readers: the canvas stays hidden (its words are in the page); summarize() announces each answer once. Unmeant names dim to 2.4:1; 50 % cream gives 4.6:1.
Build plan
Carries over: server.py (stream, cache, sanitiser, sessions, budget, guards, self-test), the fixture and builder (not the mockup's position-indexed copy), the seven-component catalogue, and the renderer spine (streamAnswer(), reconcile(), summarize(), mergeIntoPage()); from the concept, both WebGL2 passes, compose(), setRun(), setStream(), the dates painter, filterLineup(), bake-portraits.py and the rule-based composer.
New: speaker_card, session_card, agenda_day, faq, sources, coverage; the page-aware surface note; streamFromUi(); empty-and-refill, holding the turn until done; band rule, card, state line, keys; static pages; fallbacks. Effort: a local demo in three days; about three and a half weeks of front-end work beside the shared backend; a sculpted bust adds a week.
Risks
- Below the poster, reprints happen off screen; the state line carries them.
- A 40-word answer about one person repeats seven times in the head's 300-word figure; tickets and venue borrow refund and travel text.
clean()keeps 54 glyphs, so a non-Latin name vanishes from the skin.