Airline.live: global flight tracker with a live map, airport pages, runways and METAR/TAF weather, Istanbul Airport first. Küresel uçuş takip sitesi: canlı harita, havalimanı sayfaları, pistler ve hava durumu; öncelik İstanbul Havalimanı.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗
Herkese açık, uluslararası sivil havacılık uçuş takip platformu; birincil istasyonu İstanbul Havalimanı (IST). Canlı harita, uçuş, uçak ve istasyon takibi sunar. Uçak istasyona yaklaşınca (varsayılan 10 km) ve indiğinde bildirim gönderir. Canlı uçak verisi şimdilik Türkiye ve çevresinden çekilir; dünya geneli canlı veri sonraki bir kilometre taşıdır. Önce web (PWA) gelir, ardından iOS ve Android uygulaması (Expo).
Airline.live · airline.live — yönetim:
admin.airline.live, API:api.airline.live, analiz:analiz.airline.live. Önceki alan adının bütün adresleri kalıcı yönlendirmeyle (308) aynı yola gider (D-112; geçiş adımları ACTIVATION'da).
Bilinen sınır: Kendi ADS-B alıcımız olmadığı için İstanbul Havalimanı'nda iniş anı çoğunlukla doğrudan görülmez. İniş bildirimi çoğu uçuşta "muhtemelen indi (tahmini saat)" olarak ve son sinyalden 1–1,5 dk sonra gelir. Bazı uçuşlarda yalnızca "iniş verisi alınamadı" denebilir.
| Alan | Durum |
|---|---|
| Yol haritası, veri kaynakları, mimari | ✅ Hazır ve doğrulandı |
| Yerel test ortamı, Durum ve Yenilikler sayfaları | ✅ Parça 1 · M0 |
| Bütün servisler, yönetim paneli (Servisler ekranı), onaylı analiz | ✅ Parça 1 · M1a |
| Marka ve alan adı: Airline.live · airline.live; önceki alan adından kalıcı yönlendirme (D-112) | ✅ v0.25.0 (2026-10-15’ten beri airline.live’da) |
| Güvenlik sertleştirmesi (ziyaretçi başına giriş sınırı, Redis kesintisine dayanıklılık) | ✅ v0.3.2 |
| Canlı yayın: web, api., admin. (Dokploy, Let's Encrypt) | ✅ 2026-09-27 |
| Otomatik yayın hattı (GitHub Actions → GHCR → Dokploy), doğrulama ve geri alma | ✅ Parça 1 · M1b, sunucu kurulumu sürüyor (rehber) |
| Veritabanı: havalimanı, pist (eşikler dahil) ve havayolu verisi, günlük güncelleme, iz tabloları ve bakım işleri | ✅ Parça 1 · M2 |
| Canlı veri sağlayıcıları (ADSB.lol, kendi alıcı), veri temizliği ve gizlilik kuralları | ✅ Parça 1 · M3 |
| Canlı veri akışı (ingest): kapsama planı, uyarlanır istek hızı, uçuş kaydı ve iz, sağlık izleme, replay aracı | ✅ Parça 1 · M4 (adsb.lol çekimi v0.28.0 ile açıldı; yalnız havayolu uçakları, D-115) |
| Harita tasarımı: uydu zemini, metrik birimler, açılıp kapanan uçak etiketleri | ✅ Parça 1 · M6 (D-072) |
| Canlı API ve WebSocket: görünen alan, arama (sefer no, çağrı kodu, tescil, hex), saniyelik farklar, gizlilik ve engel listesi | ✅ Parça 1 · M5 |
| Canlı harita: uydu altlığı, yönlü uçak simgeleri, açılıp kapanan etiketler, arama, bilgi kartı, "Uçağı ortala", paylaşılabilir bağlantı, görünen uçaklar listesi, Türkiye havalimanları | ✅ Parça 1 · M6 (canlı uçaklar v0.28.0 ile haritada) |
| Kullanım koşulları | ✅ v0.9.0 (v0.34.0'da güncellendi; geçici notu kalktı; v0.35.0'da MET Norway maddesi, v0.36.0'da “Model” satırları, v0.39.0'da şehir adlarının kaynakları) |
Havalimanı sayfaları (61 havalimanı, pistler, resmî adlar), Hakkında sayfası, İngilizce adresler (/en/...), arama motorları ve yapay zekâ aramaları için site haritası, yapılandırılmış veri ve llms.txt | ✅ Parça 1 · M6b |
| Havalimanlarında canlı hava durumu (METAR/TAF; rüzgâr, yağmur, kar, gök gürültüsü, sis), METAR/TAF kaydı, haritada kırmızı iğne ve havalimanı penceresi, IST merkezli açılış | ✅ Parça 1 · M6c |
| Yakın ülkelerdeki 75 havalimanı (Türkiye’deki en yakın havalimanına ≤ 500 km): sayfa, pistler, hava durumu, haritada iğne ve pencere; Ercan KKTC; açık turkuaz tema; hava durumu satırlarında simge ve vurgu | ✅ Parça 1 · M6d |
| Rüzgâr km/sa ve knot ile; etkili rüzgâr (MGM meydan uyarı ölçütü) ve şiddet adı; şimşek ve yıldırım uyarısı; hizalı havalimanı penceresi | ✅ Parça 1 · M6e, v0.13.1 |
| Askerî ve sivil havalimanı adları TR/EN; haritada havalimanları tek ayarda (Gizle / Simge / Simge ve kod, D-114); yurt dışında yerel saat ve UTC farkı | ✅ Parça 1 · M6f |
| Derecelendirilmiş rüzgâr renkleri (yeşilden kırmızıya, sade şiddet adlarıyla) ve rüzgâr kesmesi uyarısı | ✅ v0.14.1, v0.16.1, v0.25.3 (D-116) |
| 2. halka: 1.000 km’ye kadar 89 havalimanı daha (toplam 225); haritanın atıf şeridinde site adı ve sürüm | ✅ Parça 1 · M6g |
| Yeniliklerde her sürümün yayın tarihi ve saati | ✅ v0.17.1 |
| Haritada kesikli ülke sınırları (OpenStreetMap) | ✅ v0.17.2 |
| 3. halka: 2.000 km’ye kadar 278 havalimanı daha (toplam 503); 2022’den beri kapalı olabilecek havalimanlarında not | ✅ Parça 1 · M6h |
| API yanıtları sıkıştırılmış (br/gzip): haritanın havalimanı ve pist listesi 440 KB → ~76 KB | ✅ v0.18.1 |
| Haritada ülke adları başkentlerde (büyük, yarı saydam; Etiketler’den açılıp kapanır) | ✅ v0.18.2 |
| Ülke adları sınırların ve kıyının içinde, çok kelimeli adlar alt alta | ✅ v0.19.1 |
| Ülke adları daha belirgin, havalimanı işaretlerinden uzak boş yerlerde | ✅ v0.21.1 |
| 4. halkaya hazırlık: 720 havalimanının pist ve saat dilimi verisi, ölçek iyileştirmeleri, daha hafif harita sayfası | ✅ Parça 1 · M6i.1 |
| Askerî hava üsleri haritada gösterilmez; harita bilgisayarda biraz daha uzaktan (z8) açılır | ✅ v0.22.1 |
| Askerî hava üsleri sitenin hiçbir yerinde yok (liste 498 havalimanı, Türkiye 56) | ✅ v0.22.2 |
| Haritada havalimanı araması: kod, ad ya da şehirle, yazarken öneri | ✅ v0.22.3 |
| Global konumlandırma: başlık ve tanıtım metinleri Türkiye ile sınırlı değil; canlı uçak verisi şimdilik Türkiye ve çevresinde (D-106) | ✅ v0.22.4 |
| Haritada bütün ülkelerin adları (164 ülke ve bölge, sınır içinde, boş yerde) | ✅ v0.22.5 |
| 4. halka: 5.000 km’ye kadar 719 havalimanı daha (toplam 1.217; Londra, Delhi, Ulan Batur, Nairobi…) | ✅ Parça 1 · M6i.2 (v0.23.0) |
| 5. halkaya hazırlık: ~2.000 havalimanının pist ve saat dilimi verisi, eski kodlardan yönlendirme, sunucudan yerel saat | ✅ Parça 1 · M6j.1 (v0.24.0) |
| Savaş nedeniyle kapalı havalimanları: 23 havalimanı listede (16’sı Ukrayna’da; Kiev, Odessa, Lviv…), 35 havalimanında kaynaklı kapanış notu (toplam 1.240) | ✅ Parça 1 · M6i.3 (v0.25.1) |
| Daha dayanıklı canlı veri sunucusu: beklenmedik bağlantı (yükseltme) istekleri düzgün hata yanıtı alır, sunucuyu yeniden başlatamaz (D-113) | ✅ v0.25.2 |
5. halkanın ölçek hazırlığı: havalimanı listesi sunucu belleğinde, daha küçük harita verisi (include=map), 180. meridyende doğru çizim, METAR/TAF kaydı tarayıcıda, daha hızlı harita ve havalimanı sayfaları (D-111) | ✅ Parça 1 · M6j.2 (v0.26.0) |
| 5. halka: dünyanın geri kalanından 2.026 havalimanı daha, ABD dahil (toplam 3.266, 232 ülke; New York, Sidney, Honolulu, Santiago…); Türkçe ve İngilizce adlar, eski kodlardan yönlendirme | ✅ Parça 1 · M6j.3 (v0.27.0) |
| Canlı uçaklar açıldı: yalnız bilinen bir havayolu çağrı koduyla uçan uçaklar; askerî, devlet, özel (iş jetleri dahil) ve kimliği belirsiz uçaklar gösterilmez. Yönetici için tek dokunuşla kapatma düğmesi ve işlem kaydı, API'de ODbL bildirimi, geri alma koruması (D-115) | ✅ Parça 1 · M7d.1 (v0.28.0) |
| adsb.lol günlük bütçesi: kaynak IP başına günde 500 istek kabul ediyor; worker günde en çok 480 istekle iki geniş çemberi sırayla sorgular, uçaklar güncellemeler arasında haritada kalır ve tahmini konumda ilerler, durum satırında "veri seyrek" notu (D-122) | ✅ Parça 1 · M7e (v0.28.1) |
| Kayıtlar en çok 30 gün: uçuş kayıtları, izler, hava durumu ve veri kaynağı geçmişi her gece budanır; yönetici e-postası 30 günde rol adıyla değişir; IP adresi günlüğe ve diske yazılmaz (istek sınırı tek yönlü anahtarla); admin → Saklama'da saklama tablosu ve yasal bekletme (D-120) | ✅ Parça 1 · M7d.2 1. yayın (v0.29.0) |
| Güvenlik güncellemesi: Next.js 16.4.1 (iki kritik uzaktan kod çalıştırma açığı dahil), Zod 4.6.6, Fastify 5.12.6 (D-123) | ✅ Parça 1 · M7g (v0.29.1) |
| Uçak etiketleri ve seçim: seçili uçağın etiketi dört satır (sefer no, kuyruk tescili, hız ve yükseklik, son yaklaşmada tahmini iniş pisti), bilgi kartında tahmini iniş pisti; boş haritaya tıklamak ya da dokunmak seçimi bırakır; diğer uçakların etiketleri kapalı, havalimanları “Simge” ile başlar (D-121) | ✅ Parça 1 · M6p.1 (v0.30.0) |
İşletim düzeltmeleri: adsb.lol isteklerimizi sınırlayınca worker giderek daha seyrek dener (400 sn'den 2 saate; sunucunun bekleme başlığı daha uzunsa o, en çok 24 saat), admin satırı "Sorunlu" ve yeniden deneme saatini, harita da yeniden deneme saatini yazar; hava durumu yavaş yanıt veren istek grubunu atlar, alınan raporları yazar ve atlanan havalimanlarını sonraki çalışmalarda eksik kaldıkları andan bu yana ister; herkese açık durum sayfası kaldırıldı (/durum ana sayfaya, /en/durum /en'e 308), admin → Servisler'de web satırı derlemeyi, ortamı ve derleme zamanını yazar, altında yol haritası (D-124) | ✅ Parça 1 · M7f (v0.31.0) |
| Saatlik hava sekmesi: havalimanı penceresinde "Şimdi" ve "Saatlik hava" sekmeleri; günün her saati bir satır (geçmiş saatlerde METAR, sonrakilerde TAF), üç dilimde duraklatılabilir otomatik geçiş (D-119) | ✅ Parça 1 · M6m.1 (v0.32.0) |
| En çok üç yönetici: sahip ve iki operatör, iki rol (operatör canlı katmanı kapatıp açar, engel listesine ekler, yasal bekletmeyi açar; çıkarma, bekletmeyi kaldırma, kapsama raporu ve analiz paneli sahipte); admin → Engel listesi telefondan: hex ya da tescille ekleme, arama, onaylı çıkarma; tescille engellenen uçak hex bilinmese de yayından çekilir; her işlem işlem kaydına yalnız sayıyla yazılır (D-125) | ✅ Parça 1 · M7d.2 2. yayın (v0.33.0) |
| Yasal sayfalar: İletişim (künye; içerik ve yer sağlayıcı), Gizlilik (işlenen veriler, hukuki sebepler, çerez ve depolama tablosu, saklama süreleri, haklar), Gizleme talebi (konusu hazır e-posta), güncellenen kullanım koşulları ve Açık veri (ODbL yöntem belgesi, makine okunur JSON); künye env'i yokken künyeye bağlı sayfalar kapalıdır (D-126) | ✅ Parça 1 · M7d.2 3. yayın (v0.34.0) |
Saatlik sıcaklık: saatlik hava sekmesinde sonraki saatlerin sıcaklığı MET Norway model tahmininden (CC BY 4.0 ve NLOD 2.0); worker yoklar (Türkiye'nin havalimanları önceden hazır, yurt dışı istek üzerine), istasyon başına tek satır, en çok 48 saat saklama; admin → Servisler'de ayrı satır; üretimde PROVIDER_CONTACT_EMAIL ile açılır (D-127) | ✅ Parça 1 · M6m.2 (v0.35.0) |
| Model koşulu: havacılık tahmini (TAF) olmayan, süresi biten, iptal edilen ya da yayımlanmayan sonraki saatlerde “Model” satırı MET Norway'in o saatlik koşulunu (41 kod, kendi TR/EN adlarımız ve simgelerimiz) ve yağışını (mm) gösterir; rüzgâr, görüş ve bulut tabanı MET'ten alınmaz; dilim özeti model saatlerini ayrı sayar (D-128) | ✅ Parça 1 · M6m.3 (v0.36.0) |
| İşletim yaması: admin → Servisler'deki hava durumu özeti istasyon başına dizinden okunur, kayıt büyüdükçe 2 sn'lik yoklamada zaman aşımına düşmez; deploy'dan sonra canlı verinin ilk isteği beklemeden ve İstanbul'u kapsayan Batı çemberine gider, harita boş kalmaz (bu yayından bir gün sonra tam etkili; iki istek arası yine en az 10 sn); günlük bütçe aşılmaz (sayaç bunun için bir izni boş bırakır) (D-129) | ✅ Parça 1 · M7h (v0.36.1) |
Seçili uçağın güzergâhı: bu uçuşta uçulan iz sunucudan, sayfa açılmadan önceki bölümüyle (havada kehribar, yerde camgöbeği, konum verisi olmayan bölümler kesikli); varışa kalan yol büyük daire boyunca beyaz çizgi, uçak varışa inince kalkar; bilgi kartının en üstünde tahmini güzergâh (ör. AYT → IST) ve havalimanlarının adları. Kalkış ve varış VRS rotalarından tahmindir (CC0); yeni uç GET /v1/aircraft/{hex}/route (D-121) | ✅ Parça 1 · M6p.2 (v0.37.0) |
Küre görünümü: uzaklaştırınca dünya küre (yakınlaştırma ≤ 2,5), 3. kademeden bugünkü düz harita; küre her yakınlaştırmada aynı altlığı taşır (Esri uydu görüntüsü, kesikli ülke sınırları; altında okyanus tonu, kenarında atmosfer halesi, dışında uzay degradesi); kürenin arkasındaki uçaklar ve havalimanları çizilmez ve listelenmez; kürede canlı abonelik kamera merkezine göre; Etiketler → Harita ayarları → Dünya görünümü: Küre / Düz, seçim cihazda hy:map:projection'da (gizlilik metninin depolama tablosunda) (D-130) | ✅ Parça 1 · M6q (v0.38.0) |
| Haritada şehir adları: başkentler yıldızla, Türkiye'nin 81 il merkezi noktayla, 886 ilçe merkezi kısa çizgiyle; sönük yazı, yakınlaştıkça artar; "Etiketler"de "Şehir adları: Gizle / Göster"; Türkiye dışında şimdilik yalnız başkentler (D-131) | ✅ Parça 1 · M6n.1 (v0.39.0) |
Canlı araçlar: pnpm smoke:live (5 dk gerçek ingest ölçümü) ve pnpm record (oynatılabilir kayıt) | ✅ Parça 1 · M7a (kod hazır; canlı çalıştırma ACTIVATION adımlarından sonra, kendi terminalinde) |
Kapsama ölçümü: iz tablolarında konum gecikmesi (seen_pos) ve barometrik alçalma hızı | ✅ Parça 1 · M7b.1 (rapor M7b.2 ile gelir) |
Kapsama raporu: admin → Kapsama (istasyon başına varış, yerde görülme oranı, güven aralığı, karar kuralları, indirilebilir rapor); gece 7 günlük oran; pnpm coverage:report (yerel) | ✅ Parça 1 · M7b.2 (gerçek rapor üretim ingest'inden sonra) |
| Yeni logo (halkanın içinden geçen uçak): başlık, sekme simgesi, uygulama simgeleri, paylaşım görselleri | ✅ Parça 1 · M6l |
| Uçak listesi sağ üstte: sefer, kuyruk tescili, yükseklik, konum ve tahmini durum (yerde, inişte, yaklaşmada) | ✅ Parça 1 · M6k |
| 10 km ve iniş bildirimi (web push) | ⏳ Parça 2 · M4 |
| Hesaplar, takip listesi, istasyon operasyon panosu | ⏳ Parça 2B / 3 |
| iOS ve Android uygulaması | ⏳ Parça 4 |
Sürüm geçmişi için CHANGELOG.md dosyasına ya da GitHub Releases sayfasına bak. Uygulama içinde aynı içerik Yenilikler sayfasında görünecek.
Gereken: Node 24, pnpm 12.6 (npm i -g [email protected]).
pnpm install
pnpm dev
http://localhost:3100/ (canlı harita), /havalimanlari, /istasyon/LTFM, /hakkinda ve /yenilikler adreslerini aç; İngilizce sürümler /en ile başlar (ör. /en/havalimanlari). Yerelde harita dış servislere çıkmadan düz koyu arka planla açılır; uydu görüntüsü yalnızca üretimde ESRI_API_KEY ile gelir. Yönetim paneli ve veritabanı için önce pnpm dev:infra (Docker), sonra bir kez pnpm db:migrate çalıştır (tabloları kurar, tohum istasyonlarını ekler). Worker açılınca havalimanı, pist ve havayolu verisini repodaki alt kümeden (tools/fixtures) kendisi yükler; hava durumu da elle yazılmış örnek METAR/TAF raporlarından gelir. İnternete çıkmaz. Panel http://localhost:3100/admin adresindedir; sürüm, derleme ve yol haritası oradaki Servisler sayfasındadır (eski /durum ana sayfaya yönlenir). Canlı veri akışını internete çıkmadan görmek için pnpm dev:replay çalıştır: sentetik uçaklar sunan bir yerel alıcı (port 4300) açılır, worker veriyi oradan alır ve uçaklar haritada hareket eder. Uçtan uca testler pnpm test:e2e ile çalışır (Playwright; önce pnpm dev:infra ve pnpm db:migrate). Uygulama .env.example'daki varsayılanlarla eksiksiz açılır; .env gerekmez. Bu makinede 3000–3003 portları başka bir projenin olduğu için web 3100, API 4100 portunda çalışır. Ayrıntılı komutlar CLAUDE.md → Komutlar bölümündedir.
docs/prompts/README.md: başlamadan önce yapılacaklar ve parçaların Claude Code ile nasıl çalıştırılacağıCLAUDE.md: proje kuralları · docs/spec/: alan, veri kaynakları, altyapıdocs/ACTIVATION.md: elle yapılacak dış adımlar ve maliyet özetidocs/DEPLOY_DOKPLOY.md: sunucu (Dokploy) kurulumu, bir kezdocs/DECISIONS.md: kararlar ve gerekçeleriGit'te 908 dosya, 233.926 satır. Bunun 217.525 satırı kod (TypeScript, TSX, CSS, JS), 12.610 satırı belgedir. Lockfile, docs/research/ ve elle yazılmayan veri (fixture CSV, TSV ve JSON dosyaları, drizzle şema snapshot'ları) hariç tutulur. Güncel değer için pnpm stats çalıştır.
| Alan | Satır |
|---|---|
| apps/web | 64.495 |
| packages/shared | 37.082 |
| apps/worker | 25.458 |
| apps/api | 24.609 |
| packages/db | 19.484 |
| tools | 18.325 |
| docs | 9.896 |
| packages/providers | 7.818 |
| packages/i18n | 6.697 |
| scripts | 2.956 |
| packages/geo | 922 |
| diğer (kök, deploy, .claude, .github) | 16.144 |
A public, international civil aviation flight tracker with Istanbul Airport (IST) as its primary station. It offers a live map and lets you follow flights, aircraft and stations. You get an alert when an aircraft approaches a station (10 km by default) and when it lands. Live aircraft data is currently fetched over Türkiye and the surrounding area only; worldwide live data is a later milestone. The web app (PWA) comes first, then iOS and Android apps (Expo).
Airline.live · airline.live — admin:
admin.airline.live, API:api.airline.live, analytics:analiz.airline.live. Every address on the previous domain redirects permanently (308) to the same path (D-112; switch steps in ACTIVATION).
Known limitation: Without our own ADS-B receiver, the moment of touchdown at Istanbul Airport is usually not observed directly. For most flights the landing alert says "probably landed (estimated time)" and arrives 1–1.5 minutes after the last signal. For some flights it can only say "landing data unavailable".
| Area | Status |
|---|---|
| Roadmap, data sources, architecture | ✅ Done and verified |
| Local test environment, Status and What's new pages | ✅ Part 1 · M0 |
| All services, admin panel (Services screen), consent-based analytics | ✅ Part 1 · M1a |
| Brand and domain: Airline.live · airline.live; permanent redirect from the previous domain (D-112) | ✅ v0.25.0 (on airline.live since 2026-10-15) |
| Security hardening (per-visitor sign-in limit, resilience to Redis outages) | ✅ v0.3.2 |
| Live: web, api., admin. (Dokploy, Let's Encrypt) | ✅ 2026-09-27 |
| Automatic release pipeline (GitHub Actions → GHCR → Dokploy), verification and rollback | ✅ Part 1 · M1b, server setup in progress (guide) |
| Database: airport, runway (thresholds included) and airline data, daily updates, track tables and maintenance jobs | ✅ Part 1 · M2 |
| Live data providers (ADSB.lol, own receiver), data cleaning and privacy rules | ✅ Part 1 · M3 |
| Live data ingest: coverage plan, adaptive request rate, flight records and tracks, health monitoring, replay tool | ✅ Part 1 · M4 (adsb.lol fetching is on since v0.28.0; airline aircraft only, D-115) |
| Map design: satellite base, metric units, switchable aircraft labels | ✅ Part 1 · M6 (D-072) |
| Live API and WebSocket: visible area, search (flight number, callsign, registration, hex), per-second diffs, privacy and blocklist | ✅ Part 1 · M5 |
| Live map: satellite base, heading-aware aircraft icons, switchable labels, search, info card, "Centre on aircraft", shareable link, list of aircraft in view, airports in Türkiye | ✅ Part 1 · M6 (live aircraft on the map since v0.28.0) |
| Terms of use | ✅ v0.9.0 (updated in v0.34.0; interim note removed; MET Norway clause in v0.35.0, “Model” rows in v0.36.0, city name sources in v0.39.0) |
Airport pages (61 airports, runways, official names), About page, English addresses (/en/...), sitemap, structured data and llms.txt for search engines and AI search | ✅ Part 1 · M6b |
| Live airport weather (METAR/TAF; wind, rain, snow, thunderstorm, fog), METAR/TAF log, red map pins and airport window on the map, map opens on IST |
See CHANGELOG.md or GitHub Releases for release history. The same content will appear in the app's What's new page.
Requires Node 24 and pnpm 12.6 (npm i -g [email protected]).
pnpm install
pnpm dev
Then open http://localhost:3100/ (live map), /havalimanlari, /istasyon/LTFM, /hakkinda and /yenilikler; English versions start with /en (e.g. /en/havalimanlari). Locally the map opens on a plain dark background without calling any external service; satellite imagery only appears in production with ESRI_API_KEY. For the admin panel and the database, first run pnpm dev:infra (Docker), then pnpm db:migrate once (creates the tables and seeds the stations). When the worker starts it loads airport, runway and airline data from the committed subset (tools/fixtures) by itself, and weather comes from hand-written sample METAR/TAF reports, without going online. The panel is at http://localhost:3100/admin; version, build and roadmap are on its Servisler page (the old /durum redirects to the home page). To see the live data flow without going online, run pnpm dev:replay: it starts a local receiver with synthetic aircraft (port 4300), the worker reads from it and the aircraft move on the map. End-to-end tests run with pnpm test:e2e (Playwright; run pnpm dev:infra and pnpm db:migrate first). The app starts with the defaults in .env.example; no .env is needed. On this machine ports 3000–3003 belong to another project, so the web app runs on 3100 and the API on 4100. Full command list: CLAUDE.md → Komutlar.
docs/prompts/README.md: one-time setup and how to run each part with Claude CodeCLAUDE.md: project rules · docs/spec/: domain, data sources, infrastructuredocs/ACTIVATION.md: manual external steps and the cost summarydocs/DEPLOY_DOKPLOY.md: one-time server (Dokploy) setupdocs/DECISIONS.md: decisions and rationale908 files and 233,926 lines in git: 217,525 lines of code (TypeScript, TSX, CSS, JS) and 12,610 lines of documentation. The lockfile, docs/research/ and generated data (fixture CSV, TSV and JSON files, drizzle schema snapshots) are excluded. Run pnpm stats for current numbers.
| ✅ Part 1 · M6c |
| 75 airports in nearby countries (within 500 km of the nearest airport in Türkiye): pages, runways, weather, map pins and window; Ercan in the TRNC; light turquoise theme; weather row icons and highlights | ✅ Part 1 · M6d |
| Wind in km/h and knots; significant wind (Turkish aerodrome warning threshold) with strength names; lightning warnings; aligned airport window | ✅ Part 1 · M6e, v0.13.1 |
| Military and civil airport names in TR/EN; airports on the map in one setting (Hide / Icon / Icon and code, D-114); local time with UTC offset abroad | ✅ Part 1 · M6f |
| Graded wind colours (green to red, with Beaufort names) and wind shear warnings | ✅ v0.14.1, v0.16.1, v0.25.3 (plainer Turkish names, D-116) |
| Ring 2: 89 more airports up to 1,000 km (225 in total); site name and version in the map attribution strip | ✅ Part 1 · M6g |
| Release date and time for every version on What’s new | ✅ v0.17.1 |
| Dashed country borders on the map (OpenStreetMap) | ✅ v0.17.2 |
| Ring 3: 278 more airports up to 2,000 km (503 in total); note on airports that may be closed since 2022 | ✅ Part 1 · M6h |
| Compressed API responses (br/gzip): the map airport and runway list goes from 440 KB to ~76 KB | ✅ v0.18.1 |
| Country names at their capitals on the map (large, semi-transparent; toggled in Labels) | ✅ v0.18.2 |
| Country names stay inside borders and coastlines; multi-word names one word per line | ✅ v0.19.1 |
| Clearer country names, placed in empty spots away from airport pins | ✅ v0.21.1 |
| Ring-4 groundwork: runway and time-zone data for 720 airports, scale work, a lighter map page | ✅ Part 1 · M6i.1 |
| Air force bases hidden on the map; the map opens a little further out on computers (z8) | ✅ v0.22.1 |
| Air force bases removed from the whole site (498 airports listed, 56 in Türkiye) | ✅ v0.22.2 |
| Airport search on the map: by code, name or city, with suggestions as you type | ✅ v0.22.3 |
| Global positioning: titles and site descriptions no longer limited to Türkiye; live aircraft data still over Türkiye and the surrounding area (D-106) | ✅ v0.22.4 |
| Every country named on the map (164 countries and territories, inside borders, in empty space) | ✅ v0.22.5 |
| Ring 4: 719 more airports up to 5,000 km (1,217 in total; London, Delhi, Ulaanbaatar, Nairobi…) | ✅ Part 1 · M6i.2 (v0.23.0) |
| Ring-5 groundwork: runway and time-zone data for ~2,000 airports, redirects from old codes, server-side local time | ✅ Part 1 · M6j.1 (v0.24.0) |
| Airports closed by war: 23 airports listed (16 in Ukraine; Kyiv, Odesa, Lviv…), a sourced closure note on 35 airports (1,240 in total) | ✅ Part 1 · M6i.3 (v0.25.1) |
| A sturdier live data server: unexpected connection (upgrade) requests get a proper error response and can no longer restart the server (D-113) | ✅ v0.25.2 |
Ring-5 scale work: airport list kept in server memory, a smaller map payload (include=map), correct drawing across the 180th meridian, METAR/TAF log in the browser, faster map and airport pages (D-111) | ✅ Part 1 · M6j.2 (v0.26.0) |
| Ring 5: 2,026 more airports from the rest of the world, the US included (3,266 in total, 232 countries; New York, Sydney, Honolulu, Santiago…); Turkish and English names, redirects from old codes | ✅ Part 1 · M6j.3 (v0.27.0) |
| Live aircraft are on: only aircraft flying under a known airline callsign; military, state, private (business jets included) and unidentified aircraft are never shown. One-tap kill switch and action log for admins, ODbL notice in the API, rollback guard (D-115) | ✅ Part 1 · M7d.1 (v0.28.0) |
| adsb.lol daily budget: the source accepts 500 requests a day per IP; the worker polls two wide circles in turn with at most 480 requests a day, aircraft stay on the map between updates and move to an estimated position, a "data is sparse" notice in the status line (D-122) | ✅ Part 1 · M7e (v0.28.1) |
| Records kept for 30 days at most: flight records, tracks, weather and data source history are pruned every night; admin e-mail addresses become role names after 30 days; IP addresses are not written to logs or disk (the request limit uses a one-way key); retention table and legal hold in admin → Saklama (D-120) | ✅ Part 1 · M7d.2 release 1 (v0.29.0) |
| Security update: Next.js 16.4.1 (including two critical remote code execution issues), Zod 4.6.6, Fastify 5.12.6 (D-123) | ✅ Part 1 · M7g (v0.29.1) |
| Aircraft labels and selection: the selected aircraft’s label has four lines (flight number, tail registration, speed and altitude, the estimated landing runway on final approach), the info card shows the estimated landing runway; clicking or tapping an empty spot on the map deselects; other aircraft labels start hidden and airports start as “Icon” (D-121) | ✅ Part 1 · M6p.1 (v0.30.0) |
Operations fixes: when adsb.lol limits our requests the worker retries less and less often (400 s up to 2 h; the server's wait header if longer, at most 24 h), the admin row shows "Sorunlu" with the retry time and the map shows the retry time too; weather skips a request group that answers slowly, saves the reports it received and asks for the skipped airports from the time they fell behind in the next runs; the public status page is gone (/durum goes to the home page, /en/durum to /en, 308), admin → Servisler shows the web build, environment and build time, with the roadmap below (D-124) | ✅ Part 1 · M7f (v0.31.0) |
| Hourly weather tab: "Now" and "Hourly weather" tabs in the airport window; one row per hour of the day (METAR for past hours, TAF for later ones), automatic switching through three parts of the day that can be paused (D-119) | ✅ Part 1 · M6m.1 (v0.32.0) |
| Up to three admins: the owner and two operators, two roles (operators switch the live layer off and on, add to the blocklist and turn the legal hold on; removing, turning the hold off, the coverage report and the analytics panel stay with the owner); admin → Engel listesi works from a phone: add by hex or registration, search, remove with confirmation; an aircraft blocked by registration is withdrawn even when its hex is unknown; every action goes to the action log with counts only (D-125) | ✅ Part 1 · M7d.2 release 2 (v0.33.0) |
| Legal pages: Contact (imprint; content and hosting provider), Privacy (data processed, legal grounds, cookie and storage table, retention periods, rights), Hide request (an e-mail with the subject filled in), updated terms of use and Open data (ODbL method document, machine-readable JSON); the imprint pages are off while the imprint env is missing (D-126) | ✅ Part 1 · M7d.2 release 3 (v0.34.0) |
Hourly temperature: later-hour temperatures in the hourly weather tab from the MET Norway model forecast (CC BY 4.0 and NLOD 2.0); polled by the worker (airports in Türkiye ready in advance, abroad on request), one row per station, kept for at most 48 hours; its own row in admin → Services; enabled in production with PROVIDER_CONTACT_EMAIL (D-127) | ✅ Part 1 · M6m.2 (v0.35.0) |
| Model conditions: later hours with no aviation forecast (TAF), or whose TAF has ended, been cancelled or not been issued, get a “Model” row with MET Norway’s hourly condition (41 codes, our own TR/EN names and icons) and precipitation (mm); wind, visibility and cloud base never come from MET; the summary counts model hours separately (D-128) | ✅ Part 1 · M6m.3 (v0.36.0) |
| Operations patch: the weather summary in admin → Services is read per station from the index and no longer times out in the 2 s probe as the stored reports grow; after a deploy the first live data request goes out at once to the western circle that covers Istanbul, so the map is not empty (in full effect one day after this release; requests are still at least 10 s apart); the daily budget is never exceeded (the counter keeps one permit free for this) (D-129) | ✅ Part 1 · M7h (v0.36.1) |
Selected aircraft’s route: the track flown on this flight comes from the server, including the part flown before the page was opened (amber in the air, cyan on the ground, parts without position data dashed); the way left to the arrival airport is a white great-circle line that goes away once the aircraft has landed there; the top of the info card shows the estimated route (e.g. AYT → IST) and the airport names. Departure and arrival are estimated from VRS routes (CC0); new endpoint GET /v1/aircraft/{hex}/route (D-121) | ✅ Part 1 · M6p.2 (v0.37.0) |
Globe view: zoom out and the world is a globe (zoom ≤ 2.5), from level 3 the familiar flat map; the globe carries the same basemap at every zoom (Esri satellite imagery, dashed country borders; an ocean tone beneath, an atmosphere glow at the edge, a space gradient outside); aircraft and airports on the far side are neither drawn nor listed; on the globe the live subscription follows the camera centre; Labels → Map settings → World view: Globe / Flat, the choice kept on the device in hy:map:projection (listed in the privacy notice's storage table) (D-130) | ✅ Part 1 · M6q (v0.38.0) |
| City names on the map: capitals with a star, Türkiye's 81 provincial centres with a dot and 886 district centres with a short dash; muted names, more appear as you zoom in; "City names: Hide / Show" under "Labels"; outside Türkiye only capitals for now (D-131) | ✅ Part 1 · M6n.1 (v0.39.0) |
Live tools: pnpm smoke:live (5-minute real ingest check) and pnpm record (replayable recording) | ✅ Part 1 · M7a (code ready; live runs after the ACTIVATION steps, from your own terminal) |
Coverage measurement: position age (seen_pos) and barometric descent rate stored with tracks | ✅ Part 1 · M7b.1 (the report comes with M7b.2) |
Coverage report: admin → Kapsama (per-station arrivals, ground-seen share with confidence interval, decision rules, downloadable report); nightly 7-day ratio; pnpm coverage:report (local) | ✅ Part 1 · M7b.2 (the real report after production ingest) |
| New logo (a plane flying through the ring): header, tab icon, app icons, share images | ✅ Part 1 · M6l |
| Aircraft list at the top right: flight, tail number, altitude, location and estimated status (on ground, landing, approaching) | ✅ Part 1 · M6k |
| 10 km and landing alerts (web push) | ⏳ Part 2 · M4 |
| Accounts, watchlist, station operations board | ⏳ Part 2B / 3 |
| iOS and Android apps | ⏳ Part 4 |