İçeriğe atla
Sami Aktaş

Defter № 65 · 22 Eylül 2026

EN

Defterin tamamı

Yapım Günlüğü

65 kayıt, girişime göre gruplanmış — her satır gerçek bir tarih, gerçek bir ilerleme notu.

35

Payda

35 kayıt

Esnaf modu gitti, kişisel panel geldi

Bugün Payda'yı sadeleştirdim: esnaf modunu ve ona bağlı tahsilat, veresiye, üyelik, e-ticaret gibi yan sistemleri önce yedekleyip sildim, yalnız yüzdelik sistem kaldı. Ardından herkesin kendi adını ve fotoğrafını her projede aynı gösterebildiği bir Profilim alanı ekledim. Üstüne YouTube, Instagram, TikTok, Threads ve X için günden güne takip kurdum; artık tek satırda 'bugün toplam kaç beğeni, kaç yorum aldın' görünüyor. Hepsi yine tek Claude üyeliğiyle, testleri yeşil geçerek canlıya çıktı.

Kopilot tek akışa indi, sami skill denetiminden geçti

Kopilot sayfası iki paralel akış taşıyordu; tek kutu, tek gönder tuşu, tek sonuç kartına indirdim ve 12 uzman modlu denetimin bulduğu 20'den fazla açığı (idem anahtarı, metin kaybı, kaydırma, balon-kasa örtüşmesi, uzun sohbette hükmün kaçması) dört turda kapattım. Her tur 13 kapı ve tarayıcı testinden geçti, canlıya çıktı. Hepsi tek Claude Pro üyeliğiyle, kanıtsız tek satır iddia yok.

Numaranın yanına tutar, kartın üstüne 'Şimdi ne oldu?', sohbetten fiyat listesi ve banka kendiliğinden doluyor

Sami'nin üç isteğini tek akışa bağladım: ayrı 'Gelir ekle' tuşu kalktı, müşteri numarasının yanında tutar var; müşteri bulununca kartın en üstünde 'Şimdi ne oldu?' — satış olduysa geliri kaydet, olmadıysa almadı notu — önceki kayıtlar altta. En keyiflisi: yapıştırılan sohbette hangi hazır metin (fiyat listesi, IBAN) geçiyorsa fiyat listesi ve banka alanı kendiliğinden doluyor, yapay zekâ çağrısı yok, ücretsiz. Kural gevşemedi: eşleşme yoksa soru yine sorulur, elle seçim ezilmez. 16 yeni test, 320px'te taşma sıfır, hepsi Claude ile.

Tasarımı canlıya birebir taşıdım: sol menü, tek sütun Özet, Ayarlar grupları

Claude Design'da çizdiğim yenileme canlıda yarım kalmıştı; bugün planı adım adım uyguladım: masaüstünde sol menü ve sayfa başlığı, Özet'te KPI şeridi ile yan yana Kasa ve Ödenecekler, Defter'e tür seçicili Kayıtlar tablosu, Ekip'e hakediş tablosu, Ayarlar'a sol grup listesi. Her parça 13 test kapısından ve parolasız ekran ölçümünden (320px'ten 1280px'e taşma sıfır) geçti. Bir dağıtımı kendim durdurdum — testler koşarken bir belge düzenledim, deploy.sh yakaladı — ve temiz ağaçla yeniden çıkardım. Hepsi Claude ile.

Süper app araştırması: Payda iyi bir defter, ama defter

Sistem oturdu, bugün tek satır kod yazmadım — "süper app" fikrini araştırdım. Önce bugünkü envanteri çıkardım: 29 uç, 8 koleksiyon, 1.400 kontrol; para tarafı (4-göz onayı, işlem anında mühürlenen kurlar, ortak carisi, dönem kapatma, denetim izi) gerçekten sağlam. Ama tek cümlelik gerçek şu: Payda'daki her sayı, başka bir yerde olmuş bir şeyin insan eliyle yazılmış kaydı — satış başka yerde oluyor, reklam başka yerde harcanıyor, para başka yere düşüyor. Süper app kalıbının üç sütununa baktığımda kimlik güçlü çıktı, ödeme yalnızca kayıt düzeyinde, mini-app platformu ise bu ölçekte gereksiz; benim bağlamımda süper app "defterden tezgâha geçmek" demek. Beş aday yön listeledim — konuşma katmanı, banka ekstresi eşleştirme, biriken veriye soru soran bir zekâ katmanı, çalışan için kurulabilir uygulama ve bildirim, çoklu ekip — ve karar vermeden önce kendime üç soru bıraktım.

Ürün Stratejisi · Araştırma · Süper App · Yol Haritası

Pasife alma düğmesi geldi, iki test kapısı kör çıktı

Dört maddelik kısa bir tur: üye kartına pasife alma düğmesi (ceza için de tatil için de aynı düğme — pasif üye projeyi listesinde göremiyor, veri yazamıyor, ama hakedişi ve geçmişi duruyor, pasifken bile ödeme yapabiliyorum), çalışanın reklam hesabı atamasının davetten sonra da değiştirilebilmesi, reklam hesabı kartında "bugüne kadar harcanan" satırı ve elle payment girişinin tamamen kapatılması — ödeme kayıtlarını artık yalnız sistemin kendi akışları üretiyor. Denetçi onay metnindeki yanlış vaadi yakaladı: "pasife alınan üye giriş yapamaz" yazıyordu, oysa hesap kapanmıyor, düşen şey proje erişimi; metin gerçeğe çekildi ve test artık yanlış vaadin yokluğunu da ölçüyor. Turun asıl bulgusu ise iki kapının kör olmasıydı — dünkü parite kapısı bayat istisnayı fark edemiyordu ve şablon bağ kapısı 16 iç listenin satır özelliklerini hiç denetlemiyormuş; kapsam 75 bloktan 87'ye çıktı. Dokuz mutasyonun dokuzu da kapıları adıyla kırdı; commit aa18bb2, 1.400 kontrol yeşil.

Üye Yönetimi · Reklam Hesapları · Test Kapıları · Emülatör Testi · Cloud Functions

Backend'de olan her şey arayüzde var mı: parite kapısı ve ölü kod süpürmesi

