ModernRadar is a modern Virtual Radar application that tracks air traffic using RTL-SDR hardware and dump1090. It is designed to be 100% offline with zero external API dependencies.
The system resolves aircraft metadata, flight routes, and airline information in milliseconds via local SQLite databases (BaseStation.sqb and StandingData.sqb) using pure ADO.NET. It is built to operate at full capacity even in remote, off-grid locations without internet access.
- 100% Offline Enrichment: Does not require external APIs (like AirLabs or FlightAware). All data resolution is handled strictly via local SQLite files.
- Unified Full-Stack Host: The Angular frontend is compiled directly into the .NET
wwwrootfolder. The application runs as a single process—no need for a separate Node.js frontend server. - Real-Time Tracking: BaseStation data (TCP Port 30003) from
dump1090is processed by a .NET background service and broadcasted instantly to the UI via SignalR. - Smart Hex Decoding: Mathematically calculates the aircraft's registration country using bitmask operations on the 24-bit Mode-S Hex code, ensuring the correct flag is displayed even if the aircraft is not explicitly listed in the database.
- Rich User Interface: A modern UI built with Angular and Tailwind CSS, featuring an interactive aircraft photo carousel, airline logos, and dynamic country flags.
- High Performance: Built on the .NET 10 architecture utilizing
IMemoryCacheand pure ADO.NET (Microsoft.Data.Sqlite) queries for a minimal CPU/RAM footprint.
- Framework: ASP.NET Core 10 (Web API, Background Services & Static File Hosting)
- Data Access: Pure ADO.NET (
Microsoft.Data.Sqlite) - No ORMs (like Dapper or EF Core) are used, prioritizing raw speed. - Real-Time Communication: SignalR
- TCP Client: Custom Asynchronous TCP Socket Listener (Port 30003)
- Framework: Angular 17+
- Styling: Tailwind CSS
- Map Engine: Leaflet.js / OpenStreetMap
- Icons & Flags: Flagpedia CDN, AVS Logos
- RTL-SDR (Any RTL2832U based SDR receiver)
dump1090(orreadsbforks)
- If you just want to run the application, you don't need any of these. Since, this is compiled standalone. all you have to do is just run
.\ModernRadar.Host. But if you want to download the source code, and compile by yourself, steps are below: - .NET 10 SDK
- Node.js and npm (Only for building the frontend)
- An RTL-SDR dongle.
- CRITICAL: A background instance of
dump1090(or a similar tool likereadsb) must be running and actively broadcasting BaseStation formatted data on TCP Port 30003. (not needed, since there is a dump1090 simulator project in solution for development purpose, you also don't need rtl-sdr dongle if you are doing development). - Virtual Radar Server (VRS) database files:
BaseStation.sqbandStandingData.sqb.
Place the required .sqb files into a local directory on your machine (e.g., C:\RadarDB\).
Update the appsettings.json file in the Backend project with your specific file paths:
{
"ConnectionStrings": {
"BaseStationDb": "Data Source=C:\\RadarDB\\BaseStation.sqb;Mode=ReadOnly",
"StandingDataDb": "Data Source=C:\\RadarDB\\StandingData.sqb;Mode=ReadOnly"
},
"RadarSettings": {
"Dump1090Host": "127.0.0.1",
"Dump1090Port": 30003
}
}The frontend app is configured to output its build files directly into the .NET project's wwwroot directory.
Open a terminal in the Angular directory and run:
cd ModernRadar.WebUI
npm install
npm run buildSince the frontend is now hosted by .NET, you only need to run the API project. Ensure your dump1090 background service is running, then open a terminal in the API directory:
cd ../ModernRadar.Api
dotnet restore
dotnet runBy default, the application runs on port 5000. Open your browser and navigate to:
👉 http://localhost:5000
Optional Custom Port: You can override the default port by passing the --port argument:
dotnet run --port 8080The system parses raw TCP lines (e.g., MSG,3,111,111,4B8429,10000,38.5,27.1,,,) and enriches them in the following order:
- Country Detection: The Hex code (
4B8429) is matched against theCodeBlocktable inStandingData.sqbusing bitmasking to mathematically determine the registration country (e.g., Turkey). - Aircraft Metadata: The Hex code is queried in
BaseStation.sqbto fetch the Registration (e.g.,TC-AAI), Aircraft Type (B738), and Owner (Pegasus Airlines). - Full Model Name: The short type (
B738) is joined with tables inStandingData.sqb(AircraftType,Model,Manufacturer) to resolve the full commercial name: "Boeing 737-800". - Route Details: If the aircraft broadcasts a Callsign (e.g.,
PGT2816),StandingData.sqbresolves the origin (ADB) and destination (ISL) airports.
The time i was developing this app, i didn't have up and running adsb receiver. So, ModernRadar.Simulator project is just dummy aircrafts pushing to tcp 30003.
Ali (TB3ARY) - Amateur Radio Operator & Software Developer.
Passionate about off-grid communications, RF technologies, and full-stack engineering.
