Skip to content

Release v0.3.3: whose link is the problem, and <1ms - #165

Merged
bilalyazicioglu merged 25 commits into
mainfrom
develop
Oct 2, 2026
Merged

bilalyazicioglu merged 25 commits into
mainfrom
develop

Conversation

@bilalyazicioglu

Copy link
Copy Markdown
Owner

Release v0.3.3

Features

  • Per-peer link quality (closes The connection drawing and the link chip flatten a whole mesh into one reading #93) — feat(ui): show whose voice link is the problem (#93) #156.
    The link used to be one reading for the whole mesh, so one bad connection coloured the screen and the round trip shown belonged to nobody. Now each connection keeps its own:
    • The roster marks a relayed link ╌340ms in brass and a slow direct one (two readings in a row at 150 ms or more, clearing below 120 ms) with its round trip. The selected row shows its own round trip when healthy.
    • In a call of three or more, the header names whose link it is: RELAY deniz 140ms. When the header is narrow the name goes first, then the number.
    • The far can is the person the reading belongs to, with their round trip and kind beneath.
    • Nobody is named beside a choppy line: dropouts are measured in our own playback and do not say whose audio was late.
    • Healthy rooms and two-person calls look exactly as before.

Fixes

Other

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update

Checklist

  • I have run cargo test and all 93+ tests pass cleanly.
  • I have run cargo clippy --all-targets and resolved all warnings.
  • I have formatted my code with cargo fmt.
  • I have updated relevant documentation / Wiki files.

Bring the README fix from main into develop
The Ratatui showcase asks for the terminal alone: no window, no camera, the
subject filling the frame and motion that is the interface's own. The
Screen Studio demo zooms and pans inside a window with a wide margin, so a
second recorder draws the same frames flat at 100x22, 1000 px wide.

It plays one call through: alone with the invite code, bob and cem join,
bob talks down a taut string, the reply is typed, the link falls back to a
relay and slows the pulse, audio breaks up and the string frays, then the
audio screen opens with a live meter. Output goes to target/showcase/
because the showcase asks for media to live outside the repository.

ffmpeg writes every GIF frame whole (~15 MB), so Pillow folds identical
frames and writes only what changed, keeping ffmpeg's palette minus its
transparency green, which the half-covered bottom pixel row was matched to.

dropped_at becomes pub(crate) so the fray can be ended on cue.

    cargo test --lib -- --ignored --nocapture showcase_gif
Mechanical: whitespace and line breaks only, default rustfmt settings.
cargo test (303 + 4 + 14 + 7), clippy -D warnings and the release build
are unchanged.
A separate fmt job runs cargo fmt --all --check once, and the fixed-name gate
now requires it alongside the test matrix, so the branch ruleset enforces it
without naming a new check. .git-blame-ignore-revs lets blame skip the
one-time formatting commit.
style: format the codebase with cargo fmt and check it in CI
Dropouts are measured in our own playback and do not say whose audio was
late. With a relayed peer in a crowded call the header read 'audio dropping
CHOPPY emre 340ms', which blames emre for something we cannot pin on anyone.
While the string is frayed the header and the far can go back to the
unnamed reading; the roster still shows each person's own link.
…#93)

A connection can outlive its person by a moment: it closes on the next
membership update and is only read again on the next tick. Until then a row
could keep someone's old round trip, and the chip could say RELAY because of
a relayed peer who had already left while naming a slow direct one.

The link table is now pruned to the people in our voice channel on every
reading and on every roster change, and the direct / relayed / worst figures
are counted from what is left. Leaving the call empties it.
feat(ui): show whose voice link is the problem (#93)
millis() truncated, so two instances on one machine or peers on a quiet LAN
read as 0ms in the header, the roster and under the far can, which looks like
no reading at all. The longest tag, ╌<1ms, still fits in the roster's cells.

Closes #158
It had slid above on_error, so on_error's docs opened by describing device
matching.
…names

Cargo.toml gains homepage = "https://tincan.rs", and npm/package.json and
the Homebrew formula written by the release workflow point there instead
of the repository. The README's website links move from
tincan.bilalyazicioglu.com to tincan.rs, and Install opens with which
name the program goes by where, and that it is not the Tin Can API.
fix(ui): write a round trip under a millisecond as <1ms (#158)
docs: make tincan.rs the homepage everywhere and explain the package names
The demo predated per-peer link quality, so it showed nothing of it. After the
tour, deniz says he is on hotel wifi and drops to a relay: the header names him,
his row reads ╌140ms and the far can becomes him. He is direct again before the
camera pulls out, so the loop opens and ends on a healthy line.

The mesh reading the showcase generator built inline is now mesh_reading(),
shared by both generators.
chore(demo): show per-peer link quality in the README demo
…ermux runs

The crates.io paragraph said the npm package and the repository are both
called tincan; both are tincan-cli, as the lines above it say. The platform
table still put Android voice on the roadmap for v0.2.0.
docs: name the npm package and the repository rightly
@bilalyazicioglu
bilalyazicioglu merged commit 8d47968 into main Oct 2, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] A round trip under a millisecond is shown as 0ms The connection drawing and the link chip flatten a whole mesh into one reading

1 participant