"Backend'de olan her şey frontend'de var mı?" sorusunu iki yönlü bir denetime çevirdim: her uç, çok-op'lu uçların her bir op'u ve sunucunun yazdığı alanlar tek tek "arayüzden ulaşılabilir mi" süzgecinden geçti. Uç düzeyinde 26 callable'ın 26'sı da bağlıydı, ama alt-op düzeyinde beş gerçek boşluk çıktı — reklam hesabının adı ve uyarı eşiği kuruluştan sonra değiştirilemiyordu, yanlış girilen hatırlatma silinemiyordu, eski satışları taşıyarak kategori yeniden adlandıran uç hiç tetiklenemiyordu; hepsini bağladım. Ölü kod tarafında silinen her parça grep kanıtlıydı (eski vardiya modelinin rotationQueue kalıntısı, yazılıp hiçbir yerde okunmayan lastProduct alanı, ölü CSS ve state) ve bağımsız bir denetçi ajan hem silinenleri hem "kullanılıyor" denilenleri rastgele örneklemle doğruladı. Asıl kazanç tek seferlik temizlik değil: "her uç ya arayüzden çağrılır ya gerekçeli istisnadır" kuralı artık teste bağlı — kapıyı üç sabotajla sınadık, üçünde de suçluyu adıyla yakaladı. Aynı turda satış girişine opsiyonel kısa not alanı geldi (müşteri kartındaki alım satırında görünüyor, boş bırakılınca hiç yazılmıyor); commit 85bfb79, 1.322 kontrol yeşil.

Ölü Kod Temizliği · Parite Kapısı · Cloud Functions · Kod Denetimi · Test

Vardiya sırasını elle dizme, 40 gün vade hatası ve bölünen müşteri kayıtları

Dün akşam başlayan beş maddelik tur sabah canlıya çıktı. Vardiya listesinde her satıra ↑/↓ taşıma okları geldi — sıra artık elle dizilebiliyor ve taşıma kimsenin çalışma saatini değiştirmiyor, yalnız devir dizilişini değiştiriyor. "40 gün" diye gördüğüm vade hatası gerçekti ve sandığımdan derindi: formül şablonun ödenmemiş ilk ayını atlıyordu, üstüne Öde'ye basınca sunucu "bu ay zaten ödendi" diye reddediyordu; kural sunucu ve istemciye birebir aynı yazıldı, 1.344 kombinasyonluk ızgara testinde red penceresi sıfır çıktı. Müşteri kayıtları da kaybolmuyormuş, bölünüyormuş — aynı numara "0555…", "+90 555…" gibi farklı yazımlarla ayrı dokümanlara düşüyordu; sunucu artık hepsini tek kanonik anahtara indiriyor ve canlıdaki 121 müşteri kaydı kopyala-doğrula-sil ile taşındı, sıfır kayıp. Grup bazlı kalan pastası ve ödeme formunun üstündeki "hangi gruptan öde" rehberi de aynı dağıtımda; commit fe7122d, 1.212 kontrol yeşil.

Vardiya Rotasyonu · Vade Hesabı · Veri Migrasyonu · Firestore · Test

İş modeline göre köklü sadeleştirme canlıda

Payda bugün en büyük değişimini yaşadı: iş modeline uymayan her şey silindi, kalan her şey tek kurala oturdu. Komisyon artık tek model — satıştan brüt yüzde; maaş ve satış-başı modeller, görev atama, bankacı giriş rolü ve genel gider kategorileri tamamen kaldırıldı. Satış girişi dört zorunlu alana indi (hesap, banka, kategori, üslup), müşteri kaydına numara bazlı engelleme geldi (taciz eden müşteri hangi hesaptan gelirse gelsin sorguda 🚫 ENGELLİ çıkıyor), görevlerin yerini hesaba bağlı tarihli hatırlatmalar aldı. Silmenin en zor kısmı kod değil kanıttı: her silinen parçanın gerçekten çağrılmadığı grep kanıtıyla raporlandı, bağımsız bir denetçi ajan rastgele örneklemle doğruladı ve test takımı yeni modele göre yeniden yazıldı — 1140 kontrol yeşil. Canlıdan da dört ölü fonksiyon silindi; biri açık kalsaydı dört-göz onayını atlatma yolu olurdu.

Sadeleştirme · Ölü Kod Temizliği · 4-Göz Onayı · 1140 Test

E-posta doğrulama şeridi ve teslimat çalışması

Doğrulanmamış e-postayla girenlere artık panelde bir güvenlik şeridi çıkıyor: 'Doğrulama e-postası gönder' tek tık. Hızlı işlem formundaki kapanma hatası da düzeltildi; ikisi de canlıda doğrulandı. Sıradaki iş belli: e-postalarımızın spam klasörüne düşmemesi için teslimat (SPF/DKIM) çalışmasına başladık.

E-posta Doğrulama · Güvenlik · UX

Canlıda kullanıcı testi: giriş ve e-posta onayı düzeldi

Sentetik bir hesapla siteye gerçek kullanıcı gibi girdim: kayıt ol → çıkış → tekrar giriş → işlem. Testin yakaladıkları aynı gün kapandı: yeni üyeye doğrulama e-postası gitmiyordu, onaysız üyelik mümkündü, şifre sıfırlama sonrası giriş takılıyordu — hepsi düzeltildi. Arayüzde sağ üstteki zil kalktı; bildirimler Özet'e taşındı ('Okundu' ve 'Tümünü okundu' ile), gelir/gider formu artık yerinde açılıyor. 8 maddelik düzeltme listesinin tamamı canlıya alındı.

Firebase Auth · E-posta Doğrulama · UX

Vardiya rotasyonu: +1 saat kayar kuyruk canlıda

Vardiya sistemi artık ekipteki herkesi sırayla döndürüyor: her döngüde sıradaki kişinin vardiyası +1 saat kayıyor, kimin ne zaman geleceği 9 döngü önceden görünüyor. Panele 'şu an vardiyada' rozeti ve rotasyon sekmesi (şu anki/sıradaki kişi + bildirimler) eklendi. 16'sı gecesi başlayıp sabaha karşı bitirdik; 182 testin tamamı yeşil, deploy edildi.

Rotasyon Kuyruğu · Bildirimler · 182 Test

Gerçek app bottom-sheet: + yerinde form açıyor

Haklı bir eleştiriyi düzelttim: 'Ekle' butonu boş bir yönlendirme ekranı açıyordu, hepsi özete gidiyordu — gereksizdi. Artık '+' butonuna basınca telefon uygulamalarındaki gibi aşağıdan gerçek bir işlem formu (bottom sheet) yükseliyor: Gelir/Gider seç, tutarı gir, kaydet — anında kaydediyor ve kapanıyor, hiçbir yere gitmiyorsun. Yerinde, akıcı, native app hissi. Masaüstünde ortalı bir kart, mobilde tam genişlik olarak çalışıyor. 166 test yeşil, canlıda.

Bottom Sheet · Mobil UX · Test

Telefon uygulaması hissi: alt navigasyon + büyük butonlar

Payda'ya gerçek bir telefon uygulaması hissi verdim: üstteki sekmeler yerine artık altta sabit, yüzen bir navigasyon çubuğu var — Özet, Defter, ortada kocaman '+' Ekle, Ekip ve Ayarlar. Ekle'ye basınca 'Ne eklemek istiyorsun?' diye iki dev kart çıkıyor (Gelir / Gider) ve tek dokunuşla forma götürüyor. Baş parmakla tek elle kullanım çok kolaylaştı. Masaüstünde de yüzen bir bar olarak şık duruyor. Hepsini emülatörde deneyerek doğruladım, 166 test yeşil, canlıda.

