feat(calls): in-game voice overlay for the desktop app (cinny-desktop #25) #488

Merged
jared merged 1 commits from feat/voice-overlay into lotus 2026-11-09 21:31:35 -05:00
Owner

Web side of cinny-desktop #25, phase 1. The native window is in LotusGuild/cinny-desktop feat/voice-overlay. Either PR can merge first: invokeTauri swallows an unknown command, and in the browser this is a no-op.

What changes

  • Settings → Calls (desktop app only):
    • In-game overlay (beta): off by default, device-local, not synced to your other devices.
    • Overlay position: four corners, shown when the overlay is on.
  • utils/callOverlay.ts, a pure snapshot builder:
    • everyone in the call, you first, then everyone else in call order;
    • one row per person across devices: speaking if any device is, muted only if every device is;
    • your own mute/deafen/PTT state. In PTT mode you aren't shown as Muted while the key is up;
    • non-user ids from the fork are ignored.
  • hooks/useTauriOverlay.ts (mounted in TauriDesktopFeatures):
    • reads live io.lotus.call_state participants, only while the overlay could show, plus the call control state;
    • sends to set_overlay_state, coalesced to one send per 100 ms at most, with the latest state always delivered;
    • skips unchanged snapshots;
    • sends an inactive state on unmount.
    • The desktop decides when to show the overlay: in a call and Lotus not focused.

Tests

  • callOverlay.test.ts: 8 new tests. Together with settings.test.ts and settingsSync.test.ts: 25/25.
  • prettier and eslint are clean on the changed files.
  • Local tsc only shows 5 errors in files I didn't touch, from a stale local node_modules. CI typechecks with the locked dependencies.

🤖 Generated with Claude Code

https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA

Web side of cinny-desktop #25, phase 1. The native window is in LotusGuild/cinny-desktop `feat/voice-overlay`. Either PR can merge first: `invokeTauri` swallows an unknown command, and in the browser this is a no-op. ## What changes - **Settings → Calls** (desktop app only): - **In-game overlay (beta)**: off by default, device-local, not synced to your other devices. - **Overlay position**: four corners, shown when the overlay is on. - **`utils/callOverlay.ts`**, a pure snapshot builder: - everyone in the call, you first, then everyone else in call order; - one row per person across devices: speaking if any device is, muted only if every device is; - your own mute/deafen/PTT state. In PTT mode you aren't shown as Muted while the key is up; - non-user ids from the fork are ignored. - **`hooks/useTauriOverlay.ts`** (mounted in `TauriDesktopFeatures`): - reads live `io.lotus.call_state` participants, only while the overlay could show, plus the call control state; - sends to `set_overlay_state`, coalesced to one send per 100 ms at most, with the latest state always delivered; - skips unchanged snapshots; - sends an inactive state on unmount. - The desktop decides when to show the overlay: in a call and Lotus not focused. ## Tests - `callOverlay.test.ts`: 8 new tests. Together with `settings.test.ts` and `settingsSync.test.ts`: **25/25**. - prettier and eslint are clean on the changed files. - Local `tsc` only shows 5 errors in files I didn't touch, from a stale local `node_modules`. CI typechecks with the locked dependencies. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
jared added 1 commit 2026-11-09 17:26:29 -05:00
feat(calls): in-game voice overlay for the desktop app (cinny-desktop #25)
CI / Build & Quality Checks (push) Skipped
CI / Secret scan (gitleaks) (push) Skipped
CI / Playwright smoke (e2e) (push) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 23s
CI / Build & Quality Checks (pull_request) Successful in 5m9s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Playwright smoke (e2e) (pull_request) Successful in 23m21s
01254291e5
Settings → Calls → "In-game overlay (beta)", desktop only, off by
default, device-local. While a call is joined it sends the call
snapshot to the desktop's new `set_overlay_state` command, which shows
a small always-on-top, click-through list while Lotus isn't focused.

- utils/callOverlay: pure snapshot builder. Everyone in the call, you
  first, one row per person across devices (speaking if any device is,
  muted only if all are), your own mute/deafen/PTT. In PTT mode you're
  not shown as Muted while the key is up.
- useTauriOverlay: live io.lotus.call_state participants plus control
  state, coalesced to at most one send per 100 ms (latest always
  lands), unchanged snapshots skipped, cleared on unmount.
- Overlay position setting (four corners).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
jared merged commit 30b5a7d6af into lotus 2026-11-09 21:31:35 -05:00
jared deleted branch feat/voice-overlay 2026-11-09 21:31:41 -05:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#488