The loom — mechanics
The fork in this look
The page opens woven. The fork is the line under the words: "Read the cloth in order ↓" anchors to the theme band; "or weave a question…" focuses the fell, as do / and any key typed with nothing focused. Band 01 is a stored real answer, regenerated per snapshot and rendered server-side: free and indexable.
Reading is the heavy route: the whole cloth, static, no model call. Weaving starts light. A question from the first screen moves to /weave in a view transition that holds beam and warp still, unweaves the structural bands right to left and glides the question into band 02's head. Bare warp is the empty realm; each band costs one turn, about a cent warm. "Read the whole cloth ↓" weaves the structure back below the answers.
The standard route
The beam is the nav. Pages are stretches of one cloth on one warp: /lineup/ the 77 band with every tag, /agenda/ the day bands, /venue/ the Austin band, /partners/ a cream band of names by tier, since logos aren't loom material. Cross-document view transitions keep the warp still between pages. A speaker's tag opens their band, thread pulled through their wefts; a weft opens its session in place; the $320.89 band goes to Eventbrite.
Asking the mind
The composer becomes a real <input> in a <form role="search">; Enter, the printed verb and the suggestion verbs submit POST /api/mind with mode: "mind".
On phase: thinking the question heading the new band re-voices glyph by glyph from typed (MONO 1) to spoken (CASL 0.6, slnt −5), once, over a band not yet filled. text deltas grow the say line; each ui event brings its threads over the band and drops their beads, the rest passing under. The first component with sessions sets the fill: a single hue group's hue, otherwise cream. done reconciles by position.
- Text:
sayis the only slanted, casual text in a band; site-written FAQ answers and bios take the linear cut. - Speakers: beads on their own threads in running order, at most three rows, full-height knots for missing portraits;
speaker_cardpulls one thread through the page and adds title, organization and bio. - Sessions: weft rows over a 6 px bar in the track hue, ticked at the speakers' threads;
session_cardadds description, room and moderators. - Agenda day: a day band with its numeral. Band 01 is
agenda_dayas a filter,{track: "ai-digital"}across days: the renderer derives its 12 sessions and 23 people, past the prototype's caps of 10 sessions and 12 speakers. - Venue and tickets: their weft words, "Austin" and the cheapest live price, which the renderer computes ($374.25 from November 20).
- Choices replace the suggestion verbs on the rule: the next weft.
- Sources: the typed footnote, built from source ids, snapshot date and the sample marker, which the model cannot remove.
- Fallbacks:
not_in_snapshotandoff_topicweave a cream band over every thread, the nearest real thing in say; errors unweave the band and append nothing; with the proxy down at boot, the mockup's regexcompose()is the labelled demo.
The assistant in the chrome
On the read route the fell is the assistant, in flow under the first screen, then fixed at every screen's foot, sending mode: "standard" with the rows in view. The merge rules become gestures: records on screen pull their threads, a list dims its other wefts (the track key by session id), a section re-weaves once, anything else weaves a band after its related band, and links navigate or register. Off-screen answers park in the fell's right-edge card ("02 · after Tuesday ↑" over its hue stripe); text-only answers unfold upward from it. The verb is the state line, the one role="status": weave, weaving 02, woven 02 ↑, still thinking (8 s), try again (25 s), resting.
Data, performance and accessibility
The fixture already draws the loom: speakers, sessions, days, tickets, FAQ and placeholder flags; its 77 speakers in order of first appearance reproduce the mockup's warp exactly; thread indices, day spans and hue groups are derived per snapshot. Whova and WordPress must add a theme per session (the seven fixture tracks are invented; otherwise bands stay cream), portraits for the 19 knots, descriptions (3 of 50), rooms and the Event record.
SVG and DOM, no WebGL; Recursive in two self-hosted axis subsets; portraits self-hosted at 80 × 100. Motion: entry 3.2 s then released, one 800 ms weave and 600 ms shuttle per band, 150 ms pulls, only the caret loops; reduced motion gets end states, no transitions.
The 77 hero names leave the tab order for one ordered list; focus pulls threads like hover; each answer band is an <article> named by its question. Cream on sky is 2.38:1, under 3:1 even at 188 px, so every weft word's fact also stands in ink (7.09:1) beside it.
Build plan
Carries over from prototype/: server.py (SSE events, one-hour cached prefix, sanitizer, append-only sessions that never trust client assistant turns, budget, guards, self-test), the fixture, the catalogue, and the renderer skeleton of mind.html and standard.html (type map, reconcile, frame reader, mergeIntoPage, ?demo=1). From the mockup: rows(), weaveIn, the pull, the track key, the fell's docking.
New: agenda_day filters, speaker_card, session_card, faq, sources, coverage, the page note and a page-pinned snapshot version; loom renderers; /weave and transitions; the fell's states; consented device storage; standard pages and the phone layout jurors found broken. About four weeks for one engineer, most of it renderers and pages, before the Next.js port.
Risks
- 147 speakers, ETS26's real count, halve the 18 px pitch; names become texture.
- A schedule edit can move every thread; page and conversation must share one snapshot version.
- "Asked here today" implies stored questions, yet no text is logged: label an editor's question honestly, or decide retention.
- Kept bands re-render on return but cannot resume the conversation.