Alt Navigasyon · Mobil UX · Test

Sekmeli panel (buton mantığı) + ölü kod temizliği

Payda'nın uzun kaydırmalı yönetici panelini buton mantıklı sekmelere böldüm: üstte sabit üç büyük sekme (Özet · Defter · Ekip & Vardiya), her biri diğerini gizliyor — artık aşağı kaydırmadan bölüm değiştiriyorsun, kişisel vardiya/görev özeti hep üstte. Sonra da daha önce kaldırdığım özelliklerden (banka preseti, bankacı bakiye-yükleme paneli) geriye kalan ölü kodu temizledim — 16 kullanılmayan bağ ve 3 ölü fonksiyon gitti; bankacı ve yönetici ekranlarını canlı deneyerek beyaz-ekran/hata olmadığını doğruladım. Masaüstü+mobil, 166 test yeşil.

Sekmeli Arayüz · Refactor · Test

Görsel derinlik + dokunsal butonlar + canlı deneyim testi

Bu kez Payda'yı gerçekten kullanarak test ettim: emülatörde açıp her bölümü tıkladım, ayarları açtım, arayüzden gelir/gider ekledim — hepsi çalıştı, konsol hatası yok. Şikayet edilen 'düz/flat' görünümü giderdim: KPI kutularına üstte accent çizgisi ve katmanlı gölge, kartlara yumuşak derinlik ve hover kalkışı, tüm butonlara dokunsal his (üstüne gelince parlama, basınca içeri gitme), bölüm başlıklarına accent nokta ekledim. Sadece CSS ve metin; iş mantığına dokunmadım, 166 test yeşil, masaüstü+mobil sağlam.

Tasarım · CSS · Deneyim Testi

Vardiya takip sistemi + para dalgalanması düzeltmesi

Bugün Payda'ya vardiya takip sistemi ekledim: dönen vardiyaları (örn. 12:00 başla, her gün +1 saat kay) otomatik hesaplıyor, herkes kendi ve ekibin saatlerini görüyor, vardiyaya yarım saat kala kırmızı geri sayım uyarısı çıkıyor. Bir de sinir bozucu bir hatayı düzelttim: sabit giderin fiyatı canlı döviz kuruyla oynuyordu — artık girdiğin tutar girdiğin para biriminde sabit duruyor. Yönetici/ortak için 'hangi bankada kesintiden sonra ne kadar kaldı' ekranı ve almayan müşteriye hangi hesaptan denendiğini yazma alanı da geldi. 166 kontrol yeşil, masaüstü ve mobilde doğruladım.

Vardiya · Döviz Sabitleme · Test

Bankacı e-postasız, ortak payı otomatik, banka karmaşası kalktı

Payda'yı daha da sadeleştirdim: bankacıyı artık e-posta olmadan sadece isim ve yüzdeyle ekleyebiliyorsun (biz bilelim yeter; daveti sonra göndeririz). Ortak payı artık net kârdan otomatik ve her ortak KENDİ yüzdesini görüyor — önceden hep ilk ortağın yüzdesi görünüyordu, bunu düzelttim. Kafa karıştıran 'banka hesabı ödetme' preset'ini tamamen kaldırdım. Hazır metinler artık tek dar kolon yerine ekranı dolduran grid. 162 otomatik kontrol yeşil, canlıda.

Sadeleştirme · Kâr Payı · Test

Gereksizleri attım: notlar, bankacı karmaşası, sabit üslup

Bugün Payda'yı sadeleştirdim: gereksiz bulunan 'notlar' özelliğini tamamen kaldırdım; satış ve görüşme üslubunu artık sabit (yumuşak/nötr/sert) seçenekler yerine kişi kendi yazıyor; bir müşteriye olumsuz dönüş kaydederken 'hangi banka gösterildi' de tutuluyor; ve bankacının kafa karıştıran 'bakiye yükle/gider gir' panelini kaldırdım — gider artık yalnız yönetici/ortak işi. 159 otomatik kontrol yeşil, canlıda.

Sadeleştirme · UX · Test

Ortak onayı genişledi, çevrimiçi göstergesi, güvenlik taraması

Bugün Payda'da 4 iş: (1) müşteri numarasını aratınca hangi hesaptan hangi bankaya ödediği de görünüyor. (2) Ortak varken artık sadece kâr payı değil; üye %'si değiştirme, üye çıkarma ve proje silme de diğer ortağın onayına düşüyor — kimse tek başına yapıyı bozamıyor. (3) Ortaklar çalışan/ortakların çevrimiçi olup olmadığını yeşil noktayla görüyor. (4) OWASP Top 10 güvenlik taraması: erişim kontrolü, XSS, başlıklar, enjeksiyon — hepsi temiz; kalan iki madde (2FA, bot koruması) panelden açılacak. 163 otomatik kontrol yeşil, canlıda.

4-Göz Onayı · OWASP · Test

Satış üslubu + kıl müşteri takibi + genel görev

Bugün Payda'nın mini-CRM'ini büyüttüm: artık her satışın hangi üslupla (yumuşak/sert) ve hangi yöntemle yapıldığı kaydediliyor. Daha önemlisi, satın ALMAYAN müşterileri de kaydedebiliyoruz — 'bu numarayı şu hesaptan yumuşak tonla denedik, almadı, olumsuz döndü' gibi. Böylece aynı kıl müşteri başka bir hesaptan tekrar denendiğinde geçmişi görünüyor. Bir de tek tuşla herkese görev atama ekledim. 142 otomatik kontrol yeşil, canlıda.

Mini-CRM · Görevler · Test

Tüm roller için yetki denetimi + 3 düzeltme

Bugün Payda'yı beş rolün (yönetici, ortak, bankacı, çalışan, pay ortağı) gözünden uçtan uca denetledim: her rol verilen yetkinin dışına çıkmayı denedi ve sistem hepsini reddetti. Bu sırada bir açık buldum — yetkisiz bir çalışan ekip notlarını silebiliyordu; kapattım. Ayrıca hiç işe yaramayan bir yetki anahtarını temizledim ve bankacının varsayılan yetkisini işine göre daralttım. Otomatik güvenlik testini 104'ten 131 kontrole çıkardım, hepsi yeşil, canlıya aldım.

Yetki Denetimi · Güvenlik · 131 Test

Yeni arayüzde panel çalışıyor

