# AudioBridger — Changelog

What's new in each public release of AudioBridger. Newest at the top.

---

## 1.2.0 — Node Graph

Effects became a real node-graph editor. Wires are wires; cut means cut;
fan out a single FX to as many receivers as you like and edits stay in
lock-step across every mirror.

### What's new

- **Ten built-in effects** per source: gain, pan, hard limiter,
  compressor, 5-band parametric EQ, noise gate, de-esser, delay,
  reverb and saturator. Each runs on the receiver, in the source's
  own DSP chain, before the mixer.
- **Node-graph effects editor.** Drop an FX card on the canvas first and
  wire it up later. Drag from any sender's OUT, FX IN/OUT, or
  receiver IN to any compatible port. Pending wires draw dashed and turn
  solid green when the full sender → … → receiver path is complete.
- **Fan-out.** Drag an FX's OUT port to multiple receivers (or into other
  FX inputs) and they all hear the same DSP. Edits stay in lock-step
  across every mirror — slide a fader on one card, every copy moves.
- **Cut wires stay cut.** Click a chain wire, press Delete, and only that
  wire goes. Audio stops on that path until you re-wire it. The FX cards
  stay where they were, with dashed wires showing what used to be
  connected — no auto-reconnect, no surprises.
- **Sample-rate conversion.** Mismatched sample rates used to be silently
  rejected. Now they get a linear-interp resampler on the fly, and a
  yellow hazard chip on the mixer row tells you what's being converted
  (and to what), so you can fix it at source for best quality.
- **Compressor & EQ presets.** Built-in starter presets (Vocal, Drum Bus,
  Mix Bus, Limiter-ish, Gentle Glue for the compressor; Flat, Vocal Air,
  Low Cut, Telephone, Smile, Warm, Bright for the EQ) plus
  Save / Load / Reset / Delete for your own custom presets, stored per
  browser.
- **Wider compressor card, taller EQ display.** Compressor card now 280px
  wide with the transfer-curve graph filling the width. EQ frequency
  response shows the live composite curve plus individual band curves
  in band-coloured ink.

### Receiver

- **Linear-interp resampler** in the mix loop. Sources at any sample rate
  are accepted; the receiver pulls them at the source's native rate and
  produces the right number of output frames for the mixer. Phase is
  carried across calls + previous-frame is remembered so there are no
  clicks at buffer boundaries.

### Hub

- **Unwired FX survive restarts.** Dropped an FX card on the canvas but
  haven't wired it up yet? It stays put after a hub restart and
  replicates to standby hubs under HA.
- **Slider edits sync across mirrors.** Adjust a parameter on one FX
  card and every fanned-out copy moves with it — one action, every
  receiver hears the change.
- **Deleting a route actually disconnects.** Used to leave the receiver
  briefly chasing the last known sender; now it goes quiet immediately.
- **No more spurious "failed to write config" errors.** Back-to-back
  edits no longer race the disk write.

### UI

- Compatible across browsers: a thorough Safari pass landed all the
  WebKit foreignObject quirks (inline width/height, no opacity for
  dimming, flex layout instead of position:absolute, plain text mute
  pill instead of speaker emoji). Sender/receiver cards, FX cards,
  VU meters and chain wires now render cleanly in Safari, Firefox and
  Chrome.

### Node-graph polish

- **One wire = one logical edge.** Mirrored FX cards used to draw one
  wire per chain, so a delete or splice on the visible wire only
  touched one mirror and left ghost wires behind. Wires now dedupe
  across mirror chains, and add / delete / palette-splice broadcast
  to every chain that holds the same edge.
- **Multi-downstream DSP.** A single FX can now fan out to multiple
  downstream FX inside the same chain. The receiver-side processor
  topo-sorts the graph and sums branches at merge points, so splitting
  a signal and recombining it works without external mixing.
- **Persistence fixes.** Effect chains saved in the richer object form
  (`{nodes, edges}`) are reloaded correctly on hub restart — previously
  the loader only accepted the legacy array shape and silently dropped
  the rest, so every restart wiped chains.
- **Mirror-aware port drags.** Drags from a sender or receiver port
  onto a mirrored FX now route the edge into the chain that needs it,
  not whichever chain the card happened to render against.
- **FX cards stop drifting when sender / receiver cards move.** Auto-
  placed positions are frozen on first compute (per node_id, across
  status polls) so only the dragged card's directly-attached wires
  follow it.
- **Click empty canvas to clear FX wire selection** (matches the
  sender/receiver wire selection behaviour).
- **DSP path-search.** A node with multiple outgoing edges no longer
  randomly picks the first one as the audio path — the processor
  follows whichever branch actually reaches `__receiver__`.
- **Receiver VU reflects what comes out, not what comes in.** Used to
  feed the raw incoming packet into the receiver's display VU, so two
  receivers subscribed to the same source mirrored each other's
  meters even when one had a broken DSP chain. Now the meter is
  driven from the post-DSP, post-mix output buffer — a broken chain
  shows a flat VU.

---

## 1.1.0 — Initial public release

The first generally-available version of AudioBridger.

### What it does

AudioBridger streams audio between computers on your local network, in real
time, with no cables, drivers, or audio interfaces. Pick a sound source on
one machine, hear it on another. That's it.

### Highlights

- **Low latency.** Built for live monitoring, not file transfer. Audio
  flows in tens of milliseconds, not seconds.
- **Zero setup.** Run the apps on two machines and they find each other
  automatically over your LAN.
- **Cross-platform.** Mac and Windows talk to each other freely, in
  either direction.
- **One sender, many listeners.** A single source can be heard on up to
  ten receivers at once.
- **Studio-quality audio.** Uncompressed 16-bit PCM, up to 48 kHz stereo,
  at about 1.5 Mbps per receiver.
- **Auto-reconnect.** Network blips don't matter — AudioBridger picks back
  up where it left off.
- **Lightweight.** No daemons, no system extensions, no driver installs.

### The hub dashboard

An optional third app, the **hub**, gives you a web dashboard for the
whole cluster:

- One row per sender and receiver, with live VU meters and packet stats.
- Drag wires from a sender to a receiver to route audio.
- Mute receivers, swap their output devices, or pick a sender's input
  device — all from any browser on the network.
- Inline browser playback for any sender that has the AAC stream
  enabled, so you can monitor without installing anything.

### Listen in a browser

Each sender can also publish a low-bitrate AAC stream over HTTP. Open
the URL in a phone, a laptop browser, VLC, or OBS — useful for spot
checks and remote monitoring without running a receiver.

Requires FFmpeg installed on the sending machine. If FFmpeg isn't
present the AAC stream silently turns off and everything else keeps
working.

### Licensing

- **Trial** — no licence required. Sender and hub each run for 30
  minutes per launch. Receivers are always free.
- **Personal** — one licence covers up to 4 senders and unlimited
  receivers in a single setup.
- **Pro** — unlimited senders, unlimited receivers. For venues,
  broadcast facilities, and multi-room installations.

Licences are perpetual — once activated, the version you bought keeps
working forever. No subscription. Online and offline activation
supported. See the website for full terms.

### Platforms

- macOS (Intel and Apple Silicon)
- Windows 10 and later (32-bit and 64-bit)
