bench-advisory / bench-advisory (push) Failing after 7m7s
ci / cargo check + cargo test (push) Successful in 10m56s
ci / cargo deny (licenses + advisories + bans + sources) (push) Successful in 53s
ci / cargo about (license inventory) (push) Successful in 10m46s
ci / flutter license inventory (push) Successful in 2m13s
ci / flutter analyze (push) Successful in 36s
ci / flutter iOS unsigned release build (push) Has been cancelled
- Rewrite CHANGELOG.md with v0.3.0 entry - Bump version to 0.3.0+100 - Fix split-per-abi Android APK builds
6.2 KiB
6.2 KiB
Changelog
All notable changes to Chanora will be documented in this file.
This project follows a Conventional Commits style workflow.
[v0.3.0] — Cross-platform voice client baseline
The v0.3.0 milestone transitions Chanora from an internal-beta voice prototype to a cross-platform baseline client with event-driven UI, per-user audio controls, non-self client info parity, and CI-hardened Android / iOS / macOS / Linux builds.
Added
- Event-driven UI replaces timer-based snapshot polling. Protocol
deltas (client join/leave/move/update, channel add/remove/update)
flow through a typed
ProtocolDeltaenum and update the Flutter UI in real time. Channel switching is instant. - Per-user volume controls. Each client in the snapshot gets an independent volume slider persisted in the bridge layer. Avatar badges show muted/deafened state. Volume adjustments take effect immediately on the audio mix.
- Non-self client info parity with Qint. The Info tab now populates
connection metadata (name, description, created, last connected,
connections, transfer, ping deviation) for other clients via an
explicit
ClientProfileRefreshPlanthat fetchesconnectioninfoand recent text messages with a bounded timeout. - Ping deviation in client profiles.
ping_deviation_millisecondspropagated from protocol DTO through bridge API to Dart, with a conditional l10n row in the client info sheet (en + zh). - Apple CoreML Silero VAD as the preferred voice activity detector
on iOS / macOS when the private
silero-coremlSwiftPM submodule is available. WebRTC VAD remains the runtime fallback. - TeamSpeak address resolver (
chanora_resolver) for DNS SRV lookups andts3server://URI handling. - Per-ABI Android APK splitting.
flutter build apk --split-per-abiproduces separate arm64-v8a / armeabi-v7a / x86_64 APKs instead of a single fat APK. - Cross-platform CI (GitHub Actions): cargo check + test, cargo deny, cargo about license inventory, flutter analyze, flutter test, flutter iOS unsigned release build. All gates must pass before merge.
- Diagnostic recording. Bridge events, audio interruptions, and Rust-level log entries are captured into an in-memory ring buffer accessible from the diagnostics page.
- Shared app snackbar styling for consistent error/info feedback.
Changed
- iOS / macOS audio lifecycle hardened. Voice unit restart-in-place, serialized lifecycle events, WebRTC VAD on iOS, unblocked connect-time audio startup.
- Linux native audio path promoted with ONNX Runtime bundled for VAD. Desktop voice I/O works on PipeWire / PulseAudio.
- Android audio routing uses
MODE_IN_COMMUNICATION, proper startup permission flow, and system back-button integration. SnapshotChangedevent removed. Replaced by the typed delta stream. The dead variant was removed end-to-end (protocol, bridge, Flutter).- Prefetch crate renamed from the PoC-era name to
chanora_prefetch. All docs, specs, and code updated. - Build number bumped to 76.
- Flutter bridge regenerated for
flutter_rust_bridge2.12.0.
Fixed
clamppanic on Info tab open.adapter.rscasti64::MINtou128before clamping, producingmin > max. Replaced with.min(i64::MAX as u128) as i64.- Non-self client profiles empty. Added
request_client_db_info()with graceful fallback for missing fields. - Server query clients visible in UI. Delta joins now filter
is_server_queryclients from the channel tree. - Speaking indicators lost after reconnect. Event forwarders are reattached after the connection task restarts.
- Channel double-tap join. 1-second cooldown prevents rapid re-join attempts.
getconnectioninfoerrors silently discarded. Now logged at warning level instead.- iOS keyboard lag. Multiple focus/tap handling fixes for iOS 26
TextFieldstale-focus regression. - Storage test isolation. Temp directories no longer collide across parallel test runs.
- CI submodule fetch. iOS build job uses best-effort
git submodule updatewith|| truefallback for the privatesilero-coremlpackage. - Stale license inventory. Regenerated
docs/security/license- inventory.mdto match currentCargo.lock.
Notes
- The
silero-coremlsubmodule references a private repository (chanoraapp/silero-coreml). CI builds skip the iOS unsigned build when the submodule is unavailable. - Default base branch is
main(previouslyproduct/scaffold-v0). - DSP chain (AEC / AGC / NS / HPF) is not yet production-tuned.
AudioEffectsstruct exists but filters are placeholder-grade. - Desktop push-to-talk is capability-based; global PTT requires OS-specific permissions and is not yet wired end-to-end in the UI.
[v0.2.0-beta.1] — Internal Beta first build
- Voice in/out wired end-to-end through the Flutter UI. Per DEC-001 this reaches the Internal Beta milestone.
crates/chanora_audio/promoted from scaffold to working engine: cpal capture (mic gain, linear resampling to 48 kHz, mono down-mix) and playback (48 kHz stereo). Opus VoIP encoding (20 ms frames). Push-to-talk gate. Live counters.crates/chanora_protocol/extended with voice channels.core/chanora_core::ChanoraSessionaudio API.crates/chanora_bridge/audio surface for Dart.- Beta UI rewrite with connect, PTT, and audio stats.
Notes
- DSP chain not yet implemented (AEC / AGC / NS / HPF deferred).
- Capture resampler is linear interpolation (production resampler deferred).
- Identity is ephemeral per connect; persistence deferred.
- No live event stream — UI polls on timer.
chanora_diagnosticsstill scaffold.- Audio engine is desktop-only in this build.
[v0.1.0-alpha.1] — Internal Alpha
- First Alpha build wires connect → snapshot → disconnect end-to-end from the Flutter UI to a live TeamSpeak-compatible server via the typed Flutter/Rust bridge.
crates/chanora_protocol/promoted from scaffold to working adapter.crates/chanora_bridge/wired againstflutter_rust_bridge2.12.0.- Alpha UI: server address form, connect button, snapshot view.
Versioning note
The project implementation has not reached a public release version yet.