v0.3 · paired over USB, encrypted over WiFi

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 instructions

Status

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

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.