Ghost Jack
Eyes, ears and a mouth for AI agents
A local bridge and cyberpunk control deck that gives people and AI agents eyes, ears and a mouth in meatspace through a $2 thrift-store pan/tilt camera, with no cloud app.
Executive summary
Why it exists
I wanted AI agents to be able to look at my workbench, listen and talk to me, without a cloud service watching my room. A $2 thrift-store camera seemed perfect, but its maker says it only works through its phone app: no local video, no RTSP.
Outcome
A working 0.1 release: see, listen, aim, night vision, speak and record, all local, with a public demo of the deck and a dated log of how each piece was found.
My role
Designer, director and maintainer. Built with AI coding assistance from Claude (Opus 5.5 and Sonnet 5.5); Glassmouth's character sketch came from a conversation with GPT-6.1 Sol.
Technical overview
How it works
A Node service on my Mac that signs in to the camera by driving the camera's own web page in a headless browser, then talks to its private API: 1080p snapshots, a live RTSP stream (H.264 and AAC) repackaged so browsers can play it, pan and tilt, night vision, image settings and the clock, plus speech through the camera's speaker. A control deck (plain HTML, CSS and JavaScript with three.js) puts the controls on the video, with a 3D model of the camera to aim with, recording, and Glassmouth, a dry night-shift character voice. It runs behind an access token, on this computer only unless shared over Tailscale.
Hard parts
Everything the maker said wasn't possible. The talk protocol lived in long-gone browser plugins; the vendor's leftover 2013 Flash engine showed it publishes the microphone over RTMP, and only AAC at 16 kHz plays. Each talk address works once, and an unused one jams the speaker until a power cycle. The speaker is alarm-loud, wakes on sound and clips first syllables, so the bridge caps levels and sends a wake pulse first. Pan and tilt moves queue and can't be stopped, and the camera never reports where it points.
How it was made
Discovery started on an isolated cable: tcpdump showed the camera's built-in address and a discovery broadcast, then its own web app's JavaScript showed the API. The character, the cyberpunk wording and the one-screen layout came from my own testing at the desk.