Omacam
Omacam turns an Android phone into one permanent Linux webcam named Omarchy Phone Camera. No phone app, no cloud.
- Android 12+ capture over USB or paired ADB Wi-Fi (
scrcpy), plus native UVC when the phone supports it. - Stable
/dev/video50. Conferencing apps see Omarchy Phone Camera, not the phone's USB name. - Idle privacy is one still black frame, then sleep. Apps still see a live camera; nothing is encoded until a phone streams.
- Front/rear, 720p/1080p, 24/30/60 fps, rotation, mirror, torch, stills.
- Auto-reconnect, disconnect recovery, stop on lock or suspend.
- Omarchy bar panel: Orientation, Capture, Connection.
Android-first 0.2.0. Phone mic, browser/iPhone mode, effects, and a native iOS app are later. iPhone UVC nodes are ignored.
Validated on Omarchy 4 with USB scrcpy, front/rear, rotation, and Google Meet. Remaining app checks: docs/release-checklist.md.
Architecture
Android UVC / scrcpy ──> phonecamd ──> /dev/video50
│ live: scrcpy, ffmpeg when needed
│ idle: one black frame, then sleep
└── Unix socket ──> phonecamctl ──> bar panel
The plugin does not install packages or request sudo. phonecamd owns ADB, scrcpy, V4L2, and idle privacy so a shell reload does not drop a call. ffmpeg is for UVC, 90°/270° letterbox, snapshots, and recording — not idle privacy.
Requirements
Omarchy 4, Android 12+ with USB debugging, matching kernel headers, and a user session with systemd, PipeWire, and V4L2.
./install-host.sh installs android-tools, ffmpeg, pipewire, wireplumber, python, python-dbus-next, scrcpy, v4l-utils, v4l2loopback-dkms, base-devel, and the running kernel's headers. It does not install DroidCam.
Install
Host first (sudo for pacman, headers, DKMS):
./install-host.sh
phonecamctl status
Then the plugin:
omarchy plugin add https://github.com/rahulmanuwas/omacam --enable
Local checkout: ./install-plugin-local.sh (use --update after QML edits). --no-deps skips package install. ./scripts/build-host-package.sh --install --syncdeps builds the pacman package only.
First USB connection
- Enable Developer options and USB debugging.
- Connect a data-capable cable, unlock, and always-allow this computer.
- In the Omacam bar panel, click Use next to the phone.
- In Meet, Zoom, OBS, Discord, or Slack, select Omarchy Phone Camera.
Use with auto-connect trusts the device. Stop camera suppresses reconnect until unplug or a new Use.
Some Android 14 QPR1+ phones expose Webcam under USB Preferences. Select it and Omacam routes that UVC node through /dev/video50. Built-in and unrelated USB webcams are ignored.
Wireless debugging
- Developer options → Wireless debugging → Pair device with pairing code.
- Enter the address and six-digit code, Pair.
- Switch to the connection port shown on the main Wireless debugging screen, Connect, then Use.
Wireless debugging often dies after a phone reboot. USB is the reliable path. The daemon never enables open ADB-over-TCP.
phonecamctl pair 192.168.1.25:37145 123456
phonecamctl wifi-connect 192.168.1.25:39877
phonecamctl connect 'adb:192.168.1.25:39877' --trust
Controls
phonecamctl status
phonecamctl devices
phonecamctl camera front
phonecamctl resolution 720p
phonecamctl fps 30
phonecamctl rotate 90
phonecamctl mirror on
phonecamctl torch off
phonecamctl auto-connect on
phonecamctl disconnect
phonecamctl snapshot
phonecamctl record
phonecamctl diagnostics --json
Stills go to ~/Pictures/Omacam. Middle-click the bar icon to capture when a phone is ready; right-click stops the camera. Record always passes --webcam-device=/dev/video50.
Troubleshooting · socket protocol
Privacy
Daemon and CLI run as the logged-in user. The socket is 0600 in $XDG_RUNTIME_DIR. Video stays on USB or the local LAN. Idle is a still frame, not an encode. The camera stops on lock and before suspend. iOS and laptop cameras are skipped. Removing the plugin stops producers after a short watcher grace period.
Plugins are unsandboxed. Review Service.qml and BarWidget.qml. Marketplace listing is not a security review.
Development
./scripts/check.sh
Stdlib-only unit tests. Hardware, scrcpy, and conferencing apps need a real Omarchy machine.
Uninstall
omarchy plugin remove io.github.rahulmanuwas.omacam
./uninstall-host.sh
--purge also drops this user's config and logs. Dependencies stay installed.
License
MIT