Faz 2'nin en büyük parçası düştü: yönetici paneli artık yeni React arayüzünde — KPI'lar, dönem ve para birimi anahtarları, geri sayımlı yaklaşan ödemeler, hızlı gelir/gider, defter ve CSV. Hepsini emülatörde gerçek akışla doğruladım: satış ekledim, sildim, kirayı ödedim, hatalı girdinin reddedildiğini gördüm. Kanıt dosyası ve denetim kapısı yeşil; canlı site hâlâ eski arayüzde, geçiş güvenli ilerliyor.

React · TypeScript · Emülatör Testi

Yeni React arayüzünün ilk ekranları çalışıyor

Faz 2'de somut ilk adım: Payda'nın yeni React+TypeScript arayüzü ayağa kalktı — giriş, üye olma, şifre sıfırlama ve Projelerim ekranı birebir taşındı. En güzel kısmı: yeni arayüz backend'le artık tipli bir sözleşme üzerinden konuşuyor; ilk projeyi bu kanaldan oluşturup emülatörde uçtan uca doğruladım. Canlı site hâlâ eski arayüzde, geçiş ekran ekran ve testli ilerleyecek.

React · TypeScript · Tip Sözleşmeleri

Faz 1 bitti: repo düzeni, CI ve tip sözleşmeleri

Payda'yı büyük yeniden yapılanma planına soktum ve ilk fazı bitirdim: proje artık gerçek bir git deposu; kök çalışma alanı, mimari/veri modeli dokümanları ve GitHub Actions test kapısı hazır. Eski prototipler arşive kalktı, açıklı paketler güncellendi (yüksek riskli açık kalmadı) ve 104 test hâlâ yeşil. Üstüne Faz 2'nin ilk taşını koydum: frontend ile backend'in ortak dili olacak tip sözleşmeleri. Tek Claude oturumu, tam şeffaflık.

Git · CI/CD · Tip Sözleşmeleri

Yaklaşan ödemelere geri sayım

Bugün Payda'ya küçük ama günlük hayatta en çok bakılacak şeylerden birini ekledim: sabit aylık ödemeler artık geri sayımla görünüyor — 'kira, her ayın 5'i, 4 gün sonra ödenecek' gibi. Panelin tepesinde Yaklaşan Ödemeler kartı en yakın ödemeyi üste alıyor; bugün ödenecekler kırmızıya dönüyor. Matematiğini birim testiyle doğrulayıp yayınladım.

Geri Sayım · Ödemeler · Birim Testi

Ödeme onayı + backend'i modüllere böldüm

Bugün ortakların çalışan/bankacı ödemelerini parça parça ya da tek seferde yapabilmesini ekledim; ikinci ortak varsa değişiklik ona onaya düşüyor (4-göz). Sonra 800 satırlık backend'i tek dosyadan lib/core + handlers/ (proje, işlem, üye, finans, görev, paylaşım, zamanlanmış) diye modüllere böldüm — davranış birebir aynı kaldı, 104 test hâlâ yeşil. Ölü kodları da attım. Hep tek Claude oturumu.

Cloud Functions · Modüler Mimari · Test

Mini-CRM, görev sistemi ve tekrarlı gider otomasyonu

Bugün Payda'ya gerçek bir mini-CRM ekledim: bir numarayı aratınca kişinin alıcı olup olmadığı, ne aldığı ve satışı KİMİN girdiği satır satır çıkıyor; müşteri notu da tutuluyor. Yanında gerçek görev sistemi (yönetici atar, çalışan 'Görevlerim'den tamamlar), aylık sabit giderler için otomatik işleyen zamanlanmış fonksiyon ve bir kâr-payı bug'ı düzeltmesi geldi. Test paketi 84/84 yeşil, hepsi tek Claude oturumunda.

Mini-CRM · Görev Sistemi · Zamanlanmış Fonksiyon

Lansman öncesi büyük tarama: 10 eksik, 10 çözüm

Bugün Payda'yı lansmana hazırlarcasına baştan taradım: dönem filtresi, CSV dışa aktarım, satış silmede tam ters kayıt, KVKK sayfaları, hesap paneli, PWA manifesti ve daha fazlası — bulduğum 10 eksiğin 10'unu da aynı gün kapattım. Güvenlik turunda CSV formül enjeksiyonunu ve çift-silme yarışını da yakalayıp düzelttim; test paketi 68/68 yeşil. Hâlâ tek Claude oturumu, hâlâ build in public.

KVKK · PWA · CSV Dışa Aktarım · Güvenlik Denetimi

Müşteri kaydı (mini-CRM) ve modüler yetkiler

Satış girerken artık isteğe bağlı müşteri numarası ve ürün eklenebiliyor; bir numarayı aratınca kimin ne aldığı ve hangi hesaptan alındığı görünüyor. Müşteri bilgisi kişisel veri sayıldığı için yalnızca yetkisi olan görebiliyor. Yetkilendirme tamamen modüler hale geldi: rol ekranı belirliyor, her yetenek tek tek açılıp kapanabiliyor (örneğin bankacıya sadece bankacılık, istenirse reklam da). 61 entegrasyon testinin tamamı geçti; backend ve arayüz canlıya alındı.

Cloud Functions · Firestore Rules · Güvenlik (PII) · Entegrasyon Testi

3'ü 1 arada: tasarım, güvenlik, SEO

Bugün Payda'ya üç uzman ajanı birden saldım: tasarımcı OKLCH token'lı, mobil uyumlu ve erişilebilir bir tasarım sistemi kurdu; güvenlik uzmanı OWASP denetiminde yüzde alanlarını ve tutar sınırlarını sıkılaştırdı; SEO ajanı da hreflang, favicon ve WebSite schema'sını ekledi. Aralarda müşteri kaydı (mini-CRM) ve tamamen modüler yetki sistemi de canlıya çıktı — 61 güvenlik testi hâlâ yeşil. Hepsi tek Claude oturumunda, ben sadece yön verdim.

Tasarım Sistemi · OWASP Denetimi · SEO

reCAPTCHA ile bot koruması

Payda'nın giriş ve kayıt akışına reCAPTCHA ekleyerek otomatik/bot kötüye kullanımına karşı koruma getirdik.

reCAPTCHA · Güvenlik

Rol yetkileri ve proje yönetimi

Kimin neyi görüp neye müdahale edebileceğini tanımladık: çalışan, partner ve bankacı rolleri. Proje oluşturma/silme akışını güvenli onaylarla düzelttik; hata ayıklama ve güvenlik denetimi planını faz faz uyguladık.

Firebase · Rol/Yetki · Güvenlik

Banka seviyesinde güvenlik ve veri izolasyonu

Giriş, e-posta doğrulama ve şifre sıfırlamayı çalışır hale getirdik ve tüm özellikleri gerçek backend'e bağladık. En önemlisi mimariyi 'çalışan başkasının verisini göremez/değiştiremez' olacak şekilde rol-izolasyonlu kurduk — banka standartlarına yakın, tüm yazma işlemleri sunucu tarafında.

