noneid is a dynamic website built around a live, operator-controlled interaction between two people who never need to meet: a Visitor who types into the site, and a Site Owner / Operator who watches that typing arrive in real time over a socket and then decides, with a single click, how the visitor's session ends — with an error message or with a success page.
The product intent is a live-interaction instrument. The visitor's keystrokes are streamed over a socket connection to an operator panel, where they appear as a live monospace log and as a generative visual field. The operator monitors the incoming input and, at any moment, fires one of two outcome controls: an ERROR control that delivers an error message to the visitor, or a SUCCESS control that delivers a success page to the visitor. The visitor sees the result of that decision on their own screen.
The audience is the site owner — a tinkerer, a maker, someone who wants a small instrument that feels alive and slightly uncanny. The experience is deliberately staged as surveillance-as-theatre: the visitor's own typing becomes the artwork, and the operator is the curator who ends the piece.
This document specifies the current delivery of that product: its pages, its real-time socket behavior, its two personas, its flows, and its visual and motion direction.
noneid is a single web application with a real-time backend. It has two human participants and one relay service:
The application is delivered as a dynamic website with custom first-party UI on every page. There is no account creation, no login, and no differentiated permission model: the operator panel is a first-party page reachable directly, and the visitor pages are anonymous. Identity continuity is not required by any accepted journey — the shared live session, not a user account, is what binds the visitor's typing to the operator's decision.
Current delivery. The current product is the complete live loop described above: a visitor types, the typing streams over a socket to an operator panel, the operator sees it live, and the operator clicks one button to deliver an error message or a success page to that visitor. Everything in this document is current unless it appears in a future section.
Access ownership. All six pages are first-party application pages. The Landing page, the Visitor Input page, the Error page, the Success page, and the Visitor Outcome page are anonymously reachable — a visitor never creates an account to type or to receive an outcome. The Operator Panel is likewise a first-party page reachable directly; the accepted requirements establish no account, login, or role gate for it, and none is inferred here. The shared live session is the binding mechanism between the two participants, not an identity system.
Real-time ownership. The live relay is application-owned backend work. The backend socket service accepts the visitor's typing events, forwards them to the connected operator panel, and forwards the operator's selected outcome back to the visitor's session. The operator panel must remain connected for the outcome to be delivered.
Explicit boundaries. This product does not include visitor accounts, operator accounts, authentication, authorization roles, chat between visitor and operator, message history or transcripts persisted beyond the live session, file upload, payments, or any capability beyond live typing capture and the two operator-triggered outcomes. Nothing in this document should be read as authorizing those adjacent capabilities.
Not applicable. No reference directive in this project declares a content_source, so no source content inventory is produced.
The page inventory below is the final page contract for this project: Landing, Visitor Input, Operator Panel, Error, Success, Visitor Outcome.
LIVE SOCKET // 0 CLIENTS with a pulsing accent dot) and the current connection state of the relay.OPEN VISITOR VIEW — a hard-edged accent control that takes the user to the Visitor Input page. OPERATOR PANEL — an outlined control that takes the user to the Operator Panel page.SUCCESS — a full-width hardware-style bar in the accent colour that delivers the success page to the visitor. ERROR — a full-width hardware-style bar in the alarm colour that delivers the error message to the visitor.TRANSMITTING… before an outcome fires.FR-1 — Live keystroke streaming to the operator. As a Site Owner / Operator, I should see what the visitor is typing arrive live over a socket connection, so that I can watch a stranger think in real time.
FR-2 — Visitor typing surface with live feedback. As a Visitor, I should type into a live input field that visibly responds to my own typing, so that I can see myself being watched as I write.
FR-3 — Backend socket relay. As a system, the backend socket service should relay visitor typing to the operator panel in real time, so that the accepted live-capture journey is executable.
FR-4 — Shared live session. As a Visitor and as a Site Owner / Operator, we should be joined by an active shared session before live input and outcome delivery can occur, so that the operator's decision reaches the correct visitor.
FR-5 — Deliver an error message to the visitor. As a Site Owner / Operator, I should be able to click a button to give the visitor an error message, so that I can end the session with a failure outcome based on what they typed.
ERROR control on the Operator Panel while a visitor session is attached.TRANSMITTING…, the error message is delivered over the socket, and the visitor's screen shows the Error surface with that message.FR-6 — Deliver a success page to the visitor. As a Site Owner / Operator, I should be able to click a button to say success page, so that I can end the session with a success outcome based on what they typed.
SUCCESS control on the Operator Panel while a visitor session is attached.TRANSMITTING…, the success result is delivered over the socket, and the visitor's screen shows the Success surface.FR-7 — Operator panel remains connected to deliver the outcome. As a Site Owner / Operator, I should stay connected to the relay so that the outcome I choose actually reaches the visitor, so that my decision is not silently lost.
FR-8 — Visitor receives the operator's error message. As a Visitor, I should see the error message the operator sent me, so that I know the outcome of my input.
ERROR control for this visitor's session.FR-9 — Visitor receives the operator's success page. As a Visitor, I should see the success page the operator sent me, so that I know the outcome of my input.
SUCCESS control for this visitor's session.FR-10 — Visitor outcome state is owned truthfully. As a Visitor, I should have a single consistent record of which outcome was delivered to my session, so that the Error and Success surfaces never disagree about what happened.
FR-11 — Explain the live interaction before participation. As a Visitor or Site Owner / Operator, I should understand from the Landing page what the live visitor interaction is and that an operator controls the response, so that I know what I am entering.
Product context. The operator is the person who owns and runs noneid. They are a tinkerer and a maker who wants a small instrument that feels alive and slightly uncanny — something they can open, watch, and end with one click. They are not managing a queue of customers or a support inbox; they are watching one stranger think in real time.
Primary goal. To watch a visitor's typing arrive live and then decide, with a single click, how that visitor's session ends — with an error message or with a success page.
Distinct accepted responsibilities. The operator is the only participant who reads the live keystroke stream, the only participant who reads the session gauge and typing-velocity sparkline, and the only participant who fires an outcome. They hold the decision authority in this product: the visitor types, but the operator decides. They must also keep the panel connected, because an outcome fired into a dead connection never reaches the visitor.
Relevant inputs and decisions. Their inputs are the incoming keystroke events, the keystroke count, and the typing velocity over time. Their decision is binary and irreversible for the session: SUCCESS or ERROR. They read the monospace confirmation line to know the outcome is transmitting.
Interactions with other accepted participants. The operator never speaks to the visitor directly. Their entire relationship with the visitor is mediated by the socket relay: the visitor's typing arrives, and the operator's decision returns. The operator's action is the sole cause of the visitor's Error or Success surface.
Observable success. The visitor's screen shows the outcome the operator chose, and the operator's panel confirms the transmission.
Product context. The visitor is an anonymous person who arrives at noneid and types into the live input field. They have no account, no profile, and no prior relationship with the site. They are, knowingly or not, the subject of the piece: their typing is the artwork the operator is watching.
Primary goal. To type into the site and see what happens as a result.
Distinct accepted responsibilities. The visitor is the only participant who produces the input that drives the entire product. They type, they see their own typing reflected in the live frame around the field, and they receive the outcome the operator chooses. They cannot choose their own outcome — that authority belongs entirely to the operator.
Relevant inputs and decisions. Their input is the text they type and the rhythm at which they type it, which drives both the live frame colour and the operator's velocity sparkline. Their only decision is whether to keep typing or to return to the input page after an outcome.
Interactions with other accepted participants. The visitor never sees the operator. They experience the operator only as the arrival of an error message or a success page on their own screen.
Observable success. The visitor sees the resulting response to their input — either the operator's error message or the operator's success page — and can start again.
LIVE SOCKET // 0 CLIENTS with a pulsing accent dot, and the headline WATCH THEM TYPE. DECIDE WHAT HAPPENS. sits flush-left with a single body line beneath it.OPEN VISITOR VIEW and arrives at the Visitor Input page.#4DD8FF toward hot magenta #FF3D6E in real time with their typing speed, so the visitor can see themselves being watched.OPERATOR PANEL.ERROR control — the full-width hardware-style bar in the alarm colour #FF3D6E at the bottom of the instrument cluster.TRANSMITTING… before the outcome fires.SUCCESS control — the full-width hardware-style bar in the accent colour #E8FF4D at the bottom of the instrument cluster.TRANSMITTING… before the outcome fires.The visual direction is Data made physical: the visitor's keystrokes as a living sculpture, after the muse Refik Anadol. The headline idea: the product's core is literally data made visible — each keystroke is a data point arriving live over a socket, rendered as a generative, luminous flow. The operator panel is a museum-grade instrument; the visitor's typing is the artwork; the operator is the curator who ends the piece.
| Role | Token | Value |
|---|---|---|
| Background (void ground) | --bg | #050508 |
| Surface | --surface | #0D0D14 |
| Text | --text | #F2F0EA |
| Primary / accent (SUCCESS, live-status pulses) | --primary | #E8FF4D |
| Accent (ERROR, alarm state) | --accent | #FF3D6E |
| Muted (labels only) | --muted | #6E6E7A |
| Field flow — slow typing | --flow-slow | #4DD8FF |
| Field flow — rising speed | --flow-fast | #FF3D6E |
| Field flow — high speed | --flow-high | #8A5CFF |
| Hairline borders | --hairline | rgba(255,255,255,0.08) to rgba(255,255,255,0.14) |
The near-black void ground #050508 carries everything. Surfaces are a barely-lifted #0D0D14 with 1px luminous borders at 8% white. The generative keystroke field renders in a multi-hue flow that shifts with input velocity — cyan #4DD8FF at slow typing, hot magenta #FF3D6E and violet #8A5CFF as speed rises. UI chrome stays monochrome so the field is the only colour. #E8FF4D is the single hot accent, reserved for the operator's SUCCESS control and live-status pulses; #FF3D6E is the ERROR control and the alarm state. Body text #F2F0EA on #050508 gives approximately 19:1 contrast. Muted labels #6E6E7A are used only at 14px and above, uppercase with letterspacing, and never for body copy.
clamp(40px, 8vw, 104px); section heads clamp(28px, 4.5vw, 48px); panel labels 11px uppercase 0.18em; body 16px/1.6; data rows 13px JetBrains Mono.Museum-instrument geometry: perfectly circular gauge rings for the live keystroke meter (SVG stroke-dasharray, no rounded rectangles pretending to be dials), thin 1px luminous hairlines at 8–14% white, hard-edged full-bleed canvases with no border radius on the generative field, and small 2px radii on controls so they read as hardware, not as app cards. Panels are flat planes separated by hairline rules and negative space — never floating glass cards with drop shadows.
The hero is a full-bleed generative canvas at 100vw/100vh with UI text overlaid in the corners, not on top of the flow's densest region. Below the fold, a strict 12-column grid with a 64px gutter at 1280px, collapsing to 4 columns at 375px. The operator panel is a two-zone split: left 60% is the live keystroke stream as a monospace log with a scrolling vertical rule; right 40% is the instrument cluster (session gauge, typing-velocity sparkline, and two oversized outcome controls stacked). The visitor input page centres a single wide field on the void with the live field wrapping it as a thin frame, never behind the text.
The imagery is the data: a full-bleed WebGL particle/fluid render whose input is the live socket stream — no stock photography, no device mockups, no illustrated characters. Secondary imagery is generative too: a horizontal keystroke-density ribbon, a radial session gauge, a sparkline of typing velocity. The only non-generative visual is the monospace log text itself, treated as an artefact.
Centred headline + subtext + blue button hero compositions; gradient-blob backgrounds and mesh-gradient decoration; grids of identical hover-lift cards with soft shadows; glassmorphism panels with blurred white fills; any blue/indigo primary (#0057FF, #2563EB, #4F46E5, #6366F1, #7C3AED) on a white ground; Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins or system-ui for any text; stock photography of people, device mockups, or flat clip-art illustration; playful bouncy easing, springy hovers, or cartoon micro-interactions. The generic indigo/blue-on-white SaaS template is forbidden for this project.
The gallery wall with an instrument on it.
The public entry is a full-viewport near-black canvas (#050508) where a slow luminous particle field breathes in the middle-right third of the screen, its colour shifting from cyan #4DD8FF toward magenta #FF3D6E as typing velocity rises. The field is masked out of the lower-left quadrant so text contrast is untouchable.
In the top-left corner, an 11px uppercase tracked label reads LIVE SOCKET // 0 CLIENTS in #6E6E7A with a pulsing #E8FF4D dot — a live instrument readout of the relay's connected clients.
In the bottom-left, a flush-left headline in Space Grotesk 300 at clamp(40px, 8vw, 104px) spans up to 9 columns — WATCH THEM TYPE. DECIDE WHAT HAPPENS. — with a single 16px body line beneath it and two hard-edged controls pinned under that: a #E8FF4D OPEN VISITOR VIEW and an outlined OPERATOR PANEL.
Nothing is centred, nothing is a gradient blob, and the composition reads as a gallery wall with an instrument on it. The signature move is that the particle field is not decoration: its particles are literally spawned by incoming keystroke events, with hue and velocity mapped to the visitor's typing rhythm, so the hero is a live portrait of a stranger's thinking.
Interaction Model: Animated Motion Tempo: cinematic Hero Dimensionality: webgl
Focal subject. A full-bleed WebGL particle field on the near-black void ground #050508, breathing in the middle-right third of the viewport, masked out of the lower-left quadrant where the headline and controls sit.
Input → transformation → outcome thesis. Each incoming keystroke event from the live socket stream spawns a particle burst whose hue and velocity derive from that key's dwell time. Slow typing renders cyan #4DD8FF; rising speed shifts the flow toward hot magenta #FF3D6E and violet #8A5CFF. The outcome is a field that is a live portrait of the visitor's thinking — the artwork is the data, and the data is a stranger typing.
Motion vocabulary. Continuous slow generative flow driven by an actual data feed. The field drifts and morphs on a 20–40 second cycle even when idle, so the hero is never static. Scroll-linked morphing compresses the field into a horizontal ribbon as the operator-panel section enters, turning the hero artwork into the next section's divider. Panel transitions are 240ms opacity/position crossfades, with no bounces.
Composed first frame. The field at rest in the middle-right third, drifting on its idle cycle. Top-left: LIVE SOCKET // 0 CLIENTS in 11px tracked uppercase #6E6E7A with a pulsing #E8FF4D dot. Bottom-left: the flush-left headline WATCH THEM TYPE. DECIDE WHAT HAPPENS. in Space Grotesk 300, a single 16px body line, and the two hard-edged controls — #E8FF4D OPEN VISITOR VIEW and an outlined OPERATOR PANEL.
Reduced-motion state. With prefers-reduced-motion, the canvas renders one static frame of the current data state and the keystroke log becomes a scrollable list. The headline, body line, status label, and both controls remain whole and fully readable at 375px, 768px, and 1280px.
A single crafted real-time WebGL scene: a luminous particle field whose particles are spawned by incoming keystroke events. Each particle's hue and velocity map to the visitor's typing rhythm — dwell time drives velocity, typing speed drives the cyan-to-magenta-to-violet shift. The scene shows the product's defining state directly: a live, generative portrait of a stranger's typing, rendered as a breathing data sculpture on a near-black void. The field is masked out of the lower-left quadrant so the headline block and controls sit on clean ground.
NFR-1 — Real-time delivery. Visitor keystrokes must reach the operator panel with live latency, because the product's entire value is watching a stranger think in real time. Provenance: explicit (the user asked to capture live what the visitor is typing with socket). Rationale: a delayed stream is not a live stream.
NFR-2 — Socket-based transport. The live capture and the outcome delivery must use a socket connection, not polling. Provenance: explicit (the user specified socket). Rationale: the user named the transport.
NFR-3 — Redis-backed session state. Redis is required for the live session state that binds a visitor's typing stream to the operator panel and carries the delivered outcome. Provenance: required_inference, consistent with the planning scope's redis_required: true. Rationale: the shared live session must survive across the relay's connections so the operator's decision reaches the correct visitor.
NFR-4 — Connection-state honesty. Both the visitor surface and the operator panel must report their true connection state, and the operator's outcome controls must be disabled whenever the relay connection is down. Provenance: required_inference. Rationale: an outcome fired into a dead connection would silently fail, and the accepted journey requires the operator's decision to actually reach the visitor.
NFR-5 — Readable text and controls at every viewport. Headlines, wordmarks, labels, numbers, and controls must stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit, with no other element covering any part of them. Provenance: explicit (creative direction). Rationale: the direction's full-bleed canvas and overlaid corner text must never compromise legibility.
NFR-6 — Reduced-motion support. With prefers-reduced-motion, the generative canvas must render one static frame of the current data state and the keystroke log must become a scrollable list. Provenance: explicit (creative direction). Rationale: the direction's continuous motion must have a usable still equivalent.
NFR-7 — Contrast. Body text #F2F0EA on #050508 must maintain approximately 19:1 contrast, and muted labels #6E6E7A must be used only at 14px and above, uppercase with letterspacing, never for body copy. Provenance: explicit (creative direction). Rationale: the dark palette must remain readable.
docker-compose.yml as the inventory of runnable services — the frontend, the backend (including the socket relay), and Redis.Assumptions
SUCCESS control. (Assumption — not specified by user.)Constraints
stroke-dasharray tracks the session's keystroke count.No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No comments yet. Be the first!