DCS Sortie Starter — Sources
Where the facts in this product came from. Served at /api/sources.
Why this page exists. DCS Sortie Starter makes a lot of specific claims — a
SAM's engagement radius, a squadron's callsign, the heading a stand's painted
lines run, the bearing of a 1981 raid, a contrast ratio. Every one of them is
either measured, cited, or an admitted estimate, and the difference matters. A
number nobody can trace is a number nobody should trust, including us.
Rule of the page: anything the product asserts as fact gets an entry here.
If a claim can't be traced to a source, a measurement, or a stated estimate, it
is a bug — file it. tests/test_sources.py fails the build if a data pack with
external provenance has no entry.
1. The simulator and the library
pydcs
The mission-file framework everything is built on.
- Upstream: https://github.com/pydcs/dcs
- License: LGPL-3.0. Full text ships in
vendor/dcs/COPYING.LESSER and vendor/dcs/COPYING. - Our copy is byte-for-byte unmodified. Behavioral changes we need (deterministic onboard numbers, a frozen ambient-random default) are applied at runtime in
missiongen/_determinism.py — 33 lines of monkey-patch — precisely so the vendored library stays separable and replaceable, which is what LGPL-3.0 §4/§5 requires. Full statement: vendor/dcs/PYDCS_PROVENANCE.md.
The dcs-retribution pydcs fork
Two terrain packages are lifted from a fork, not from upstream.
- Source: https://github.com/dcs-retribution/pydcs
- Commit:
3a79b8edf923042a5b933feb64543da9e6bdfd37 (25 July 2026) - License: LGPL-3.0, same as upstream.
- Used for:
missiongen/terrains/iraq/ (v1.67.0) and missiongen/terrains/afghanistan/ (v1.68.0). - One adaptation each, marked in the source: our
Terrain.__init__ requires a utc_offset and the fork's does not. Iraq gets UTC+3 (Arabia Standard Time), Afghanistan UTC+04:30. Nothing else is changed. - Why not swap the whole library: the two have diverged, not raced — ours is the only one of the two with
Terrain.utc_offset. Reasoning in docs/pydcs-fork-feature-review.md.
Eagle Dynamics, on their own maps
Product state, airfield lists, what is modelled and what is planned.
Full research with per-claim citations: docs/dcs-iraq-map-state.md.
2. Measured in the simulator — our own instrumentation
These are not cited because nobody has published them. They are measured,
by us, with the method and the date recorded.
| Data | What it is | Method |
|---|
data/parking_headings.json | 9,550 painted-line stand headings (degrees TRUE) across ten maps | Hand-measured in the Mission Editor. pydcs does not expose stand heading, so without these every static aircraft points at a random compass bearing. Guarded by tests/test_parking_headings.py, which found 26 dead measurements on the day it was written. |
data/airframe_dimensions.json | Real in-sim bounding boxes (m) | BUSURVEY export read out of dcs.log. pydcs models the F-14's span as 10.15 m (swept); the real envelope is 20.34 m. Survey f14bu_survey2, 21 July 2026. |
missiongen/terrains/afghanistan/projection.py | Transverse Mercator parameters | Originally derived by us from an in-sim probe mission (probe_afghanistan.miz → scripts/import_projection.py) and marked provisional. v1.68.0 replaced it with ED's official export — which agreed with ours to 2.3 × 10⁻⁵ m of false easting. The label was over-cautious, not wrong. |
docs/mission-semantics-baseline.json | Semantic fingerprint of 52 generated missions | scripts/mission_semantics.py. Not a source so much as a control: it is how we prove a data swap changed what we think it changed. |
aar.TERRAIN_MAX_FT — the refuelling track floor
A refuelling track you can fly into a mountain is not a training aid. pydcs
exposes no terrain elevation (terrain carries no height attributes and an
airport's alt is None), so the highest ground on each map is a table, and
each row is labelled with where the number came from.
"cited" rows are published summit elevations, taken as the map's ceiling because the peak is inside the playable area: Mount Elbrus, 5,642 m / 18,510 ft on Caucasus, and Noshaq, 7,492 m / 24,580 ft on Afghanistan."ours" rows are our own conservative estimates — a round number at or above the highest terrain we can identify within the map bounds. They are labelled as estimates precisely because they are not measurements, per the honest-numbers rule.- A map that is not in the table gets the worst row in it. Failing closed gives an unlisted map an unrealistically high track; failing open gives it a track inside a mountain. Those are not comparable costs. Track altitude is
max(tanker's own block, highest ground + 3,000 ft), rounded up to the next thousand, and clamped to the tanker's ceiling. The 3,000 ft is clearance for the receiver, who starts each ride 1,000 ft below the track. A tanker that cannot reach the resulting altitude is not offered for that map, and the reason is printed beside the ones the era gate removed.
The era gate — data/aircraft_service.json and data/weapon_service.json
The hard filter that keeps a Hornet out of 1978 and an AIM-120 off a 1965
Phantom is two tables of [from_year, to_year | null], one per pydcs aircraft
class and one per weapon CLSID.
- Compiled by hand from public service-entry and retirement dates. There is no single authoritative machine-readable source for this; each entry is a judgement about when a type or store entered and left service.
- **Where the judgement is contestable, it is recorded as a product decision rather than smuggled in.** The F-14B(U) community variant carries a deliberately widened window so it can fly the Cold War; the stock F-14B does not, and
tests/test_pending_aircraft.py asserts that split so it cannot drift. The F-14A remains the period-correct Cold War Tomcat. - Gaps are reported, not hidden. An aircraft with no entry passes the gate and is listed in
/api/health under service_data_gaps. Racks (LAU-7, APU-60-2M) inherit their family's window by prefix rather than being listed individually.
data/air_corridors.json
Curated tactical lanes per map and era: a compass bearing from the friendly
base centroid and a reach in metres. Every lane traces to a published
operation — see §3 below, and docs/iraq-air-corridors.md for the full
citations, the places sources disagree, and the four candidates we rejected.
Corridors that cross terrain a map's developer has not detailed yet carry a
terrain_note that is briefed to the pilot verbatim.
The F-16 B-Course track — bc_* Library cards
Eleven Library cards follow the phase architecture, task lists and setup
geometry of **AETC Syllabus F16C0B00PL (56 FW), "F-16C/D Initial
Qualification", April 2014** — the Luke AFB Combined Wingman Syllabus. Every
card names the document and the paragraph it came from, and
tests/test_bcourse.py fails the build if one stops doing so.
- The BFM perch ranges (9,000 / 6,000 / 3,000 ft, offensive and defensive) are the syllabus's, from BFM-1 through BFM-6 task 6. They are asserted in feet against a distance measured out of a generated
.miz. - The G-awareness profile (4 G warm-up, a 180 at 6–8 G, a 180 at 8–9 G, two AGSM cycles per hard turn) is TR-1 Note 2.
- The 500 ft AGL low-level floor and the 1,000→500 ft LOWAT CAT I band are 5-16f(1) and LASDT-2 Note 3. What the syllabus does not contain, we did not invent. Chapter 5 is a set of gradesheets, not a tactics manual: it states no dive angles, release altitudes, pop parameters or safe-escape numbers, no engagement counts, and — notably — no BFM floor value, even though floor awareness is a graded task. Full accounting, including the 42 sorties deliberately not built and why:
docs/f16-bcourse-track.md. The 5,000 ft hard deck is now cited, not ours. It was labelled an invention until two further documents turned up stating it for exactly this activity: the 48 OG / 493 FS F-15C Flying Training Syllabus (Feb 2009 — "Floor: 5,000 ft AWL/AGL" on every BFM ride) and AFMAN 11-2F-22A Vol 3, *F-22A Operations Procedures*, 20 Sep 2018, Table 3.2 ("Aerobatics / Air Combat Training / Advanced Handling: 5,000"). Same figure, two commands, two airframes. That manual is also the source of the training-rules gates worth adopting more widely — 300 KCAS minimum for low-level navigation, 350 KCAS for low-altitude maneuvering below 5,000 ft AGL, 1,000 ft deconfliction reducing to 500 ft below 5,000 ft AGL. Review of the whole source library, with what to build from it: docs/source-library-proposals.md.
Air refuelling — missiongen/aar.py
Six tankers, each on a track its receivers can actually fly. Every entry
carries a basis field, because these are a different kind of number from
the BFM perches: tuned operating points, not quotations. No document in
this library states AAR airspeed bands, so the table says so next to each value
rather than implying doctrine.
What is sourced is the instruction. The pre-contact zero-closure gate is
ATP-56; the 1-3 kt closure figure is from Stephenson's *Air Refueling
Receiver*; the boom-vs-drogue hookup benchmark (40.8 s vs 85.0 s) is a CARI
study; and the pilot-induced-oscillation explanation — phase lag, loop gain,
the 0.5-1 Hz danger band — is the standard PIO literature. Full working and
citations: docs/aar-training.md.
The card deliberately refuses to give a control-curve number. Published
recommendations for the same task span 0 to 30 depending on gimbal type and
stick length. A single figure would be confidently wrong for most readers,
which is the same failure mode as an invented range.
Admitted estimates, labelled as such. Where we could not measure or cite, we
say so in the product rather than rounding a guess into a fact:
- Magnetic variation. Flight-plan cards publish TRUE headings and say so. pydcs exposes no declination, and a bundled WMM/IGRF model would silently expire. Labelling is the honest answer until a per-map table is checked against the sim. (
docs/ROADMAP.md, "Verified magnetic variation".) - Aircraft performance figures in briefing and kneeboard text are given as a band plus the method, never as a single authoritative number. Values we control — ranges, times, hard decks — are exact.
- Terrain temperature tables. Afghanistan's comes from ED's export verbatim, including an oddity (June's minimum is warmer than July's). We deliberately do not hand-smooth vendored data; a silent local "fix" is how a vendored file stops being vendored.
3. History — mission and corridor design
Each corridor and scenario traces to a published account. Full write-ups with
per-claim citations, source disagreements, and the candidates we rejected:
docs/iraq-air-corridors.md.
Iran–Iraq War (1980–88)
- CSIS, Lessons of the Iran-Iraq War — Ch. 7 · Ch. 14 — the Kharg strike campaign, low-level pop-up profiles, HAWK coverage
- Human Rights Watch, Genocide in Iraq — The First Anfal — the Jafati valley, Dukan Dam, aircraft types and sortie counts
- H-3 airstrike · Atlantic Council — the 4 April 1981 route, and the distance/tanker discrepancy between the two accounts
- Operation Opera · Operation Kaman 99 · War of the cities Coalition operations (1991–2011)
- Air & Space Forces Magazine — "Package Q" · "Scud War, Round Two" · "Ambush at Najaf"
- Army University Press — Task Force Normandy staff-ride packet
- Haulman, Crisis in Iraq: Operation PROVIDE COMFORT, AFHSD — the 36th parallel
- GlobalSecurity — Southern Watch — the 32nd, then the 33rd parallel
- Wathen, "The Miracle of Operation Iraqi Freedom Airspace Management", Air University · CENTAF, OIF – By The Numbers · CGSC, "Joint Doctrine and the Kill Box"
- ARSOF History — Operation Ugly Baby · Operation Viking Hammer
- From Balloons to Drones — Iraqi air defenses in Desert Storm — the KARI battery counts NTTR corridors (
data/nttr_corridors.json, nttr.py, v1.99.0). Every routed flight plan on the Nevada map is threaded through the published structure — the FLEX turnout, the Sally Corridor, the Alamo Corridor, the FYTTR departure west, the recoveries. Structure and rules: - 57th Wing, NELLISAFBI 11-250, Local Flying Procedures — §2.8.1 "Sally Corridor is exclusively owned by NATCF to vector aircraft in and out of the north ranges"; NATCF "has limited radar coverage below 10,000 ft"; §4.6 FLEX departures to FYTTR / HAYFORD PEAK / DREAM / MORMON PEAK / MMM; §4.13 the JAYSN, STRYK, TORYE/ARCOE, MINTT and ALAMO recoveries; §4.6.13.4 north-west bound via FYTTR then BTY
- NTTR, AFMAN 13-212V1 ACC Sup NTTR Addendum A — Table 2.1: Desert MOA = Coyote A–D, Caliente A–C, Elgin, Sally Corridor; note 3: "a corridor within Alamo A/B/C (FL190 to FL210) is identified as 'Alamo Corridor'"; §3.1.1.1 entry via NATCF then Range Monitoring, exit in reverse
- 99 ABW, Nellis AFB Local Flying Procedures excerpts (NTSB docket) — §4.14.5: STRYK from the west, ACTON from the Elgin MOA (RWY 21), ARCOE north ranges (RWY 21), MINTT north ranges (RWY 03), ALAMO when the Alamo corridor is active
- vJaBoG66, Flight Information Publication — Nevada — the DCS community's transcription of the procedures: FLEX at LSV 338/4 crossed at or below 4,000; FYTTR via the LSV 15 DME arc at or below 8,000 then R-269; STRYK at or above 9,500 direct GASS PEAK; JAYSN via Beatty at FL190/FL210; ALAMO recovery heading 165 direct HAYFORD
- opennav.com — FYTTR, STRYK, JAYSN, INS, LSV, LAS, MMM, BLD positions
- Dreamland Resort, Groom Range flight — a civilian flight up the corridor: "parallel to I-15 north and then over Rt.93 north towards Alamo in what is known as Sally corridor"
- 60 FR 20635 — Realignment of R-4807A and R-4808N — the legal boundary descriptions drawn on the corridor chart (
nttr_chart.py, /api/nttr/chart.png); every other outline on that chart is curated and marked ~ - Nellis / Creech / NTTR MACA pamphlet (FAASTeam) — the seven restricted areas, the Desert and Reveille MOAs as VFR-transitable, Alert Area 481 (7,000–17,000, 25 miles west), NATCF frequencies (Desert MOA 126.65 south / 124.45 north) The corridor charts themselves (Figures 4.1–4.9 of 11-250, the FLIP's pages 103–111) are drawings we could not transcribe. Where a point's position comes from those charts — DREAM, MINTT, ARCOE, ACTON, APEX, the gates — it is placed by geography, flagged
approx:true, marked ~ on the F10 map and listed in the brief as curated. The far-west road goes round R-4808N because the straight line from Indian Springs to Beatty runs through the Box. Levant corridors (data/corridors/syria.json, corridors.py, v1.102.0). The same standard on the Syria map — one data file per map, four home clusters (the Galilee fields, Akrotiri and the Cyprus fields, Incirlik and the Adana MTMA, Muwaffaq Salti and the Jordanian fields), six target sectors (Lebanon, Damascus, the coast, the north, the east, central Syria). The structure is the published one — airways, FIR-boundary fixes, TMAs, the Israeli training blocks — and the roads are the ones the IAF and the coalition are reported to have flown. Sources: - AIP Israel (gov.il eAIP) — ENR 2.1 FIR/TMA/sectors (Tel Aviv FIR, PLUTO control in the north), ENR 3.1 ATS routes (J14 NAT–MOCEV–GAFAZ–BARZI–ROP; the coast; MERVA/MUVIN), ENR 3.3, ENR 1.5, ENR 5.1 restricted areas (LLR01 offshore training 7,000–40,000; LLR02; LLR83 Jordan Valley; LLP15 Dimona and LLP19 Gaza prohibited; the LLR36/500/800-series Negev ranges, merged on the chart), ENR 6-1 route chart, the AIP index
- CARC Jordan — ENR 2.1 FIR/UIR/TMA (Amman TMA 5,500–FL155 Class C), ENR 3.1 lower ATS routes (L200 ASLON–NADEK–DAXEN–KUMLO–DAPUK; L513 to BUSRA; L412 to ZELAF), AIRAC AMDT 19/2022, ENR 1.5, ENR 6-1, Eurocontrol RAIS 10.00 Israel–Jordan (the MUVIN crossing)
- AIP Türkiye (DHMİ) — ENR 2.1 (Adana MTMA 50 NM 2,000–FL280; Diyarbakır MTMA), ENR 3.1 (W74 ADA–MILBA–GAZ–SURUC–OZBEY–DYB), ENR 3.2, ENR 4.4 (NISAP, TUNLA, TUSYR, LESRI on the FIR boundary), ENR 5.1 (LTD13 Adana air-to-air firing), ENR 6.2, LTAG İncirlik, LTAJ Gaziantep
- UK Mil AIP — LCRA Akrotiri combined (the SIDs to IREFA and ANANE, the TACAN STAR via AKR HOLD, the ARFA, Flamingo Ops); Cyprus AMC — Nicosia FIR maps and library; LCD47 SOTIA NOTAM (a 33-NM circle — the polygon is not published, drawn
~); IFALPA/IFATCA Ankara–Nicosia FIR leaflet; Eurocontrol ERC04L - Syria GACA eAIP — ENR 2.1 (Damascus FIR; Latakia CTR 15 NM on 35°28'49"N 035°56'32"E, 119.9), ENR 3 routes and ENR 3.2 (L601 TUNLA–SALIM–KTN), ENR 4.1 and ENR 4.4 (DAM, RDIMA, ABBAS, BUSRA, NIKAS, TUNLA, SALIM), ENR 5.1 (every P/R/D row blank — "published by NOTAM"), OSDI, OSLK (SID NIKAS 1-J "needs military coordination"), OSDZ
- Lebanon (DGCA via IVAO mirror) — AD 2 OLBA (Beirut CTR 20 NM on KAD), AD 2 OLKA Rayak, ENR 1.2
- The IAF roads, as reported — Wikipedia, 1973 Syrian General Staff HQ raid ("out over the Mediterranean, before turning north towards Lebanon and then east towards Damascus"); Wikipedia, Operation Mole Cricket 19 (the Bekaa, the coastline Sidon–Beirut); GlobalSecurity, MML 1973; Al Jazeera 31 Jan 2013, 25 Nov 2020 (from the Golan), 5 May 2021 (Latakia from the sea), 28 Dec 2021, 2 Jul 2022 (Tartus), 17 Sep 2022 (Damascus airport), 20 Nov 2024 (Palmyra); Gulf News (from Lebanese airspace), Jerusalem Post (same), CBS (over southern Lebanon); Times of Israel — T-4, Masyaf by day, Aleppo, Al-Bukamal; The Defense Post — T-4 2018; TASS on the Il-20 ("approached the target from the Mediterranean at a low altitude"), TWZ on the Il-20; Yahoo/AFP low-level attack; Frantzman on Masyaf
- Northern Watch and the W74 road — A&SF, "Northern Watch" Feb 2000 (the ROZ over eastern Turkey), A&SF Aug 2002, GlobalSecurity ONW, Jamieson, Northern Iraq, Haulman, Provide Comfort, USMC Provide Comfort, Smithsonian, "Cleared in Hot", PBS at Incirlik, The Aviationist — the Tornados leave Akrotiri
- Al-Tanf, the 55 km zone and the Euphrates line — Wikipedia, Al-Tanf, GlobalSecurity, VOA 2017, Military Times 2017, Brookings, Washington Institute, Stimson — Tower 22, TASS 2019, TWZ — F-35s to Jordan, Wikipedia, Muwaffaq Salti AB, Rukban; Atlantic Council — the Euphrates buffer, Al Jazeera 19 Jun 2017, MEI, Al-Monitor 2020
- Risk pages that summarise the structure — safeairspace Syria, Cyprus, Jordan; OPSGROUP on the Il-20 and Turkey/Syria/Iraq What the sources do not give: the IAF's own routes (none are published — every "road" over Lebanon, the Golan or the sea is a reported track placed on the named town, summit or coastline and flagged
approx:true, ~ on the chart, listed in the brief as curated); Syria's P/R/D areas (the eAIP prints none); the Lebanese ATS routes in usable detail. The coast and the borders on the chart are schematic polylines, not surveyed. Central Region corridors (data/corridors/germany.json, v1.103.0). The Cold War Germany map, Cold War era only, both sides of the line. Seven NATO clusters (the Eifel, the Hunsrück, the Pfalz, Rhein-Main, the Rhineland, the Weser, the Elbe) and three Warsaw Pact clusters (the Berlin ring, the southern fields, Mecklenburg) share six curated crossing gates — Boizenburg, Dömitz, Helmstedt, Herleshausen, Point Alpha, Hof. What is drawn from the printed figure and what is placed: - The ADIZ / Flugüberwachungszone — de.wikipedia "Air Defense Identification Zone" (dewiki.de mirror): "eine Tiefe von 25 bis 30 Seemeilen bzw. später durchschnittlich 40 km Tiefe", the 1963 FlugÜZ rules, Braunschweig's 1958 exception; DHV-Info 49 (1989) — "usafe clearance" numbers still issued in 1989; NATO AIRCOM — Germany as a special case. Drawn as a 40 km band on a schematic border (
~). - The belts — relikte.com, Nike in Niedersachsen ("die vorderen Nike-Stellungen ca. 150 km westlich des Eisernen Vorhangs"), HAWK in Niedersachsen (the HAWK belt in front of the Nike belt's eastern edge, battalion sites by town), the FlaRak overview and the radar sites (SOC 1 Brockzetel FLYFISH, SOC 2 Uedem MANDRIL, CRC Brekendorf BUGLE, Visselhövede SILVERCORK, Uedem CRABTREE, Auenhausen BACKWASH, Erndtebrück LONESHIP, RP Uelzen UNITY); nl.wikipedia Groepen Geleide Wapens (LOMEZ "ca. 50 km diep direct achter het IJzeren Gordijn", the KLu sites); de.wikipedia Nike (Rakete)) and Nike-Feuerstellung Albach (70 sites); FlaRakGrp 38; Air & Space Forces, "Air Defense" Jul 1983; CBO 1978; usarmygermany.com — 32nd AADCOM, 10th ADA Bde, 69th ADA Bde, 94th ADA Group, 108th ADA Bde; ACE High Journal — the CRC bunkers with printed coordinates; en.wikipedia List of Nike missile sites. Drawn as bands (
~). - Airspace control measures — FM 100-103 (1987) Ch. 2: the LLTR "a temporary corridor of defined dimensions which allows the low-level passage of friendly aircraft through friendly air defenses", "activated for specified times only and changed frequently"; MRR, SAAFR, HIDACZ, BDZ, WFZ; FM 44-100 ("Low-level transit routes are the NATO equivalent of MRR"); FM 3-52 Ch. 4. No trace was ever published — the gates and the roads to them are ours.
- The corps sectors and the seam — GlobalSecurity, Cold War NATO Army Groups ("Gottingen (FRG)-Liege"), NORTHAG (I BR "from Goslar to Paderborn"), the Fulda Gap, the Hof corridor; en.wikipedia 2 ATAF ("north of the city of Kassel"), 4 ATAF, NORTHAG, NORTHAG 1989 order of battle_order_of_battle); warhistory.org — NATO's Central Region ground forces; JMSS — the Minden Gap; BAOR July 1989 (orbat85); coldwardecoded — I NL Corps, I BE Corps; en.wikipedia III Corps (Bundeswehr)).
- The Berlin corridors — FRUS 1945 vol. III doc. 1206 ("20 English miles (32 kilometers) wide, i.e., 10 miles (16 kilometers) each side of the center line"; the Control Zone "a radius of 20 miles (32 kilometers)"); en.wikipedia West Berlin Air Corridor; Berlin Air Safety Center; the Air Directorate report (UW digital library). Drawn from the border crossing to the Control Zone.
- The GDR's own structure — nva-flieger.de, Luftraum der DDR: the Grenzsperrstreifen's 27 reference towns, the corridors from the east ("mindestens 300m Flughöhe", "bei 10'000 Fuß"), the Control Zone "bis zu einer Höhe von 3000m", the 99 örtliche Fluglinien with their NDB bearings; nva-flieger.de Typausbildung (Zone 064 Rathenow); nva-futt.de Faktensammlung; d-d-r.de NVA Luftstreitkräfte (Bunker Fuchsbau); mil-airfields.de Wittstock (the 1989 training routes 023–029, the Wulfersdorf SAM site); Veith, NVA airfield list (NDB idents); coldwardecoded — LSK/LV 1989. The eastern fixes are the named towns, placed (
~). - The 16th Air Army and the SAM ring — en.wikipedia 16th Air Army, 16 GvIAD, 6 GvIAD, 105 ADIB, gsvg88 16 VA, gsvg88 army aviation and SAM brigades; de.wikipedia Flugabwehrraketentruppen (NVA)) (the 41., 43., 51. FRBr and the FRR sites by town — the 41. FRBr ring is drawn as a 30-NM circle,
~); Sperenberg, Jüterbog, Alt Daber, Templin/Groß Dölln, Parchim, Oranienburg, Werneuchen, Stendal-Borstel. - The ranges — de.wikipedia TrÜbPl Wittstock ("53° 5′ 10″ N, 12° 38′ 42″ O", 118.99 km²), mil-airfields.de — the Bitburg replica (N530503 E0124004), forgottenairfields Wittstock, 16va.be LABS, 16va.be Retzow, 16va.be ranges; TrÜbPl Altmark ("52° 25′ 48″ N, 11° 34′ 12″ O", 232 km²); Lieberoser Heide ("51° 56′ 7″ N, 14° 19′ 40″ O", 28 x 12 km); urbex.nl Altes Lager. West: AIP Germany ENR 5.1, AIRAC 03/24 (mirror) — ED-R 37 Nordhorn, 31 Bergen-Hohne, 32 Munster, 33 Unterlüss, 34 Meppen, 10 Todendorf-Putlos, 11 Ostsee, 13 Meldorfer Bucht, printed vertices; RAF Nordhorn; openaip ED-R 116 Baumholder and ED-R 136 Grafenwöhr (limits; boxes on the point,
~); Bundestag 16/10116 (TRA 204/304 Eifel absorbed into Lauter 2003), de.wikipedia TRA Lauter, flugzeugforum TRA 205/305 (outline approximate, ~). - The Low Flying Areas — NfL 2025-1-3686, Bekanntmachung über Tiefflüge (the seven areas with full coordinates, re-activated 2025; Luftwaffe — Tiefflugregeln); de.wikipedia Tiefflug (the Cold War list: Borken, Cloppenburg, Nördlingen, Holzminden, Schneverdingen, Itzehoe; 500 ft everywhere, 250 ft in the areas); Bundestag 13/1892 ("Prinzip der freien Streckenwahl" — day low flying was free-routed); Wissenschaft & Frieden, Risiko Tiefflug. The polygons are today's re-publication of the named areas; whether they match the 1980s outlines exactly is not stated.
- Navaids — OurAirports: Spangdahlem SPA, Nattenheim NTM, Büchel BUE, Hahn HND, Kirn KIR, Ramstein RMS, Zweibrücken ZWN, Wiesbaden WIB, Taunus TAU, Cola COL, Germinghausen GMH, Hamm HMM, Fritzlar FTZ, Warburg WRB, Osnabrück OSB, Bückeburg BYC, Wunstorf WUN, Leine DLE, Nienburg NIE, Celle CEL, Fassberg FSB, Braunschweig BRU, Hehlingen HLZ, Bremen BMN, Nordholz NDO, Hamburg HAM, Elbe LBE, Lübeck LUB, Kiel KHD. Current data; the Cold War idents that no longer exist (Bitburg, Sembach, Gütersloh, Nörvenich TACANs) are not in it — those fields are placed at their DCS positions.
- The wings of 1985 — 36th Wing, Spangdahlem, Hahn, Ramstein / 526 TFS, 81 TFW FOLs, Zweibrücken, RAF Gütersloh, TaktLwG 31, JG 71, Crested Cap 83, Autumn Forge 83. What the sources do not give: a published ADIZ boundary (the 1963 Bekanntmachung is not online); any LLTR/MRR trace, width or crossing procedure for the Central Region; the Cold War TRA outlines; the DFS AIP's ENR 3/4/5 for the east (robots-blocked); Soviet (as opposed to NVA) SAM sites; documented Warsaw Pact attack routings. Every crossing gate, every road over the GDR and every eastern fix is therefore placed on a named town, checkpoint or river crossing and flagged
~; the ADIZ and the belts are bands on a schematic border; the border, the Elbe, the coast and the autobahns are schematic. Other theatres. data/historical_airspace.json carries the Berlin air corridors, the Syria/Euphrates deconfliction line, OEF airspace control and the Groom box. data/theater_identity.json carries per-map/era national ownership of each airbase. What we deliberately did not use. Two things are widely repeated and have no citable authority we could find: a named post-2003 **Baghdad restricted operating zone, and the BIAP "corkscrew" approach**. They are folk knowledge, so they are not in the product. Documented in docs/iraq-air-corridors.md.
4. Training and doctrine
missiongen/bfm.py — the three-perch ladder. Geometry (range, aspect, altitude offset) is the difficulty knob rather than an AI skill slider, and every standards card is generated from the rung actually flown. Design and instructional rationale: docs/skillwork-syllabus.md.data/comms_plan.json — one comm ladder used by every generated mission, so a pilot learns a single plan that holds across all starters. All UHF/VHF-AM values sit on real, legal frequencies.data/callsigns.json — each entry is tagged documented (a real squadron or flight radio callsign with a known source: incident audio, callsign registries) or flavor (plausible, invented). The tag ships with the data so the distinction survives.data/squadrons.json — real squadron identities per base, used to fill ramps in contiguous single-type blocks the way a real flight line reads.- The Training Pipeline (
data/courses.json, missiongen/courses.py). The three-school shape — UPT, FRS, MQT — is the order the US services train a pilot, and the course is laid over rides whose sources are recorded above (the White Knights documents, the AAR Academy, the timing track). The readings under data/courses/ are original writing for this product: - f4e_history.md draws on Peter E. Davies, F-4 Phantom II vs MiG-21 (Osprey, 2008) and USAF F-4 Phantom II MiG Killers 1972–73 (Osprey, 2005); Marshall L. Michel III, *Clashes: Air Combat over North Vietnam 1965–1972* (Naval Institute Press, 1997) — the Sparrow/Sidewinder probability-of-kill figures and the training story; Robert F. Dorr and Anthony M. Thornborough, Phantom: A Legend in Its Own Time; the National Museum of the USAF fact sheets for the F-4C/D/E/G; the Heatblur DCS: F-4E manual for what the Block 45 airframe models. Dates and production totals are the commonly published ones (first flight 27 May 1958; F-4E first flight 30 June 1967; 5,195 built) and the chapter avoids figures the sources disagree on. - aviation_basics.md and pipeline_howto.md are general airmanship and product description; nothing in them is a measured claim.
5. Design, typography and accessibility
- Flightline Technical design system — one token source,
data/brand/flightline.json, generated into the frontend by scripts/gen_theme.py. Contrast ratios are computed, not claimed. - WCAG 2.2 AA — the standard the product is audited against. Audit and remediation:
docs/wcag-audit-2026-08-12.md. Enforced in the suite by tests/test_a11y.py and scripts/axe_check.js (axe-core, vendored at vendor/axe-core/, MPL-2.0 — see its LICENSE). - Apple Human Interface Guidelines — the reference for the Library's color semantics (v1.61.0).
- Fonts, all vendored under the SIL Open Font License 1.1, license text alongside each file in
data/brand/fonts/: IBM Plex Mono, Source Sans 3, Source Serif 4, Barlow Condensed, Bangers. - Lucide icons — ISC license,
data/brand/LICENSE-lucide.txt.
6. Licensing summary
| Component | License |
|---|
| DCS Sortie Starter (our code) | MIT © Authentic Media LLC — LICENSE |
vendor/dcs (pydcs) | LGPL-3.0, unmodified — vendor/dcs/COPYING.LESSER |
missiongen/terrains/{iraq,afghanistan} | LGPL-3.0, from the dcs-retribution fork |
vendor/axe-core | MPL-2.0 |
| Vendored fonts | SIL OFL 1.1 |
| Lucide icons | ISC |
Full third-party notices: THIRD-PARTY-NOTICES.md.
Not affiliated with Eagle Dynamics. DCS World and its terrain modules are
their products; this tool generates mission files for them.
7. Thanks
**The Thanks list is rendered below this section when this page is served, and
it is not in this file.** That is deliberate. Everything above is a citation —
a pinned commit, a license, a published source — and belongs in the repository
where it is versioned, reviewed and guarded byte-for-byte. Gratitude is a
living list: it changes between releases, and the person who should be writing
it is the one who knows the community, not the one who knows the build system.
So it lives on the server's data volume, is edited from the password-gated
/admin under Thanks, and is injected into this page at request time.
Also available as JSON at /api/credits. See missiongen/credits.py.
8. Where the deeper write-ups live
| Document | What it covers |
|---|
docs/dcs-iraq-map-state.md | What ED has actually shipped for Iraq, with per-claim citations and an explicit list of what we could not verify |
docs/iraq-air-corridors.md | The corridor research: every lane, its sources, the disagreements between them, and the four candidates rejected |
docs/skillwork-syllabus.md | The training progression and its instructional design |
docs/pydcs-strategy.md, -fork-evaluation.md, -fork-feature-review.md, -plan-critique.md | The library question, from first look to standing conclusion ("take the data, leave the engine") |
docs/wcag-audit-2026-08-12.md | Accessibility audit and remediation |
docs/how-a-terrain-module-works.md, docs/afghanistan-terrain-export-runbook.md | How terrain data is exported and verified |
docs/chart-authenticity-evaluation.md | How close the theatre chart gets to a real aeronautical product, and where it deliberately stops |
vendor/dcs/PYDCS_PROVENANCE.md | The vendoring discipline and the LGPL reasoning |
Thanks
This tool stands on a lot of other people's work. Some of it is code we vendored and some of it is the reason anybody knows how to fly these aircraft at all.
- Eagle Dynamics — For DCS World itself, and for the terrain teams whose maps this tool exists to fill. Not affiliated with them.
- The pydcs authors — pydcs (LGPL-3.0) is the mission-file framework everything here is built on. Vendored unmodified.
- The DCS Retribution team — Their pydcs fork is where the Iraq and Afghanistan terrain packages came from.
- Sedlo — Campaign author (Bold Cheetah and others). The bar for what a hand-built DCS mission should feel like.
- Stewmanji — For the community teaching work that gets people from installed to actually flying.
- The MOOSE project — Their airbase enum is the independent list we cross-check our terrain exports against.
- Casmo — Thanks for the QA and recommendations