Firestore Rules · Firebase Auth · Güvenlik

Payda serüveni başlıyor

Proje yönetim ve muhasebe platformu Payda'yı Firebase'e kurduk: veritabanı, kimlik doğrulama ve barındırma. Tüm veri altyapısını sıfırdan oluşturduk.

Firebase · Firestore · Firebase Auth

12

Ekran Çeviri

12 kayıt

Grok API'den vazgeçtim: tek yapay zeka merkezi Claude

Grok API aboneliğini iptal ettim; bundan sonra tek yapay zeka merkezim Claude. Ekran Çeviri'nin çeviri motoru Grok'a bağlıydı — kodda Google ve Bing motorları yedek olarak duruyor, ama kalite kapıları Grok yolunu varsayıyor. Yani bu iptal, uygulamanın çeviri hattında yeniden düzenleme gerektiriyor; kod hâlâ GrokMotor'u içeriyor. Vazgeçilen kararları da yazıyorum, çünkü build in public sadece işe yarayanları değil, geri alınanları da göstermek demek.

Grok API · Claude · Çeviri Motoru · Karar Değişikliği

Depoyu Windows'a indirdim ve v1.1.0'ı yayınladım

Eski platform kaynağını depodan çıkarıp (git geçmişinde duruyor) Windows projesini köke taşıdım ve README'yi baştan Windows kullanıcısına göre yazdım. API anahtarı akışını uçtan uca bağladım: anahtar ilk açılışta soruluyor, yazarken maskeleniyor, Windows'un kendi şifrelemesiyle (DPAPI) saklanıyor ve ayar dosyasına asla düşmüyor; 'xai-' ile başlamayan metin reddediliyor, çünkü yanlış yapıştırma bütün çevirileri sessizce bozuyordu. GitHub Actions gerçek bir Windows makinesinde 54/54 testi geçirdi ve kurulum gerektirmeyen 74 MB'lık tek dosyalık .exe'yi üretti — testler geçmezse .exe hiç çıkmıyor.

Yayın · GitHub Actions · DPAPI · API Anahtarı

Beş Uzman Denetimi: 77 Bulgu ve Ekrandan Gelen Talimat Riski

Arka planda beş ayrı uzman bakış açısıyla (sistem, güvenlik, dilbilim, UX, QA) denetim koşturdum; 77 bulgu çıktı, tekrarlar elenince 18'e indi. En kritiği güvenlikti: karşı tarafın ekrandaki mesajları sistem talimatına ham giriyor ve çıktı ben okumadan yapıştırılabiliyordu, yani ekrandaki bir metin bana mesaj yazdırabilirdi — güvenilmez içerik artık veri olarak etiketleniyor. Dilbilimci "1,5 saat 150 chf" girdisinin giden mesajda "15 stund 150"ye dönüştüğünü yakaladı; sayı koruma kuralı ve kalite kapısı ekledim. Ayrıca sızmış xAI anahtarı için önce yedek alıp 13 commit'lik git geçmişini yeniden yazdım ve QA'nın en sinsi bulgusunu kapattım: testler üretim kodunun kopyasını doğruluyordu, artık gerçek fonksiyonları çağırıyor.

Güvenlik · Prompt Injection · Git Geçmişi · Test · Denetim

Windows sürümünü sıfırdan ikinci bir uygulama olarak yazdım

Arkadaşlarım Windows kullandığı için mevcut sürümü 'uyarlamak' mümkün değildi — ekran yakalama, yazı tanıma ve arayüzün tamamı platforma özgüydü. C# / .NET 8 / WPF ile ayrı bir uygulama yazdım: yakalama GDI BitBlt, yazı tanıma cihazda çalışan Windows.Media.Ocr, çeviri katmanı tıklamayı geçiren WPF katmanlı pencere, kısayol RegisterHotKey + SendInput. Çeviri zekâsının tamamını (lehçe algılama, sözlükler, istemler, rakam ve fiyat koruma kapıları) birebir taşıdım. 44 saf mantık testini koşturdum ve test gerçek bir hata yakaladı: 'chli' kelimesi Zürih'in güçlü işaret listesindeydi, oysa Bern'de de kullanılıyor — Bern lehçesiyle yazan birine Zürih lehçesinde cevap yazılıyormuş; iki sürümde de düzelttim.

Windows · C# · .NET 8 · WPF · Port

Denetim 32 kusur çıkardı; en kötüsü silinen fiyatlardı

'Çeviriler yanlış anlaşılacak kadar bozuk' şikayetinin kökünü buldum: canlı modda bloklar yalnız ekrandaki konumlarına bakılarak eşleştiriliyordu, metne hiç bakılmıyordu — yeni mesaj gelip liste yukarı kayınca her mesaj bir üsttekinin çevirisini alıyordu. İkinci ağır hata daha sinsiydi: saat damgası temizleyicisi 12.50 (fiyat), 10-15 (süre) ve 12.05 (tarih) desenlerini de saat sanıp metinden siliyordu; düzeltmeden sonra ölçtüm, sayı kaybı 0/5. Ayrıca ekran yakalama çağrılarına zaman aşımı koydum — yanıt gelmezse iş kuyruğu kalıcı kilitleniyordu — ve kirlenmiş çeviri hafızasını sürümleyip temizledim, çünkü uygulamanın kendi çıktısı ve tek harflik anahtarlar orada kayıtlıydı.

Denetim · Çeviri Doğruluğu · OCR · Hata Düzeltme

"Bölgeyi Çevir"i Sessizce Öldüren Kilitlenmeyi Buldum

Uygulamayı kapatıp tekrar "Bölgeyi Çevir" dediğimde hiçbir şey olmuyordu — uyarı da yoktu. Sebep, arka plan iş kuyruğunun ortasında ana iş parçacığını bekleyen bir çağrıydı: ana iş parçacığı bir pencereyle meşgulse sıra kilitleniyor ve "çeviri sürüyor" bayrağı sonsuza dek açık kalıyordu. Bekleyen çağrıyı kaldırdım, onay penceresini kuyruktan çıkardım, takılı işi 15 saniye sonra iptal eden bir kurtarma ve 5 saniyede bir kontrol yapan sağlık bekçisi ekledim. Kendi senaryomu 20 tur koşturdum, 20/20 temiz geçti; bu döngü artık yayın kapısında, testler geçmeden paket üretilmiyor.

Swift · Eşzamanlılık · Deadlock · Test Otomasyonu

Çökmenin kök nedeni: aynı veriye iki iş parçacığından yazmak

