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 covers the sanctioned Iranian fleet, including Mahan Air, Iran Air, Caspian, Meraj, Qeshm, Pouya, Iran Airtour, and government and cargo aircraft of both widebody and narrowbody types. Aircraft that are airborne and transmitting are displayed 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 displays its recent flights as arcs between airports.

The database and the tracker

The system maintains two sets. The database contains every airframe designated by a sanctions list, regardless of whether the aircraft still flies. The tracker contains the aircraft that have been observed transmitting. Most designated airframes have never been observed, and a small number of observed aircraft carry no designation.

The sets are maintained separately because neither contains the other. An aircraft flying without a designation qualifies for the tracker but not for the database, and combining the two would restrict the tracker to aircraft that a sanctions list had already identified.

Aircraft discovery

A watchlist can be polled only for registrations that are already known, which excludes any aircraft whose registration was never published. The backend therefore sweeps Iran’s Mode-S allocation at half-hour intervals and reports any hex within that block not accounted for by the roster. An aircraft transmitting from the Iranian block and absent from the roster is by definition one the tracker had not recorded.

The sweep provides the only access to the unsanctioned domestic carriers. Taban, Zagros, Kish and Varesh hold no sanctions designation, so no listing can supply information about them. The first sweep identified a Varesh 737 over the Gulf on this basis.

A discovered aircraft enters the tracker marked with an asterisk and without a sanctions status, as no source attributes one. A database entry records what an aircraft is and what designates it, with sources. A discovery records only that the aircraft exists and was observed. Sweeps returning no results are the normal outcome.

Coverage

Two factors limit the number of aircraft visible at any time.

Aircraft still in service routinely disable their transponders in the vicinity of Iranian airspace, so most are not transmitting for most of the period. Normal transponder operation is most consistent on routes to China.

A substantial portion of the designated fleet is no longer in service. A sanctions list records designations rather than airworthiness, and the roster accordingly includes sixteen Fokker F28s and thirteen ATR-72s with no recent recorded movement. These carry a status of uncertain.

An empty map is therefore the normal state. The roster and sanctions data are displayed regardless of whether any aircraft is airborne.

Aircraft not transmitting

For a tail that is not transmitting, the tracker reports two values separately: the last observed position, and the airport at which the aircraft is presumed to be located. Each presumption is accompanied by the evidence supporting it and an assessment of that evidence, ranging from a confirmed ground sighting to a destination filed a week earlier. The map displays the observation as a solid marker and the inference as a hollow ring, with a tether indicating the distance between them.

Sanctions data is drawn from the OFAC SDN list, with EU, UK and Canadian designations resolved per tail. Fleet composition and designations both change over time.