UAP Finder
UAP Finder is a citizen-science network of passive, sky-facing cameras that triangulates unidentified aerial objects from two or more viewpoints miles apart. Edge nodes analyse their own video and send only small signed packets; a server matches simultaneous sightings, intersects their lines of sight and turns them into 3D tracks with altitude, speed, acceleration and error bars; and a public website with a live 3D map recruits the volunteers who host the nodes.

At a glance
- Type
- Platform
- Industry
- Citizen science
- Live site
- https://uapfinder.vercel.app
- Built with
- Python, OpenCV, FastAPI, PostGIS and Redis; React, TypeScript and CesiumJS; Astro
- Edge hardware
- NVIDIA Jetson Orin Nano with a CSI camera and GPS with PPS timing
- Codebase
- About 34,000 lines across the shared library, node, server, map and website
- Tests
- About 430 automated tests, plus 52 browser end-to-end tests of the website
Why two cameras
A single camera records a direction, not a distance. A bird 50 metres away and an airliner 10 kilometres away can trace the same path across the frame, so one video can't give altitude, true speed or acceleration.
When two cameras several miles apart see the same object at the same instant, their sight lines cross at the object. Repeat that ten times a second and you have a track. The project makes no claims about what anything is; it measures where it is and how it moves, and publishes the uncertainty with every number.
On the node
Each node runs a pipeline in Python and OpenCV on a Jetson Orin Nano: 1080p60 capture into a rolling buffer, a background model, blob detection and tracking, then filters for clouds, stars, birds, insects and aircraft that broadcast ADS-B. What's left becomes an azimuth and elevation with a GPS-timed timestamp, sent as a small HMAC-signed packet over UDP or HTTPS. Video stays on the node unless the server asks for a clip.
The node is designed as an appliance: flash one microSD card, plug the parts together, and finish setup from a phone, with a Wi-Fi hotspot if there's no network. It works out where the camera points by solving against the stars on the first clear night. A pipeline builds the flashable OS image.
Matching and triangulation
The server, written in FastAPI with PostGIS and Redis, verifies each packet's signature and freshness, finds active nodes within 80 miles whose reports fall within 50 milliseconds of each other, and intersects their rays. Intersections behind a camera are rejected, and a gate checks parallax, range, altitude and miss distance against the angular noise model before two sightings count as one object.
Three or more nodes are solved together by weighted least squares, and every fix carries a 1-sigma uncertainty. Successive fixes become a track; acceleration comes from curves fitted to the track, and a track is flagged when it's hypersonic or when even the low end of its error range is above 10 g. The first match asks each contributing node for a short HD clip.
Tested against ground truth
A network simulator flies known targets past virtual nodes and scores the server's tracks against the truth. In the repository's own run with six nodes, a Mach 6 target at 20 km came back with an 18 m median error, and a 216 m/s cruise at 9 km with 8 m.
The shared library, node, server, map and website each have their own test suites, run in CI, including WGS84 conversions cross-checked against PROJ and a Monte Carlo check that the error model predicts the observed error. What hasn't been tested yet is real Jetson hardware and the production server deployment.
The website and live map
The public site, built with Astro, explains the method with its own diagrams, has a build guide and parts list, and takes volunteer sign-ups. The live map is React, TypeScript and CesiumJS: a 3D globe with nodes, camera fields of view, tracks and an altitude-sliced coverage grid that suggests where a new node would help most.
Privacy is built in: public node positions are rounded to about a kilometre, and the public lines of sight are recomputed from those rounded positions so they can't be traced back to a volunteer's house. Until the server is live, the map shows a clearly labelled demo network.
Highlights
- Stereo triangulation across nodes miles apart, with a stated uncertainty on every fix.
- On-device filtering of stars, clouds, birds and ADS-B aircraft; only small signed packets leave the node.
- Matching within 50 ms across nodes up to 80 miles apart, solved by weighted least squares.
- A ground-truth simulator that scores the server's tracks: 8 to 18 m median error in its own runs.
- A flash-and-plug node appliance that calibrates its pointing from the stars.
- A live 3D CesiumJS map that shows coverage gaps, with node positions rounded for privacy.
Let's talk.
Tell me what you're building. I read every message myself and usually reply within one business day.