Nedir
Fişin fotoğrafını çekiyorsunuz, harcama deftere işlenmiş oluyor. Exptract, tarayıcıda yaşayan ama telefona uygulama gibi kurulan bir gelir-gider takipçisi: bir görüntü modeli fişteki tutarı, tarihi, işyerini ve kategoriyi okuyor; siz özete bakıp onaylıyorsunuz. Elle girişler de aynı yoldan ilerliyor ve her ekran hem Türkçe hem İngilizce.

Ürün yöneticisiyim, mühendis değilim. Uygulamayı tek başıma Claude Code ile geliştirdim — kodu o yazdı, kararların tamamı bendeydi: kapsam, tasarım, güvenlik, uyumluluk.
Nasıl çalışır
Ön yüz, React + Vite ile geliştirilmiş bir PWA. Kimlik doğrulama, Postgres veritabanı, dosya depolama ve sunucu tarafı fonksiyonlar Supabase’te; her tabloda satır düzeyinde güvenlik (RLS) var. Fiş okuma Gemini Flash-Lite ile yapılıyor ve model yalnızca sunucu tarafındaki bir fonksiyondan çağrılıyor — API anahtarı tarayıcıya hiç inmiyor. Yapay zekâ taramaları ayda 10 ile sınırlı; sınıra gelen kullanıcı tek dokunuşla bekleme listesine katılıyor.

Uyumluluk tarafı vitrin süsü değil. Kullanıcı onayı, istemcinin yalnızca okuyabildiği bir tabloda kayıt altına alınıyor; iki dilli gizlilik politikası gerçek veri akışlarını anlatıyor; hesap silme ise her şeyi gerçekten siliyor — veritabanı kaskadının tek başına ulaşamadığı fiş görselleri dahil. Girişleri Cloudflare Turnstile koruyor, dağıtım Vercel üzerinde.
Ne öğrendim
Bütün geliştirme boyunca kod incelemesinden yalnızca iki bug kaçtı; ikisini de uygulamayı kullanıcı gibi kurcalarken yakaladım. Biri, giriş formundaki doğrulama mesajlarının uygulamanın değil tarayıcının dilinde çıkmasıydı; öbürü, zaten kayıtlı bir e-postayla üye olunmaya çalışılınca ekranın sessizce asılı kalması. Beş dakikalık tıklama turu, her fazda kod incelemesinden daha çok iş çıkardı.
En büyük dersi, hata ayıklamanın dibe vurduğu an verdi. Fiş okuyucu, tek bir
yanıltıcı “CORS hatası”nın arkasında beş ayrı şekilde bozuktu — fonksiyon
aslında çöküyor ve gerçeği söyleyecek başlıkları döndüremeden ölüyordu.
Yığının en dibinde ise yapay zekâ sağlayıcısının cevabı: limit: 0. O
modele ücretsiz kota sıfırmış. Hatalar okunur hale gelince her katman tek
satırlık bir düzeltmeye dönüştü.
Uyumluluk da bir onay kutusu değil, sistem. “Kullanıcı verisini silebilsin” kulağa basit geliyor; ama veritabanı kaskadı depodaki fiş görsellerine ulaşmıyor ve kullanıcı onayının, uygulamanın yalnızca okuyabildiği — sonradan kimsenin değiştiremediği — bir tabloda tutulması gerekiyordu.