Unicode Spinners Pro · loaders made of text · v1.0

Loaders made of text.

40 braille, block and box-drawing spinners, AI “thinking” and streaming loaders, step rows that turn into ✓ or ✗, and progress bars that fill a fraction of a character at a time. Crisp at any size, in your text color, never shifting your layout. A script tag, a React component or a Framer component.

Buy Unicode Spinners Pro · $9Open the playground

One-time payment · Instant download · Single-project license · Free v1.x updates

Loading

Just need raw frames for a terminal? unicode-animations is our free MIT package with 18 braille spinners as frame data. Pro is the extended set for websites: 22 more spinners, AI and progress loaders, colors and finished, accessible components. See the difference.

AI thinking and streaming loaders

Thinking… then done.

A label with a light that sweeps across it, a cursor at the end of a streamed answer, and agent rows that turn from a spinner into ✓ or ✗. Screen readers hear “Thinking…”, then the result: never the frames.

Thinking

Why do my spinners jump around?

Thinking…
<pf-spinner name="shimmer" label="Thinking…" shimmer-label color-mode="gradient">

Token stream cursor

Writing

answer.append(token) <pf-spinner name="cursor" label-position="hidden">

Agent steps

  1. Searching the docs
  2. Running the tests
  3. Checking the API
  4. Writing the answer
row.done("Read 12 pages") // ✓ row.fail("Rate limited") // ✗

Progress bars

A fraction of a character at a time.

Blocks fill in eighths of a cell, braille dot by dot. Percent and an estimated time left, or an indeterminate band. Always the width you set, read out as a real progress bar.

blocks · eta
braille
shade
line
ascii
indeterminate
shimmer

Playground

Pick a spinner or type your own frames, then change the speed, color, label, size and state. The code under the preview follows along: copy it for a script tag, React or Framer.

Thinking…

Inline in a sentence: Loading it keeps the text's size and never moves it.

<script src="/js/unicode-spinners.min.js" defer></script>

<pf-spinner
  name="helix"
  color-mode="gradient"
  colors="#f0b27a, #22d3ee"
  label="Thinking…"
  shimmer-label
  size="32">
</pf-spinner>

<script>
  // when the work is done:
  // document.querySelector("pf-spinner").done("Done")
</script>

Color
State

Like what you made? The snippet runs with the script from the download.

Buy Unicode Spinners Pro · $9

Free package or Pro?

unicode-animations stays free on npm. The 18 spinners in it are in Pro too, unchanged, so names carry over; what you pay for is everything around them.

Featureunicode-animations (free)Unicode Spinners Pro ($9)
Spinners18 braille spinners40: the same 18 plus 22 braille, block, box-drawing, arrow and AI designs
What you getFrame data ({ frames, interval }): you write the loop and the markupFinished components: <pf-spinner> and <pf-progress>, React components and a hook, a Framer component
AI and streaming—Shimmering “Thinking…”, token-stream cursor, typing dots, agent rows that turn into ✓ / ✗
Progress bars—Five styles with sub-cell precision, percent, time left, indeterminate
CustomizingEdit the frames in codeCustom frames as a string or an array, speed, interval, solid / gradient / cycling / shimmer color, size
Layout and accessibilityUp to youFixed monospace cells (no layout shift), role="status", polite announcements, aria-busy, frames hidden from screen readers, Reduce Motion
LicenseMIT, free$9 one-time, one website or project

Works with

  • FramerCode component with a properties panel: spinner or progress bar, label, colors, fontIn the v1.0 download
  • WebflowPaste the footer code, then an Embed with <pf-spinner>In the v1.0 download
  • Plain HTML / any siteOne script + <pf-spinner name="helix">In the v1.0 download
  • WordPressCustom HTML block with the script and the tagIn the v1.0 download
  • ShopifyTheme asset + a Custom Liquid sectionIn the v1.0 download
  • Squarespace, WixCode Injection / embed block (plan must allow custom code)In the v1.0 download
  • React, Next.js, Vite<Spinner>, <Progress>, <AgentSteps>, useSpinner(): server-rendered still frameIn the v1.0 download

