Right now, this is all your user gets.
A spinner looks the same at second one and second thirty. It can’t say what’s happening, so people start to doubt, and many leave.
Orbs that move differently when your product listens, thinks, works and speaks. A 4 KB player that never blocks a click.
Free player, MIT. Works in React, Vue, Svelte and plain HTML.

orb.state = "thinking"114 KB loop at 320px
Your agent works for thirty seconds. A spinner says nothing the whole time. aurb gives the wait a shape, so people can see what is happening.
A spinner looks the same at second one and second thirty. It can’t say what’s happening, so people start to doubt, and many leave.
Sound arrives, and the rim answers. People know the mic is open before they say a word.
The surface goes quiet. Inside, it churns, and sparks when something lands.
A steady rhythm in one direction, so a long wait feels like progress, not a freeze.
It swells as it talks and sends waves outward. The voice has somewhere to come from.
Calm and green, then back to idle. One line of code per moment.
Each has its own material and moves its own way in every state. Try any of them here. Every one is free.
aurora, thinking
Free forever, in commercial products too.
Every character is a set of short video loops. The GPU plays them, so clicks and typing never wait.
How it works
Every character comes ready to use, one short loop per state. The page loads only the states it shows, from the edge nearest your visitor, and your code only says which state to show. The orb never competes with your app for a click.
Your code only flips a state.
15 characters, all of them free
22 KB per state, at 160px
4 KB the whole player
0.4% of the main thread
Measured
aurb against the usual ways to build an orb, each drawing 120px orbs in Chrome. Lower is better in every column. 100% is one whole CPU core, marked on the CPU bars.
Against Rive, as AI Elements’ Persona ships it
| Approach | One orb playingtotal CPU | Ten orbs playingtotal CPU | Main threadwhere clicks are handled | First loaddownload for one orb |
|---|---|---|---|---|
| aurb | 9% | 36% | 0.4% | 36 KB |
| WebGL shader (three.js) | 35% | 63% | 4.6% | 130 KB |
| CSS gradients | 37% | 65% | 5.4% | 0.6 KB |
| Lottie | 48% | 92% | 10.1% | 78 KB |
| Rive (AI Elements Persona) | 64% | 183% | 15.7% | 1,044 KB |
Ten Rive orbs needed almost two whole cores, and dragged the page from 144 to 82 frames a second.
The CSS orb downloads almost nothing, but uses four times aurb’s CPU while it plays.
Chrome 156 on a Windows laptop, median of three runs. Rive is AI Elements’ Persona exactly as it ships; the CSS, three.js and Lottie orbs are typical builds of each. The screen ran at 144 Hz, so orbs drawn every frame would cost less at 60 Hz.
One character, any size: sharp as a hero, nearly free as a 20px icon. Every character comes in light and dark.
Read the deploy log
Compare traces
Writing the fix
Run the tests
Why is checkout slow this week?
Thinking…
It's a standard web element, with a typed React component. State names are checked, so a typo is a compile error.
Every character is free. Copy the line under the big orb in Characters, or swap in another name. The player loads it from jsDelivr, a free public CDN, only the states you use, so there is nothing to host.
import { Aurb } from "@aurb/player/react";
<Aurb
orb="chalk"
state={busy ? "thinking" : "idle"}
prefetch="thinking"
style={{ width: 120 }}
/>Yes. The player and every character are free, in commercial products too, with no attribution, no key, and no limit on traffic. What the licence doesn't allow is reselling the orbs themselves.
On jsDelivr, a free public CDN, cached at the edge nearest each visitor, so there is nothing to host. To host them yourself, run npx @aurb/player download <name> and set orb to the URL of that folder instead.
No. Loops are pre-rendered, which is why they're so light. The speaking state moves like a voice but doesn't follow your actual audio. If you need that, use a shader.
About 0.4% of a core on the main thread, with no long tasks. In total, one playing orb used about 9% of a core in our tests, and ten used about 36%, so keep one or two moving and show the rest as posters. For comparison, one Rive orb from AI Elements used 64%, and ten used 183%: almost two whole cores.
Any modern browser plays it: VP9 where supported, H.264 otherwise. We've tested Chrome on Windows. Safari and iOS aren't tested yet.
In any product, forever. No key, no account.