İDx Weather İDx Weather
📵 Çevrimdışısınız — Gösterilen veriler son önbellekten alınmaktadır.
📲 İDx Weather'ı ana ekrana ekle — daha hızlı açılır, çevrimdışı çalışır.
İDx İDx Weather
İDx Weather

Hava durumu paneline giriş yapın.

veya 🌍 Giriş yapmadan devam et

© İDx Weather · isademir

İDx İDx Weather

İDx Weather

Çoklu modelli profesyonel hava tahmini, kişisel uyarı kuralları, radar haritası ve şimdi tahmin (nowcast).

🌤 Hava 🗺 Harita 🪁 Karşılaştırma 📊 Grafikler 📍 Yerlerim ⚙ Ayarlar 🔔 Uyarı geçmişi ☀️ Güneşi Yakala ⚙ Ayarlar 🛠 Yönetim ❓ Yardım 🔐 Giriş Yap 🚪 Çıkış
Şimdi
Radar zamanı
—
TAHMİN
Şeffaflık
geçmiş şimdi tahmin
☂ Yağış tahmini · 4 saat
Yer
Modeller
Saatlik tahmin tablosu — her satır farklı bir model. Renkler sıcaklık ve rüzgâra göre.

Model karşılaştırma — grafik

⏳ Yükleniyor…

Yerlerim

Bildirim geçmişi

Son 200 bildirim. Çoklu modelin uyumlu olduğu uyarılar gönderilir.

☀️ Güneşi Yakala

Yakınındaki en güneşli noktayı bul. Mesafe ve zaman dilimi filtresi ile ideal hava koşullarını keşfet.

Gün
Zaman
Yarıçap
Mod
En iyi nokta
📍 Nokta Detayı

👤 Profil

🔑 Şifre değiştir

🌡️ Tahmin & Harita tercihleri

📊 Karşılaştırma & Grafik için varsayılan modeller

