Max Makovsky
← Projects

Project

Iran Aviation Tracker

Tracks sanctioned Iranian aircraft on a live map, alongside a roster giving each tail's type, operator, sanctions designations and recent flights.

Built with Python, FastAPI, SQLite, React, Leaflet

Status Repository is currently private, release forthcoming.

The tracker follows the sanctioned Iranian fleet: Mahan Air, Iran Air, Caspian, Meraj, Qeshm, Pouya, Iran Airtour and the government and cargo aircraft, widebody and narrowbody alike. Aircraft that are airborne and transmitting appear on a live map. A filterable roster lists each tail with its type, operator, status, last flight, resolved Mode-S hex, and its US, EU, UK and Canadian sanctions designations. Selecting a tail draws its recent flights as arcs between airports.

A database and a tracker, kept separate

The database holds every airframe a sanctions list designates, whether or not it still flies. The tracker holds the aircraft actually observed transmitting. Most designated airframes have never been seen, and a small number of observed aircraft appear on no list at all.

That last group is why these are two sets rather than one list with a filter. An aircraft that is flying but designated by nobody belongs in the tracker and can never belong in the database. Neither set contains the other, and collapsing them would leave the tracker able to show only what a sanctions list had already predicted.

Finding aircraft no list published

A watchlist can only be polled for tails already known, which will never surface an aircraft whose registration was never published. So the backend also sweeps Iran’s Mode-S allocation every half hour and reports any hex in that block the roster does not account for. Anything transmitting from Iran’s block and absent from the list is, by construction, an Iranian aircraft the tracker did not know about.

This is the only route to the unsanctioned domestic carriers. Taban, Zagros, Kish, Varesh and the rest appear on no sanctions list, so nothing about them can be sourced from one. The first sweep found a Varesh 737 over the Gulf for exactly that reason.

A discovery joins the tracker marked with an asterisk and carrying no sanctions status, because nothing sourced says the aircraft has one. A database entry says what an aircraft is and what designates it, sourced. A discovery says only that something exists and was seen. Finding nothing is the ordinary case rather than a broken sweep.

Why the map is usually empty

Two separate reasons, worth keeping apart.

The aircraft that still fly routinely switch their transponders off near Iranian airspace, so most of them are dark most of the time. Where they behave and squawk normally is on the China routes.

Much of what a sanctions list carries is no longer flying at all. A designation list records what has been designated, not what remains airworthy, which is why the roster holds sixteen Fokker F28s and thirteen ATR-72s that have almost certainly not moved in years. Their status reads uncertain, because that is the honest answer.

An empty map is therefore the expected state. The roster and the sanctions data render regardless of whether anything is airborne.

Dark aircraft

For a tail that is dark, the tracker reports two separate things and never merges them: the last position actually observed, and the airport the aircraft is presumed to be at now. Every presumption carries the evidence behind it and what that evidence is worth, from a confirmed sighting on the ground down to a filed destination from a week ago. On the map the solid dot is the observation, the hollow ring is the inference, and the tether between them shows the distance the guess covers.

Sanctions data comes from OFAC’s SDN list, with EU, UK and Canadian designations resolved per tail. Fleet data drifts as the fleet and the listings change.