Lumi/companion
2026-07-26 17:22:10 +02:00
..
docs Release Lumi Companion and server plugins 2026-07-24 14:44:27 +02:00
installer release: replace stream testing with MediaMTX 2026-07-25 20:57:22 +02:00
legal release: replace stream testing with MediaMTX 2026-07-25 20:57:22 +02:00
native/obs-bridge feat: complete companion streaming and logging upgrades 2026-07-26 17:22:10 +02:00
plugins feat: complete companion streaming and logging upgrades 2026-07-26 17:22:10 +02:00
scripts release: replace stream testing with MediaMTX 2026-07-25 20:57:22 +02:00
src feat: complete companion streaming and logging upgrades 2026-07-26 17:22:10 +02:00
tests/Lumi.Companion.Core.Tests feat: complete companion streaming and logging upgrades 2026-07-26 17:22:10 +02:00
Lumi.Companion.sln release: add private stream testing and media fixes 2026-07-24 22:12:39 +02:00
README.md feat: complete companion streaming and logging upgrades 2026-07-26 17:22:10 +02:00

Lumi Companion

Lumi Companion is the Windows streaming-computer client for Lumi. It provides a single paired-device shell for Companion plugins, including server-hosted transcription and Song Overlay capture. The app is single-instance, installs per Windows user, closes to the notification area, and preserves pairing and settings across updates.

Install and pair

From Lumi, open Admin > Companion and choose Download Companion. The private ZIP contains:

  • the checksum-pinned per-user Windows installer;
  • a one-time .lumi-pairing.json package;
  • a Host Operator notice and start instructions.

Extract the ZIP and run Lumi.Companion-Setup.exe. Setup installs to %LocalAppData%\Programs\Lumi Companion, displays the licence and privacy notices, identifies the paired Lumi host, imports the adjacent pairing package, and opens the installed copy. The extracted download can then be deleted.

Existing portable or installed builds retain the current Windows user's DPAPI-protected device identity, so reinstalling does not create a duplicate paired device. Pairing packages expire after 15 minutes, work once, and must not be shared or committed.

Security boundaries

  • Companion plugins inherit the shell's paired-device authentication. Plugins do not store or request separate Lumi credentials.
  • Production Companion traffic requires HTTPS. Plain HTTP/WebSocket traffic is accepted only when the device was paired from the exact matching loopback Lumi origin and the request remains on loopback.
  • The OBS integration communicates with Companion through a same-user named pipe.
  • Transcription audio is normalized to 16 kHz mono signed 16-bit PCM, kept in bounded memory, and sent to the paired Lumi host. Companion does not perform local speech recognition.
  • Installing or repairing the OBS integration requests elevation only while OBS is closed and only to copy the verified managed component into OBS's shared ProgramData plugin directory.

Updates

Companion checks after connecting and every six hours. Updates are user-approved, size- and checksum-verified, and refused while OBS is streaming or recording. Applying an update replaces the installed executable, bundled components, and legal bundle, then restarts Companion. Pairing credentials, settings, and plugin state remain in the per-user data directory.

If the paired Lumi host is temporarily unavailable, Companion remains paired and reconnects quietly in the background with bounded backoff. The Overview and Connection pages show the offline state without repeated dialogs; Retry now remains available for an immediate manual attempt.

Localhost development builds can also receive checksum-addressed same-version updates without publishing a release. See Localhost development updates.

Transcription control

The Transcription page has a persistent Generate and include captions switch, also available from the tray menu. Turning it off stops the active transcription session, excludes captions from live and private-test output, and stops sending microphone audio to Lumi for speech recognition. Private Stream Testing remains available as a video-only test. Turning the switch back on restores automatic caption startup with OBS and can start captions while a private test is already running.

Private Stream Testing

The core Stream Testing page asks the paired Lumi host for an expiring destination, then uses the managed OBS Bridge to snapshot the complete current OBS streaming service before installing that destination. OBS sends its ordinary encoded video and audio to the existing paired Lumi hostname on the configured RTMP/RTMPS port; Companion does not need a second login, destination editor, or local media runtime.

While a private test is active, Companion exposes Open stream viewer, which opens the paired Lumi host directly at Admin > Stream testing.

Lumi owns and verifies the MediaMTX receiver. MediaMTX remuxes the source stream for same-origin Admin playback without transcoding or recording it. In v0.3.3, Source is therefore the normal and only quality choice unless a future provider supplies genuine additional representations.

Stopping the test, losing the Lumi connection, receiver failure, Companion exit, expiry, or an OBS restart all enter the same recovery path. Companion keeps the DPAPI-protected recovery record until the OBS Bridge confirms that the exact saved service type and settings were restored and saved. If automatic restoration cannot finish while OBS is unavailable, the recovery remains visible and can be retried after OBS and the bridge reconnect.

Build and verify

Requirements:

  • Windows x64;
  • a current .NET SDK with the .NET 8 targeting pack;
  • CMake and Visual Studio C++ tools for the native OBS bridge;
  • Inno Setup 6 for the installer.

Build the managed solution:

dotnet build companion/Lumi.Companion.sln -c Release -p:EnableWindowsTargeting=true

Build the pinned OBS bridge, self-contained archive, legal bundle, and installer:

companion/scripts/publish-companion.ps1

The publish script generates the shared application/tray icon, verifies the OBS payload inside the published executable, collects NuGet notices, and packages the corresponding source for the GPL-licensed OBS bridge.

Run Song Overlay's focused verification with:

companion/scripts/verify-song-overlay.ps1

Generated installers, pairing packages, credentials, build output, and logs must not be committed.

The release is currently unsigned, so Windows may show an unknown-publisher warning. The installer and installed legal directory include the Companion licence, default privacy notice, third-party notices, exact licence texts, and the corresponding OBS bridge source bundle.

Self-hosters should set LUMI_OPERATOR_NAME, LUMI_OPERATOR_CONTACT, and LUMI_OPERATOR_PRIVACY_URL. Those values identify the Host Operator responsible for its hosted service and server-side processing; OokamiKunTV is the software developer and is not automatically the operator of an independently hosted Lumi installation.