Spectrum Aura is a dynamic, real-time visual analyser that turns live sound into motion, light, depth, and rhythm directly in your browser.
No installs for viewers. No backend. No upload flow. Open the page, feed it audio, and the scene responds instantly.
Spectrum Aura is designed for use on desktop browsers, and can visualise audio from any Chromium based browser or your device microphone. It is not designed for mobile browsers but may work, but only using your phone microphone.
It is not designed to be used for any formal audio analysis, it's intended purely for fun and to create an exciting visual treat, working best with music, like Spotify or YouTube in your browser.
https://danamini.github.io/spectrum-aura/ — deployed automatically from main on every merge.
Depending on your hardware you may need to tune performance via the options in settings.
- WebXR support for Meta Quest is currently alpha.
- Desktop mode remains the primary, fully supported experience.
- If WebXR is unavailable in your browser, the app continues to work in desktop mode without XR.
- Production testing URL: https://danamini.github.io/spectrum-aura/
- Browser-native real-time rendering with animated 3D scenes and post-processing.
- Designed for live sessions: quick mode switching, keyboard-first controls, and preset slots.
- Musical sync: experimental BPM detection, a 4/4 bar grid, manual beat/downbeat taps, and phrase-aware view cycling.
- Multiple visual personalities in one app: Combo, Classic, Ripple, Cyberpunk Data-Stream, Ethereal Nebula, Brutalist Monolith, Symmetric Mandala, Audio-Reactive Terrain, Obsidian Shard, Hyper-Torus Accelerator, Brutalist Sound-Wall, Floating Geometry Nebula, On-rails Tube, and Asset-Flow.
- Beat-aware motion and camera behavior that reacts to energy and musical phase, not just raw levels.
- Works with microphone input or shared tab/system audio.
- Retro post FX options including CRT scanline emulation and projector-film artifacts.
![]() |
![]() |
![]() |
![]() |
- Use microphone for ambient or live room capture.
- Use tab/system audio for direct playback-reactive visuals.
For shared tab/system audio in Chrome:
- Select a browser tab when prompted.
- Enable Share tab audio.
- Combo: radial bars, reactive sphere, particles, BPM-driven energy.
- Classic: horizontal LED/bar analyzer with peak hold behavior.
- Ripple: ring-wave field with configurable band columns.
- Data-Stream: neon point-cloud terrain reacting to bass/high bins.
- Nebula: pulsing volumetric shader sphere with fresnel aura.
- Monolith: 32x32 instanced cube grid with peak-following spotlight.
- Mandala: 12 audio-reactive radial ribbons with bloom/glitch surges.
- Terrain: wireframe waterfall displacement grid over spectrum history.
- On-rails Tube: fly-through wire tunnel with beat-reactive pulse and twist.
- Asset-Flow: music-reactive 3D model choreography over drifting layered 2D backgrounds.
Spectrum Aura treats rhythm as a first-class input — not just loudness. A SongClock keeps an authoritative 4/4 grid (4 beats per bar, 16 beats per phrase) that drives the BPM HUD, visual pulse, and optional view cycling.
How it works
- Audio analysis estimates tempo (BPM) and detects transients from the FFT signal.
- SongClock turns that into a continuous beat index: which beat you're on, where you are in the bar, and where you are in a 4-bar phrase.
- Visuals use injected beat phase for pulses, kicks, and post-FX — not a naive wall-clock timer.
This is tuned for fun, live visuals — not DAW-grade beat tracking — but manual taps make it surprisingly tight for DJ sets, streams, and browser playback.
Manual sync (recommended for live use)
| Key | What it does |
|---|---|
T |
Beat tap — tap on each beat. After a couple of taps the app learns your tempo and locks the grid. Keep tapping if the track drifts. |
⇧T |
Downbeat tap — tap on the first beat of a bar (the "one"). Resets the phrase to beat 1 of 16 immediately — use this when a new section starts or the auto grid feels off by a beat. |
M |
Toggle the BPM readout and bar grid overlay (confidence %, locked state, 16-beat dots). |
Tap behaviour in plain terms
Ton beats: learns BPM from your tap spacing and anchors the running grid to your timing.⇧Ton the downbeat: says "this moment is beat 1" — the phrase counter resets to 1/16, not just the next beat in the current bar.- After you tap: the grid stays on your tempo. If the analyser later detects beats that line up with your grid, it can gently nudge phase and hand control back to auto detection.
- Misaligned audio after a manual lock will not skip or jump beats — the clock waits for agreement rather than fighting your taps.
Auto detection
When audio confidence is high enough, SongClock can enter auto mode without taps. The BPM readout shows a confidence percentage; locked means the detector is fairly sure.
The app can also watch for musical changes every four bars (spectral shift + strong onset) and realign the phrase downbeat — useful when a drop or new section lands on a bar line.
Phrase-aware view cycling
Press C to enable music-reactive view cycle. Views switch at the start of each 4-bar phrase (16 beats), not every single bar — so changes feel musical rather than frantic. A short warm-up applies before the first switch.
Where to see it
- Canvas overlay (
M): large BPM digits + 16-beat grid when audio is running. - Settings → Audio (
S): same tempo readout, plus toggles for the latency HUD (L) and beat sensitivity. - Latency HUD (
L): frame timing breakdown (audio → scene → render) for tuning on slower hardware.
Technical deep dive: Song clock and sync.
Rrandomize lookVnext visualAplay saved looks in rotationFtoggle fullscreenStoggle settings panelXreset the current audio source selectionNtoggle stats panelGshow/hide shortcut bar (restores viaGor the bottom pill)Tbeat tap (learn tempo + lock grid)⇧Tdownbeat tap (reset phrase to beat 1/16)Mtoggle BPM & bar sync gridLtoggle latency HUDCtoggle music-reactive view cycle (every 4-bar phrase)
Bottom shortcut rail:
- Visual cluster shows the active visual and whether it is in
3Dor2D. inctoggles whether randomize touches view settings in addition to post FX.fxtoggles the post-processing pipeline.- Save controls are grouped like a transport cluster: previous, play saves, next, random, save, delete.
- Utility cluster: audio source, fullscreen, stats, latency, BPM grid, beat tap, settings, hide all (
G). - Every shortcut button and toggle has an in-app styled tooltip with usage details.
Control panel additions:
- Global
Wireframetoggle in the View section that maps to the active view's wireframe setting (where supported). Post FX pipelinemaster toggle in Post FX that bypasses all post-processing without changing individual effect settings.Randomize view settingstoggle in Post FX that keeps randomize constrained to post FX unless you explicitly enable view geometry changes.Monolith Brightnessslider in Monolith view settings for direct lighting/visibility control.- Asset-Flow controls for
Movement intensity,2D background amount, and2D background drift. - Asset-Flow model motion is tuned for smoother 3D bounce with minimal lateral drift to avoid left/right flicker.
- Asset-Flow layered 2D overlays now crossfade smoothly and bias transition timing toward detected beat intervals when BPM confidence is high.
- New post FX filters:
CRT(scanlines/curvature/vignette) andProjector film(dust, random scratches, jitter, flicker).
Asset sources and licensing:
- Runtime Asset-Flow models live under
public/assets/models/. - Third-party licensing and attribution are tracked in
docs/THIRD_PARTY_ASSETS.md.
- FFT size, smoothing, gain, beat sensitivity (onset detection for sync)
- Camera drift and beat response controls
- Post FX controls: bloom, chroma, grain, vignette, DOF, glitch, god rays, grading, kaleidoscope, mirror, CRT, projector film
- Post FX master pipeline bypass toggle
- View-specific wireframe controls, plus a global wireframe toggle bound to the current view
- Dedicated monolith brightness control
- Show BPM & bar grid and Show latency HUD in Settings → Audio
- Built-in presets for fast scene changes.
- First-time users are seeded with five curated starter saves by default.
- Saves are stored in local storage as a growing list instead of a fixed five-slot bank.
- The shortcut rail and settings panel both support previous/next/random/save/delete flows over the current save list.
- Play Saves mode rotates through the current saved list automatically.
- Added retro-focused built-ins:
CRT Arcade,Retro Broadcast,16mm Projector,Projector Grindhouse, andVHS Dream.
- React 19 + TypeScript
- Three.js + custom shader materials
- Vite 7
- Static SPA output (no backend services)
- Node.js 20+
- npm 10+
npm install
npm run devDefault local URL:
- Install the Debugger for Chrome extension (recommended via
.vscode/extensions.json). - Run and Debug → Launch Chrome (Spectrum Aura).
- Use the audio picker in the Chrome window (not Cursor's Simple Browser preview — it cannot access the microphone).
Audio capture requires http://localhost:6789 (secure context). Opening via a LAN IP like 192.168.x.x will block mic/tab audio APIs.
The dev server supports hot module reloading for rapid iteration.
npm run build
npm run previewnpm run lint # ESLint validation
npm run format # Prettier formatting
npm run test:run # Vitest (single run)
npm run test # Vitest (watch mode)
npm run check # typecheck + lint + test:runFor a fuller local gate before pushing, run npm run format and npm run build in addition to npm run check.
- Tests live in
__tests__/folders (analyser/__tests__/,analyser/engine/__tests__/) - Prefer focused suites: normalization, slots, sync invariants, engine units
- Use deterministic tests for stateful logic (
vi.resetModules(), stablelocalStoragemocks) - Test behavior through public APIs (
SongClock,settingsStore,BPMDetector) - For sync/timing changes, extend
sync-invariants.test.ts
src/App.tsx: Single-page shellsrc/main.tsx: Browser entry pointsrc/components/analyser/: UI and interaction layerAnalyser.tsx: Thin orchestrator (overlays + hooks)hooks/: Render loop (useAnalyserEngine), beat taps, commands, presetscontrol-panel/: Shared primitives + per-viewViewSettingsoverlays/: Latency HUD, stats, freq labels, audio promptTempoReadout.tsx+theme.ts: Shared BPM display and design tokensstore.ts: Settings state managementBarTimingHud.tsx: BPM / bar grid HUDControlPanel.tsx: Settings sheet and flyout tabsvisuals.ts: Canonical visual registry__tests__/: Store, shortcuts, regression, preset/theme testsengine/: Audio, SongClock, scene, post-processingengine/__tests__/: Engine and sync invariant tests
src/components/ui/: Minimal shadcn surface (label,sheet,slider,switch)AGENTS.md: Guide for Cursor / Claude coding agentsdocs/: Technical documentation (see docs/README.md)docs/DEVELOPMENT.md: Architecture and contribution guide
- Current version: 0.0.1 (see
CHANGELOG.md). - Versioning follows Semantic Versioning; each release is a Git tag
v<version>. - A push of a
v*tag triggers the Release workflow, which runs checks, builds, and publishes a GitHub Release (with notes from the changelog and a packageddist). - Full process and commands:
docs/RELEASING.md.
npm run release:patch # bump, tag, and push (also: release:minor / release:major)Build static assets and publish dist/ to any static host:
npm run buildPushes to main auto-deploy to GitHub Pages via .github/workflows/deploy.yml.
Spectrum Aura runs a real-time pipeline: FFT → band features → BeatMatcher (onsets) + BPMDetector (tempo estimate) → SongClock (bar/beat grid) → visuals.
- Beats and bars: 4 beats per bar, 16 beats per phrase (4 bars in 4/4).
- Manual taps (
T,⇧T) anchor the grid; audio estimates tempo but does not fight misaligned taps. - View cycle (
C) advances on phrase boundaries after a short warm-up.
Technical documentation (equations, algorithms, latency):
- Documentation index
- Audio analysis pipeline — FFT, BeatMatcher, BPMDetector
- Song clock and sync — bar grid, taps, view cycle
- Rendering and latency — rAF loop, timing budgets
- FFT overview — short map with links
Agents: AGENTS.md



