noui-orb · web component

noui orb

<noui-orb> is the orange o from the mark as a live voice surface. This page is built only on the component's public API. Switch states, change what drives it, and tune the motion until it feels right.

Idle

Get started

Everything on this page is built with the calls below. <noui-orb> is a standard Web Component, so it works in plain HTML and in any framework. It is a scripted early release: it draws and reacts, it does not understand speech. Your app does the listening and the thinking and tells the orb what is happening.

  1. 1. Install

    Add the package, then import it once. Importing registers the <noui-orb> tag.

  2. 2. Put it on the page

    The orb fills its box, so size it from outside and keep it square. gestures turns on character motion (leaning, nodding, hopping). intro="auto" plays the logo-to-orb intro on load.

  3. 3. Tell it what your app is doing

    Set the state as your app moves through a turn. For work with known steps, give it progress and the ring fills; without progress it shows a spinning arc and never fakes a percentage.

  4. 4. Give it a voice

    You ask for the microphone and hand the orb the stream; it only listens to loudness and tone, and nothing leaves the page. Call this from a click or tap, on an HTTPS page. If you analyse audio yourself, push levels instead.

  5. 5. Let it react

    Gestures each mean one thing (see the vocabulary below). The orb nods by itself when it starts thinking and hops when a task finishes. Ask for others when your app knows better.

  6. 6. Assemble interface out of it

    The orb is where your interface comes from. Ask it to emit, read where it is, and animate your element out of that point. Use place("aside") when the user starts working, and bring it back when they tap it.

  7. 7. Use it from a framework

    Set object values like progress as properties and listen with addEventListener. React 19 passes objects and events straight through; React 18, Vue and Svelte notes are in the README. It is safe to import on a server, so Next.js works from a client component.

Reference: every attribute, property, method, event and number is in the spec. Questions or a rough edge? Open an issue.

Gesture vocabulary

Each gesture means one thing. Local signals trigger the instant ones; the backend's reply triggers the ones that need understanding.

GestureMeansTriggered bySource
LeanI'm listening to youPointer or input position while listeningDevice
NodGot it, or yesEnd of the user's sentence; a yes in the replyDevice, backend
ShakeNo, or can't do thatA no or a refused requestBackend
HuhI didn't understandLow-confidence understandingBackend
BreathAbout to speakHalf a second before reply audioDevice
InterruptGo aheadUser starts talking while the orb speaksDevice
EmitHere's what you needA new piece of interface is assembledBackend
PointLook hereAn element that needs the user's actionBackend
Step asideYour turnUser working in the assembled interfaceDevice
WaitTake your timeA decision is pending; dims after a long silenceDevice
HopDoneTask finishedBackend, app

How each state behaves

The orb shows energy: who is talking and how loudly. The ring shows time, and only appears when there is something to wait for.

StateOrbRingDriven by
IdleSlow drift, slight breath, softer colourHiddenTime only
ListeningWaves travel inward; swell follows loudnessHiddenMicrophone
ThinkingFast swirl, warmer core, soft pulseOrbiting arc, because the wait has no known endTime only
WorkingCalm swirl, brief flash on completionOne segment per step; gaps close when doneTask progress
SpeakingWaves travel outward; swell follows loudnessHiddenReply audio
ErrorColour drains, motion nearly stopsBroken and greyConnection status

What drives the motion

Loudness → swell and edge wobble
RMS level in decibels, smoothed with a fast attack and a slower release so the orb doesn't jitter.
Brightness → colour
Spectral centroid. Brighter voices push toward pale yellow, deeper ones toward red-orange.
Bass and treble → wave size
Energy under 300 Hz moves large, slow shapes. Energy between 2.5 and 8 kHz adds fine ripple at the edge.
Pointer → lean
With gestures on, the orb's warm core and light drift toward your pointer while listening, or toward the bottom of the screen when there's no pointer.
Pace → flow speed
Syllable onsets per second over the last two seconds. Faster speech makes the gradient flow faster.