Applies the gen2 desktop-PTT review summary
(`gen2/chanora-desktop-ptt-review-summary-v0.9.2.md`) to our doc set
with the owner rulings PTT-OPEN-001 through PTT-OPEN-006 resolved as
accepted decisions DEC-023 through DEC-028:
* DEC-023 Windows Global PTT P0 / MVP
* DEC-024 macOS Global PTT P0 / MVP with permission UX
* DEC-025 Linux officially-tested env: GNOME on Wayland only
* DEC-026 Mouse side buttons supported (Win + macOS; Linux portal)
* DEC-027 PTT diagnostics: capability + availability only, no
raw key codes ever
* DEC-028 Missed-key-up watchdog: P0
Requirements (SysRS / SRS) and architecture (SysDes / SAD / SDD)
gain the desktop-PTT ID set the gen2 summary describes:
SysRS-296..302 -> SysDes-142..148
-> SRS-195..203
-> SAD-071..079
-> SDD-081..092
ID totals advance from 295 / 141 / 194 / 70 / 80 to 302 / 148 / 203
/ 79 / 92. The strict layered sourcing rule (`SRS -> SysDes` only,
`SAD -> SRS` only, `SDD -> SAD` only) is preserved; the
`tools/validate_docs.py` validator reports zero undefined refs and
zero direct-layer-rule violations.
New document:
* `docs/architecture/desktop-ptt-architecture.md` — capability
ladder (L0Focused, L1GlobalShortcut, L2GlobalHoldToTalk,
L3GlobalWithMouseButtons, L4DeviceAware reserved), Windows /
macOS / Linux strategies, privacy rule, audio-gate rule,
missed-key-up watchdog, release-readiness evidence requirement,
traceability summary.
Doc addenda (Baseline Candidate 0.9.3):
* `privacy/privacy-policy.md` — no raw key history, capability-
dependent Global PTT, UI reflects actual runtime capability
* `security/threat-model.md` — THREAT-PTT-001..006
* `security/diagnostic-redaction-audit-report.md` —
REDACT-PTT-001..006 banned field list enforced by `PttSanitizer`
* `release/platform-release-policy.md` — per-platform evidence
fields, no over-claim on untested Linux compositors
* `release/release-readiness-go-nogo-record.md` — RR-PTT-001..008
release-readiness items
* `verification/swe4-unit-verification-plan.md` —
SWE4-UV-035..039
* `verification/swe5-software-integration-verification-plan.md` —
SWE5-IV-015
* `verification/swe6-software-verification-plan.md` — SWE6-SV-017
* `verification/sys4-system-integration-verification-plan.md` —
SYS4-SIV-016
* `governance/traceability-matrix.md` — full PTT trace rows +
verification map
* `governance/decision-impact-assessment.md` — DEC-023..028
impact matrix
* `governance/product-decision-register.md` v0.9.9 entry
recording DEC-023..028 in the decision table and the status
table at §7
* `governance/document-index.md` — adds
`desktop-ptt-architecture.md` to the controlled set
* `architecture/proof-of-concept-plan.md` —
PoC-PTT-001..005 platform items
* `references/external-references.md` — Windows Raw Input,
macOS event-tap, Linux GlobalShortcuts portal references
* Both validation reports
(`baseline-candidate-validation-report.md`,
`repo-format-validation-report.md`) bumped to v0.9.3 with the
new ID totals (302 / 148 / 203 / 79 / 92).
README §"Desktop Push-to-Talk" added between Architecture Overview
and Repository Layout: capability levels, per-platform strategy,
privacy posture, missed-key-up watchdog.
Tooling:
* `tools/validate_docs.py` copied from the gen2 zip into the
repo tree (was previously available only inside the zip).
Reports zero undefined refs, zero direct-layer-rule violations,
English-only CJK check passes. The 35 "old package-style
filename" hits are pre-existing and identical to the gen2
baseline (they live in `path-migration-map.md` and config-ID
headers of governance docs and are intentional per the path
migration policy).
* `.gitignore` adds `/gen2/` so the externally-provided review
package does not enter the repo.
No code changes in this commit; B (the implementation split into
`transmit_active` / `capture_active`, `PttCapabilityLevel`
reporting, `PttSanitizer` diagnostics rule, and the UI capability
badge) follows in a separate commit.
444 lines
12 KiB
Markdown
444 lines
12 KiB
Markdown
# Chanora
|
|
|
|
Chanora is a cross-platform voice communication client for TeamSpeak-compatible servers.
|
|
|
|
It is built with a shared Flutter UI and a Rust core, with TeamSpeak-compatible protocol integration isolated behind `tsclientlib`.
|
|
|
|
```text
|
|
Flutter UI + Rust Core + tsclientlib
|
|
```
|
|
|
|
> Chanora is an independent project and is not affiliated with, endorsed by, sponsored by, or officially associated with TeamSpeak.
|
|
|
|
---
|
|
|
|
## Status
|
|
|
|
Chanora is currently in early planning and baseline-candidate design.
|
|
|
|
```text
|
|
Current documentation baseline: v0.9.2
|
|
Current status: Baseline Candidate
|
|
Implementation status: Not production-ready
|
|
```
|
|
|
|
The current engineering focus is:
|
|
|
|
- defining the system and software architecture;
|
|
- preparing the Flutter + Rust application structure;
|
|
- validating TeamSpeak-compatible protocol integration through `tsclientlib`;
|
|
- defining cross-platform audio behavior;
|
|
- preparing release, verification, security, privacy, and legal gates.
|
|
|
|
---
|
|
|
|
## Target Platforms
|
|
|
|
Chanora is intended to support:
|
|
|
|
- Windows
|
|
- macOS
|
|
- Linux
|
|
- Android
|
|
- iOS / iPadOS
|
|
|
|
Current platform policy:
|
|
|
|
| Platform | Baseline |
|
|
|---|---|
|
|
| iOS / iPadOS runtime target | iOS 13+ unless Flutter, plugin, audio, or product constraints require raising it |
|
|
| App Store Connect upload gate | Xcode 26+ with iOS 26 / iPadOS 26 SDK+ for upload on or after 2026-04-28 |
|
|
| Android runtime target | Android API 24+ unless Flutter, plugin, audio, or product constraints require raising it |
|
|
| Google Play target API | Target the Google Play-required API level on upload date |
|
|
|
|
The App Store / Play Store upload gates are release requirements. They are separate from local development and internal testing requirements.
|
|
|
|
---
|
|
|
|
## Architecture Overview
|
|
|
|
Chanora separates UI, protocol logic, state synchronization, audio processing, diagnostics, and platform services.
|
|
|
|
```text
|
|
Flutter Application
|
|
├─ App Shell
|
|
├─ Material 3 / Chanora Design System
|
|
├─ Feature Modules
|
|
├─ View Models / State
|
|
└─ Typed Flutter/Rust Bridge
|
|
|
|
Rust Core
|
|
├─ Connection Manager
|
|
├─ State Synchronization
|
|
├─ Protocol Adapter
|
|
├─ Audio Subsystem
|
|
├─ Storage Services
|
|
└─ Diagnostics
|
|
|
|
Protocol Layer
|
|
└─ tsclientlib
|
|
└─ TeamSpeak-compatible server
|
|
```
|
|
|
|
Key architecture rules:
|
|
|
|
- Flutter does not call `tsclientlib` directly.
|
|
- Protocol-specific types do not leak into the Flutter UI layer.
|
|
- Rust Core owns protocol coordination, state synchronization, audio logic, storage services, diagnostics, and bridge-facing DTOs.
|
|
- Flutter owns presentation, navigation, Material 3 theming, accessibility, localization presentation, and platform UI behavior.
|
|
- Product localization and server-provided content are separated.
|
|
- UTF-8 is the internal cross-layer text representation.
|
|
- Non-UTF-8 conversion, if needed, occurs only at explicit protocol or platform boundaries.
|
|
|
|
---
|
|
|
|
## MVP Direction
|
|
|
|
The current recommended MVP scope is:
|
|
|
|
| Area | MVP decision |
|
|
|---|---|
|
|
| Active server connections | One active server connection per client instance |
|
|
| UI baseline | Material 3 + Chanora Design System |
|
|
| Product language | English UI first, i18n-ready architecture |
|
|
| Server content | Preserve Unicode and do not translate server-provided content |
|
|
| Audio processing defaults | Echo Canceller, Automatic Gain Control, Noise Suppression, and High-Pass Filter enabled where supported and stable |
|
|
| Audio implementation path | Platform-native first; fallback isolated behind the audio subsystem |
|
|
| Local non-secret storage | SQLite or equivalent embedded database |
|
|
| Secret storage | Platform secure storage |
|
|
| Flutter/Rust bridge | Stable typed bridge with generated or schema-controlled DTOs |
|
|
| Diagnostics | Local, user-initiated export only |
|
|
| Telemetry | None in MVP |
|
|
| Crash reporting | Disabled unless explicitly approved later |
|
|
|
|
---
|
|
|
|
## Desktop Push-to-Talk
|
|
|
|
Chanora's desktop Push-to-Talk (PTT) follows a **capability-based** design (see
|
|
[`docs/architecture/desktop-ptt-architecture.md`](docs/architecture/desktop-ptt-architecture.md)).
|
|
Focused PTT — the user holds a bound key or mouse button inside the
|
|
focused Chanora window — is mandatory on Windows, macOS, and Linux.
|
|
Global PTT (recognised while the application is not focused) is
|
|
**capability-dependent**: it requires the operating system, the
|
|
user-granted permission set, the display server, and the available
|
|
input backend to all permit it.
|
|
|
|
The application reports a `PttCapabilityLevel` (`L0Focused`,
|
|
`L1GlobalShortcut`, `L2GlobalHoldToTalk`, `L3GlobalWithMouseButtons`)
|
|
that matches actual runtime behaviour, not the platform's theoretical
|
|
maximum. The UI capability badge shows the live value.
|
|
|
|
Per-platform strategy (resolved by owner rulings 2026-05-15, see
|
|
`docs/governance/product-decision-register.md` DEC-023 through
|
|
DEC-028):
|
|
|
|
* **Windows** — Raw Input first, low-level keyboard hook fallback,
|
|
Focused PTT terminal fallback. Mouse side buttons supported.
|
|
P0 / MVP.
|
|
* **macOS** — permission-aware Event Tap with Focused PTT fallback;
|
|
Global PTT upgrades asynchronously when the user grants Input
|
|
Monitoring / Accessibility. P0 / MVP.
|
|
* **Linux** — officially tested on **GNOME on Wayland** using the
|
|
`org.freedesktop.portal.GlobalShortcuts` interface; every other
|
|
Linux environment falls back to Focused PTT. Release notes do
|
|
not claim Global PTT support outside the tested compositor.
|
|
* Raw key codes, scan codes, virtual-key values, keysyms, and
|
|
key-press timing sequences are never logged or included in the
|
|
user-initiated diagnostic export. The diagnostic export carries
|
|
only capability level, backend identifier, and bound input
|
|
class.
|
|
|
|
A missed-key-up watchdog (default 30 s) clears `transmit_active`
|
|
when the OS suppresses a key-up event so a stuck-PTT bug class is
|
|
ruled out by construction.
|
|
|
|
## Repository Layout
|
|
|
|
The repository documentation is expected to live under `docs/`.
|
|
|
|
```text
|
|
docs/
|
|
requirements/
|
|
sysrs.md
|
|
srs.md
|
|
|
|
architecture/
|
|
sysdes.md
|
|
sad.md
|
|
sdd.md
|
|
|
|
verification/
|
|
verification-master-plan.md
|
|
swe4-unit-verification-plan.md
|
|
swe5-software-integration-verification-plan.md
|
|
swe6-software-verification-plan.md
|
|
sys4-system-integration-verification-plan.md
|
|
|
|
release/
|
|
release-readiness-go-nogo-record.md
|
|
platform-release-policy.md
|
|
|
|
security/
|
|
security-privacy-legal-guideline.md
|
|
threat-model.md
|
|
secure-storage-audit-report.md
|
|
diagnostic-redaction-audit-report.md
|
|
dependency-and-supply-chain-report.md
|
|
|
|
privacy/
|
|
privacy-policy.md
|
|
|
|
legal/
|
|
trademark-and-attribution-review.md
|
|
|
|
ui-ux/
|
|
material3-guideline.md
|
|
material3-design-tokens.md
|
|
material3-component-catalog.md
|
|
adaptive-layout-platform-guide.md
|
|
|
|
i18n/
|
|
localization-architecture.md
|
|
|
|
governance/
|
|
document-index.md
|
|
document-naming-convention.md
|
|
traceability-matrix.md
|
|
baseline-approval-record.md
|
|
baseline-candidate-validation-report.md
|
|
document-review-report.md
|
|
product-decision-register.md
|
|
decision-impact-assessment.md
|
|
git-commit-message-convention.md
|
|
repo-format-validation-report.md
|
|
path-migration-map.md
|
|
|
|
references/
|
|
external-references.md
|
|
aspice-swe2-swe3-integration-note.md
|
|
```
|
|
|
|
Implementation source folders may be added later. A likely structure is:
|
|
|
|
```text
|
|
apps/
|
|
chanora_flutter/
|
|
|
|
core/
|
|
chanora_core/
|
|
|
|
crates/
|
|
chanora_protocol/
|
|
chanora_audio/
|
|
chanora_state/
|
|
chanora_storage/
|
|
chanora_diagnostics/
|
|
chanora_bridge/
|
|
```
|
|
|
|
The exact implementation layout should be finalized when the repository scaffold is created.
|
|
|
|
---
|
|
|
|
## Documentation Entry Points
|
|
|
|
Start here:
|
|
|
|
| Topic | Document |
|
|
|---|---|
|
|
| System requirements | `docs/requirements/sysrs.md` |
|
|
| Software requirements | `docs/requirements/srs.md` |
|
|
| System architecture | `docs/architecture/sysdes.md` |
|
|
| Software architecture | `docs/architecture/sad.md` |
|
|
| Software detailed design | `docs/architecture/sdd.md` |
|
|
| Verification strategy | `docs/verification/verification-master-plan.md` |
|
|
| Release readiness | `docs/release/release-readiness-go-nogo-record.md` |
|
|
| Platform release policy | `docs/release/platform-release-policy.md` |
|
|
| Product decisions | `docs/governance/product-decision-register.md` |
|
|
| Traceability | `docs/governance/traceability-matrix.md` |
|
|
| Security/privacy/legal gates | `docs/security/security-privacy-legal-guideline.md` |
|
|
|
|
---
|
|
|
|
## Engineering Process
|
|
|
|
Chanora follows this documentation hierarchy:
|
|
|
|
```text
|
|
SysRS -> SysDes -> SRS -> SAD -> SDD
|
|
```
|
|
|
|
Direct traceability rules:
|
|
|
|
| Document | Direct upstream source |
|
|
|---|---|
|
|
| SysDes | SysRS |
|
|
| SRS | SysDes only |
|
|
| SAD | SRS only |
|
|
| SDD | SAD only |
|
|
|
|
Verification mapping:
|
|
|
|
```text
|
|
SDD -> SWE.4 Unit Verification
|
|
SAD + SDD -> SWE.5 Software Integration Verification
|
|
SRS -> SWE.6 Software Verification
|
|
SysDes -> SYS.4 System Integration Verification
|
|
```
|
|
|
|
Release readiness is tracked separately through the Go/No-Go record.
|
|
|
|
---
|
|
|
|
## Release Readiness
|
|
|
|
A release is not approved by design documents alone.
|
|
|
|
Before an external or public release, the project must complete:
|
|
|
|
```text
|
|
docs/release/release-readiness-go-nogo-record.md
|
|
```
|
|
|
|
The release decision must explicitly state:
|
|
|
|
```text
|
|
Go
|
|
Conditional Go
|
|
No-Go
|
|
```
|
|
|
|
Release readiness must include:
|
|
|
|
- release scope;
|
|
- build number;
|
|
- commit SHA;
|
|
- Git tag;
|
|
- artifact hashes;
|
|
- satisfied P0/MVP requirements;
|
|
- deferred requirements;
|
|
- verification results;
|
|
- waivers;
|
|
- security review status;
|
|
- platform readiness;
|
|
- legal and OSS review status;
|
|
- privacy policy status;
|
|
- approval decision and approvers.
|
|
|
|
---
|
|
|
|
## Security, Privacy, and Legal Gates
|
|
|
|
Security, privacy, and legal evidence are required before public or store release.
|
|
|
|
Required documents include:
|
|
|
|
```text
|
|
docs/security/threat-model.md
|
|
docs/security/secure-storage-audit-report.md
|
|
docs/security/diagnostic-redaction-audit-report.md
|
|
docs/security/dependency-and-supply-chain-report.md
|
|
docs/privacy/privacy-policy.md
|
|
docs/legal/trademark-and-attribution-review.md
|
|
```
|
|
|
|
Important gates:
|
|
|
|
- identity secrets and server passwords must use platform secure storage;
|
|
- logs and diagnostic exports must redact secrets;
|
|
- diagnostic export must be user-initiated unless a later approved policy changes this;
|
|
- dependency licenses and vulnerabilities must be reviewed;
|
|
- OSS notices must be prepared where required;
|
|
- public wording must not imply official TeamSpeak affiliation;
|
|
- privacy policy must describe local storage, diagnostics, permissions, and data handling.
|
|
|
|
---
|
|
|
|
## Git Commit Convention
|
|
|
|
Chanora uses a Conventional Commits style format:
|
|
|
|
```text
|
|
<type>(<scope>): <summary>
|
|
```
|
|
|
|
Examples:
|
|
|
|
```text
|
|
feat(voice): add push-to-talk state handling
|
|
fix(protocol): recover channel tree after reconnect snapshot
|
|
docs(sad): add interface catalog and performance view
|
|
i18n(ui): add fallback behavior for missing localization keys
|
|
sec(diagnostics): redact server password from export bundle
|
|
release(android): prepare internal alpha build metadata
|
|
```
|
|
|
|
See:
|
|
|
|
```text
|
|
docs/governance/git-commit-message-convention.md
|
|
```
|
|
|
|
---
|
|
|
|
## Development
|
|
|
|
Implementation commands will be added after the repository scaffold is finalized.
|
|
|
|
Expected future commands may include:
|
|
|
|
```bash
|
|
flutter pub get
|
|
flutter test
|
|
cargo test
|
|
cargo clippy
|
|
cargo fmt
|
|
```
|
|
|
|
Do not treat these as authoritative until the actual Flutter/Rust workspace has been created.
|
|
|
|
---
|
|
|
|
## Contributing
|
|
|
|
Before making a change:
|
|
|
|
1. Check the affected requirement/design document.
|
|
2. Confirm the correct traceability layer.
|
|
3. Use the Git commit convention.
|
|
4. Update docs and verification plans when the change affects requirements, architecture, detailed design, release behavior, security, privacy, or legal gates.
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
Chanora is dual-licensed under either of:
|
|
|
|
- Apache License, Version 2.0
|
|
([LICENSE-APACHE](LICENSE-APACHE) or
|
|
<https://www.apache.org/licenses/LICENSE-2.0>)
|
|
- MIT license
|
|
([LICENSE-MIT](LICENSE-MIT) or
|
|
<https://opensource.org/licenses/MIT>)
|
|
|
|
at your option. This dual-license model was Accepted on 2026-05-14
|
|
as decision DEC-020 in
|
|
[`docs/governance/product-decision-register.md`](docs/governance/product-decision-register.md).
|
|
|
|
Unless you explicitly state otherwise, any contribution intentionally
|
|
submitted for inclusion in Chanora by you, as defined in the Apache-2.0
|
|
license, shall be dual-licensed as above, without any additional terms
|
|
or conditions.
|
|
|
|
Third-party software bundled or linked by Chanora is listed in
|
|
[`NOTICE`](NOTICE) with its own licenses. The complete legal review of
|
|
the dependency tree (DEC-012) must complete before any public/store
|
|
release. See:
|
|
|
|
```text
|
|
docs/governance/product-decision-register.md
|
|
docs/security/dependency-and-supply-chain-report.md
|
|
docs/legal/trademark-and-attribution-review.md
|
|
```
|