Repository navigation
Releases: bilalyazicioglu/tincan-cli
Release list
v0.3.4
What's Changed
- Added flake support by @Melal1 in #167
- chore(npm): normalize repository.url to npm's git+https form by @abhicodes-007 in #169
- docs: ask contributors to claim an issue first by @bilalyazicioglu in #170
- docs: ask in the PR template whether the issue was assigned by @bilalyazicioglu in #171
- docs: add a sponsor button by @bilalyazicioglu in #172
- feat(audio): follow system default devices on macOS by @bilalyazicioglu in #173
- Release v0.3.4 by @bilalyazicioglu in #174
New Contributors
- @Melal1 made their first contribution in #167
- @abhicodes-007 made their first contribution in #169
Full Changelog: v0.3.3...v0.3.4
v0.3.3
What's Changed
- docs: say plainly what tincan needs and what it does not by @bilalyazicioglu in #154
- Bring the README fix from main into develop by @bilalyazicioglu in #155
- style: format the codebase with cargo fmt and check it in CI by @bilalyazicioglu in #157
- feat(ui): show whose voice link is the problem (#93) by @bilalyazicioglu in #156
- fix(ui): write a round trip under a millisecond as <1ms (#158) by @bilalyazicioglu in #159
- docs: make tincan.rs the homepage everywhere and explain the package names by @bilalyazicioglu in #161
- chore(demo): show per-peer link quality in the README demo by @bilalyazicioglu in #162
- chore: release 0.3.3 by @bilalyazicioglu in #163
- docs: name the npm package and the repository rightly by @bilalyazicioglu in #164
- Release v0.3.3: whose link is the problem, and <1ms by @bilalyazicioglu in #165
Full Changelog: v0.3.2...v0.3.3
v0.3.2
What's Changed
- fix(npm): verify the release archive's SHA-256 before running it by @bilalyazicioglu in #144
- docs: link the website from the README by @bilalyazicioglu in #146
- fix(demo): pin every non-ASCII glyph to its own cell in the rendered frames by @bilalyazicioglu in #147
- fix(ui): keep ALSA and JACK output off the interface (#148) by @bilalyazicioglu in #149
- feat(audio): list sound servers and cards, not every ALSA plugin by @bilalyazicioglu in #150
- feat(net): take a closed room's address down, and add join --retry (#145) by @bilalyazicioglu in #151
- chore: release 0.3.2 by @bilalyazicioglu in #152
- Release v0.3.2: quiet ALSA, a clean device list, and join --retry by @bilalyazicioglu in #153
Full Changelog: v0.3.1...v0.3.2
v0.3.1
What's Changed
- docs: address disclosure, and a Homebrew step that stops failing quietly by @bilalyazicioglu in #137
- docs: publish on crates.io, and say so by @bilalyazicioglu in #138
- feat: AFK presence indicators, rail overflow indicators, and /help & /clear commands (v0.3.1) by @bilalyazicioglu in #140
- feat(ui): add rail overflow indicator and /help & /clear commands (closes #91) by @bilalyazicioglu in #141
- Release v0.3.1: AFK presence indicators, rail overflow indicators, and /help & /clear commands by @bilalyazicioglu in #142
Full Changelog: v0.3.0...v0.3.1
v0.3.0
What's Changed
- feat(dist): build for Windows, Intel macOS and arm64 Linux by @bilalyazicioglu in #133
- feat(audio): clean the microphone up before anyone else hears it by @bilalyazicioglu in #134
- v0.3.0 — noise suppression, and binaries for five platforms by @bilalyazicioglu in #135
Full Changelog: v0.2.4...v0.3.0
v0.2.4 — Speakable Room Identities, Homebrew Tap & NPM Distribution
What's Changed in v0.2.4
🎙️ Speakable Room Identities (#118, #130)
- Rooms can now be created and joined using memorable room names and human-speakable passphrases derived from a BIP-39 wordlist:
tincan host myroom tincan join myroom
- Deterministically derives cryptographic identities, encryption keys, and room discovery without central servers.
- Full backward compatibility with raw 63-character invite codes.
🍺 Official Homebrew Tap Distribution (#131)
- Added official Homebrew Tap at
bilalyazicioglu/homebrew-tap:brew tap bilalyazicioglu/tap && brew install tincan - Instant 1-second installation with prebuilt native binaries for Apple Silicon macOS and Linux x86_64, with automated shell completion registration.
📦 Official NPM Package Distribution (#131)
- Added official
tincan-clinpm package:npm install -g tincan-cli # or instant run without installing: npx tincan-cli host
🤖 Release Automation
- Added automated Homebrew tap updating step to release workflow on new tag publishes.
📖 Documentation
- Added English developer blog translation alongside the Turkish post.
Full Changelog: v0.2.3...v0.2.4
v0.2.3 — Screen Studio Demo, Graceful Endpoint Shutdown & Shell Auto-Completions
What's Changed in v0.2.3
🎬 Screen Studio-Style Animated Demo (#126)
- Added an automated, deterministic generator (
demo_video) rendering a Screen Studio-style animated walkthrough with dynamic camera zoom, pan, and TrueColor metallic palettes. - Integrated into the repository as
assets/demo.mp4and a 2-pass palette-optimizedassets/demo.gif(featured inREADME.md).
🔌 Graceful Endpoint Shutdown (#112)
- Ensured that iroh
Endpoint::close()is called across every session exit path: coordinator command loop exit, client reader disconnection, and client writer termination or transport errors. - Completely eliminates
ERROR iroh::socket: Endpoint dropped without calling Endpoint::close. Aborting ungracefullywarnings on session endings. - Added comprehensive end-to-end integration test verifying that guests receive closing notices and cleanly close endpoints upon coordinator exit.
🐚 Shell Auto-Completions (#61)
- Added
tincan completions <shell>subcommand powered byclap_complete, generating auto-completion scripts for:- Bash:
source <(tincan completions bash) - Zsh:
tincan completions zsh > ~/.zfunc/_tincan - Fish:
tincan completions fish > ~/.config/fish/completions/tincan.fish - PowerShell:
tincan completions powershell | Out-String | Invoke-Expression
- Bash:
🧹 Maintenance & Issue Cleanups
Full Changelog: v0.2.2...v0.2.3
v0.2.2
What's Changed
- fix(ui): persist keyboard sound settings and add F6 settings transition cues by @bilalyazicioglu in #123
- chore: bump version to 0.2.2 by @bilalyazicioglu in #124
- Release v0.2.2 by @bilalyazicioglu in #125
Full Changelog: v0.2.1...v0.2.2
v0.2.1 — Chat Scrollback & Per-Person Volume
A major usability update bringing Chat Scrollback and Per-Person Volume Control to the terminal interface.
💬 Chat Scrollback & Navigation (#90, #53)
Older messages are no longer lost once the chat pane fills up:
- Deep conversation history: Keeps up to 5,000 lines in memory by default (configurable via
history_limitin~/.config/tincan/config.toml). - Mouse Wheel & Trackpad scrolling: Smooth two-finger scrolling directly on the chat pane and settings menu (with safe terminal mouse capture restoration on exit).
- Vim-style navigation:
Ctrl+K/Alt+Kto scroll up,Ctrl+J/Alt+Jto scroll down (plainjandkremain safe for drafting messages). - Smooth keyboard scrolling:
Ctrl+↑/↓,Shift+↑/↓, andAlt+↑/↓for precise 2-line scrolling. - Page navigation:
PageUp/PageDownfor 15-line scrolling,EndorEscto instantly snap back to the latest message. - Visual indicators:
- Vertical scrollbar on the right margin (
▲ █ ░ ▼) showing your exact position in history. - Floating pill badge indicating unread messages arrived while scrolling (
[ ▼ +N new · Esc to bottom ]) or history state ([ 📜 History · Esc to bottom ]). - Beginning of conversation separator line when reaching the earliest loaded message.
- Vertical scrollbar on the right margin (
- Anchor locking: The viewport stays pinned on what you are reading when new messages arrive while scrolled up.
🔊 Per-Person Volume Control & Silence (#116, #119)
Manage loud or quiet participants individually:
- Individual volume tuning: Select someone on the roster with
↑/↓and use←/→to adjust their playback volume from 0% to 200%. - Individual silence: Press
Ctrl+Kon a selected peer to silence them completely without muting yourself or deafening the entire room. - Sound feedback: Silencing and un-silencing someone borrows the familiar ear chime an octave apart.
🛠️ Documentation & Infrastructure
- UI screenshot assets rendered automatically from the layout engine.
- Clarified install script instructions and dropped obsolete Intel macOS runner (#113).
📦 Installation
curl -fsSL https://raw.githubusercontent.com/bilalyazicioglu/tincan-cli/main/install.sh | shv0.2.0
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 witha— 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
mfor 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).