Every row in the Apple client's three settings surfaces carried its whole design rationale in the caption. Audio quality was the extreme: six dynamic variants, each with a bandwidth-gate rider and a surround rider bolted on, so 96 kHz on 5.1 rendered ninety-five words under one picker. The tvOS cluster caption for the same setting was a single 102-word paragraph, read from a sofa.
50 strings rewritten across five files: 2 097 → 973 user-facing words, −54%.
The rule
One clause of what the setting does, one of what it costs. Toggles land under ~12 words, pickers under ~16.
Numbers survive — "2.3 Mbps", "one refresh of latency", "20 Mbps" are the actionable half.
Rationale does not. It already lives in the code comment directly above each caption, in duplicate. That is its right home.
Pre-emptive troubleshooting goes — "turn off if hosts behind a VPN look offline when they aren't" is a support answer, not a toggle subtitle.
Captions that restate the row's own label go — "Live session stats in a corner overlay" under a row labelled Statistics overlay.
Real warnings stay, tightened.windowed_safe_present is the only setting whose wrong value can take down the whole machine, so its off-state still says "kernel-panic" and says it early.
Before / after
Before
After
Audio quality (six variants + riders)
273 w
78 w
tvOS audio cluster caption
102 w
27 w
Echo cancellation
44 w
15 w
Forward controllers
43 w
15 w
Hold Select for guide
43 w
13 w
Three things worth knowing
The lossless gate riders moved to the section footer. They are gone from all five lossless rows and said once, in the Audio footer. That sentence — "Lossless falls back to Standard if the host or this device's output declines it." — is now the only thing keeping audioFormatCaption compliant with the design rule that the UI states the RESOLVED format, never the requested one. Its doc comment says so. Do not delete it without replacing it.
bitrateFooter loses its speed-test sentence entirely rather than being shortened. That string is tvOS-only and directed Apple TV users to a host card's context menu; tvOS has no context menus. A bug, not just length.
Seven console rows are now word-for-word with their touch-UI twins. The two surfaces had drifted into describing identical settings differently, which is how the divergence started.
Verification
swift build --target PunktfunkClient is clean on macOS, on arm64-apple-ios17.0 against the iPhoneOS SDK, and on arm64-apple-tvos17.0 against the AppleTVOS SDK — so the #if-gated iOS and tvOS branches are compiled rather than assumed. tvBody in particular carries three of the edited captions and neither of the other two builds reaches it.
347 tests pass, 0 failures. No test asserts any of these strings.
Scope
Apple only. Error and notice text is untouched — an error has to say what went wrong and what to do, which is a different job with a different budget.
The Linux GTK client was already writing at the right length and served as the reference; Android's echo-cancel wording is the phrasing all four clients now share. Android still owes the same pass on four strings (audio quality, forward controllers, controller type, and its touch-UI audio caption) — happy to follow up so all four clients read identically.
Every row in the Apple client's three settings surfaces carried its whole design rationale in the caption. **Audio quality** was the extreme: six dynamic variants, each with a bandwidth-gate rider and a surround rider bolted on, so 96 kHz on 5.1 rendered ninety-five words under one picker. The tvOS cluster caption for the same setting was a single **102-word paragraph**, read from a sofa.
50 strings rewritten across five files: **2 097 → 973 user-facing words, −54%**.
## The rule
One clause of what the setting does, one of what it costs. Toggles land under ~12 words, pickers under ~16.
- **Numbers survive** — "2.3 Mbps", "one refresh of latency", "20 Mbps" are the actionable half.
- **Rationale does not.** It already lives in the code comment directly above each caption, in duplicate. That is its right home.
- **Pre-emptive troubleshooting goes** — *"turn off if hosts behind a VPN look offline when they aren't"* is a support answer, not a toggle subtitle.
- **Captions that restate the row's own label go** — *"Live session stats in a corner overlay"* under a row labelled **Statistics overlay**.
- **Real warnings stay, tightened.** `windowed_safe_present` is the only setting whose wrong value can take down the whole machine, so its off-state still says "kernel-panic" and says it early.
### Before / after
| | Before | After |
|---|---:|---:|
| Audio quality (six variants + riders) | 273 w | 78 w |
| tvOS audio cluster caption | 102 w | 27 w |
| Echo cancellation | 44 w | 15 w |
| Forward controllers | 43 w | 15 w |
| Hold Select for guide | 43 w | 13 w |
## Three things worth knowing
**The lossless gate riders moved to the section footer.** They are gone from all five lossless rows and said once, in the Audio footer. That sentence — *"Lossless falls back to Standard if the host or this device's output declines it."* — is now the only thing keeping `audioFormatCaption` compliant with the design rule that **the UI states the RESOLVED format, never the requested one**. Its doc comment says so. Do not delete it without replacing it.
**`bitrateFooter` loses its speed-test sentence entirely** rather than being shortened. That string is tvOS-only and directed Apple TV users to a host card's context menu; tvOS has no context menus. A bug, not just length.
**Seven console rows are now word-for-word with their touch-UI twins.** The two surfaces had drifted into describing identical settings differently, which is how the divergence started.
## Verification
`swift build --target PunktfunkClient` is clean on **macOS**, on **`arm64-apple-ios17.0`** against the iPhoneOS SDK, and on **`arm64-apple-tvos17.0`** against the AppleTVOS SDK — so the `#if`-gated iOS and tvOS branches are compiled rather than assumed. `tvBody` in particular carries three of the edited captions and neither of the other two builds reaches it.
**347 tests pass, 0 failures.** No test asserts any of these strings.
## Scope
Apple only. Error and notice text is untouched — an error has to say what went wrong and what to do, which is a different job with a different budget.
The **Linux GTK client was already writing at the right length** and served as the reference; Android's echo-cancel wording is the phrasing all four clients now share. **Android still owes the same pass** on four strings (audio quality, forward controllers, controller type, and its touch-UI audio caption) — happy to follow up so all four clients read identically.
Every row in the Apple client's three settings surfaces carried its whole
design rationale in the caption. "Audio quality" was the extreme: six dynamic
variants, each with a bandwidth-gate rider and a surround rider bolted on, so
96 kHz on 5.1 rendered ninety-five words under one picker. The tvOS cluster
caption for the same setting was a single 102-word paragraph, read from a sofa.
The rule applied throughout: one clause of what the setting does, one of what
it costs. Numbers survive — "2.3 Mbps", "one refresh of latency", "20 Mbps" are
the actionable half. The rationale does not; it already lives in the code
comment directly above each caption, which is its right home. Pre-emptive
troubleshooting ("turn off if hosts behind a VPN look offline when they
aren't") goes too — that is a support answer, not a toggle subtitle.
Three things worth knowing:
- The lossless gate riders are gone from all five rows and said ONCE in the
Audio section footer instead. That footer sentence is now the only thing
keeping `audioFormatCaption` honest about the design's rule — the picker must
never read as a promise of the RESOLVED format — so its doc comment says so.
Do not drop it without replacing it.
- `bitrateFooter` loses its speed-test sentence entirely rather than being
shortened. That string is tvOS-only and directed Apple TV users to a host
card's context menu; tvOS has no context menus. A bug, not just length.
- Seven console rows are now word-for-word with their touch-UI twins. The two
surfaces had drifted into describing identical settings differently, which is
how the divergence started in the first place.
Safe windowed presentation is trimmed conservatively — it is the only setting
whose wrong value can take down the whole machine, so the off-state keeps
"kernel-panic" and keeps it early.
Verified: `swift build --target PunktfunkClient` clean on macOS, and on
arm64-apple-ios17.0 and arm64-apple-tvos17.0 against their own SDKs, so the
#if-gated iOS and tvOS branches are covered rather than assumed. 347 tests pass.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Every row in the Apple client's three settings surfaces carried its whole design rationale in the caption. Audio quality was the extreme: six dynamic variants, each with a bandwidth-gate rider and a surround rider bolted on, so 96 kHz on 5.1 rendered ninety-five words under one picker. The tvOS cluster caption for the same setting was a single 102-word paragraph, read from a sofa.
50 strings rewritten across five files: 2 097 → 973 user-facing words, −54%.
The rule
One clause of what the setting does, one of what it costs. Toggles land under ~12 words, pickers under ~16.
windowed_safe_presentis the only setting whose wrong value can take down the whole machine, so its off-state still says "kernel-panic" and says it early.Before / after
Three things worth knowing
The lossless gate riders moved to the section footer. They are gone from all five lossless rows and said once, in the Audio footer. That sentence — "Lossless falls back to Standard if the host or this device's output declines it." — is now the only thing keeping
audioFormatCaptioncompliant with the design rule that the UI states the RESOLVED format, never the requested one. Its doc comment says so. Do not delete it without replacing it.bitrateFooterloses its speed-test sentence entirely rather than being shortened. That string is tvOS-only and directed Apple TV users to a host card's context menu; tvOS has no context menus. A bug, not just length.Seven console rows are now word-for-word with their touch-UI twins. The two surfaces had drifted into describing identical settings differently, which is how the divergence started.
Verification
swift build --target PunktfunkClientis clean on macOS, onarm64-apple-ios17.0against the iPhoneOS SDK, and onarm64-apple-tvos17.0against the AppleTVOS SDK — so the#if-gated iOS and tvOS branches are compiled rather than assumed.tvBodyin particular carries three of the edited captions and neither of the other two builds reaches it.347 tests pass, 0 failures. No test asserts any of these strings.
Scope
Apple only. Error and notice text is untouched — an error has to say what went wrong and what to do, which is a different job with a different budget.
The Linux GTK client was already writing at the right length and served as the reference; Android's echo-cancel wording is the phrasing all four clients now share. Android still owes the same pass on four strings (audio quality, forward controllers, controller type, and its touch-UI audio caption) — happy to follow up so all four clients read identically.
Every row in the Apple client's three settings surfaces carried its whole design rationale in the caption. "Audio quality" was the extreme: six dynamic variants, each with a bandwidth-gate rider and a surround rider bolted on, so 96 kHz on 5.1 rendered ninety-five words under one picker. The tvOS cluster caption for the same setting was a single 102-word paragraph, read from a sofa. The rule applied throughout: one clause of what the setting does, one of what it costs. Numbers survive — "2.3 Mbps", "one refresh of latency", "20 Mbps" are the actionable half. The rationale does not; it already lives in the code comment directly above each caption, which is its right home. Pre-emptive troubleshooting ("turn off if hosts behind a VPN look offline when they aren't") goes too — that is a support answer, not a toggle subtitle. Three things worth knowing: - The lossless gate riders are gone from all five rows and said ONCE in the Audio section footer instead. That footer sentence is now the only thing keeping `audioFormatCaption` honest about the design's rule — the picker must never read as a promise of the RESOLVED format — so its doc comment says so. Do not drop it without replacing it. - `bitrateFooter` loses its speed-test sentence entirely rather than being shortened. That string is tvOS-only and directed Apple TV users to a host card's context menu; tvOS has no context menus. A bug, not just length. - Seven console rows are now word-for-word with their touch-UI twins. The two surfaces had drifted into describing identical settings differently, which is how the divergence started in the first place. Safe windowed presentation is trimmed conservatively — it is the only setting whose wrong value can take down the whole machine, so the off-state keeps "kernel-panic" and keeps it early. Verified: `swift build --target PunktfunkClient` clean on macOS, and on arm64-apple-ios17.0 and arm64-apple-tvos17.0 against their own SDKs, so the #if-gated iOS and tvOS branches are covered rather than assumed. 347 tests pass.