Tap scenes. Ride the faders. Keep your stream in check.
SceneDeck turns your Android phone or tablet into an OBS Studio remote. OBS runs on your desktop; the scenes, mixer and stream controls are right in your hand. Inspired by the Linux SceneDeck workflow, rebuilt with Kotlin and Jetpack Compose.
- Scenes: a clean card grid, numbered tiles, scene search and a curated Deck filter.
- Stream control: blue Stream → breathing red Stop when live. Green stream timers and yellow recording timers in the header keep output state easy to read.
- VCam: a direct virtual-camera action alongside Stream and Record.
- Mixer: vertical faders, live audio meters, direct mute, channel locks and audio settings.
- Always visible: OFF AIR or LIVE with an elapsed timer on every main tab. The bottom performance readings appear only while streaming.
- Stats: FPS, bitrate, frame drops, CPU and render time, with gauges and rolling trends.
- Studio mode: preview scenes and transition controls, ready for your next cue.
- Your vibe: dark/light themes, multiple palettes, dynamic color and reduced-motion options.
- Extras: scene curation, dependency graph, Doctor checks, saved connections, QR pairing, an Android widget and optional background connection.
Curation lives on your device. SceneDeck preserves your OBS scene collection.
| Scene deck | Streaming | Recording |
|---|---|---|
![]() |
![]() |
![]() |
| Studio preview & switching | Audio mixer | Stream health |
|---|---|---|
![]() |
![]() |
![]() |
| Appearance | Connections | Light theme |
|---|---|---|
![]() |
![]() |
![]() |
| Scene switched | Stream + record | Light recording |
|---|---|---|
![]() |
![]() |
![]() |
| Standby: metrics hidden | Streaming + recording | Recording only |
|---|---|---|
![]() |
![]() |
![]() |
These are rendered application UI previews with representative OBS data. The GIF cycles through the app’s states; it does not start a real broadcast.
| Layer | Tech |
|---|---|
| Language & build | Kotlin 2.4.20, AGP 9.4.1, Gradle 9.6, KSP, Kotlin DSL |
| UI | Jetpack Compose 2026.09 BOM, Material 3 Expressive, Navigation 3 |
| State | MVVM + unidirectional data flow, coroutines, StateFlow, lifecycle-aware collection |
| DI | Hilt |
| OBS | WebSocket v5 through ktobs + Ktor, kotlinx.serialization |
| Storage | Room, Proto DataStore, Keystore-backed credential encryption |
| Images & identity | Coil 3, Lucide-style vectors, Inter + JetBrains Mono |
| Tests | JUnit, MockK, Turbine, coroutines-test, Robolectric, Roborazzi previews |
| Quality | Detekt, Android Lint, ktfmt, Semgrep, CodeQL, Dependabot |
Exact dependency pins and toolchain notes live in TECH_STACK.md.
- In OBS Studio 28+, open Tools → WebSocket Server Settings, enable the server and set a password. The default port is 4455.
- Put your phone and OBS machine on the same network.
- In SceneDeck, open More → Connections, add the host, port and password, test the connection, then connect.
Build from source with JDK 21 and Android SDK 37 installed:
./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apkSupports Android 9 / API 28+. Download the signed APK from GitHub Releases. The command above builds a development APK.
SceneDeck Android is MIT licensed, matching the desktop project. Inter and JetBrains Mono are bundled under SIL OFL 1.1; notices and source checksums are in LICENSES.
An F-Droid source build is available with -PfdroidBuild=true. It uses manual OBS
connection entry and excludes camera QR scanning and ML Kit. See
F-Droid preparation and submission. This preparation does not
mean the app is already listed in the official F-Droid repository.
# One-time: pre-commit hook (ktfmt + detekt on staged Kotlin changes)
scripts/install-git-hooks.sh
# Full local gate: format check, complexity, lint, tests, build and security patterns
# Requires JDK 21 and uv
scripts/check-quality.sh
# Apply the shared Kotlin formatting style (mirrored by .editorconfig)
./gradlew ktfmtFormatCyclomatic and cognitive complexity checks cover Compose functions too. CI runs the same gate as parallel jobs — wrapper validation, static analysis, tests, APK build, Semgrep/Gitleaks security scans and PR dependency review — publishing reports and SARIF results to code scanning, plus separate CodeQL analysis. Local security checks cover project-specific patterns; passing scans does not guarantee absence of bugs.
Feature spec · Architecture · Design system · Roadmap · Hardening report
OBS protocol code stays in core/obs; repositories own state and persistence;
feature modules own screens. Shared styling lives in core/designsystem.
Project development skills are included in .kimi/skills.
Built for the “one more scene switch” crowd. 🎬
Run the Android delivery workflow for a downloadable APK. Version tags build signed APK/AAB releases; Google Play delivery supports internal, beta, and production tracks. See release setup for signing and Play credentials.















