Inspiration

so this is a great story of mine, It's 2020. I'm a high schooler, school just moved online, and suddenly everyone needs a webcam — except I'm broke, running a laptop so low-spec its built-in camera was basically a potato.

So I did what every broke kid does: I Googled. That's how I found DroidCam — turn your phone into a webcam! Except the free version was crippled on purpose: capped at 720p, dropped to 480p after 30 minutes unless you paid.

And I remember thinking: I'm literally holding a phone with a better camera than most webcams. Why am I being paywalled to use my own hardware?

I couldn't afford the upgrade. So I decided I'd build the thing I wished existed — free, no limits, no timers.

It started for people who can't buy a webcam. But building it made me realise the problem is bigger than being broke: almost everyone already owns a better camera than the one they're using. Laptop webcams are tiny sensors that fall apart in anything but perfect light; the phone in your pocket has a camera a webcam maker would charge hundreds to match. Whether you can't afford a webcam or you're just tired of looking washed out on calls, the fix is the same — use the camera you already have.

What it does

STICam turns your Android phone into a professional PC webcam over Wi-Fi or USB, and it shows up in Zoom, Teams, Google Meet, and OBS like any other camera.

But the part I'm proudest of is the AI face tracking. Using an on-device 468-point face mesh, STICam frames you like a real camera operator — it keeps you centered, eases into a gentle cinematic zoom, holds the shot perfectly still while you talk, and glides to follow you only when you actually move. No jitter, no hunting, no fiddling.

Add full manual camera controls (ISO, focus, exposure) and zero-quality-loss recording — and it's all free and fully offline. No subscriptions, no timers, no cloud.

How I built it

  • Android client — Kotlin, Camera2, Jetpack Compose, and Google MediaPipe for on-device face tracking.
  • Windows host — C# / .NET, FFmpeg for H.264 decoding, and a virtual-camera bridge so any app sees STICam as a webcam.
  • Low-latency H.264 streaming over TCP, through USB (adb port-forwarding) or Wi-Fi. Everything runs on your own devices — nothing touches a server.

Challenges I ran into

  • Color-space wars. The phone speaks YUV, the PC wants RGB — making that translation both fast and correct without wrecking latency took real work.
  • Orientation hell. Front camera, rear camera, portrait, landscape — every sensor is mounted differently, and getting an upright image on both cameras and both screens meant chasing rotation math that fought back for days.
  • Making the AI feel human. Early versions "zoom-hunted" and swayed constantly. Teaching it to hold still when you're framed and move only with intent — like an operator, not a drone — was the difference between a gimmick and something genuinely useful.

Accomplishments that I'm proud of

A free tool, built solo, that goes toe-to-toe with the paid apps that made me feel locked out in the first place — and beats them on the thing that matters most on camera: framing. It's signed, released, and real.

What I learned

More than any single API: in 2020 I couldn't afford a $30 webcam. Today, with the tools now within reach, one person can build something better than that webcam from scratch. I'm genuinely grateful to be building in a time when that's possible — that's the part that keeps me going.

Built with Codex during Build Week

STICam existed before Build Week — the streaming pipeline, MediaPipe face tracking, and camera controls are prior work. Here's what I built with Codex (GPT-5.6) during the submission window:

The security rewrite (13 July). STICam's connection was plaintext and unauthenticated — fine on my own Wi-Fi, not fine anywhere else. Codex replaced it with a real encrypted transport: a pairing-key handshake, AES-256-GCM records, replay rejection, and keys held in DPAPI on Windows and the Android Keystore on the phone. It wrote deterministic test vectors for both platforms plus a negative test proving a forged handshake is rejected — the project's first automated tests. It also made MP4 recording actually reachable, fixed several camera and codec race conditions, and added CI and dependency locking.

That work is on the codex/v1.1.0-hardening branch — 54 files, +4,359 / −1,183. It's deliberately unmerged: main had already moved to v1.5.0 on a different track, so I shipped that first and kept the hardening branch for the v2.0 rework, where the encrypted transport belongs anyway.

The audit (20 July). I asked Codex to check my README against my actual code. It found five things I'd shipped wrong — including Wi-Fi instructions that were backwards (they told users to type the phone's IP into the PC, when the phone is what dials the PC), and an MP4 recording feature I advertised that no button could actually trigger. Being told my docs were wrong when I was sure they were right was the most useful hour of the week.

What's next for STICam

  • An iOS client — the streaming protocol and Windows host are platform-agnostic, so the next step is a Swift client (AVFoundation + VideoToolbox) to bring STICam to iPhone.
  • AR face filters — real-time effects riding on the same 468-point face mesh.
  • A hardware-accelerated pipeline — GPU decode and encode, so it stays light even while gaming.
  • Merging the Codex hardening branch — the encrypted transport belongs in the v2.0 rework, where it'll ship properly.
  • Growing it into a community project — so the kid who can't afford a webcam next year already has one.

Built With

  • .net
  • adb
  • camera2
  • codex
  • csharp
  • ffmpeg
  • gpt-5.6
  • jetpack-compose
  • kotlin
  • mediapipe
Share this project:

Updates