Uygulama arada çöküyor, arada ağ hatası verip hiç çevirmiyordu. Denetimde çeviri önbelleği, blok listesi ve çeviri metinlerine iki iş parçacığından aynı anda erişildiğini buldum — bu bellek bozulması, yani çökme demek; hepsini kilitledim ve 8 kuyruk × 3.000 turluk saldırı testinde tek çökme almadım. Ağ tarafında tek bir geçici hata tüm çeviriyi düşürüyordu; kendi ağ oturumumu açıp 0,6 ve 1,8 saniye arayla 3 deneme koydum, erişilemez adreste bekleme 11 saniyeden 0'a indi. Üçüncü sorun bendendi: gün içinde ~20 kez yeniden derlediğim için uygulamanın imzası her seferinde değişiyor ve sistem erişilebilirlik iznini iptal ediyordu — sabit bir imza kimliği oluşturup iznin derlemeler arasında korunduğunu doğruladım.

Çökme · Eşzamanlılık · Ağ Dayanıklılığı · İzinler

Yerel Çeviri Hafızası Kurdum, OCR'da Harf Düşmesini Ölçüp Kapattım

Her çeviriyi diske kaydedip yeni mesajda önce hafızaya bakan bir akış kurdum: aynı mesajların ikinci çevirisi 8.3 saniyeden 0.00 saniyeye indi, OCR metni biraz farklı okusa bile bulanık eşleşme yakalıyor ve motora hiç gitmiyor. "Harf düşmesi" şikayetinin kök nedenini ölçerek buldum — metin Vision'a çok küçük gidiyordu; Lanczos ile büyütünce karakter hata oranı %0.50'den %0.16'ya, tam doğru satır oranı %88.5'ten %96.6'ya çıktı. Yol boyunca çevirilerin yanlış mesajlara yazılmasına yol açan numaralandırma hatasını yakalayıp sıralamayı modele emanet etmeyi bıraktım ve regresyon testi ekledim. 6 dakikada 31 MB'dan 106 MB'a büyüyen bellek sızıntısını da kapattım; şimdi 81 MB'da sabit.

OCR · Apple Vision · Önbellek · Bellek Sızıntısı · Grok API

İsviçre Almancası lehçelerini tek tek ayırt etmeyi öğrettim

Uygulama düz Almanca'yı çeviriyordu ama İsviçre Almancası'nda saçmalıyordu; asıl ihtiyacım tam da oradaydı. Gerçek sohbet geçmişinden 15.610 mesajlık bir altın test seti çıkardım ve Züridütsch, Bärndütsch, Baseldytsch, Doğu İsviçre, Wallis lehçelerini otomatik ayırt eden bir algılama yazdım — panel hangi lehçede olduğunu gösteriyor ve benim Türkçe yazdığım cevap da o lehçede yazılıyor. Sohbet geçişi testinde Bern → Zürih → Bern → Hochdeutsch geçişlerinin hepsi doğru çıktı; 31/31 birim testi ve 6 dakikalık 40 turluk dayanıklılık testi hatasız geçti. Bir de yerel çeviri hafızası ekledim: daha önce çevrilmiş bir cümle modele hiç gitmiyor.

Lehçe Algılama · İsviçre Almancası · Test · Çeviri Hafızası

Kısayolla yazdığımı çevirme ve pakete sızan API anahtarı

Türkçe yazdığım mesajı kısayola basınca karşı tarafın dilinde ve seçtiğim üslupta yeniden yazan bir özellik ekledim; kısayolu artık uygulama içinden atayabiliyorum. Denetimde paketleme betiğinin geliştirme makinemdeki config.json'u uygulama paketine varsayılan ayar olarak kopyaladığını gördüm — yani kişisel API anahtarım dağıtılan pakete giriyordu; bunu kestim. Ayrıca 13 ağsız birim testi yazıp yayın betiğini testlere bağladım: testler geçmeden paket üretilmiyor.

Kısayol · Güvenlik · Test · Yayın Kapısı

Uygulama kendi çevirisini okuyup tekrar çeviriyordu

Canlı modun sonsuz döngüye girdiğini fark ettim: ekrana yazdığı Türkçe çeviriyi bir sonraki turda 'yeni mesaj' sanıp tekrar çeviriyordu. Çeviri katmanını ekran yakalamanın dışına aldım, döngü kapandı. Aynı turda motorları zincire bağladım — Bing → Google → Grok; biri düşerse diğeri devralıyor ve panelde hangisinin çalıştığı yazıyor. Ayrı sohbet balonlarını tek blok sanıp birleştiren gruplama mantığını da düzelttim, çünkü birleşen balonlar anlamı tamamen bozuyordu.

Canlı Çeviri · OCR · Çeviri Motoru · Balon Gruplama

Alfred betiğini gerçek bir masaüstü uygulamasına çevirdim

İş, Alfred'e bağlı tek bir çeviri betiği olarak başlamıştı; onu menü çubuğunda kendi başına duran kurulu bir uygulamaya taşıdım. Ekranda bir bölge seçiyorsun, uygulama o alandaki yazıyı okuyup çeviriyi geri veriyor. Yol boyunca iki tuzağı çözdüm: arka plan uygulaması olduğu için işletim sistemi uygulamanın tüm bildirim pencerelerini sessizce gizliyordu ve ekran kaydı izni doğru kimlikle istenmiyordu. İlk gün sonunda uygulama gerçekten açılıp bölge seçebiliyordu.

Masaüstü · OCR · Ekran Yakalama · Menü Çubuğu

14

samiaktas.com

14 kayıt

Defterin kendi verisini denetledim: mükerrer girişim ve id çakışmaları

Bu kez kodu değil defterin kendi verisini denetledim ve altı somut hata çıktı: girişim listesinde "Payda" iki kez kayıtlıydı (anasayfadaki şişik sayaç hatasının asıl kök nedeni buymuş — kodda savunma vardı ama veri hâlâ kirliydi), dört kayıt numarası ikişer kez kullanılmıştı (10, 30, 31, 32), dört kayıt içeriksiz otomatik girdiydi ve bunların bir kısmında Ekran Çeviri ile Devam işleri yanlışlıkla samiaktas.com'a atanmıştı, beş kaydın etiketi boştu ve bir kayıt İngilizce sayfada Türkçe görünüyordu. Ayrıca 16 Ağustos'tan beri deftere hiç işlenmemiş iş birikmişti. Hepsini tek geçişte düzelttim: mükerrer girişim kaldırıldı, çakışan numaralar yeniden verildi, içeriksiz kayıtlar gerçek işleriyle değiştirilip doğru girişime taşındı, eksik etiketler ve çeviri tamamlandı.

Firestore · Veri Kalitesi · i18n · İçerik

Denetim sonrası onarım: 36 değişiklik, 18 dosya, bağımsız doğrulama

