uwucam
An open-source DroidCam replacement. Rust on the PC, minimal Kotlin + Rust on Android.
Built because the DroidCam OBS plugin broke against a newer ffmpeg ABI and the Android app hides its resolution setting somewhere nobody could find. So: doing it ourselves, in the open, GPLv3.
Download Source on Forgejo Build instructionsStatus
Works end-to-end: camera → PC → v4l2loopback → OBS (or
anywhere else). Verified against real hardware, including surviving a USB cable
unplug/replug or an app stop/restart mid-stream — the connection recovers on
its own, no relaunching anything. See the
roadmap for what's next.
What it does
- Turns your Android phone's camera into a Linux webcam via
v4l2loopback - Streams at whatever resolution your phone's camera actually supports — not stuck at 640x480
- Works over the USB cable, or over WiFi once the two are paired
- Recovers on its own from a dropped cable or connection instead of needing a relaunch
- Linux + Android only for now; other platforms land when work on them actually starts
Pairing, and why there is no code to type
Plug the phone in and press Start once. That is the pairing: the PC hands a key down the cable, both sides remember it, and neither asks you anything. After that the phone can connect over WiFi — pick WiFi in the app and type the address the PC shows you.
The key is only ever handed over the cable, never over the network. A USB connection arrives from loopback, so "came from loopback" means "came down a cable somebody plugged in" — a channel that is trusted for a physical reason rather than a cryptographic one, which is both stronger than six digits read off one screen and less to do.
Every connection after that proves both ends still hold that key and derives a fresh key for the session, and the frames themselves travel sealed with ChaCha20-Poly1305. So something sitting on the port cannot get a picture, and something sitting on the network cannot read one. WiFi is off until you turn it on.
Using it for purrr calls
Once the daemon is running, the virtual camera is an ordinary webcam — nothing knows or cares where the frames came from. In a purrr call, turn your camera on and pick uwucam from your browser's camera list. Same for OBS, Zoom, or anything else that asks for a camera.
If purrr tells you there is no camera on the device, that is the case this solves: the phone in your pocket is usually a better one than a laptop ships with. purrr links here from its download page for exactly that reason.
Get it
On Arch, from the AUR:
yay -S uwucam # or paru, or makepkg -si
Everywhere else, prebuilt releases have the daemon and the APK. Building from source is a short version of the README:
cd pc && cargo build --release
cd android && ./gradlew assembleDebug
adb install -r android/app/build/outputs/apk/debug/app-debug.apk
./pc/target/release/uwucam-pc --device /dev/videoN
The daemon needs a v4l2loopback device to write into. Run
uwucam-pc --list-devices to see which ones exist and which other
programs are already holding them open — that second column is usually the
answer when a resolution comes out wrong.