Pulse

Side A · ready

PM—001LP · 2026

One Custom Element for every framework. It grows with its container, re-themes itself — and listens to the music it plays.

33⅓

Mixing desk
npm i @pulse-music/web-component

What Pulse is

Pulse is one Custom Element for every framework. It reads its own width — a disc at 96 px, a hero card at 760 — wears nine moods that re-light every player on the page, and listens to the music it plays: the real spectrum, sixty times a second.

A2Grows with the page1:10

No breakpoints.
It reads its own width.

Everything, mute included

@container pulse (width < 128px)
A3Nine moods0:55

Nine moods.
One attribute.

Pick one and the whole room changes key — the players on this page, the mini player following you, even this wall. It’s remembered for your next visit.

Moods heard 0/9

<pulse-player variant="auto">

Interlude

Flip therecord.

Side B is the part you hear before you see it.

B1Follows you0:45

Scroll away.
It comes with you.

<pulse-fab> shares the same audio session as every player on the page. It appears when the music starts, can be dragged anywhere, snaps to the nearest corner and remembers where you left it — even across pages.

It’s already here. Drop the needle to meet it.

Placement
<pulse-fab placement="bottom-end" pulso></pulse-fab>
Change page — keep the music
B2Listens back1:05

It hears what
it plays.

Twenty-four bands of the real spectrum, sixty times a second, from one Web Audio analyser shared by every visual — the ambient EQ, the FAB’s halo, and this landscape. Each line is a moment that just passed.

Idle — drop the needle
// The same frames that drive this page. One analyser, zero copies.
const off = engine.onFrame(({ bands, energy }) => {
  // bands: Float32Array(24) · energy: 0..1
  canvas.draw(bands)
})

No audio? No problem: when the analyser can’t run (cross-origin media, no Web Audio), frames are synthesised from playback so visuals never freeze — and they flag syntheticso you can tell.

B3Speaks every framework0:50

One element.
Speaks every framework

The engine and the player are framework-free. Thin, typed wrappers give Vue, React and Svelte their own idioms; Angular and plain HTML use the element as-is. Same audio, same events, same types.

<script type="module">
  import '@pulse-music/web-component'
</script>

<pulse-player ambient-eq>
  <pulse-track src="/projector-screen.mp3" title="Projector Screen"
    artist="HoliznaCC0" cover="/projector-screen.jpg"></pulse-track>
</pulse-player>

<!-- Optional floating mini player, same audio session -->
<pulse-fab></pulse-fab>
npm i @pulse-music/web-component
B4Built to be heard1:00

Made for ears,
not only eyes.

Focus the player and type. Or press a key below. Then watch what assistive technology is told — read live from the player’s own accessibility attributes.

  • Keyboard first

    Every control is reachable, shortcuts work from anywhere inside the player.

  • Screen readers

    Real buttons and an ARIA slider with spoken time — “1:12 of 2:40”.

  • Lock screen

    Media Session: title, artwork and controls on phones and keyboards.

  • Reduced motion

    Spins, ripples and springs step aside when you ask the OS for calm.

  • Any language

    Every label is replaceable through one labels property.

  • Checked in CI

    axe-core runs WCAG 2.2 AA checks on every change.

C1The reel0:15

Fifteen seconds,
cut to the beat.

This page’s motion as a film, rendered frame by frame from code to “Projector Screen”. No editing software, no stock footage. Sound on.

The grid this page moves on70.06 BPMBeat · 856 msEighth · 428Sixteenth · 214Thirty-second · 107

A tonearm swings in and drops onto a spinning record. The headline slams in word by word; the letters of “plays” rise and fall with the music. The player card opens from the full stop and folds from 760 to 96 pixels wide, then four moods wipe across it. The spectrum turns into a ridgeline landscape, curls into the grooves of a record that flips to side B, and the reel ends on the Pulse logo as the turntable brakes.

C2Pressings0:35

Open source.
Pressed in public.

MIT-licensed, typed end to end, tested in real browsers. Every change goes through lint, unit, end-to-end and accessibility checks before it’s pressed.

Pressed byMao — @maoxorDesign, engine, elements, and this website.

Pulse — LP · 2026 · MIT

Reading times are approximate. Music: HoliznaCC0, public domain (CC0).