Denetimin ardından onarım fazını koşturdum: çakışmayan beş grupta 36 değişiklik uygulandı, 18 dosya değişti ve sitenin kimlik üretimi (kayıt numarası, proje slug'ı, sayfa ankoru, JSON-LD kimliği) dört ayrı yerde kopyalanmak yerine tek bir yeni modülde toplandı. Yayında görünen üç doğruluk hatası düzeldi: aynı güne düşen kayıtların ters sırası, mükerrer "Payda" kaydı yüzünden "Aktif girişim" sayacının 3 yerine 4 yazması ve aynı yazının yapısal veride birden fazla kimlikle yayınlanması. Yerel önizleme aracındaki bir açık kapatıldı ve araç artık yalnız kendi makinemi dinliyor; günlük yazan betik de yazmadan önce yedek alıyor ve doküman arada değiştiyse üzerine yazmayı reddediyor. Her grup, onarımı yapmayan bağımsız bir ajanla yeniden denetlendi: dördü temiz geçti, yayın hattı grubunda onarım ajanının üç değişikliği yeni sorun doğurmuştu ve doğrulayıcı üçünü de geri aldı. Canlıya hiçbir şey yayınlanmadı, canlı veriye dokunulmadı ve değişen 20 dosyanın tek komutla geri alınabilir yedeği alındı.

Astro · Node.js · Bash · JSON-LD · Erişilebilirlik

53 ajanlı denetim: 19 kritik iddianın 13'ü çürüdü

Siteyi ve etrafındaki araçları dokuz uzman modunda (hata ayıklama, mimari, performans, temiz mimari, backend, frontend, teknik liderlik, güvenlik, DevOps) paralel denetlettim; toplam 53 ajan koştu ve her kritik bulgu iki bağımsız hakemin çürütme testinden geçti. Sonuç beklediğim gibi çıkmadı: 19 "kritik" iddianın 13'ü ölçüm yapılınca düştü — "site üç gündür yayınlanmıyor", "HTML hiçbir katmanda önbelleklenmiyor", "analytics kritik CSS'i geciktiriyor" gibi maddelerin hiçbiri canlı ölçümde doğrulanmadı. Geriye kalan gerçek acil üç madde ise sitenin kendisiyle değil, çevresindeki yerel araçlarla ilgiliydi. Uygulama katmanı sandığımdan sağlam çıktı: URL güvenlik filtresi denenen 21 saldırı vektörünün tamamını engelledi ve derlenmiş çıktıda hiç sır sızıntısı yok. Bu projeye kalıcı kuralım şu oldu: kod okuyarak varılan sonuç, canlıdan ölçülmeden bulgu sayılmaz.

Çok-Ajanlı Denetim · Güvenlik · Performans · Astro · Firestore

Yönetim Paneli ve API Entegrasyonu

Bugün Grok API'yi siteye bağladım. Yeni proje eklemek ve resim değiştirmek için basit bir yönetim arayüzü oluşturdum. Otomatik paylaşım özelliği de eklendi. (Sonradan iptal edildi: Grok API aboneliğinden vazgeçtim.)

Yönetim Paneli · Otomatik Paylaşım · İptal Edildi

Günlük Sistemi İyileştirmeleri

Bugün günlük sistemimi geliştirdim. Verilerin daha gerçekçi işlenmesini sağladım.

Yapım Günlüğü · Otomasyon · Veri İşleme

Kod diyeti: 8 MB ölü ağırlık gitti, yapı modülerleşti

Eski tek-dosyalık sitenin kalıntılarını (8 MB'a yakın ölü dosya) temizledik; orijinali arşive kaldırdık. Üç sayfada kopyala-yapıştır duran başlık, alt bilgi ve günlük kaydı blokları tek tek bileşenlere indi — artık bir görünümü değiştirmek tek dosya düzenlemek demek. Türkçe sitede hiç kullanılmayan Kiril/Yunan/Vietnam font paketleri de atıldı (39 tanımdan 16'ya). Görünüm piksel piksel aynı kaldı.

Refactor · Modüler Mimari · Performans

Site artık iki dilli: İngilizce sürüm yayında

samiaktas.com/en açıldı — anasayfa, günlük arşivi ve girişim sayfalarıyla sitenin tamamı İngilizce. Sağ üstte TR/EN düğmesi var; otomatik yönlendirme bilerek yok (Google'ın tavsiyesi: hreflang + kullanıcı seçimi). 15 günlük kaydının tamamı, Hakkımda hikâyem ve tüm arayüz elden çevrildi; tarihler bile dile göre biçimleniyor. Kod tekrarı sıfır: aynı dosyalar iki dili birden üretiyor. Yapay zeka motorları ve Google artık İngilizce sorgularda da bu defteri kaynak gösterebilir.

i18n · hreflang · SEO · Astro

Gerçek giderler ve teknoloji etiketleri

Defterdeki 'sıfır gider' gerçeği yansıtmıyordu — 'İş Akışı & Araçlar' diye bir genel gider sınıfı açtık ve Claude Pro aboneliğini (17 USD ≈ ₺796) işledik. Şeffaflık artık gerçek rakamı gösteriyor; bu sınıf girişim olarak sayılmıyor, kendi başlığı altında dökümlü. Ayrıca günlükteki her kayda o gün kullanılan teknolojiler ve güvenlik çalışmaları etiket olarak eklendi — ziyaretçi hangi işin neyle yapıldığını tek bakışta görüyor.

Şeffaflık · Genel Gider · Etiketleme

Günlük arşivi ve girişim sayfaları

Yapım günlüğü büyüyünce yapıyı değiştirdik: anasayfada artık yalnızca son 5 kayıt var, defterin tamamı /gunluk sayfasında. Her girişimin kendi günlük sayfası oluştu — Payda ve samiaktas.com ayrı ayrı okunabiliyor, yeni bir girişim eklediğimde sayfası kendiliğinden açılacak. Kayıtlar yeniden eskiye sıralandı, her sayfa kendi başlığı ve şemasıyla arama motorlarına ayrı ayrı tanıtıldı; site haritası kendini güncelliyor.

Astro · SEO · Schema.org

Site kendini yayınlıyor + üçlü uzman denetimi

Bugün siteyi her düzenlemede otomatik derleyip yayınlayan bir hat kurduk (derle → yayınla → arama motorlarına anında bildir). Ardından tasarım, SEO/GEO ve güvenlik olmak üzere üç ayrı uzman denetimi yaptırdık: erişilebilirlik/kontrast düzeltmeleri, daha zengin yapısal veri ve veritabanı yazma kuralının sahibime kilitlenmesi. Not: bu sitenin tamamı tek bir Claude Pro üyeliğiyle, yapay zekayla birlikte kuruldu.

CI/Otomasyon · Güvenlik · SEO · Erişilebilirlik

Siteyi sıfır-JavaScript Astro ile yeniden yazdık

AI ve Google'da en hızlı görünürlük için siteyi tamamen statik, sıfır-JavaScript bir Astro yapısına taşıdık. Sonuç: ~34 KB boyut, yarım saniyenin altında açılış ve tüm içeriğin botların anında okuyabileceği şekilde gömülü olması. Tasarımı da sadeleştirdik: metin odaklı bir açılış ve Hakkımda'da tek büyük fotoğraf.

Astro · Tailwind CSS · Sıfır-JS

Kimlik, giriş ve arayüz oturdu

Hakkımda metnini (Adana, yazılım girişimciliğine bu siteyle başlama hikayem) yazdık, yönetici girişini Firebase ile güvene aldık ve arayüzü elden geçirdik. E-posta tarafındaki eksik DNS kaydını bulup düzelttik; artık [email protected] çalışıyor.

Firebase Auth · DNS · Güvenlik

Arama motoru ve yapay zeka görünürlüğü paketi

Siteyi Google, Bing ve Yandex'e tanıttık; sitemap, robots.txt, llms.txt, Schema.org işaretlemeleri ve IndexNow'ı kurduk. GPTBot/ClaudeBot gibi yapay zeka tarayıcılarına okuma izni verdik. Cloudflare ile hız, güvenlik (SSL, WAF) ve önbellek katmanı ekledik.

SEO · Schema.org · Cloudflare · WAF/SSL

Site nihayet açıldı

Açılmayan portföy sitesini Firebase Hosting'e taşıyıp yayına aldık. 7 MB'lık tek dosyayı parçalara böldük ve Firestore ile kalıcı hale getirdik; sayfa artık her yenilemede sıfırlanmıyor. Kod bilmeden, yapay zekayla adım adım.

Firebase Hosting · Firestore · JavaScript

04

Reels Stüdyo

4 kayıt

Her işlemede platform açıklaması, kanca bandı ve A/B kapak üretiliyor

Araştırma dosyasında uygulanmamış kalan beş boşluğu kapattım. Artık her işlemede platform ve dil başına açıklama dosyası üretiliyor ve "kapak metni başlıkla aynı olmasın" kuralı gerçekten işliyor: kapak "KODU AI YAZDI" derken başlık "Gün 1: Claude siteme güvenlik yaması yazdı" oluyor. Kapaktan sonraki 0.4–2.9 saniyeye en fazla 8 kelimelik bir kanca bandı bastım; kapakla aynı encode içinde gömüldüğü için ek işlem süresi yok, 1.5. saniyenin karesini çıkarıp gözle doğruladım. Damga kararının verisi olmadığı için her işlemede kapağın damgalı ve "?" işaretli iki varyantını birden üretiyorum, böylece YouTube Test & Compare için malzeme her gün hazır. Son 9 kapağı Instagram'ın 3:4 kırpmasıyla profil ızgarası olarak diziyorum ve Yayınlar sekmesine izlenme/tutma notu alanı ekledim; 38/38 test ve kalite kapısı -14.0 LUFS ile geçti.

Swift · ffmpeg · CoreText · İçerik otomasyonu · A/B testi

Kapağı ayrı dosya olmaktan çıkarıp videonun ilk karesine gömdüm

Kapakta yazı mı yoksa videodan bir kare mi daha iyi çalışıyor sorusunu tahminle cevaplamak istemedim; 6 araştırmacı ve 1 sentezci ajanı paralel çalıştırdım, 68 web araması sonunda 10 kanıta bağlı karar çıktı. En değerli bulgu şuydu: üç platformda da akışta video otomatik oynuyor, yani kapak feed'de hiç görünmüyor, yalnızca profil ve keşifte bir varlık. Bunun üzerine kapağı videonun ilk 0.4 saniyesine gömdüm ve çıktının ilk karesini çıkarıp gerçekten kapak olduğunu doğruladım. Araştırma üç eski kararımı devirdi: sol koyu şerit gitti (TikTok ızgarası kapağı merkez kareye kırpıyor), daire damga gitti (izleyicide clickbait sinyali) ve "şaşkın yüz seç" mantığı gitti; yerlerine merkez blok yerleşim, köşeli eğik etiket ve günün aracının ekran görüntüsünü taşıyan kanıt kartı geldi. Yeniden derledikten sonra 38 birim test ve kalite kapısı yine geçti, süre 19.66 + 0.4 = 20.075 saniye olarak tuttu.

Çoklu ajan araştırması · Kapak tasarımı · ffmpeg · A/B testi

Reels Stüdyo'yu sıfırdan yazıp imzalı macOS uygulaması olarak kurdum

Planı kod yazmadan bırakmadım: StudyoKit video motorunu, SwiftUI panelini ve CLI'ı aynı gün yazıp imzaladım, uygulama /Applications/Reels Stüdyo.app olarak kuruldu. Doğrulamak için Türkçe TTS sesi ve gerçek bir yüz fotoğrafıyla bilerek karanlık ve kısık sesli bir test videosu ürettim; ses -24.6 LUFS'tan tam -14.0'a çekildi, 25.3 saniyelik video 19.6 saniyeye indi ve eşiğin altındaki 0.3 saniyelik boşluk doğru şekilde korundu. 38 birim testin hepsi geçti; kalite kapısı LUFS, çözünürlük, fps, ilk kare parlaklığı ve süre oranını her işte otomatik kontrol ediyor. Homebrew'un ffmpeg 8.x sürümünde libass olmadığını fark edince altyazı gömmeyi CoreText → PNG → overlay yoluyla kendim yazdım, whisper large-v3-turbo ile Türkçe transkripsiyon dört cümlenin dördünde birebir doğru çıktı. Devam uygulamasındaki günlük ve site altyapısını 15 dosya halinde GunlukKit olarak taşıdım, tek satır değişiklik gerekmeden derlendi.

Swift · SwiftUI · ffmpeg · Apple Vision · whisper.cpp · CoreText

Dikey video hattının standartlarını araştırmayla kilitledim

Telefonla çekilmiş dikey videoyu tek adımda yayına hazırlayacak hattı kodlamadan önce araştırdım: ses hedefi olarak -14 LUFS'u, sessizlik kırpma eşiği olarak 0.4 saniyeyi ve 1080x1920 30 fps çıktıyı sabitledim. Kapak şablonunu iki kez elden geçirdim; ilk taslakta metin sol altta kalıyordu, Instagram profil ızgarasının kapağı 3:4'e kırptığını görünce kritik her öğeyi merkezdeki güvenli kutuya taşıdım. Almanca altyazı için Apple'ın cihaz içi çeviri motorunu denedim, Türkçe'nin macOS 26'da bulunmadığını görünce yolu Türkçe → İngilizce → Almanca olarak kurguladım. YouTube, Instagram ve TikTok'un 2026 API kısıtlarını tek tek doğruladım ve on kararı PLAN.md'ye yazdım. Bu turda bilerek tek satır kod yazmadım.

ffmpeg · loudnorm · Apple Translation · Platform API · Planlama