feat(sdr): local receivers — browser RTL-SDR, Local ADS-B layer and decoder feeds (#732)

Adds a Local ADS-B layer fed by your own receivers: a browser WebUSB
RTL-SDR (with FM listening) and local 1090/978 MHz decoder feeds
(LOCAL_RECEIVER_FEEDS, local and private addresses only). Local aircraft
draw in magenta with class, silhouettes, 3D models, trails and a position
sanity filter; the click card names the band and input that heard them.

Builds on Sameh Khamis's SDR prototype and the initial GEV port by
Mazeyar Moeini Feizabadi (#134); the decoder-feed design follows the
notes on #57. Closes #57.

Co-authored-by: Sameh Khamis <[email protected]>
Co-authored-by: Mazeyar Moeini Feizabadi <[email protected]>
This commit is contained in:
authored and GitHub committed 2026-09-23 16:00:53 -05:00
1 parent 143cffd7ca
commit 1fc795577a
78 files changed
+12267 -108

No files matched your search

+10 -1
View File
@@ -89,6 +89,10 @@ export async function checkPackageBoundaries(root) {
const seen = new Set();
await build({
root,
// Keep this gate out of a running dev server's dependency cache
// (node_modules/.vite): a build there re-optimizes dependencies and the
// dev server's workers then fail with 504 "Outdated Optimize Dep".
cacheDir: path.join(root, 'node_modules/.vite-boundaries'),
configFile: false,
envFile: false,
publicDir: false,
@@ -115,7 +119,12 @@ export async function checkPackageBoundaries(root) {
assetsInlineLimit: 0,
rollupOptions: {
input,
external: group.external,
// A declared dependency also owns its package subpath exports
// (for example `@jtarrio/webrtlsdr/rtlsdr.js`).
external: (id) =>
group.external.some(
(name) => id === name || id.startsWith(`${name}/`),
),
// Unused imports must still obey ownership; tree shaking is not a boundary.
treeshake: false,
preserveEntrySignatures: 'strict',
+16 -2
View File
@@ -799,6 +799,21 @@
"scripts/qa-weather-swap.mjs",
"scripts/qa-weather-teardown.mjs",
"src/layers/weather/imageryHost.test.mjs",
"src/sdr/adsbDecoder.test.mjs",
"src/sdr/controller.test.mjs",
"src/sdr/gain.test.mjs",
"src/sdr/spectrum.test.mjs",
"src/sdr/usbDevices.test.mjs",
"src/sources/adsbRecords.test.mjs",
"src/layers/localAdsb/index.test.mjs",
"src/ui/localSdrControls.test.mjs",
"src/ui/localSdrMarkup.test.mjs",
"src/ui/localSdrPresentation.test.mjs",
"src/data/localReceiversProxy.test.mjs",
"src/layers/localAdsb/feeds.test.mjs",
"src/ui/railScrollers.test.mjs",
"src/layers/localAdsb/motion.test.mjs",
"src/data/modelEligibility.test.mjs",
"src/layers/recentImagery/model.test.mjs",
"src/layers/recentImagery/catalog.test.mjs",
"src/maps/imageryHost.test.mjs",
@@ -808,6 +823,5 @@
"src/ui/imageryBoxTool.test.mjs",
"src/ui/recentImagery.test.mjs",
"src/layers/recentImagery/testDoubles.mjs",
"scripts/qa-recent-imagery.mjs",
"src/ui/railScrollers.test.mjs"
"scripts/qa-recent-imagery.mjs"
]
+52 -5
View File
@@ -602,7 +602,10 @@
"src/layers/weather/imageryHost.js",
"src/ui/layerBindings.js",
"src/ui/displayBindings.js",
"src/ui/shellFacade.js"
"src/ui/shellFacade.js",
"src/ui/localSdrControls.js",
"src/layers/localAdsb/feedNames.js",
"src/ui/localSdrPresentation.js"
],
"external": ["cesium"]
},
@@ -755,7 +758,9 @@
"src/layers/flights/records.js",
"src/layers/flights/recordPolicy.js",
"src/layers/flights/snapshotRenderer.js",
"src/data/inputOwnership.js"
"src/layers/flights/modelSpec.js",
"src/data/inputOwnership.js",
"src/data/modelEligibility.js"
],
"external": ["cesium"]
},
@@ -790,7 +795,8 @@
"src/layers/military/records.js",
"src/layers/military/recordPolicy.js",
"src/layers/military/snapshotRenderer.js",
"src/data/inputOwnership.js"
"src/data/inputOwnership.js",
"src/data/modelEligibility.js"
],
"external": ["cesium"]
},
@@ -1771,6 +1777,7 @@
"src/layers/flights/records.js",
"src/layers/flights/recordPolicy.js",
"src/layers/flights/snapshotRenderer.js",
"src/layers/flights/modelSpec.js",
"src/layers/military/records.js",
"src/layers/military/recordPolicy.js",
"src/layers/military/snapshotRenderer.js",
@@ -1824,6 +1831,7 @@
"src/data/contactTrailRenderer.js",
"src/data/transitProxy.js",
"src/data/gtfsRealtime.js",
"src/data/modelEligibility.js",
"src/layers/transit/trails.js",
"src/layers/transit/movement.js",
"src/layers/transit/qaMetrics.js",
@@ -1890,6 +1898,23 @@
"src/layers/cyclones/rendering.js",
"src/layers/cyclones/labels.js",
"src/layers/cyclones/source.js",
"src/app/layers/localAdsb.js",
"src/layers/localAdsb/index.js",
"src/layers/localAdsb/policy.js",
"src/layers/localAdsb/card.js",
"src/layers/localAdsb/feeds.js",
"src/layers/localAdsb/status.js",
"src/layers/localAdsb/feedNames.js",
"src/layers/localAdsb/motion.js",
"src/layers/localAdsb/models.js",
"src/layers/localAdsb/enrichment.js",
"src/sources/adsbRecords.js",
"src/sdr/controller.js",
"src/sdr/spectrum.js",
"src/sdr/gain.js",
"src/sdr/usbDevices.js",
"src/ui/localSdrControls.js",
"src/ui/localSdrPresentation.js",
"src/app/layers/recentImagery.js",
"src/layers/recentImagery/index.js",
"src/layers/recentImagery/model.js",
@@ -1907,7 +1932,8 @@
"egm96-universal",
"mgrs",
"pbf",
"satellite.js"
"satellite.js",
"@jtarrio/webrtlsdr"
]
},
"application-catalog": {
@@ -2249,6 +2275,7 @@
"src/layers/flights/records.js",
"src/layers/flights/recordPolicy.js",
"src/layers/flights/snapshotRenderer.js",
"src/layers/flights/modelSpec.js",
"src/layers/military/records.js",
"src/layers/military/recordPolicy.js",
"src/layers/military/snapshotRenderer.js",
@@ -2322,6 +2349,25 @@
"src/layers/cyclones/rendering.js",
"src/layers/cyclones/labels.js",
"src/layers/cyclones/source.js",
"src/app/layers/localAdsb.js",
"src/layers/localAdsb/index.js",
"src/layers/localAdsb/policy.js",
"src/layers/localAdsb/card.js",
"src/layers/localAdsb/feeds.js",
"src/layers/localAdsb/status.js",
"src/layers/localAdsb/feedNames.js",
"src/layers/localAdsb/motion.js",
"src/layers/localAdsb/models.js",
"src/layers/localAdsb/enrichment.js",
"src/sources/adsbRecords.js",
"src/sdr/controller.js",
"src/sdr/spectrum.js",
"src/sdr/gain.js",
"src/sdr/usbDevices.js",
"src/data/detection.js",
"src/data/detectionRenderDemand.js",
"src/data/detectionPresentation.js",
"src/data/modelEligibility.js",
"src/app/layers/recentImagery.js",
"src/layers/recentImagery/index.js",
"src/layers/recentImagery/model.js",
@@ -2337,7 +2383,8 @@
"satellite.js",
"@mapbox/vector-tile",
"pbf",
"mgrs"
"mgrs",
"@jtarrio/webrtlsdr"
]
},
"application-operations": {