LASA

Live Atomic Spatial Audio

An open protocol for live, object-based spatial audio, built on Media over QUIC. Any number of clients contribute positioned sources. Every listener hears a binaural render of the shared space. Audio, position and state travel over one connection.

MIT licensed Browser, native and server implementations Version 0.1

The idea

Atomic

Audio is sent as 5 ms Opus frames, and every frame can carry the full pose of its source: x, y, z, yaw, pitch, roll. Position arrives with the sound it belongs to. There is nothing to synchronise and no interpolation lag between the audio and where it is coming from.

One connection

LASA runs over Media over QUIC. Audio and pose go in lossy, low-latency datagram tracks. State goes in reliable streams. All of it shares one QUIC session with TLS, which a browser opens with WebTransport and a native client opens directly. Optional full-bandwidth redundancy masks packet loss, with a latency cost you choose.

Shared state

Everything that is not audio or pose lives in a real-time, pub-sub key-value store with sequential consistency. The base profile uses it for roles, permissions, channels, moderation and display data. Applications extend it with their own keys.

Why it exists

Live spatial audio has been stuck with formats and tools that were built for something else: WebRTC or RTP that carry voice well but have no notion of space; theatrical delivery formats without 6DoF or support for live, and game engine voice bound to specific engines and with limited capacity.

The newer immersive formats, Eclipsa and MPEG-I Immersive Audio, are delivery formats: they carry a finished scene to a renderer. LASA is the step before that, many people contributing positioned sources, live, into one shared space. The two fit together. A LASA space is a scene those formats could carry to an audience.

LASA is the missing layer: a wire format and a server that render a shared acoustic space for hundreds of listeners at once, from browsers, native apps and studio rigs alike. It is small enough to read in an afternoon and complete enough to build on.

Whether that space is a virtual venue, a distributed choir, a research rig with six degrees of freedom, or a room full of people talking, the protocol is the same.

The pieces

The specification

Two documents and a set of schemas

lasa-core.md defines identifiers, tracks and namespaces, connection and authentication, the audio packet format, presence, and the state machinery with its wire encoding. lasa-base-profile.md defines the lasa. state namespace: roles, permissions, channels, moderation and key lifetimes. JSON Schema documents describe every data object.

@panaudia/lasa-client

The browser client, in TypeScript

Publishes object audio with pose, plays rendered sinks, follows the presence feed and synchronises the state store, all from a web page. Built on WebTransport, WebCodecs and AudioWorklet, ESM only, with no runtime dependencies.

Panaudia LASA server

Media server and spatial engine

A full reference implementation of LASA, a high-performance Go/C media server and spatial engine providing up to 5th order bi-lateral ambisonics with near field compensation. Ingests every source, renders a binaural or ambisonic sink per listener, and holds the state store.

Panaudia Bridge

Real audio devices into a space

A native macOS application that bridges CoreAudio devices to LASA: any number of input channels become positioned entities, and the binaural render comes back out. Saves rigs as files, so a studio arrangement opens on a laptop. Signed and notarised.

lasa-ticket

Keys and admission

A ticket is a signed Ed25519 JWT admitting one client to one space, carrying its identity, roles, permissions and entity definitions. lasa-ticket generates keys, mints and verifies tickets from the command line. Samples in Go, Python and TypeScript show how to issue tickets from your own backend.

Get started

A space running locally, and a page talking to it, in three steps. The development mode below admits anyone. The docs cover tickets, certificates and deployment.

  1. Run a space

    docker run --rm -p 4443:4443/udp \
      -e PANAUDIA_ALLOW_UNTICKETED=true \
      panaudia/panaudia-server:0.1.2-amd64

    Use the -arm64 tag on Apple silicon. The server prints its certificate hash at boot. Copy it.

  2. Install the client

    npm install @panaudia/lasa-client
  3. Connect, speak, listen

    import { LasaClient } from '@panaudia/lasa-client';
    
    const client = await LasaClient.connect({
      url: 'https://localhost:4443/lasa',
      spaceId: 'main',
      clientId: 'alice',
      entities: [{ id: 'alice-voice', name: 'Alice' }],
      serverCertificateHashBase64: hash,   // from the server log
    });
    
    const ctx = new AudioContext({ sampleRate: 48000 });
    const mic = await navigator.mediaDevices.getUserMedia({ audio: true });
    
    await client.startCapture('alice-voice', {
      source: ctx.createMediaStreamSource(mic),
      pose: { x: 0, y: 0, z: 0, yaw: 0, pitch: 0, roll: 0 },
    });
    await client.playSink('alice-voice', 'binaural');

    Your page must be served with Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp, so the client can use SharedArrayBuffer.

Full guides on connecting, audio, presence, state and the base profile.

Status

August 2026

LASA is at version 0.1. The specification is stable enough to implement against and is tagged. The browser client is tested against Chromium, and works in other engines as their WebTransport and WebCodecs support allows. The Bridge runs on macOS. An iOS client is in design. We expect to make breaking changes before 1.0 and will say so in the release notes.

Panaudia

LASA is made by Paul Harter at glowinthedark, a small spatial audio company in London. It is the protocol we wished had existed when we started building live spatial audio systems.

We are building a hosted service on LASA. If you would like early access, or want to talk about a project, write to .