# Telefon, bilgisayar ve tablette aynı yerden devam

Supabase veya ayrı bir giriş sistemi gerekmez. Mevcut Cloudflare hesabındaki Pages sitesi, Cloudflare D1 üzerinde tek bir kişisel çalışma kaydı tutar. Her cihaz bir kez aynı özel eşitleme anahtarını girer. Kelime kayıtları, tekrar takvimi, seçilen gün ve yarım kalan oturumun cevap sırası birlikte eşitlenir.

## Bir kez yapılacak kurulum

1. **D1 kaydını oluştur.** Cloudflare panelinde **Workers & Pages → D1 SQL Database** bölümünden `yds-ilerleme` adlı bir veritabanı oluştur. SQL yazman veya tablo kurman gerekmez; ilk yetkili bağlantıda tablo otomatik oluşturulur.
2. **YDS sitesine bağla.** YDS Pages projesinde **Settings → Bindings → Add → D1 database** seç. Değişken adını tam olarak **`DB`** yaz ve `yds-ilerleme` veritabanını seç. Production ortamına uygula.
3. **Anahtarı tanımla ve yeniden yükle.** Uygulamadaki **Cihazlarım → Yeni anahtar üret → Kopyala** düğmelerini kullan. Pages projesinin **Settings → Variables and Secrets** bölümünde **Secret** türünde **`SYNC_KEY`** oluştur ve anahtarı değer olarak yapıştır. Production ortamına uygula. Ardından güncel **`yds-cloudflare-pages.zip`** dosyasını YDS projesine yeni bir production deployment olarak yükle.

Panel isimleri arayüz diline göre değişebilir. Binding ve secret değişikliklerinden sonra yeni deployment gerekir. Paket bağımsız `_worker.js` içerir ve Cloudflare'ın panelden ZIP yükleme yolunu destekler. Ayrı Worker projesi, Wrangler, Supabase veya SQL kurulumu gerekmez.

ZIP içindeki dosyalar sitenin kökünde olmalı. Eski Kelime projesi yerine ayrı **YDS Pages projesine** yükle. Alan adını bu projenin Custom domains bölümünden `yds.ali-emre.com` olarak bağla. YDS ilerlemesini eski uygulamanın veritabanına bağlama.

## Her cihazda bir kez

Önce mevcut ilerlemenin bulunduğu cihazda `https://yds.ali-emre.com` adresini aç. **Cihazlarım** menüsüne Cloudflare'daki `SYNC_KEY` değerinin aynısını gir ve **Bu cihazı bağla** düğmesine bas. Bulut kaydı boşsa bu cihazdaki ilerleme buluta aktarılır.

Telefonunda ve tabletinde aynı adresi açıp aynı anahtarla bağlan. Boş cihaz mevcut bulut kaydını alır; **Oturuma devam et** düğmesinden kaldığın sıradan çalışırsın. Bir cihazdan ayrılmadan önce üstte **Eşitlendi** yazdığını kontrol et. Görünür sayfa diğer cihazların kaydını yaklaşık 15 saniyede bir kontrol eder; sayfaya geri döndüğünde de hemen kontrol eder.

Anahtar o tarayıcıda saklanır. Yeni tarayıcı veya gizli sekme kullanırsan yeniden girmen gerekir. Anahtarı bilen kişi çalışma kaydını okuyup değiştirebilir; anahtarı paylaşma. Bu tek kişilik çalışma alanıdır; çok kullanıcılı üyelik sistemi değildir. Anahtar ZIP dosyasına veya kaynak koda yazılmaz ve URL'de taşınmaz.

## İnternet kesilirse veya kayıtlar farklıysa

Açık sayfada verdiğin cevaplar önce cihazda kaydedilir. İnternet geri gelince eşitleme yeniden denenir. Tamamen kapalı bir sayfanın internet olmadan açılması bu sürümde garanti edilmez.

İki cihazda birbirinden ayrı çalışırsan **Kayıt seç** ekranı açılır. Bu cihazın kaydıyla buluttaki kaydı karşılaştırıp devam edeceğin sürümü seçersin. Eski sürüm daha yeni kaydın üzerine sessizce yazılmaz. Kayıtlar otomatik birleştirilmez; seçtiğin sürüm ortak kayıt olur. Seçimden önce her iki sürüm cihazda yedeklenir. **Cihazlarım → Son çakışma yedeklerini indir** ile iki ayrı JSON dosyası indirebilir, gerekirse **Yedekleme ve ayarlar → Yedek yükle** ile birini geri alabilirsin. Sonraki çakışma, bu kurtarma yedeğini yeniler.

**Bu cihazın bağlantısını kes** yalnızca bu tarayıcının anahtarını kaldırır; çalışma kayıtlarını silmez. Eşitleme açıkken ilerlemeyi sıfırlamak veya yedek yüklemek ortak kaydı da değiştirir. Sunucudaki anahtarı değiştirirsen her cihazı yeni anahtarla yeniden bağla.

Yerel önizleme sunucusu eşitleme API'sini çalıştırmaz. Cloudflare ayarları yoksa uygulama yerel kayıtla çalışmaya devam eder; Cihazlarım menüsü eşitlemenin henüz kurulmadığını söyler.

## Teknik bilgi ve doğrulama

Tarayıcı aynı adresteki `/api/sync` üzerinden GET/PUT kullanır. API yalnızca doğru anahtarla erişilebilir. D1 yazmaları sürüm numarasını koşul olarak kullanır; eşzamanlı yazmalardan biri 409 döner ve kayıt seçimi ister. Okumalar D1'in `first-primary` oturumunu kullanır. Veritabanında tek ilerleme satırı bulunur; API istek gövdesi en fazla 1,5 MB kabul eder. Tüm 683 kelimenin standart çalışması bu sınırın içindedir.

Node.js 22.13 veya üstü ile `npm test` yerel SQLite üzerinde API yetkisini, koşullu yazmaları ve farklı cihazların devam/çakışma/kurtarma senaryolarını doğrular. Yerel testler Cloudflare hesabının doğru ayarlandığını doğrulamaz. Canlı kurulumdan sonra bir cihazda birkaç cevap verip ikinci cihazda aynı sıradan devam ederek son kontrolü yap.

Cloudflare D1 ücretsiz planda kullanılabilir; hesabındaki güncel kullanım sınırları geçerlidir. Kişisel çalışma için ayrı ücretli Supabase hizmeti gerekmez.

Kaynaklar: [D1 binding ve yeniden deployment](https://developers.cloudflare.com/pages/functions/bindings/), [ZIP yüklemede `_worker.js` desteği](https://developers.cloudflare.com/pages/get-started/direct-upload/), [Advanced mode](https://developers.cloudflare.com/pages/functions/advanced-mode/), [D1 oturumları](https://developers.cloudflare.com/d1/worker-api/d1-database/), [D1 fiyatlandırma ve sınırlar](https://developers.cloudflare.com/d1/platform/pricing/).
