Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 11:58
· 116 commits to main since this release
5133944

The interface is rebuilt, and the audio path learned to survive real hardware.

41 commits since v0.1.2, closing twenty-five issues.

The interface

Rebuilt around a token layer: colour, glyph and motion decisions live in one place, with fallbacks for NO_COLOR, ASCII-only terminals, reduced motion and light backgrounds. Nothing is boxed and there are no emoji. The palette is metal — a brown tin ground, brass for the string and the invite code, and the two greens copper actually turns.

The divider between the room and the talk is the connection itself: taut when every peer is reached directly, sagging through a relay, fraying when audio drops, with a pulse that travels along it at the speed of the round trip. Latency is something you see rather than read. Before anyone has joined, the chat pane draws that link full size — two cans, the string with the measured round trip written over it, and your invite code underneath.

Names are set flush against their messages and the column is only as wide as the names actually talking; a run of messages from one person keeps a single heading; the transcript hangs from the bottom of the pane. A channel written in since you last looked turns brass.

Audio

  • An adjustable noise floor, drawn on the live meter and moved with ←/→, or measured from the room with a — the program listens for a second and a half and sets it just above what it heard. Remembered per microphone, because a laptop microphone and a headset do not share a noise floor.
  • A microphone test that records and then plays back, rather than monitoring live. On a laptop the microphone can hear the speakers, and anything that opens both at once closes an acoustic loop between them. Live monitoring is still available under m for headphones, and cuts itself off if it starts feeding back.
  • A level meter per person, computed from frames the playback loop already decodes. No protocol change.
  • Sounds that mean something: muting and deafening are the same gesture an octave apart, up for open and down for closed; a message is the only single note in a set of two-note gestures; and the keyboard can be given a voice, seeded per key so the same key always sounds the same.
  • Runtime device switching, and cubic resampling so any sample rate works — 16 kHz Bluetooth headsets included.

Fixes

  • A remembered microphone that is no longer plugged in used to take all audio down with it and drop the session to text only. It now falls back to the default and says which device it was looking for.
  • A speaker whose sample rate changed under the program never came back — the meter kept moving and nothing came out. Streams are now reopened against the device's current configuration.
  • The dropout warning never cleared once it appeared, because the underrun counter only climbs.
  • The interface redrew fifty times a second whenever audio was running.
  • Log output printed on top of the interface. It now goes to a file, with one line at exit naming it.
  • Ctrl+C at the invite-code prompt left the endpoint open, and then hung forever waiting on a keypress that was never coming.
  • Settings refused a device with a reason that resampling had made obsolete.

Platforms

Prebuilt binaries for macOS (Apple Silicon) and Linux x86_64. Anywhere else — Intel Macs, arm64 Linux, Windows — install.sh falls back to building from source, which needs a Rust toolchain and a few minutes.

Intel macOS was in this release's matrix until it wasn't: the job sat queued on a macos-13 runner for fourteen hours without ever starting, and the release job waits on all of them. Cross-compiling it from an Apple Silicon runner is #114. Windows is untested (#105) and arm64 Linux is not built yet (#106).

Known limits

No scrollback yet (#90), the rail silently drops rows that do not fit (#91), link quality is reported for the mesh as a whole rather than per peer (#93), and the noise gate silences your room between sentences but does not clean up your voice during them (#97).