What it does

  • 40 spinners. Classic braille, braille grids (scan, helix, rain, heartbeat, equalizer...), AI and streaming, block elements, box drawing, arrows and geometric shapes. Every one is plain text: crisp at any size, in your font color.
  • Made for AI interfaces. A “Thinking…” label with a light that sweeps across it, a cursor that sits at the end of a streamed answer, typing dots, and step rows for an agent's tool calls that turn from a spinner into ✓ or ✗, announcing the result.
  • Progress bars with sub-cell precision. Blocks fill in eighths of a character, braille dot by dot, plus shade, line and ASCII styles. Percent and an estimated time left, or an indeterminate band.
  • Yours to change. Your own frames as a string or an array, speed and interval, one color, a gradient across the characters, colors that cycle, or a shimmer. Size with font-size.
  • Nothing shifts. Every character sits in its own fixed monospace cell, every frame is the same width, and ✓ / ✗ keep that width. The text around a spinner never moves.
  • Accessible. role="status" with polite announcements and aria-busy while it spins. Screen readers hear the label, never the frames, and hear “Done” when it finishes. Bars are progressbars with their value spoken. Reduce Motion shows a still frame or a slow version.
  • Light. 8 KB gzipped for all of it, no dependencies, no fonts to load. One animation loop for the whole page; spinners pause offscreen and in background tabs.

What's in the download

  • unicode-spinners.min.js: <pf-spinner> and <pf-progress> for any website (18.7 KB, 8 KB gzipped)
  • unicode-spinners.esm.js + TypeScript types, for bundlers
  • react/UnicodeSpinners.tsx: Spinner, Progress, AgentSteps and useSpinner (React 18+, one file)
  • framer/UnicodeSpinner.tsx: the Framer code component
  • spinners.json: every spinner's frames and interval
  • demo.html, and a README with a quick start for every platform
  • Free updates to v1.x

Single-project license (LICENSE.md in the download): one website or project per license. The 18 unicode-animations spinners stay MIT (© Gunnar Gray); six frame sequences follow cli-spinners (MIT, © Sindre Sorhus). Both notices are in LICENSE.md.

Install in about a minute

  1. Upload unicode-spinners.min.js from the download to your site.

  2. Add the script once, then the tags wherever you need a loader.

  3. Call done() or fail() when the work finishes.

<script src="/js/unicode-spinners.min.js" defer></script>

<pf-spinner name="shimmer" label="Thinking…" shimmer-label></pf-spinner>
<pf-progress value="42" label="Uploading" eta></pf-progress>

<script>
  document.querySelector("pf-spinner").done("Answer ready")
</script>

Squarespace and Wix: add the script and the tag in a Code or Embed block (your plan must allow custom code). The download's README has a quick start for every platform and the full settings reference.

Unicode Spinners Pro

$9 one-time

  • Script tag, React and Framer builds
  • 40 spinners, AI loaders and progress bars
  • Free v1.x updates
  • Single-project license
Buy on Polar · $9

Secure checkout by Polar. Instant download after payment.

Get all 8 for $49 with the All-Access Pass$92 separately · save $43

FAQ

Isn't unicode-animations free?

Yes, and it stays free: unicode-animations is an MIT-licensed npm package with 18 braille spinners as raw frame data, for when you want to write the loop and markup yourself (it's great in terminals). Unicode Spinners Pro includes those 18 unchanged so the names match, and adds 22 more spinners, the AI and streaming loaders, progress bars, custom frames and colors, the accessibility and layout work, and finished script-tag, React and Framer components.

Where does it work?

Anywhere you can add a script tag: Webflow, WordPress, Shopify, Squarespace, Wix, plain HTML. Also React/Next.js and Framer. Site builders need a plan that allows custom code.

Will the characters show up on every device?

Braille patterns, block elements, box drawing and arrows are in the default fonts of macOS, iOS, Windows, Android and most Linux systems. Spinners use the visitor's monospace font; no fonts are downloaded.

Will it move my layout around?

No. Every character sits in its own fixed cell, every frame of a spinner has the same width, and the ✓ / ✗ that replace it keep that width. Bars are always the width you set.

What do screen readers hear?

The label, or “Loading” when there's no visible label, never the frames. A spinner is a polite status that's busy while it spins; when you call done() or fail(), screen readers hear the done or error label. Bars are progressbars that read their value, like “42%, about 8s left”.

What about Reduce Motion?

With Reduce Motion on, a spinner shows a still frame (the one that reads best as a loader), or a slow, plain version if you set reduced-motion="slow". The label shimmer stops too.

Is it a text animation like Kinetic Type?

No. Kinetic Type animates your headlines. These are loading indicators: spinners, status rows and progress bars. The token-stream cursor sits after text your app streams in; it doesn't reveal or animate the text itself.

What's the license?

Single project: one website or project per purchase. The details are in LICENSE.md in the download, with the MIT notices for the unicode-animations spinners and the frame sequences that follow cli-spinners.

Do I get updates?

Yes, free updates for v1.x.

Questions before buying?

Email hi@gunnargray.com.

Hear about updates

The launch, new spinners, v1.x releases and the occasional new tool. No more than that.

Unicode Spinners Pro $9 · 40 spinners · bars · one-timePlaygroundBuy