Overlap is the point
Two nodes only triangulate in the patch of sky both can see. In the drawing, 12 km apart and both pointing straight up, it starts 6 km up and widens with altitude; aiming cameras towards a shared area lowers it.
The node
A UAP Finder node is a small computer and a wide-angle camera under a clear dome. It watches the sky all day and night, explains away what it can, and reports the exact direction and time of everything else. Two nodes miles apart turn those directions into a position.
New and not yet hardware-tested. The ready-to-flash system image, the setup page and the automatic star calibration described here are new. They are tested in simulation and in containers, but have not yet run on a real Jetson with a real camera and GPS. Figures marked as estimates have not been measured on a complete node.
Everything sits in one weatherproof box on a rigid mount. The camera looks up through a clear dome; the computer, GPS and optional extras live underneath. Only power and, ideally, an Ethernet cable go in.
The node does the heavy work itself. Sixty times a second it compares the new frame with what the sky normally looks like, follows anything that moves, and drops what it can explain. Only a few hundred bytes per sighting leave your house.
The camera streams 1920 × 1080 video at 60 frames per second. Each frame is time-stamped the moment it arrives, on a clock locked to GPS, and kept in a memory buffer holding the last 10 seconds.
A slowly updated average of recent frames (a 2-second time constant) absorbs the sky's brightness gradient, haze, clouds that barely move, and the slow drift of the stars.
Subtracting the background leaves what changed. Pixels well above the local noise become candidate points, each with a sub-pixel centre. Areas the host masks out, and anything below 3° elevation, are ignored.
A tracker links detections from frame to frame into local tracks, predicting each one's next position and bridging the odd missed frame.
Each confirmed track is checked against what is already understood: stars and planets (moving at the sky's own 0.0042° per second, or not at all), clouds (large, diffuse, drifting with the wind), birds and insects (big, close, flapping or out of focus) and aircraft broadcasting their position by ADS-B, from the node's own receiver or an online feed. Explained tracks are logged on the node and not sent.
The pixel position becomes a direction in the sky, azimuth from true north and elevation above the horizon, using the lens model and the pointing the node worked out from the stars.
Ten times a second while the object is in view, the node sends about 520 bytes: the frame's capture time in nanoseconds, the node's position, camera pointing, the direction to the object and a few image measurements, signed with the node's own key. A heartbeat with the node's health follows every 10 seconds.
More detail, including each filter's rules, in How it works.
One camera knows only the direction to an object, not how far away it is: a small bird near the lens and an aircraft 10 km up can look the same. A second node miles away sees the same object along a different line. Where the two lines cross is the object's position, and how well they cross tells us how certain it is.
Two nodes only triangulate in the patch of sky both can see. In the drawing, 12 km apart and both pointing straight up, it starts 6 km up and widens with altitude; aiming cameras towards a shared area lowers it.
Against the background stars the object sits in a different place in each camera's frame. The larger that angle, the better the range is pinned down, which is why nodes need to be miles apart.
The overlap of the two uncertainty wedges becomes the published sigma_m. With a 16 km
baseline and a target at 10 km it is about 18 m at 0.05° pointing precision (computed, not measured).
Triangulation only works if both sight lines describe the same instant. A Mach 6 object moves about 100 m in 50 ms, so every node needs to know, very precisely, when each frame was taken.
The GPS module sends the time as text, and a separate pulse-per-second (PPS) wire that rises exactly at the start of each second. That pulse is far more precise than the text.
The node's clock software (chrony) locks the system clock to that pulse, to around a microsecond. Without a PPS wire, internet time is only good to a few milliseconds.
Each frame gets its capture time from that clock, minus the camera's own delay. Both nodes therefore stamp their frames on the same timescale, even though their frames are not taken at the same moments.
For each packet it takes the other node's sight line at exactly that time, interpolated between its samples, or the nearest one within 50 ms. The setup page warns if the clock's estimated error exceeds 2 ms.
Ten fixes a second become a 3D track. Individual fixes are noisy, so speed and acceleration are never taken
from one fix to the next: they come from curves fitted to many fixes, each with its own error bar. Flags such
as high_g use the 2σ lower bound, so noise alone cannot set them off.
Simulated data (true acceleration 12 m/s²), not a real observation. The values are the actual outputs of the fits shown.
Knowing exactly where the camera points matters more than anything else in the error budget. Nobody can aim a camera to a hundredth of a degree by hand, so the node measures its own pointing from the stars on the first clear night.
The node reports with a large angular uncertainty and the status page says "Pointing: waiting for a clear night". Because the server accepts only geometrically consistent matches, an uncalibrated node rarely produces false fixes.
The same solve also measures the lens: its exact focal length and how it bends straight lines near the edges, so a direction is right across the whole frame, not just in the middle.
A 1° heading error alone puts a fix about 870 m sideways at 50 km range. Figures from the error model in docs/MATH.md; the automatic calibration is new and not yet tested on a real night sky with node hardware.
A node has no screen. It serves its own small web page on your network, at
http://uapfinder.local. If it has no network, it opens a
Wi-Fi hotspot called UAPFinder-XXXX (password uapfinder) with the page at
http://10.42.0.1.
UAP Finder node uapfinder-7c3e
UAP Finder node uapfinder-7c3e
Choose a network, enter the claim code your network coordinator sent you (eight
characters, like 7KQ2-M9XD; upper or lower case, dash optional, single use), and set a
device password. The node exchanges the code for its own identity and key; there is nothing to copy by
hand.
The page shows what hardware it found and how it is doing: camera, GPS fix and satellites, PPS lock, the clock's estimated error, orientation sensor, ADS-B source, storage, server connection, pointing calibration and software version. A live preview with a horizon and elevation overlay helps with aiming. Restart, shut down and a diagnostics download are there too.
Once the device password is set, anything that changes the node needs it; the status view stays readable on your local network.
Defaults of the software with the recommended parts. Values marked estimate are calculated, not yet measured on a complete node.
| Item | Value | Basis |
|---|---|---|
| Computer | NVIDIA Jetson Orin Nano 8 GB developer kit | The image is built on Jetson Linux R36.5.2 (JetPack 6.2.3, Ubuntu 22.04). |
| Video | 1920 × 1080 at 60 frames per second | Software default; the IMX477 camera has this mode on Jetson. |
| Field of view | ≈ 90° × 59° | With the recommended ≈ 90° lens; the exact value comes from calibration. |
| Pixel scale | ≈ 0.047° per pixel | 90° over 1920 pixels. |
| Angular precision | 0.01–0.05° (estimate) | Sub-pixel centroids with star-calibrated pointing; about 1° from an orientation sensor alone. |
| Position error of a pair | ≈ 4–30 m at 5–20 miles apart (estimate) | Error model, target 10 km up, 0.01–0.05° precision; about 50–270 m at 80 miles. |
| Timing | GPS PPS-disciplined clock | The setup page warns above 2 ms estimated error; without PPS, network time (a few ms). |
| Reports | 10 per second per tracked object, ≈ 520 bytes each | Plus a heartbeat every 10 seconds; signed with the node's key. |
| Video memory | Last 10 seconds in RAM | A 10-second clip around a confirmed event is uploaded only on request. |
| Storage | microSD 64 GB+ (system), NVMe SSD (clips) | A blank NVMe drive is formatted on first boot. |
| Power | 15–30 W average (estimate) | NVIDIA's power modes plus peripherals. Details. |
| Upload | ≈ 5 MB a day idle (UDP); ≈ 5 KB/s while tracking (estimate) | From the wire protocol's message sizes. Details. |
| Spacing | 5–40 miles from another node | The server pairs nodes up to 80 miles apart; beyond about 40 miles objects sit low on both horizons. |
The complete guide covers the parts, a one-time firmware check, flashing the card, wiring, the enclosure, placement and setup, in the order you do them.