So I got tired of bouncing between Flightradar, MarineTraffic, and Twitter every time something kicked off globally, so I wrote a dashboard to aggregate it all locally. It’s called Shadowbroker.
I’ll admit I leaned way too hard into the "movie hacker" aesthetic for the UI, but the actual pipeline underneath is real. It pulls commercial/military ADS-B, the AIS WebSocket stream (about 25,000+ ships), N2YO satellite telemetry, and GDELT conflict data into a single MapLibre instance.
Getting this to run without melting my browser was the hardest part. I'm running this on a laptop with an i5 and an RTX 3050, and initially, dumping 30k+ moving GeoJSON features onto the map just crashed everything. I ended up having to write pretty aggressive viewport culling, debounce the state updates, and compress the FastAPI payloads by like 90% just to make it usable.
My favorite part is the signal layer—it actually calculates live GPS jamming zones by aggregating the real-time navigation degradation (NAC-P) of commercial flights overhead.
It’s Next.js and Python. I threw a quick-start script in the releases if you just want to spin it up, but the repo is open if you want to dig into the backend.
Let me know if my MapLibre implementation is terrible, I'm always looking for ways to optimize the rendering.
Have you seen these projects?
https://github.com/protomaps/PMTiles
https://github.com/maplibre/martin
Right now, ShadowBroker is really optimized for 'blinking blip' real-time radar tracking (streaming the raw GeoJSON payload from the FastAPI backend directly to MapLibre every 60s), so we get as close to as smooth 60fps entity animations across the map.
Moving to something like Martin would be incredible for handling EVEN MORE entities if we start archiving historical flight and AIS data into a proper PostGIS database, but the trade-off of having to invalidate the vector tile cache every few seconds for live-moving targets makes it a bit overkill right now....
Great project, will be contributing!
I set that up for an agricultural project a while back.
everything is open source
Deleted Comment
You mentioned compressing the FastAPI payloads by 90% to keep the browser from melting. I'm really curious about your approach there did you just crank up gzip/brotli on the JSON responses, or did you have to switch to something like MessagePack, Protobuf, or a custom binary format to handle that volume of moving GeoJSON features?
Also, never apologize for the "movie hacker" UI. A project like this absolutely deserves that aesthetic. Awesome work!
https://github.com/blue-monads/potato-apps/tree/master/cimpl...
i should finish but have not have time
1. How do you handle deduplication when the same event surfaces across multiple feeds simultaneously? For news aggregation this is the hard part - an event that appears in Reuters, Bloomberg, and 12 downstream outlets is one story, not 13.
2. What's your rate limiting strategy across 15 sources? Some of the better data APIs (Shodan, GreyNoise, etc.) have strict per-minute limits that become a real constraint at even modest query frequencies.
The B2B application of this pattern is company intelligence - pulling company news, job postings, funding signals, and tech stack changes from 10+ sources and surfacing the relevant signal per account. Same architecture challenge (deduplication, rate limits, signal:noise ratio) with a much smaller initial data volume but higher precision requirements per entity.