Sürükleyerek sıralayın · işaretlediğiniz modeller Karşılaştırma ve Grafik sekmeleri ilk açıldığında otomatik seçili gelir. i butonuyla model detayını görebilirsiniz.

    🔤 Yazı Boyutu

    Tüm arayüzü etkiler. Tercih tarayıcıda saklanır.

    📶 Çevrimdışı Ön Yükleme

    🔄 Veri Yenileme Sıklığı

    Hava durumu verisi ne sıklıkla otomatik güncellensin? 0 = sadece sayfa açıldığında.

    📍 Açılış Konumu

    Uygulama açıldığında hangi konum gösterilsin?

    📨 Bildirim Kanalları

    Bildirimleri hangi kanal(lar)dan almak istediğinizi seçin. Pushover için pushover.net'ten user key + bir uygulama oluşturarak app token alın.
    Telegram için @BotFather'dan bot oluşturup token alın, sonra botunuza mesaj atıp chat id'nizi @userinfobot ile öğrenin.

    📱 Pushover ileri ayarları

    Kritik uyarılar (fırtına, dolu, şiddetli yağış, don, sıcak hava dalgası vb.) otomatik olarak en az +1 öncelik alır. Acil (+2) öncelikte Pushover ekranı sürekli onayınızı isteyecektir.

    🌙 Rahatsız Etme Modu

    Belirtilen saat aralığında bildirimler iletilmez; geçmişe kaydedilir. Mod sona erince özet gönderimi, alttaki ayar açıksa yapılır.

    – (gece yarısı geçişi desteklenir)

    👥 Kullanıcılar

    ⚙️ Uygulama Ayarları

    🌍 Misafir Mod Ayarları

    Misafir kullanıcıların seçebileceği yenileme aralıkları ve uyarı türlerini buradan belirleyin.

    ⏱ Yenileme aralığı seçenekleri (dakika)

    Virgülle ayır. 0 = manuel. Örn: 0,5,10,15,30,60

    🔔 İzin verilen uyarı türleri

    📨 Misafire izin verilen bildirim kanalları

    PWA dışı kanallar (Pushover/Telegram) misafir için yapılandırma alanı gerektirir; varsayılan kapalıdır.

    🎛 Misafir Mod Özellik Kontrolü

    Misafir kullanıcılara hangi sekmelerin, widget'ların ve servislerin sunulacağını belirleyin. Değişiklikler, sayfa yenilendikten sonra misafir kullanıcılara yansır.

    🗂 Sekme Erişimi

    🧩 Widget Erişimi

    🗂 Ek Sekme Erişimi

    🗑 Veri Yönetimi

    ⚙ Kısıtlamalar

    🧠 Aktif Modeller (Sistem Geneli)

    Sadece burada aktif edilen modeller kullanıcı/misafir listelerinde görünür. Her model satırındaki i ile detay modalı açılır.

    📊 Misafir Varsayılan Modeller (Hava)

    Yeni yer eklerken önerilen başlangıç modeli/model listesi. Sürükle-bırak ile sıra belirleyin.

    🪁 Global Varsayılan Modeller (Karşılaştırma & Grafik)

    Misafir ve kullanıcılar için Karşılaştırma ve Grafik sekmeleri ilk açılışta bu listeyi kullanır. Sürükle-bırak sırası korunur.

    📱 Cihaz ve Uygulama Yönetimi

    Tüm bildirim kanalları ve cihazlar tek panelde: tarayıcı / PWA Web Push abonelikleri ve Android uygulaması (Capacitor · com.isademir.weather) üzerinden gelen Firebase Cloud Messaging (FCM) cihazları. — — VAPID: …

    🌐 Web Push (Tarayıcı / PWA)
    • PC/Mac/Linux: Chrome, Edge, Firefox, Brave, Opera, Safari (macOS 13+) — Service Worker + VAPID Web Push API.
    • Android tarayıcıları: Chrome / Samsung Internet / Firefox — sayfa açıkken veya site PWA olarak yüklendiğinde çalışır.
    • iOS: Yalnızca Safari ve sitenin ana ekrana yüklenmiş PWA modunda (iOS 16.4+).
    • Endpoint URL'sine bakarak cihaz başına servis (FCM relay / Mozilla autopush / WNS / APNs) ve PWA standalone modu gösterilir.
    📲 Android Uygulaması (Firebase Cloud Messaging)
    • Kaynak: APK (/apk) ile yüklenmiş Capacitor uygulamasından gelen FCM token'ları (fcm_tokens tablosu). Sunucu Firebase Admin SDK üzerinden gönderir.
    • Kullanıcı + Misafir: FCM hem giriş yapmış kullanıcılar hem misafir oturumları için kaydedilebilir.
    • Token yaşam döngüsü: Uygulama açılışta token alır → POST /api/push/fcm/subscribe (Bearer + X-WX-Client: android-capacitor). Açıldıkça POST /api/push/fcm/heartbeat son aktiflik, konum, batarya, ağ ve uygulama sürümünü günceller. Çıkışta DELETE.
    • Admin temizlik: Push Manager'da seçili cihaz/misafir temizleme işlemi transaction ile yapılır; aktif cihaz ilk bağlantıda FCM/konum kaydını yeniden oluşturur.
    • Toplu seçim: Push Manager seçim çubuğundaki Tümünü Seç butonu, aktif sekmede filtreye uyan tüm kullanıcı/misafirleri seçer.
    • Kayıtlı detaylar: install_id, app_version/build, OS sürümü, üretici/model, dil, saat dilimi, ekran, ağ tipi (wifi/cellular), batarya seviyesi & şarj durumu, son konum (lat/lng + ad), son aktiflik zamanı, toplam app açılış sayısı, IP ve User-Agent.
    • ⚠ Token bekleyen: App girişi var (last_app_login_at dolu) ama fcm_tokens'da kayıt yok — Google Play Services / bildirim izni / ağ kontrolü gerek.
    Kapsam dışı: iOS uygulaması (henüz yayında değil), masaüstü yerel uygulaması (yok).

    📊 Bildirim Akışı

    Kanal × Durum (periyot)

    Günlük Trend

    Top 10 Hata Sebebi

    En Aktif Kullanıcılar

    En Aktif Misafirler

    🔍 Bildirim Logu (filtreli)

    🛰 Radar API Ayarları

    Rainbow.ai veya Tomorrow.io üzerinden canlı radar karoları sunulur. API anahtarları yalnızca sunucuda saklanır, tarayıcıya gönderilmez.

    🌀 Tomorrow.io Özellikleri

    Tomorrow.io API anahtarı girili olduğunda aktifleştirilebilir.

    🌧 Rainbow Nowcast Özellikleri

    Rainbow API anahtarı girili olduğunda aktifleştirilebilir. Dakika bazlı 4 saatlik yağış verisi (5.000 istek/ay).

    🗄 Önbellek TTL Ayarları

    Her API türü ve kullanıcı rolü için önbellek süresi (dakika) belirleyin. Kısa süre = daha taze veri; uzun süre = daha az API isteği / kota tasarrufu. Misafir değerleri API kotasını korumak için uzun tutulmalıdır.

    API / Önbellek 👑 Admin
    En taze veri
    👤 Kullanıcı
    Dengeli
    🌍 Misafir
    Kota tasarrufu
    🌈 Rainbow Radar Karoları
    Tahmin karoları için. Geçmiş karolar daima önbellekte kalır (değişmez).
    📊 Limit: 30.000/ay · güvenli cap: 900/gün
    💡 Önerilen: Admin 3 · User 5 · Guest 10
    dk dk dk
    ☂ Rainbow Nowcast
    Dakika bazlı 4 saatlik yağış tahmini (harita + nowcast widget).
    📊 Limit: 5.000/ay · ~167/gün. Her konum tıklaması = 1 istek (önbelleksiz).
    💡 Önerilen: Admin 5 · User 10 · Guest 15
    dk dk dk
    🌀 Tomorrow.io Saatlik Tahmin
    Widget + Grafikler sekmesi verileri. Lokasyon başına önbelleğe alınır.
    📊 Limit: 25 req/saat · 500 req/gün. Kota kritik; misafir için uzun TTL gerekli.
    💡 Önerilen: Admin 15 · User 30 · Guest 60
    dk dk dk
    🌤 Open-Meteo Hava Verisi
    Ana hava durumu verileri (sıcaklık, rüzgar, yağış, vb.). Veritabanı önbelleği.
    📊 Limit: Ücretsiz, API key yok. Yüksek yük ile fair-use politikası devreye girer.
    💡 Önerilen: Admin 10 · User 20 · Guest 30
    dk dk dk

    📈 Analitik

    Bildirim istatistikleri, kanal dağılımı, önbellek durumu.

    Yükleniyor…

    🎯 Model Doğruluğu

    Her saat başı mevcut tahminlerin anlık görüntüsü kaydedilir. 24 saat sonra tüm aktif modellerin ortalamasıyla karşılaştırılarak MAE (ortalama mutlak hata) hesaplanır. Referans olarak model ortalaması kullanılır — bu sayede hiçbir modelin kendine karşı ölçülmesinden doğan yapay avantaj ortadan kalkar. Lokasyon kartına tıklayarak o konuma özel sıralamayı görebilirsiniz.

    Yükleniyor…

    📘

    Kullanım Kılavuzu

    Kayıtlı kullanıcı ve misafir için temel iş akışları, kurulum komutları, bakım rutinleri.

    🚀 Hızlı Başlangıç

    1. Yer ekle — Yerlerim sekmesi ▶ + Yer ekle butonu. Modal harita üzerinden tıkla ya da koordinat gir.
    2. Modeller — Ayarlar ▶ Tahmin Tercihleri'nden birincil modeli ve karşılaştırma listesini sürükle-bırak ile sırala.
    3. Bildirim kanalı — Pushover (kullanıcı + token), Telegram (bot + chat_id) veya tarayıcı PWA push.
    4. APK dağıtımı — /apk adresi Android cihazda indirme butonu, masaüstünde QR kodlu yönlendirme sayfası gösterir. Dağıtım için imzalı debug APK kullanılır (assembleDebug); unsigned release APK cihazda kurulmaz.
    5. Yazı boyutu — Ayarlar ▶ Tercihler ▶ Yazı Boyutu veya Misafir ▶ Yenileme & Model ▶ Yazı Boyutu: S / M / L / XL butonlarıyla tüm arayüz ölçeklenir. Tercih tarayıcıda saklanır.
    6. Çevrimdışı ön yükleme — Ayarlar ▶ Tercihler ▶ Çevrimdışı Ön Yükleme (kullanıcı) veya Misafir ▶ Yenileme & Model ▶ Çevrimdışı Ön Yükleme'den açılır. Etkinleştirildiğinde online olunduğunda tüm konumların verisi arka planda güncellenir; internet kesildiğinde son veri gösterilir.
    7. 🌙 Rahatsız Etme Modu — Ayarlar ▶ Bildirimler ▶ Rahatsız Etme Modu'ndan açılır. Başlangıç ve bitiş saati seçilir (gece yarısı geçişi desteklenir). Bu sürede gelen bildirimler iletilmez; Bildirim Geçmişi'ne suppressed_dnd durumuyla kaydedilir. Mod bitince özet bildirimi gönder ayarı açıksa, bekleyen bildirimler tek mesajla özetlenir.
    8. Uyarı kuralları — Yerlerim ▶ 🔔 Uyarılar: sıcaklık/yağış/rüzgar/yıldırım eşikleri tanımla.
    9. Karşılaştırma — Karşılaştırma sekmesinde 4 / 7 / 16 gün saatlik tablo, Grafikler sekmesinde 3 / 7 / 16 gün sıcaklık-yağış-rüzgar-gust görünümü bulunur. Her iki sekme de güncel saatten başlar (geçmiş veriler atlanır). Kısa ufuklu model veri bitince boş kalır; daha uzun model görünmeye devam eder.
    10. Harita — Radar karoları Rainbow.ai Tiles (30.000 karo/ay · 900/gün) ve Tomorrow.io üzerinden sunulur. 4 saatlik dakika bazlı Nowcast için Rainbow.ai Nowcast (5.000 istek/ay · 160/gün) kullanılır — bu iki Rainbow hizmeti bağımsız kotaya sahiptir; admin panelinde ayrı ayrı izlenir. Kotalar tükendiğinde ilgili servis boş karo / tahmin yok döner.

    🌍 Misafir Modu

    Siteye ilk girişte varsayılan olarak misafir modunda açılır — oturum açmadan hava durumuna bakılabilir. Giriş yapmak için üst çubukta Giriş Yap bağlantısına tıklayın ya da /?login=1 adresine gidin. Oturumunuzu kapattıktan sonra site yeniden misafir moduna döner. Tüm konum ve ayarlar tarayıcı localStorage'da tutulur.

    • Yerlerim sekmesinde + Yer ekle ile harita + arama destekli modal açılır — Leaflet haritasına tıkla ya da şehir ara, yer adı gir, Kaydet.
    • Her konum kartında ✏️ Düzenle · 🔔 Uyarılar · 🗑 Sil olmak üzere 3 eylem butonu bulunur. Düzenle modalı isim, model tercihleri ve Varsayılan konum yap seçeneğini içerir.
    • 7 / 16 gün görünümü misafirde de kullanıcıyla aynı davranır; seçili konumun modeline göre dolu gün sayısı kadar genişler.
    • 🔔 Uyarılar butonuna tıklandığında kullanıcıyla aynı çekirdeği kullanan uyarı kuralları modalı açılır — don, yüksek sıcaklık, rüzgar, hamle, yağış, şiddetli yağış, kar, fırtına, şemsiye, UV, nem, sabah/akşam özeti, yol buzlanma, sıcak dalga dahil. Kurallar konum başına localStorage'a yazılır; yeni konumlar için varsayılan devre dışı gelir.
    • Ayarlar sekmesi 2 alt sekmeli: 🔔 Bildirimler (PWA tarayıcı izni butonu + 🌙 Rahatsız Etme Modu — uyarı kuralları konum bazlı, Yerlerim ▶ 🔔 Uyarılar butonuyla yönetilir) · ⏱ Yenileme & Model.
    • 🌙 Misafir Rahatsız Etme Modu — Ayarlar ▶ Bildirimler ▶ Rahatsız Etme Modu'ndan açılır. Başlangıç ve bitiş saati seçilir (gece yarısı geçişi desteklenir). Bu sürede bildirimler bastırılır ve localStorage'da kuyruğa alınır. Mod bitince özet bildirimi gönder ayarı açıksa, bastırılan bildirimler tek özet mesajla iletilir.
    • Admin Yönetim ▶ Misafir sekmesinden misafire izin verilen yenileme aralıklarını, uyarı türlerini ve kanal listesini değiştirebilir. Misafir uyarı türleri yıldırım tipleri hariç yönetilir.
    • Admin Ayarlar ▶ Misafir Mod Özellik Kontrolü'nda Hava / Karşılaştırma / Grafikler için varsayılan model listelerini ayrı ayrı yönetebilir; her listede işaret + sürükle-bırak sırası kayıtlanır.
    • Admin aynı bölümde 🧠 Aktif Modeller bölümünden sistem genelinde hangi modellerin aktif olacağını seçer. Sadece aktif modeller tüm kullanıcı/misafir/karşılaştırma listelerinde görünür; inaktif modele gelen istekler reddedilir. Her modelin yanındaki i butonuyla detay modalı açılır.
    • Admin aynı bölümde "Uzun Ufuklu Modeli Otomatik Tercih Et" ayarını aç/kapatabilir. Açıkken misafirde 16 gün destekleyen model otomatik öne alınır.
    • Misafir modunu tümüyle kapatmak için Uygulama Ayarları ▶ 🌍 Misafir Modu kutusunu kaldır.

    ⚙️ İlk Kurulum

    # 1) Veritabanı
    sudo -u postgres psql -c "CREATE USER wx WITH PASSWORD 'wx_secure_password_2024';"
    sudo -u postgres psql -c "CREATE DATABASE wx_db OWNER wx;"
    psql -h 127.0.0.1 -U wx -d wx_db -f backend/db/schema.sql
    node backend/db/migrate-v14.js     # forecast_snapshots + model_accuracy tabloları
    
    # 2) Redis (zaten kuruluysa atla)
    sudo apt install -y redis-server
    sudo systemctl enable --now redis-server
    
    # 3) Backend
    cd backend && npm install
    pm2 start ../ecosystem.config.js
    pm2 save
    sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u isa --hp /home/isa
    
    # 4) Testler
    npm test                           # 23/23 geçmeli
    
    # 5) Nginx + SSL
    sudo ln -s /etc/nginx/sites-available/wx.idx.cx /etc/nginx/sites-enabled/
    sudo certbot --nginx -d wx.idx.cx
    sudo systemctl reload nginx
    
    # 6) .env gereksinimleri
    PORT=3001
    REDIS_URL=redis://127.0.0.1:6379
    DATABASE_URL=postgres://wx:[email protected]:5432/wx_db
    JWT_SECRET=...
    VAPID_PUBLIC_KEY=...
    VAPID_PRIVATE_KEY=...
    VAPID_SUBJECT=mailto:[email protected]

    🛠 Bakım Komutları

    🔄 Reload
    pm2 reload wx-api --update-env

    Backend'i sıfır kesintiyle yeniden yükle (yeni env değişkenleri dahil).

    📜 Loglar
    pm2 logs wx-api --nostream --lines 50 --err

    Son hata satırlarını yazdır (akıştan değil).

    🗄 Migration
    node backend/db/migrate-vN.js

    Şema güncelleme dosyalarını sırayla çalıştır.

    ♻️ Cache Bust
    sed -i 's/?v=NN/?v=MM/g' index.html

    sw.js'deki wx-static-vNN ile birlikte arttır.

    📱 APK Rebuild (installable)
    cd wx-app && rm -f www/apk/*.apk && npx cap sync android && cd android && ./gradlew clean assembleDebug

    Debug APK imzalıdır ve doğrudan kurulabilir. app-release-unsigned.apk kurulmaz.

    💾 Yedek
    pg_dump -h 127.0.0.1 -U wx wx_db | gzip > wx_$(date +%F).sql.gz

    Tek dosyalık kuru veritabanı yedeği.

    🔍 Uyarı Tara
    curl -X POST -H "Authorization: Bearer $T" /api/alerts/check-now

    Cron beklemeden uyarı kurallarını anında işlet.

    ❓ Sık Karşılaşılan Durumlar

    🔁 Mükerrer bildirim — aynı uyarı tekrar geliyor

    Motor her 30 dakikada çalışır; aynı tür bildirim son 24 saat içinde gönderildiyse yalnızca koşul belirgin şekilde kötüleştiğinde tekrar gönderilir. Eşikler: yağış +%40 veya +5 mm · rüzgar/hamle +%30 veya +15 km/sa · düşük sıcaklık/don 3°C daha soğuk · yüksek sıcaklık/sıcak dalga 3°C daha sıcak · şemsiye olasılığı +20 puan · CAPE +%50 · UV +2 birim · fırtına/yol buzlanma +3 saat. Nowcast ve Tomorrow.io bildirimleri kendi sabit pencereleriyle ayrıca deduplicate edilir (NC: 30 dk · TM: 6 saat). Her bildirim notification_log.trigger_value alanına tetikleyen değeri kaydeder.

    🔔 Bildirim geçmişinde aynı uyarı birden çok satır çıkıyor

    Aynı uyarı birden fazla kanala gönderildiyse (örn. pushover + pwa + Android app) artık tek satırda gruplandırılır; her kanal için ayrı rozet gösterilir (pushover ✓, pwa ✓, Android App ✓). Hatalı gönderimde rozete tıklanarak hata detayı görülür. Eski kayıtlar ayrı satır olarak kalmaya devam edebilir.

    📵 Bildirim gitmiyor

    Ayarlar ▶ Bildirim Kanalları altında ana anahtar açık mı? Tarayıcı / PWA için web push izni verildi mi? Android uygulama için Android uygulama bildirimi kanalı açık mı ve cihaz giriş yaptıktan sonra FCM token oluştu mu? Pushover/Telegram/Android app için Test butonlarıyla kanal sağlığını doğrulayın. notification_log tablosunda status sütunu hatayı yazar.

    Not: Proje güncellemesi tek başına tarayıcı bildirim iznini normalde silmez. Ancak tarayıcı verisi temizlenirse, origin (alan adı/protokol) değişirse veya PWA kaldırılıp tekrar kurulursa izin/subscription yeniden istenebilir.

    📲 Android uygulamada "FCM kaydı tamam" görünüyor ama test başarısız

    Çözüldü (2026-05-11): Bu durum iki katmanlı bir sorundan kaynaklanabiliyordu: bazı cihazlarda native token alma sonrası sync isteği aynı zincirde takılıyordu ve backend tarafında belirli NULL koordinat kombinasyonlarında PostgreSQL tip çıkarım hatası token kaydını engelliyordu.

    • Frontend düzeltmesi: Token alınır alınmaz UI başarıya döner; subscribe sync arka planda retry ile gönderilir.
    • Backend düzeltmesi: fcm_tokens yazımındaki CASE WHEN parametreleri numeric cast ile sabitlendi.
    • Operasyon notu: APK yeniden kurulum gerekmez; uygulamayı tamamen kapatıp açmak genelde yeterlidir.

    Hâlâ test başarısızsa admin tarafta pm2 logs wx-api --lines 50 --nostream ile [push:fcm:subscribe] satırını kontrol edin; bu satır tokenın DB'ye yazıldığını gösterir.

    🌆 Misafir akşam özeti saatini değiştirdim ama bildirim gelmedi

    Güncel davranış (2026-05-11): Misafirde konum/saat değiştiğinde sunucu senkronu artık sadece test butonuna bağlı değildir. Konum ekle-düzenle-sil sonrası native FCM subscribe üzerinden konum snapshot'ı da gönderilir ve backend guests.loc_coords alanını günceller.

    • Pencere kuralı: Akşam özeti yalnızca hedef saat etrafında ±10 dk gönderilir; pencere kaçtıysa bir sonraki gün gelir.
    • Android kanal: Sabah/akşam özetleri Android'de artık ayrı summary kanalına gider. Cihaz ayarlarında bu kanal sessize alınmışsa bildirim görünmeyebilir.
    • Eski misafir verisi koruması: Boş snapshot geldiğinde backend artık eski konumları silmez; eski misafir kaydı korunur.
    • Token churn: Yeni guest token oluşursa sistem install_id ve IP/UA fallback ile konumları otomatik taşır.

    Kontrol: Admin tarafta pm2 logs wx-api --lines 160 --nostream içinde şu satırları arayın: guest snapshot synced, guestSummary:stats, pub/fcm/client-log. no_tokens: 0 ve doğru saat/konum görünüyorsa akış sağlıklıdır.

    Yönetimde görünürlük: Push Manager misafir detayında Konum Uyarı Ayarları bölümünde her konumun sabah/akşam özeti (açık-kapalı + saat) gösterilir. Aynı yapı kullanıcı kartlarında da Konum Alarm Detayları olarak görünür; kullanıcıların kayıtlı cihazları hangi konuma bağlıysa o konumun alarm kuralları da listelenir.

    📦 APK kurulumunda INSTALL_PARSE_FAILED_NO_CERTIFICATES hatası

    Bu hata genelde app-release-unsigned.apk dağıtıldığında oluşur. Kurulabilir paket için assembleDebug ile üretilen app-debug.apk kullanılmalı; dağıtım öncesi wx-app/www/apk/*.apk temizlenip sonra npx cap sync android çalıştırılmalıdır.

    🧩 Ayarlar / Yönetim sekmeleri tıklanınca açılmıyor

    Kök neden (2026-05-12): Frontend tarafında aynı bileşenlerin bazıları yanlışlıkla iki kez eklendi (duplicate HTML/script) ve bir noktada settings.js dosyasının en üstüne düz HTML satırı girdi. Bu durum JS parse/çalışma akışını bozup sekme event'lerini kilitledi.

    • Temizlenenler: push filtrede duplicate buton, kanal satırlarında duplicate etiketler, duplicate app.js include, duplicate SW cache sabiti.
    • Kritik düzeltme: settings.js başındaki hatalı HTML satırı kaldırıldı (JS parse normale döndü).
    • Cache zorlaması: APP_BUILD ve SW cache sürümü artırıldı; yeni dosyalar zorla alınır.

    İstemci doğrulaması: sayfada app.js?v=203 ve SW tarafında wx-static-v252 görmelisiniz. Hâlâ eski sürüm görünüyorsa Hard Reload yapın.

    ☀️ Açık temada bir şey okunmuyor

    Üst çubukta sağda (her ekranda sabit) güneş/ay/oto simgesinden tema seçin; auto sistem tercihini izler. v89 ile açık temada metin/ikon kontrastı ve toast bildirim okunabilirliği güçlendirildi. Hala eski görünüm varsa tarayıcı önbelleğini temizleyin veya PWA'da uygulamayı kapat-aç yapın (asset sürümü ile birlikte yenilenir).

    📵 Çevrimdışıyken (offline) veri gösterilebiliyor mu?

    Evet. Web ve PWA iki katmanlı offline önbellek kullanır:

    • Service Worker (API cache): Son başarılı hava API yanıtları wx-api-v1 önbelleğinde tutulur. Çevrimdışıyken SW bu yanıtı döndürür; uygulama offline: true işaretli veriyle çalışmaya devam eder.
    • localStorage önbelleği: Her konum için son hava verisi wx_wc_<id> (auth) / wx_gwc_<lat>_<lng>_<model> (misafir) anahtarıyla saklanır. Network hatası durumunda önbellekten yüklenir; hava panelinde 📵 Çevrimdışı · önbellekten rozeti gösterilir.
    • Çevrimdışı Ön Yükleme: Ayarlar ▶ Tercihler ▶ Çevrimdışı Ön Yükleme (kullanıcı) veya Misafir ▶ Yenileme & Model ▶ Çevrimdışı Ön Yükleme'den açılır. Aktif olduğunda uygulama her açılışında ve internete bağlanıldığında tüm kayıtlı konumların verileri arka planda güncellenir.

    Misafir modunda da aynı offline davranış geçerlidir. Android uygulaması ek olarak widget önbelleğini (widget_weather) native katmanda tutar.

    🔑 Giriş yapmak istiyorum ama site misafir modunda açılıyor

    Varsayılan açılış misafir modudur. Giriş yapmanın iki yolu:

    • Üst menüde (hamburger) veya üst çubukta Giriş Yap bağlantısına tıklayın — otomatik olarak giriş ekranına yönlendirir.
    • Doğrudan https://wx.idx.cx/?login=1 adresine gidin.

    Oturumu kapattıktan sonra Giriş Yap özellikle tıklanana kadar site misafir modunda kalır. Oturum açık kalırken sekmeyi yenilediğinizde token kontrol edilerek otomatik giriş yapılır.

    ⌛ Veri eski görünüyor

    Açık model + sunucu cache (30 dk) + istemci yenileme (10 dk). Hava panelindeki Yenile butonu ?force=1 göndererek cache'i atlar. Visibility-change ile sekme tekrar açıldığında 5 dk üstü staleyse otomatik yenilenir.

    📅 Neden ilk açılışta 7 gün görüyorum, 16 gün nerede?

    Varsayılan görünüm yoğunluğu azaltmak için 7 gündür. Hava sekmesindeki günlük tahmin kartında 7 gün / 16 gün, Karşılaştırma sekmesinde 4 / 7 / 16 gün, Grafikler sekmesinde ise 3 / 7 / 16 gün anahtarı vardır. Open-Meteo verisi 16 güne kadar çekilir; ancak çoklu model görünümünde ekran, en az iki seçili modelin taşıdığı ortak ufka kadar uzar.

    📊 Karşılaştırmada neden bazı hücreler boş?

    Özellikle ICON-EU gibi kısa ufuklu modeller birkaç günden sonra saatlik veri sağlamayabilir. Bu durumda tablo artık sahte 0°, ❔ veya 0 yazmaz; hücre gerçekten boş bırakılır. Daha uzun ufuklu modeller aynı satırlarda veri göstermeye devam eder.

    🛰 Radar neden bazen zayıf görünüyor / Nowcast çalışmıyor?

    Rainbow.ai'ın iki ayrı servisi ve bağımsız kotası vardır:

    • Tiles API — radar haritası karoları · 30.000 karo/ay, günlük kap 900. Kota bitince harita boş karo gösterir.
    • Nowcast API — 4 saatlik dakika bazlı yağış tahmini · 5.000 istek/ay, günlük kap 160. Kota bitince nowcast bar "tahmin yok" durumuna geçer.

    Admin ▶ Yönetim ▶ API & Önbellek'de her iki kota ayrı satırda gösterilir. Kotalar sıfırlanana kadar beklemeniz yeterlidir (UTC gece yarısı sıfırlanır). Tomorrow.io'nun kota limiti aşılırsa radar katmanı otomatik olarak düşük öncelikli duruma geçer.

    🗺 Konum eklerken haritada şehir isimleri görünmüyor

    Konum ekleme haritasında katman seçici vardır ve Şehir etiketleri varsayılan açık gelir. Voyager / Karanlık / Uydu arasında geçiş yapabilirsiniz. Masaüstünde modal ve harita alanı genişletildi; daha rahat seçim için Mevcut konumu kullan butonu da eklidir.

    ⚡ 48 saatlik yıldırım risk grafiği nasıl okunur?

    Her çubuk bir saati temsil eder. Renk riski gösterir: gri yok, sarı düşük, turuncu orta, kırmızı yüksek. Çubuğun altındaki ince mavi şerit CAPE (atmosfer enerjisi) yoğunluğunu gösterir — şerit ne kadar koyu olursa potansiyel o kadar yüksek. Üstteki günlük kartlar (Bugün / Yarın / Öbür gün) o günün en kötü riskini özetler. Tepe nokta kırmızı parıltıyla işaretlenir ve alt bilgi satırında tarih/saat olarak yazılır.

    ⚡ Yıldırım kanalı kopuk

    Backend açılışında [blitzortung] connected log'u olmalı. Aksi halde DNS/firewall kontrol edin: ws1/ws2/ws3.blitzortung.org arası otomatik fail-over yapılır. Canlı Sistem sekmesinde anlık durum görünür.

    ⚡ Anlık yıldırım bildirimi gelmiyor

    Tarayıcı bildirimi izni verilmiş olmalı. Bildirim, seçili konumda 50 km yarıçapında 30 km'den yakın vuruş olduğunda tetiklenir (son 15 dk). Sayfa açılışından 3 sn sonra ilk kontrol yapılır; sonrası 5 dk aralıklı. Aynı konuma 10 dk içinde tekrar bildirim gönderilmez. Mobil/PWA'da bildirimler Service Worker üzerinden iletilir — arka planda da çalışır.

    🔐 PWA push aboneliği reddedildi

    Tarayıcı izinleri ▶ Site izinleri ▶ Bildirimler: İzin ver. Bazı tarayıcılarda HTTPS şart; HTTP kullanıyorsanız Safari/Firefox abonelik vermez.

    📐 Tablet yataydayken uygulama "dikey mod" uyarısı veriyor

    Bu kısıt kaldırıldı. wx.idx.cx artık tablet ve telefonda dikey ya da yatay fark etmeksizin çalışır. Kurulu PWA eski manifest/CSS cache'i ile açılıyorsa uygulamayı tamamen kapatıp yeniden açın; gerekirse bir kez kaldırıp yeniden kurun. Güncel manifest yön kilidi kullanmaz (orientation: any).

    📱 Samsung Internet'te "Uygulama Yükle" görünmüyor / Manifest hayır

    Kök neden (çözüldü v112): Telefon eski SW cache'inden manifest linki olmayan bir index.html sunuyordu. Tablet aynı tarayıcıyla çalışıyordu ama telef­onda DOM'da manifest görünmüyordu — 📊 Canlı Sistem ▶ 🧪 Tarayıcı Tanı modalındaki yeni "Manifest fetch" satırı fetch OK / DOM hayır olarak ayırt etti.

    Kalıcı düzeltmeler:

    • SW cache versiyonu v112'ye yükseltildi — eski v110/v111 cache tam temizlenir.
    • <head>'e inline manifest-inject guard eklendi: eski cache'li HTML yüklense bile JS anında <link rel="manifest"> DOM'a ekler.
    • SW controllerchange olayında location.reload() — yeni SW aktive olunca sayfa network-first taze HTML ile yenilenir.
    • SW navigasyon istekleri (HTML) artık network-first; index.html nginx'ten Cache-Control: no-store ile geliyor.
    Tanı modalı ek aksiyonları: "Bildirim izni" durumunu kontrol edin; gerekiyorsa doğrudan modal üzerinden izin isteyip test bildirimi gönderin. Bu akış t.idx.cx, labs.idx.cx ve scp.idx.cx projelerine de aynı mantıkla taşındı.

    Hâlâ sorun yaşanırsa: Samsung Internet ▶ Ayarlar ▶ Gizlilik ▶ wx.idx.cx site verisini temizle, tarayıcıyı kapat-aç, 10-15 sn bekle.

    🎨 Tema seçici nerede?

    Sağ üstte sabit: masaüstünde üst çubukta, mobilde ise ekranın sağ üst köşesinde bağımsız yüzer buton olarak görünür. Menü açıkken geçici olarak gizlenir.

    ⏰ Uyarı penceresi geçmiş saatleri kapsıyor gibi hissettiriyor

    Motor her çalıştığında Open-Meteo'nun saatlik zaman dizisinde İstanbul saatiyle şimdiki saati bulur (nowHourIdx()) ve tüm pencereler buradan başlar. "24 saatte toplam X mm" = şu andan itibaren 24 saat; geçmiş saatler dahil edilmez. Uyarı gece çalıştıysa tepe saati sabah olabilir — bu normal, gelecekte beklenen değeri gösterir.

    📣 Web Push Yönetimi (admin)

    Ayarlar ▶ Web Push Yönetimi butonu yeni V2 panelini açar. 👤 Kullanıcılar, 🌍 Misafirler ve 📲 Uygulamalar sekmeleri vardır; her satır açılır kart şeklindedir. Kart başlığında cihaz tipi emoji + tarayıcı/OS + idle rozeti (Bugün / 5g önce / 💤 60g) gösterilir. Açılınca:

    • ⏱ Aktivite — ilk ziyaret, son ziyaret, ilk push aboneliği zaman çizelgesi (mutlak + göreli süre)
    • 🪪 Kimlik & Cihaz — token, tarayıcı, donanım, ekran, saat dilimi, dil, model API, IP (yanında ⓘ butonuyla ipinfo.io)
    • 📍 Konumlar — chip'e tıklayınca harita açılır; konum bazında bildirim kapalıysa çip üstü çizik ve 🚫 prefix'li gözükür
    • 📱 Cihazlar — her cihazın kendi 📣 test ve 🗑 sil butonu; kart altında misafir başına 📣 Mesaj · 🔔 Test · 🗑 Abonelikleri sil toplu butonları
    • 🧬 User-Agent — monospace, kopyalanabilir kutu
    • 📜 Son Bildirimler (sadece kullanıcılarda) — son 20 bildirim lazy-load (notification_log)
    • 📝 Not — misafir için serbest metin not; + Ekle / ✎ Düzenle bağlantısı modern bir modal açar (karakter sayacı, Sil butonu, canlı kayıt durumu)
    • 📈 Son 7 Gün Aktivite (Uygulamalar) — FCM cihazlarının günlük aktivite sparkline grafiği
    • 🩺 FCM Sağlık Skoru (Uygulamalar) — token son kullanım + IP bilgisine göre 0-100 sağlık puanı

    Toolbar: arama (kullanıcı/IP/token/konum), filtre çipleri (Tümü / 📲 Push'lı / 🚫 Push'suz / ⏱ Son 7 gün), 📣 Mesaj Gönder, ↻ Yenile.

    Çoklu seçim & Broadcast: kullanıcı/misafir/cihaz checkbox'ları. Seçim varken üst bar açılır; 📣 Mesaj butonuyla başlık+body+url özel push gönderilir. POST /api/push/admin/broadcast endpoint'i hedefi {all:true} ya da {user_ids,guest_tokens,sub_ids} olarak alır. Tüm broadcast'ler notification_log'a alert_type='admin_broadcast' olarak kaydedilir.

    Android APK Misafir Tespiti (v165): Misafir kartında ; wv) User-Agent bayrağı veya FCM token kaydı varsa 📲 Android App (APK) mavi rozeti görünür. FCM token kayıtlıysa 🔔 FCM (n) yeşil rozeti + açılır kartta 🔔 FCM Cihazları · Android APK bölümü eklenir (token kısa gösterimi, cihaz adı/OS/uygulama sürümü, son aktiflik). ⚠ Aboneliği eşleşmedi uyarısı artık yalnızca hem Web Push hem FCM kaydı yokken çıkar — APK misafirler için false positive önlendi. FCM cihazları boşsa misafir muhtemelen eski APK kullanıyor (v164 ≤ bozuk native bridge); v165 APK'yı yeniden kurması gerekir.

    📊 Bildirim Akışı (admin · v164)

    Yönetim ▶ 📊 Bildirim Akışı sekmesi notification_log tablosunu detaylı analiz eder. Periyot seçici (24 saat / 3-7-14-30 gün) üzerinden tüm grafikler tek tıkla yenilenir.

    • Özet kartları — Toplam, son 24 saat (başarı %), aktif kullanıcı/misafir (7g), FCM token sayısı (kullanıcı/misafir ayrı), Web Push abonelik sayısı (kullanıcı/misafir ayrı).
    • Kanal × Durum matrisi — Pushover/Telegram/PWA/FCM × sent/error/no_tokens/suppressed_dnd/sent_fcm_fallback. Yeşil = başarılı, kırmızı = hata, sarı = altyapı eksik.
    • Günlük trend — kanal başına bar chart (genişlik = max'a göre normalize).
    • Top 10 hata sebebi — en sık hata mesajları + kanalı + sayısı.
    • En aktif kullanıcı / misafir — son periyotta en çok bildirim alan ilk 10.
    • Filtreli log — kanal, durum (özel: success = sent + sent_fcm_fallback, failed = error:%), user_id, guest_token (* = tüm misafir), mesaj içinde arama, tarih aralığı; sayfalı tablo (default 50/sayfa).

    Backend endpoints: GET /api/push/admin/notification-stats?days=N · GET /api/push/admin/notification-log?... · POST /api/push/admin/fcm/test/:tokenId · GET /api/push/admin/fcm/tokens?owner=user|guest|all.

    🔔 Misafir uyarı geçmişi (v164)

    Misafir kullanıcı artık üst menüden 🔔 Uyarı geçmişi sekmesine erişebilir. Geçmiş, misafirin guest_token'ı üzerinden filtrelenir; backend uç noktası GET /api/pub/alerts/log?token=&limit=&page=. Misafirde toplu sil / seç gibi işlemler gizlenir; "Şimdi kontrol et" butonu da misafirde görünmez (kontrolü cron yürütür).

    📲 Misafir gerçek FCM Android bildirimi (v164–v165)

    Önceden misafire "Android uygulama bildirimi" görünüyordu fakat altta Web Push çalışıyordu — bu mobilde güvenilmez. v164 ile misafir gerçek FCM token kaydeder:

    • Schema — fcm_tokens.guest_token sütunu + check constraint user_id IS NOT NULL OR guest_token IS NOT NULL.
    • Public endpoints — POST /api/pub/fcm/subscribe · POST /api/pub/fcm/heartbeat · DELETE /api/pub/fcm/subscribe · POST /api/pub/fcm/test. Hepsi guest_token body'de.
    • APK native — native-bridge.js → subscribeFcmToken() auth token yoksa localStorage.guest_token ile public endpoint'e POST eder; localStorage.wx_fcm_last_mode = 'guest' | 'user' takip için.
    • Misafir → kullanıcı geçişi — auth /fcm/subscribe ON CONFLICT artık guest_token = NULL set ederek temizlik yapar.
    • Alert engine — notifyGuest() artık çoklu-kanal: app_settings.guest_channels (default ["fcm","pwa"]) ile fcm_tokens/push_subscriptions kesişimi hesaplanıp her kanal ayrı log satırına yazılır.

    v165 Düzeltme: v164 APK'da native-bridge.js script tag'i kaybolmuştu → window.WXNative undefined → FCM register hiç tetiklenmedi. v165 ile tag geri eklendi. v164 APK yüklü cihazların v165 APK'yı yeniden kurması gerekir — aksi hâlde fcm_tokens boş kalır, bildirim gönderilemez, Cihaz Yönetimi'nde FCM bölümü boş görünür.

    v165 Admin Görünürlüğü: Cihaz Yönetimi ▶ Misafirler'de APK kullanan misafirler artık 📲 Android App (APK) + 🔔 FCM (n) rozetleriyle işaretlenir. Açılır kartta 🔔 FCM Cihazları · Android APK bölümü token, cihaz adı/OS/uygulama sürümü ve son aktiflik bilgisini gösterir.

    📲 Misafir bildirim altyapısı tam akış (v170–v172)
    • v170 — FCM kayıt düzeltmesi: /api/pub/fcm/subscribe Postgres'te guest_token bind cast hatası nedeniyle 500 dönüyordu; explicit ::uuid cast eklendi. APK misafirleri artık ilk açılışta token kaydeder. navigator.sendBeacon yerine fetch(..., keepalive:true) ve credentials:'omit' kullanıldı (cookie taşması önlendi).
    • v171 — Test butonu gerçek FCM: Misafir Ayarlar'daki 🔔 Test Bildirimi Gönder artık doğrudan POST /api/pub/fcm/test çağırır → backend fcm.sendToGuest() ile gerçek round-trip yapar. Önceden sadece local notification gösteriyordu.
    • v172 — Misafir günlük özetleri: Yeni cron checkAllGuestSummaries('morning'|'evening') her dakika çalışır; guests.loc_coords[].alert_rules içindeki morning_summary.time / evening_summary.time değerlerini İstanbul saatine göre eşler. POST /api/pub/guest/ping artık loc_coords içinde per-konum alert_rules kabul eder (toplam JSON 8 KB ile sınırlı). Kullanıcı tarafındaki günlük özet UI'ı misafire de uygulanır; tercihler localStorage'da tutulur, ping ile sunucuya iletilir.
    • v172 — Admin /admin/test & /admin/broadcast FCM-only desteği: Endpoint'ler artık {ids?, user_ids?, guest_tokens?} hedef alır. Web Push aboneliği olmayan ama FCM token'ı olan misafirler için doğrudan fcm.sendToGuest() çağrılır. Yanıt: {ok, total_targets, web_push:{results,sent}, fcm:{results,sent}}. Broadcast'te FCM gönderimleri notification_log'a channel='fcm' ile kaydedilir.
    • v172 — Çoklu kanal yönlendirme (auth): notifyUser() kullanıcı için notification_channels içindeki her kanala paralel gönderir: pushover, telegram, pwa (web push), fcm (native). FCM seçili ama hiç APK kurulmadıysa fcm|no_tokens; PWA seçili değilse otomatik sent_fcm_fallback ile web push'a düşer (PWA zaten seçiliyse fallback gerekmez). DND aktifken log girdisi artık seçili ilk kanalı yansıtır (önceden hep pwa görünüyordu).
    • v176 — Harita Zaman Çizelgesi & Güneşi Yakala (v1): Hava Haritası sekmesine saat bazlı timeline slider eklendi; geçmiş ve tahmin saatleri arasında film şeridi gibi kaydırılabiliyor. Güneşi Yakala sekmesi eklendi: Leaflet haritasında belirlenen merkez etrafındaki grid noktaları Open-Meteo ile puanlanıyor, en güneşli nokta ⭐ ile işaretleniyor. Misafir bildirim geçmişi silme eklendi (backend DELETE /api/pub/alerts-log/:id + DELETE /api/pub/alerts-log/all).
    • v177 — Güneşi Yakala İyileştirmeleri & Misafir Mod Genişletme: CartoDB Voyager harita katmanı, varsayılan yarıçap 30 km. Noktaya tıklayınca modal açılıyor: Nominatim reverse geocode ile konum adı (il/ilçe/köy) + saatlik hava durumu tablosu (sıcaklık, yağış, bulut, UV, rüzgar). En iyi nokta otomatik modal açıyor. Misafir özellik kontrol paneline ☀️ Güneşi Yakala sekmesi ve 🗑 Bildirim Geçmişi Silme toggle'ları eklendi; misafirler bu özellikleri görmemesi için admin kapatabilir. APK v177.
    • v178 — Açık Tema Okunabilirlik Düzeltmeleri: Açık temada sıcaklık değerleri, pm-stat-pill metni ve push modal kapatma butonu beyaz metin sorunu giderildi. Tüm bileşenler koyu ve açık temada doğru kontrasta sahip.
    • v179 — Güneşi Yakala Modal Tema + Google Maps + Merkez Toggle: Koyu temada modal arka planı #111c2e sabitlendi; açık tema için tam override seti eklendi. Konum altına "🗺 Google Maps'te Aç" bağlantısı eklendi. "Tıkla → merkez" toggle (varsayılan kapalı) ile haritaya tıklamanın merkezi değiştirip değiştirmeyeceği kontrol ediliyor. APK v179.
    • v180 — Günlük Detay Modalı Compact Overlay: Tam ekranı kaplayan detay paneli, PC'de 680px genişliğinde ortalanmış karta dönüştürüldü. Mobilde bottom-sheet. Arka plana tıklayarak kapatma, sticky sütun başlıkları, scale/slide animasyonu.
    • v181 — Güneşi Yakala Tam Genişlik + Dinamik Gün Pilleri: .ssc-container üzerindeki 900px kısıtı kaldırıldı, diğer sayfalarla aynı hizaya geldi. Gün seçme pilleri "+2/+3/+4" yerine gerçek gün adı (Sal) ve tarih (13 May) gösteriyor; mobilde tarih satırı gizleniyor.
    • v182 — Saatlik Tabloya Ani Rüzgar (Gusts): Güneşi Yakala detay modalındaki saatlik tabloya turuncu renkli 💨 ani rüzgar sütunu (wind_gusts_10m) eklendi. Özet stat kartına günlük maksimum ani rüzgar değeri eklendi.
    • v183 — "Az Rüzgar" Modu: Filtre çubuğuna Mod seçici eklendi: ☀️ Güneş / 💨 Az Rüzgar. Az Rüzgar modunda, rüzgar ve ani rüzgarın en az olduğu noktayı bulur; sakinlik skoru Çok Sakin → Rüzgarlı aralığında gösterilir. Backend /api/pub/sunny-scout?mode=wind parametresiyle çalışır.
    • v184 — Detay Modal Başlık İki Satır: Dar ekranlarda taşan başlık iki satıra bölündü: üst satır ikon + tarih, alt satır sıcaklık aralığı + yağış miktarı (daha küçük, soluk renk).
    • v193 — Harita Katmanlar Varsayılan Kapalı:
      • Hava haritası açıldığında Katmanlar paneli (katman/model seçenekleri) artık varsayılan olarak gizli gelir; ☰ Katmanlar butonuna tıklanınca açılır.
      • Renk katmanı (overlay) da varsayılan olarak kapalı başlar; 👁 Kapalı butonuna tıklanınca açılır.
      • Daha önce ilk harita açılışında katmanlar zorla görünür kılınıyordu — bu davranış kaldırıldı.
      • Her iki buton da başlangıç durumunu (active CSS sınıfı ve metin) doğru yansıtır.
    • v194–v196 — Push Manager + Sekme Regresyon Hotfix:
      • Android/Pushover/Telegram ikon geçişi sonrası oluşan duplicate HTML satırları temizlendi.
      • Push modal filtrelerinde duplicate Push'lı butonu kaldırıldı.
      • Sayfa sonunda duplicate app.js include kaldırıldı (tek sürüm bırakıldı).
      • settings.js dosyası başına yanlışlıkla eklenen HTML satırı temizlendi; Ayarlar/Yönetim sekmeleri tekrar çalışır hâle geldi.
      • SW cache ve build versiyonları artırılarak istemcide eski bozuk cache'in kalması engellendi.
    • v197 — Hava Katmanı Açılınca Radar Otomatik Duraklatma:
      • Hava katmanı paneli açıkken Rainbow/Tomorrow radar otomatik durdurulur; radar tile katmanları haritadan kaldırılır.
      • Radar oynatma ve 5dk otomatik yenileme interval'i kapatılır; gereksiz API çağrısı engellenir.
      • Hava katmanı paneli kapatıldığında radar akışı otomatik geri alınır (interval tekrar başlar ve radar snapshot yeniden yüklenir).
      • Bu davranış MapModule.pauseRadarForWeatherLayers() ve resumeRadarAfterWeatherLayers() ile yönetilir.
    • v198 — Katman Aç/Kapa Davranışı Düzeltmesi:
      • Radar pause/resume akışı panel aç/kapa yerine doğrudan 👁 Katman Aç/Kapa butonuna bağlandı.
      • 👁 Açık olduğunda radar durur; 👁 Kapalı olduğunda radar geri başlar.
      • Overlay henüz oluşmamışsa açma anında kısa gecikmeli fetch tetiklenir; buton durumu ve gerçek katman görünürlüğü senkron kalır.

    Doğrulama komutları:
    curl -X POST /api/pub/fcm/test -H 'Content-Type: application/json' -d '{"guest_token":"..."}'
    curl -X POST /api/push/admin/test -H 'Authorization: Bearer ...' -d '{"guest_tokens":["..."]}'
    curl -X POST /api/push/admin/broadcast -d '{"title":"...","body":"...","target":{"guest_tokens":["..."]}}'

    Not: Bir auth kullanıcı için FCM kanalı no_tokens dönüyorsa, kullanıcı APK'yı oturum açıkken hiç başlatmamış demektir — APK'ı açıp giriş yaptığında fcm_tokens.user_id kaydedilir.

    🤖 AIFS / GEM / JMA modelleri ne zaman kullanılmalı?

    ECMWF AIFS — AI tabanlı, ekstrem hava olaylarını erken yakalıyor; normal günlerde klasik IFS ile karşılaştırmak için idealdir. GEM — Kanada modeli, orta vadeli tahminlerde ECMWF/GFS ile iyi tamamlanım sağlar. JMA — Japonya modeli, Orta Doğu/Doğu Avrupa geçişlerinde alternatif referans olarak faydalıdır. Tüm modeller Karşılaştırma sekmesinde yan yana görüntülenebilir.

    👤 Admin panelinde misafirler gözükmüyor

    Admin ▶ Push ▶ Misafirler listesi guests tablosundan gelir. Misafir, siteyi ziyaret ettiğinde localStorage'dan üretilen rastgele UUID token ile POST /api/pub/guest/ping çağrısı yapılır; bu kayıt DB'ye yazılır. Olası neden: (1) Yeni misafir henüz sayfayı açmadı — sayfa açıldığında otomatik kaydolur. (2) Eski önbellekten sunulan JS, güncelleme öncesi sürümü çalıştırdı — misafirin tarayıcı SW cache'ini yenilemesi beklenir. (3) Token uzunluğu veya format kontrolünden geçmedi — pm2 logs wx-api --err ile hata satırı kontrol edilebilir.

    ⚙️ Yöneticinin varsayılan model ayarları misafire uygulanmıyor

    Admin Misafir Mod Özellik Kontrolü'nde kayıt edilen guest_default_models (Hava / Karşılaştırma / Grafikler), misafir sayfayı yüklediğinde /api/pub/config'ten çekilir ve Guest._applyAdminDefaults() ile uygulanır. Misafirin localStorage'ındaki model tercihleri önceliklidir — konum bazlı preferred_models veya Ayarlar sekmesindeki model seçici kaydedilmişse admin varsayılanı geçersiz kalır. Konum düzenleme modalından model tercihlerini sıfırlamak önceliği tekrar admin varsayılanına devreder.

    🛠

    Teknik Mimari

    Stack, sunucu/IP, cron rejimi, cache politikaları, şifre yerleşimi, tablo şeması ve uç noktalar.

    🏗 Stack

    🖥
    FrontendVanilla JS · Leaflet 1.9.4 · Chart.js 4.4.4 · Service Worker (PWA) · Inter font · CSS --fs-* ölçeği
    🟢
    BackendNode.js 24 · Express · PM2 (tek instance) · JWT · ioredis
    🐘
    VeritabanıPostgreSQL wx_db · kullanıcı wx · JSONB cache + model_accuracy
    🔴
    Cache L1Redis 7 (ioredis) · hava durumu önbelleği · 127.0.0.1:6379 · graceful fallback
    🌐
    Reverse ProxyNginx + Let's Encrypt · 127.0.0.1:3001 → 443
    📡
    Hava VerisiOpen-Meteo · ECMWF IFS · ECMWF AIFS (AI) · ICON · ARPEGE · GFS · UKMO · GEM · JMA
    🌬
    Hava KalitesiOpen-Meteo Air Quality (CAMS) · PM2.5 · PM10 · NO₂ · O₃ · SO₂ · Avrupa AQI · 60 dk cache
    ⚡
    YıldırımBlitzortung WebSocket (ws1/ws2 fail-over)
    📍
    GeocodeOSM Nominatim (public)
    🌈
    Radar TilesRainbow.ai Tiles API · 30.000 karo/ay · günlük kap: 900
    ☂️
    NowcastRainbow.ai Nowcast API · 5.000 istek/ay · günlük kap: 160
    🌀
    Radar (alt)Tomorrow.io Map Tile API · 3 istek/s · 25/saat · 500/gün
    🧪
    TestlerJest + Supertest · 23 test · npm test · backend/tests/

    🌐 Sunucu / Ağ

    Domain
    wx.idx.cx
    Sunucu
    Netcup RS2000G12 · Ubuntu 24.04
    Backend port
    127.0.0.1:3001
    PM2 app
    wx-api (id 0)
    DB host
    127.0.0.1:5432
    Frontend kök
    /home/isa/sites/wx.idx.cx/frontend
    Backend kök
    /home/isa/sites/wx.idx.cx/backend
    Nginx conf
    backup/nginx/sites-available/wx.idx.cx.conf
    SSL
    Let's Encrypt (otomatik yenileme)
    İşletim Sistemi
    Linux · sistem servisi nginx, postgresql

    ⏰ Cron / Zamanlanmış Görevler

    ÇizelgeİşAçıklama
    */30 * * * *checkAllAlertsKullanıcı kurallarını çoklu modele karşı tara — 24h dedup + değer bazlı mükerrer önleme
    5,35 * * * *checkAllGuestAlertsMisafir Web Push/FCM uyarı taraması (ana taramadan 5 dk ofset)
    * * * * *Sabah özeti (auth)Her dakika kontrol; konum başına özelleştirilebilen saatte gönderilir (varsayılan 07:00 İstanbul)
    * * * * *Akşam özeti (auth)Her dakika kontrol; konum başına özelleştirilebilen saatte gönderilir (varsayılan 19:00 İstanbul)
    * * * * *checkAllGuestSummaries (morning)v172 — Misafirin loc_coords[].alert_rules.morning_summary.time ile dakika eşleşince FCM/PWA üzerinden sabah özeti
    * * * * *checkAllGuestSummaries (evening)v172 — Misafir akşam özeti, aynı mantıkla
    0 * * * *Cache temizleme + Model snapshotweather_cache süresi geçmiş girdiler silinir · forecast_snapshots: aktif lokasyonlar için tahmin anlık görüntüsü alınır
    1 * * * *DND ÖzetiRahatsız etme modu biten kullanıcılara bastırılmış bildirimlerin özet mesajı gönderilir
    25 * * * *Model doğruluk hesaplama24 saat geçen snapshot'lar gerçekleşen değerle karşılaştırılır; MAE model_accuracy tablosuna yazılır
    sürekliBlitzortung WSws1/ws2 yedeklemeli, kopuşta otomatik reconnect

    � Günlük Özetler (Sabah & Akşam)

    Günlük sabah ve akşam özetleri varsayılan olarak 07:00 ve 19:00 (İstanbul saati, UTC+3) saatlerinde gönderilir. Ancak her konum için bu saatleri ayrı ayrı özelleştirebilirsiniz.

    • Özetleri açmak/kapatmak: Yerlerim ▶ 🔔 Uyarılar ▶ Günlük özetler bölümüne gidin. Her konum için Sabah özeti (🌅) ve Akşam özeti (🌇) togglelerini kullanabilirsiniz.
    • Saatleri değiştirmek: Uyarı kuralları modalında Günlük özetler bölümünde saat seçicisine tıklayın. Her konum bağımsız olarak ayarlanabilir; değişiklikler otomatik kaydedilir.
    • Varsayılan saatlere dön: Saat alanını temizleyerek (boş bırakarak) konum başına varsayılan değerlere (07:00 ve 19:00) geri dönebilirsiniz.
    • Saklama: Konum başına özel saatler tarayıcı localStorage'da tutulur; çalışma sırasında önbellekte tutulur ve backend dakikalık kontrol ile kesin eşleştirme sağlar.

    🗃 Cache Politikaları

    Hava durumu L1
    Redis 7 · key wx:weather:lat:lng:model · TTL 30 dk · Redis kapalıysa L2'ye graceful fallback
    Hava durumu L2
    PostgreSQL weather_cache · key=lat,lng,model · TTL 30 dk · Redis miss'te Redis'e de yazar · past_days=2 ile geçmiş 48 saat dahil (model doğruluk referansı)
    Hava kalitesi
    PostgreSQL weather_cache model=__aq__ · TTL 60 dk
    Service Worker
    wx-static-v252 (versiyonla geçersiz) · wx-api-v1 (offline fallback) · wx-ext-v1 (Leaflet/Chart/Inter) · her asset ayrı try/catch
    İstemci yenileme
    Auth: 10 dk · Guest: kullanıcı seçer · 0 = manuel · Visibility-change: 5 dk üstü stale
    Offline önbellek
    wx_wc_<id> (auth) · wx_gwc_<lat>_<lng>_<model> (misafir) — network hatası olduğunda otomatik yüklenir · Çevrimdışı Ön Yükleme ayarıyla bağlantı gelince tüm konumlar otomatik güncellenir
    Lightning buffer
    RAM, son 60 dk; 100 km yarıçap, 50 km eşik; 30 dk dedup (guest localStorage)

    🔐 Şifreler & Sırlar

    • DB DSN: postgres://wx:[email protected]:5432/wx_db
    • JWT secret: backend/.env ▶ JWT_SECRET (rastgele 64+ karakter)
    • VAPID push: VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY · subject mailto:
    • Pushover/Telegram: kullanıcı bazlı, users tablosunda saklı

    🗄 Önemli Tablolar

    TabloAmaçNotlar
    usersAuth + bildirim kanalırole: admin/user; Pushover/Telegram alanları; alert_rules JSONB
    locationsKullanıcı yerleripreferred_models TEXT[]
    notification_logGönderim kaydıstatus VARCHAR(64); trigger_value NUMERIC; 24h pencere + değer bazlı mükerrer önleme; deliveries JSON ile gruplu görünüm
    app_settingsGenel ayarkey/jsonb; misafir varsayılanları
    push_subscriptionsPWA Web Pushendpoint + p256dh + auth + device_info JSONB + last_ip, vendor, device_model; index'ler: user_id (partial), guest_token (partial), last_used DESC
    guestsMisafir kayıtlarıtoken (UUID) + UA + browser/OS/device_type/screen/tz/lang + last_ip + vendor + device_model + loc_names/loc_coords (JSONB) + note
    weather_cacheOpen-Meteo + Hava Kalitesi önbelleği30 dk TTL (hava) · 60 dk TTL (AQ, model=__aq__) · saatlik temizleme
    forecast_snapshotsTahmin anlık görüntüleriSaatlik cron; lat/lng/model/target_time · doğruluk hesaplamasının kaynağı
    model_accuracyModel MAE istatistikleritemp/precip/wind MAE · forecast_hour · Admin ▶ Model Doğruluğu sekmesinde gösterilir

    🛡 Güvenlik Politikaları

    • CORS — sadece CORS_ORIGINS env'de listelenen origin'ler (varsayılan: https://wx.idx.cx). Same-origin (nginx arkası) etkilenmez.
    • Rate limit — /api/auth/login: 5/dk + 30/saat IP başı. Public endpoint'lerde 5–30/dk yol bazlı. middleware/rateLimit.js in-memory.
    • JWT — 30 gün HS256, secret JWT_SECRET env. Yenileme yok; süre dolunca yeniden login.
    • SSRF koruması — ipinfo proxy: özel/lokal IP'ler dışa gönderilmez, yanıt 32KB cap, sadece beklenen alanlar dönülür (whitelist).
    • SQL — tüm sorgular parametreli ($1, $2). String concat yok.
    • Body limit — express.json({limit:'256kb'}).
    • Admin yetkisi — adminOnly middleware req.user.role === 'admin' kontrolü.
    • Web Push — VAPID; 410/404 dönen abonelikler oto-temizlenir.

    🔌 Uç Noktalar

    🔓 Public

    • GET/api/pub/config — misafir ayarları + aktif modeller + enabled flag
    • GET/api/pub/models — yalnızca aktif modeller
    • GET/api/pub/weather — misafir hava verisi (?lat=&lng=&model=)
    • GET/api/pub/lightning — son N dk yıldırım (?lat=&lng=&radius_km=&minutes=)
    • GET/api/pub/geocode — Nominatim proxy (?q=)
    • GET/api/pub/alerts/defaults — varsayılan uyarı kuralları (misafir modal için)
    • POST/api/pub/guest/ping — misafir oturum kaydı/güncelleme (analitik)
    • POST/api/pub/push/subscribe — misafir PWA push aboneliği
    • DEL/api/pub/push/subscribe — misafir abonelik iptali

    🔐 Auth

    • POST/api/auth/login
    • GET/api/auth/me

    📍 Yerler

    • GET/api/locations
    • POST/api/locations
    • PUT/api/locations/:id
    • DEL/api/locations/:id

    🌤 Hava

    • GET/api/weather/models — aktif modeller
    • GET/api/weather/models/all — tüm modeller (admin)
    • GET/api/weather/:locationId — hava verisi (?model=)
    • GET/api/weather/:locationId/compare — çoklu model karşılaştırması
    • GET/api/airquality?lat=&lng= — hava kalitesi (CAMS AQI, PM2.5/10, NO₂, O₃, SO₂)
    • GET/api/radar/tile/:provider/:z/:x/:y — PNG radar tile proxy
    • GET/api/radar/forecast — Tomorrow.io saatlik tahmin
    • GET/api/radar/nowcast — Rainbow Nowcast 4 saatlik dakika bazlı
    • GET/api/lightning/:locationId — konum çevresindeki vuruşlar

    🔔 Uyarılar

    • GET/api/alerts/log — bildirim geçmişi (gruplu)
    • GET/api/alerts/types — uyarı türleri meta
    • GET/api/alerts/defaults — varsayılan kurallar
    • POST/api/alerts/test — test bildirimi gönder
    • POST/api/alerts/check-now — anlık kural kontrolü
    • DEL/api/alerts/log/:id — tek bildirim sil
    • POST/api/alerts/log/delete-bulk — toplu silme
    • DEL/api/alerts/log — tüm log sil

    🎯 Doğruluk & Analitik

    • GET/api/accuracy/global?days=14 — tüm lokasyonlar model MAE sıralaması
    • GET/api/accuracy?lat=&lng=&days=14 — belirli konum için MAE
    • GET/api/analytics/overview?days=30 — bildirim trendi, kanal dağılımı, cache durumu (admin)
    • GET/api/analytics/locations?days=30 — konum bazlı uyarı sayıları (admin)

    👑 Admin

    • GET/api/users — kullanıcı listesi
    • POST/api/users — yeni kullanıcı
    • DEL/api/users/:id
    • PUT/api/users/me/settings — kişisel ayarlar
    • PUT/api/users/me/password
    • GET/api/users/admin/settings — uygulama ayarları
    • PUT/api/users/admin/settings
    • GET/api/users/admin/system — OS/process/DB/lightning istatistikleri
    • GET/api/push/vapid-key — VAPID public key
    • POST/api/push/subscribe — kullanıcı push aboneliği
    • DEL/api/push/subscribe — abonelik iptali
    • GET/api/radar/status — kota/cache istatistikleri

    📣 Push Yönetimi (Admin)

    • GET/api/push/admin/users — kullanıcılar + cihazlar + konumlar + bildirim istatistikleri
    • GET/api/push/admin/guests — misafirler (UA, yaş, idle gün, push abonelik tarihi dahil)
    • GET/api/push/admin/apps — uygulama kullanıcıları + FCM cihaz/token özetleri
    • GET/api/push/admin/notifications?user_id=X&limit=20
    • POST/api/push/admin/broadcast — hedefli/toplu özel push (target: all|user_ids|guest_tokens|sub_ids)
    • POST/api/push/admin/test — seçili abonelik(ler)e test bildirimi
    • DEL/api/push/admin/subscriptions/:id
    • DEL/api/push/admin/fcm-tokens/:id — tek FCM cihaz kaydını sil
    • POST/api/push/admin/cleanup — seçili cihaz/misafir toplu temizleme (transaction)
    • GET/api/push/admin/ipinfo/:ip — ipinfo.io proxy (özel IP'lerde local ipucu)
    • POST/api/push/fcm/subscribe — Android uygulama FCM token kaydı
    • DEL/api/push/fcm/subscribe — Android FCM token iptali
    📊

    Canlı Sistem Bilgisi

    Sunucu kaynakları, veritabanı boyutu, son 24 saatteki bildirim aktivitesi ve Blitzortung yıldırım WebSocket sağlığı.

    ⏳ Yükleniyor…

    ⚙️ Uygulama

    Donanım & İşletim Sistemi

    🧠 Bellek (Process)

    🐘 Veritabanı

    Tablo satır sayıları

    📡 Aktivite (son 24 saat)

    En çok kullanılan modeller (24 saat)

    ⚡ Blitzortung (Yıldırım WS)

    Üretildi: —

    ⚙️ Misafir Ayarları

    Konumlarını yönetmek için 📍 Yerlerim, hava durumunu görmek için 🌤 Hava Durumu sekmelerini kullan. Bu sekmede sadece bildirim ve yenileme tercihleri vardır.

    🔎

    🔔 Bildirimler

    Uygulama veya tarayıcı üzerinden bildirim alabilirsiniz.

    💡 Uyarı kuralları (eşikler, türler) her konum için ayrı ayrı ayarlanır — 📍 Yerlerim sekmesinde konum kartındaki 🔔 Uyarılar butonuna tıkla.

    🌙 Rahatsız Etme Modu

    Belirlenen saatler arasında bildirimler gönderilmez. İstersen mod bitiminde özet tek bildirim olarak iletilir.

    (gece yarısı geçişi desteklenir)

    🔤 Yazı Boyutu

    Tüm arayüzü etkiler. Tercih tarayıcıda saklanır.

    📶 Çevrimdışı Ön Yükleme

    🔄 Veri Yenileme Sıklığı

    Hava durumu verisi otomatik yenilensin mi? 0 = sadece sayfa açıldığında.

    📍 Açılış Konumu

    Uygulama açıldığında hangi konum gösterilsin?

    📡 Tahmin Modeli

    Bütün konumlar için tek bir model seçilir. Değişiklik anında uygulanır.

    🪁 Karşılaştırma & 📊 Grafikler — Varsayılan Modeller

    İşaretlenen modeller her iki sekme açılışında otomatik seçili gelir. Her model satırında ⓘ butonuna tıklayarak model hakkında bilgi alabilirsiniz.

    © İDx Weather · isademir

    Yer

    Uyarı kuralları

    📱 Tarayıcı / İşletim Sistemi / Install Tanı

    Bu ekran sadece mevcut cihaz ve tarayıcının PWA installability durumunu gösterir.

    Otomatik Yorum

      User Agent

      
      
            

      📊 API & Önbellek Durumu

      🌈 Rainbow.ai Tiles
      —çağrı/gün
      —kalan/gün (900)
      —tile önbel.
      —hata/gün
      Günlük kota
      ☂️ Rainbow.ai Nowcast
      —çağrı/gün
      —kalan/gün (160)
      —hata/gün
      Günlük kota
      🌀 Tomorrow.io
      —çağrı/gün
      —kalan/saat
      —kalan/gün
      —tile önbel.
      —hata/gün
      Saatlik kota
      Günlük kota
      🗄 Tile Önbelleği
      —toplam tile
      —Rainbow tile
      —Tomorrow tile
      —isabet
      —ıskalama
      —isabet oranı
      📍 Konum Önbellekleri

      📱 Bildirim Yönetimi Web Push + Android FCM

      VAPID: … 0 abonelik
      0 seçili

      Yükleniyor…

      Yükleniyor…

      Yükleniyor…

      📣 Özel Bildirim Gönder
      Hedef: tüm aboneler
      📝 Misafir Notu
      0 / 500
      IP Bilgisi