Buoy

Buoy

An island for your notifications, promises and background work.

Star on GitHub

Try it

buoy('Link copied', { icon: 'link' });

The island at the top of this page is the real component. Press a button and watch it change.

Live activities

const timer = buoy.live({ label: 'Focus timer', expandable: true, render });
setInterval(() => timer.refresh(), 1000);

Things that keep going stay on the island until you stop them. While a timer, song, call or recording runs, tap the island to open its controls.

Four themes

One prop changes the surface. Pick one to see it on the island.

<Buoy theme="ink" />

Two lines to start

Render the island once. Call it from anywhere, even outside React.

import { Buoy, buoy } from 'buoy-ui';

export default function App() {
  return <Buoy />;
}

buoy('Link copied', { icon: 'link' });

Messages, promises, tasks and every option are covered in the README.

One shape, every state

Nothing stacks and nothing jumps. The same element changes its size, icon and label.

Link copied
message
Saved to drafts
promise
3 uploads
task
Sent
two at once

Queues, never stacks

One message at a time. A small badge counts what is waiting.

Work steps aside

Uploads shrink into a bubble so new messages still get through.

Calm by default

Real buttons, a live region, and only fades when motion is reduced.