The official Android client for Bedrud — a self-hostable, LiveKit-powered video meeting platform.
This app is a pure client. It doesn't run a server; you point it at one or more Bedrud
server instances (https://your-server/api) and it handles auth, rooms, and live meetings.
For the server, web app, and other platforms, see the main Bedrud project.
- Video & audio meetings — WebRTC rooms powered by the LiveKit Android SDK
- Connect to multiple servers — add several Bedrud instances and switch between them; each keeps its own login
- Meetings as real calls — joining starts a self-managed telecom call, so meetings get proper audio routing, a call notification with mute/hangup, and survive backgrounding
- Picture-in-Picture — keep the meeting visible while using other apps
- Screen sharing and an adaptive video grid
- In-meeting chat with image sharing, over the LiveKit data channel
- Shared stage — screenshare and coordinated peer-to-peer
- Admin moderation — kick, ban, mute, and stage controls for room hosts
- Flexible sign-in — email/password, guest access, OAuth, and FIDO2 passkeys
- Localized — 10 languages with right-to-left (Arabic, Persian) support
- Android 9 (API 28) or newer
- One or more reachable Bedrud server instances
- Install the app (build it yourself — see below — or grab a release APK).
- On first launch, add a server instance by entering your Bedrud server URL.
- Sign in (or join as a guest), then create or join a room.
You'll need the Android SDK and JDK 17. Android Studio (latest stable) is the easiest path — open the project and let it sync.
From the command line:
# Debug APK
./gradlew assembleDebug
# Release APK (requires a keystore, see below)
./gradlew assembleRelease
# Run unit tests
./gradlew testDebug APKs land in app/build/outputs/apk/. Builds are split per ABI
(arm64-v8a, armeabi-v7a, x86_64) with a universal APK also produced.
For a signed release build, create a keystore.properties file in the project root:
storeFile=/path/to/your.keystore
storePassword=...
keyAlias=...
keyPassword=...If the file is absent, release builds are simply left unsigned.
Single-module Kotlin app (com.bedrud.app) built with Jetpack Compose and Material 3.
There are no ViewModels — screen state lives in MutableStateFlow on manager classes and
is collected with collectAsState().
| Concern | Choice |
|---|---|
| UI | Jetpack Compose + Material 3 |
| DI | Koin |
| Networking | Retrofit + OkHttp (Gson) |
| Realtime media | LiveKit Android SDK |
| Calls | Self-managed telecom ConnectionService (foreground service) |
| Auth storage | EncryptedSharedPreferences, per instance |
| Passkeys | AndroidX Credential Manager + Play Services FIDO |
| Images | Coil |
Multi-instance is the spine of the app. InstanceManager rebuilds the auth manager,
Retrofit APIs, and the LiveKit RoomManager for whichever server is active, and the UI
reacts to the swap. This is why every login, room list, and meeting is scoped to a server.
Source layout (app/src/main/java/com/bedrud/app/):
core/
api/ Retrofit services + DTOs
auth/ login, tokens, passkeys
call/ telecom ConnectionService (meetings-as-calls)
chat/ in-meeting chat
deeplink/ /m/ and /c/ link handling
di/ Koin modules
instance/ multi-server management
livekit/ RoomManager — LiveKit lifecycle
meeting/ meeting logic + stage/ peer-to-peer stage protocol
pip/ picture-in-picture state
recent/ recent rooms
ui/
components/ shared Compose widgets
screens/ auth, dashboard, instance, main, meeting, admin, profile, settings
theme/ colors, typography
- AGENTS.md — developer guide and conventions
- DESIGN.md — design system notes
- CONTRIBUTING.md — how to contribute
- README-OLD.md — the original monorepo README (full-stack Bedrud), kept for reference
Apache-2.0. See NOTICE for attributions.