UniFi left users alone with their 360 cameras, so I built our own investigation tool with Claude Code and Codex in 2 days so far

We have a festival tent covered with UniFi cameras, mostly AI 360 fisheyes plus a few normal ones. Part of the job is reviewing incidents, tracing back thefts and answering requests from the police. That means figuring out who was where, following a person across several cameras and handing over footage that anyone can watch and that holds up.
With the 360 cameras that was almost impossible. Ubiquiti has never cared about this. Since these cameras came out there is still no way to export a dewarped video from Protect. People have been asking in the community forum for years, the thread is locked and the accepted answer is a few ffmpeg commands from another user. So the customers are on their own, and I started building the tool myself.
**What works today:** \- synced playback of all cameras on one timeline, forward and backward up to 16x, frame by frame
\- dewarps AI 360 fisheyes into normal views you can pan and zoom. Normal UniFi cameras (G5 Flex, G5 Turret Ultra, G4 Dome) stay as they are, with lens correction if needed
\- floor plan with a live mosaic of all cameras. Click a spot and every camera turns to look at it
\- 3D model of the tent built from the seating plan, around 550 tables, benches, bars, booths and doors. It gets projected into every camera, and when the lines sit on the real tables the camera is calibrated
\- calibration from known points on the floor, and cameras can be aligned to each other using the same point seen in two of them
\- follow a person by clicking them in the video. The tool picks the camera that shows them best at every moment and zooms in
\- reads the burned in clock of every camera, measures how far each clock is off and flags gaps, cuts and repeated frames. Frames with a doubtful timestamp are marked red
\- every case gets its own folder. Originals are never touched, every import gets a SHA-256 and write protection, and every change is logged with old and new value in a chained log
\- evidence export with the MP4, which source frame every output frame came from, checksums and a PDF report. Rendering runs on the CPU, so the same export gives the same frames on any machine
\- single video mode: drop in any AI 360 video, set keyframes for angle and zoom and get a normal dewarped MP4 with a report
\- everything also works from the command line, fully offline. The Windows build ships with ffmpeg
**What I'm working on right now:** \- handling camera images that rotate in the middle of a recording. I found one that flipped 180 degrees at midnight without any gap in the video
\- pulling footage straight from the Protect console. It's built and tested against a mock, the test on a real console is still open
\- getting rid of the protect console at all, cause its always buggy and annoying to use
**Planned:** \- Protect events on the timeline and loading footage directly from the viewer
\- saving the calibration for every tent setup with its date
\- estimating lens distortion and tilt from the 3D model instead of by hand
\- GPU preview for smooth fast reverse playback
\- brightening for night footage, clearly marked in the video
\- measuring the real lens model and calibrating all cameras on site
Happy to answer questions about the workflow.