

FitZen
UygulamaYapay zekâ destekli diyet ve beslenme takibi.
TEKNOLOJİ
Expo ve React Native ile geliştirdiğimiz uygulamalardan kararlar: native modül, EAS derleme, RevenueCat aboneliği, Supabase ve Firebase.
KISA CEVAP
AMG Yazılım, mobil uygulamalarının çoğunu Expo ve React Native ile tek kod tabanında geliştiriyor. FitZen ve PeakUp iOS ve Android’de, GlowTira App Store’da yayında; in5min tek Expo kod tabanından iPhone, Mac ve Vision Pro’ya çıkıyor. Widget ve Live Activities gibi platform özelliklerini native modülle ekliyor, abonelikte RevenueCat, backend’de Supabase ya da Firebase kullanıyoruz.
Mobil projelerimizin büyük kısmı Expo ve React Native ile yazılıyor; FitZen, GlowTira, PeakUp, HuntLine IQ, RichlyMe, Muslim Mubarak, in5min ve Karaman Mobile bunlardan bazıları. Yalnız iOS’a çıkan iki ürünümüz ise SwiftUI ile yazıldı: PersonaDreams (145 Swift dosyası) ve AppsPaper. Kararı ekran sayısına göre değil; iki platformun ne kadar akışı paylaştığına, cihaz entegrasyonunun derinliğine ve bakım ihtiyacına göre veriyoruz.
React Native seçmek native koddan vazgeçmek anlamına gelmiyor. Platforma özgü parçayı küçük bir native modülle ekliyoruz:
modules/widget-bridge namaz verisini paylaşılan depolamaya yazıyor; targets/widget altındaki beş SwiftUI widget’ı bu veriyi okuyor.Ürünün asıl değeri platforma özel bir etkileşimdeyse bunu keşif aşamasında açıkça konuşuyor ve native seçeneği de masaya koyuyoruz.
HuntLine IQ’nun iOS ve Android uygulamaları tek bir Expo SDK 57 kod tabanından EAS ile TestFlight’a ve Play’e gönderildi. Push bildirimleri Expo Push Service üzerinden gidiyor ve uygulamada Firebase SDK’sı yok; FCM anahtarını EAS’e yalnız kimlik bilgisi taşıyan bir Firebase projesi sağlıyor.
Karaman Mobile’da müşteri mağaza derlemelerini kendi Expo ve Firebase hesaplarından alacaktı. Bu yüzden kaynak kodda hiçbir sır tutulmadı: Karaman API’sine giden çağrılar karaman-proxy üzerinden geçiyor ve üretim profili sahte veriyle derlemeyi reddediyor.
En öğretici hata FitZen’in Android 2.0.2 sürümünde çıktı. Yerel EAS derlemesi eas.json içindeki $DEGISKEN yer tutucularını çözmeden pakete koydu; RevenueCat, Firebase ve Google girişi anahtarları pakete yer tutucu metin olarak girdi. Çözüm, app.config.js içinde $ ile başlayan değerleri boş saymak ve istemci anahtarları için varsayılan tanımlamak oldu. FitZen’in yayın kontrol listesindeki şu madde oradan geliyor: ortam değişkenlerinin gerçekten çözüldüğünü, yerel ve bulut derlemede paketin içinden doğrulayın. Anahtarların yalnız .env içinde değil EAS ortamında da tanımlı olması ayrı bir madde.
FitZen’de altı mağaza ürünü iki mağazada birebir aynı kimlikle açıldı ve üç abonelik RevenueCat’te tek bir "premium" yetkisine bağlandı. RevenueCat tek doğruluk kaynağı; Firebase yalnız bir ayna tutuyor ve bu aynayı istemci değil sunucu yazıyor:
Firestore kuralları 18 yetki alanına istemci yazımını reddediyor. Denetimler iki ders bıraktı: iade ayrı bir olay tipiyle gelmiyor, CANCELLATION içindeki cancel_reason ile tanınıyor; bitiş tarihi taşımayan tek seferlik paket hiçbir zaman süresiz premium sayılmamalı.
Aynı kalıp başka projelerde de var. RichlyMe’de üyelik yalnız Apple uygulama içi satın alımıyla satılıyor ve RevenueCat ile yönetiliyor; GlowTira ve HuntLine IQ RevenueCat webhook’u kullanıyor. Araç ürüne göre değişebiliyor: Parent Daily’de abonelik Adapty ile çalışıyor.
İkisiyle de yayında ürünümüz var; seçim verinin şekline ve yetki kuralının nerede durması gerektiğine bağlı.
Firebase tarafında FitZen, Wardrova, Muslim Mubarak, in5min, Garaj ve Düzce Biz var. Garaj’da 1v1 bilgi yarışmasının her maç kararı Cloud Functions’ta veriliyor; istemci yalnız çağırıyor ve maç belgesini dinliyor. GPS ile ölçülen performans testi ise güvenlik kuralı gereği yalnız kullanıcının kendi belgesine yazabiliyor.
Supabase tarafında ilişkisel veri ve satır düzeyinde yetki öne çıkıyor:
Mevcut backend’i yeniden kurmadan bağlandığımız projeler de var. Karaman.com’un hesaplarını bir köprü Edge Function’ı Supabase profiline eşliyor; HuntLine IQ’nun mobil uygulaması web platformuyla aynı Supabase projesini kullanıyor.
Mobil uygulama çoğu zaman tek başına değil, bir web paneli ya da web ürünüyle birlikte yaşıyor. Bu durumda en pahalı hata, iki tarafın aynı kuralı farklı uygulaması.
HuntLine IQ’da müşterinin web uygulaması hazırdı ve iOS ile Android uygulamalarının Tennessee fuar takvimine yetişmesi için üç hafta vardı. Kapsam cümlesi netti: web ile birebir aynı davranış ve sözleşmede tanımlanan iki native özellik. Tipli API katmanı, sabitler, tarih biçimlendirme ve EXIF’i koruyan fotoğraf hazırlığı web deposundan taşındı. TanStack Query anahtarları web önbelleğiyle aynı, tasarım değişkenleri web CSS’inden donduruldu ve NativeWind’e aktarıldı. Sunucuya yalnız iki şey eklendi: push token kaydı ve RevenueCat webhook’u.
PeakUp’ta üye, antrenör ve stüdyo sahibi aynı Expo uygulamasında; sahip için ayrıca Next.js 16 ile bir panel var. Ortak @peakup/shared paketi zod şemalarını ve KDV, devamsızlık, paket düşümü kurallarını taşıyor; aynı kurallar veritabanında CHECK kısıtlarıyla da uygulanıyor. Düzce Biz’de de Expo uygulaması, Next.js 16 panelleri ve paylaşılan tipler tek bir monorepo içinde duruyor.
FitZen’de App Review riskini koddan çok ödeme ekranının sunumunda bulduk. 91 numaralı derleme (1.2.3) için yaptığımız denetim iki engel çıkardı: ödeme ekranı uygunluk kontrolü yapmadan "3 gün ücretsiz" gösteriyordu, fiyatlar ve üstü çizili indirimler mağaza vitrinine göre değil arayüz diline göre koda gömülüydü. Yeni usePaywall kancasında fiyat ve deneme bilgisi doğrudan RevenueCat offering’inden geliyor; uygunluk bilinmiyorsa deneme vaat edilmiyor. İnceleyici ödeme duvarını geçebilsin diye inceleme notu ve premium bir demo hesap hazırlanıyor.
Yayından önce bir kalite kapısı koşuyor. PeakUp’ta veritabanı ve RLS testleri, sözleşme kontrolleri ve birim testleri tek bir pnpm dogrula komutunda toplanıyor; yeşil değilse hiçbir şey yayına çıkmıyor. Uygulama, mevcut mağaza kaydına 2.0.0 güncellemesi olarak iOS ve Android’de yayınlandı.
App Store ve Google Play geliştirici hesapları müşterinin adına açılıyor. Karaman Mobile bunun tipik örneği: müşteri derlemeyi kendi Expo hesabından alıyor; uygulama kaynak kod, kurulum talimatı ve sunucu yayın notlarıyla Eylül 2026’da teslim edildi.
Evet. Expo kod tabanına native modül ekleyerek bunu birkaç projede yaptık. Muslim Mubarak’ta beş WidgetKit widget’ı namaz vakitlerini bir native köprü modülü üzerinden okuyor; in5min’de Live Activities ve ana ekran widget’ı native modül olarak eklendi. Native kısım platforma özgü parçayla sınırlı kalıyor, uygulamanın geri kalanı ortak React Native kodunda.
Evet. HuntLine IQ’da müşterinin web uygulamasıyla birebir aynı davranan iOS ve Android uygulamalarını üç haftalık bir takvimde geliştirdik. Tipli API katmanı ve tarih biçimlendirme web deposundan taşındı, sunucuya yalnız push token kaydı ve RevenueCat webhook’u eklendi. Başlamadan önce mevcut API’yi, kimlik doğrulamayı ve veri modelini inceleyip entegrasyon kapsamını çıkarıyoruz.
Pakette değil, sunucuda. GlowTira’da hiçbir sağlayıcı anahtarı uygulama paketine girmiyor; güven sınırı Edge Function. Parent Daily’de asistan sohbeti OpenAI’ye bir Cloud Function üzerinden ulaşıyor. FitZen’de model çağrıları Cloudflare Worker üzerindeki bir proxy’den geçiyor; emekliye ayrılan model adları orada güncel modellere eşlendiği için düzeltme mağaza incelemesini beklemeden yayına çıkabiliyor.
Hayır, ama birçok projemizde RevenueCat var: FitZen, GlowTira, RichlyMe, HuntLine IQ ve Macsug. Parent Daily’de abonelik Adapty, atıf ise AppsFlyer ve Meta SDK ile çalışıyor. Araç ne olursa olsun FitZen’de uyguladığımız kural geçerli: premium bilgisini istemci değil sunucu yazar ve fiyat ile deneme bilgisi koddan değil mağazadan okunur.
Tek kod tabanından iOS ve Android’e birlikte çıkmak mümkün; FitZen ve PeakUp iki mağazada da yayında. in5min tek bir Expo kod tabanından iPhone, Mac ve Vision Pro’ya hizmet veriyor. GlowTira ve RichlyMe ise şimdilik yalnız iOS hedefliyor. Her yeni platform ayrı cihaz testi ve ayrı mağaza incelemesi demek; bunları takvime ayrıca koyuyoruz.
Ölçerek. FitZen’deki performans denetimi açılışta ve her sekme odağında 4 ile 8 arasında gereksiz premium kontrolü saydı; eşzamanlı çağrılar tek isteğe birleştirildi ve sonuç 60 saniye önbellekte tutuldu. react-native-purchases native pakete yaklaşık 880 KB’lık web yedeğini taşıyordu, metro.config.js bunu boş bir taslakla değiştiriyor. Açılış görevleri önceliklendirildi ve 1.300 satırlık abonelik servisi modüllere bölündü.
Size. App Store ve Google Play geliştirici hesapları, sunucu ve servis hesapları sizin adınıza açılır. Teslimde kaynak kodun tamamını, tasarım dosyalarını ve tüm erişimleri size devrederiz.
Hayır. Kullanıcı ekranlarını ve yönetim paneli ekranlarını projenize özel olarak tasarlayıp sıfırdan geliştiririz. Böylece panel, sizin iş akışınıza göre çalışır.
İLGİLİ STÜDYO NOTLARI


Yapay zekâ destekli diyet ve beslenme takibi.

Yapay zekâ güzellik ve stil koçu.


Spor stüdyosu yönetimi ve üye takibi, tek uygulamada.


Konumunu ifşa etmeden av hareketliliği içgörüsü veren platform.


Davetle girilen, deneyimlerin kanıtla paylaşıldığı kapalı üyelik kulübü uygulaması.


Namaz vakitleri, Kuran ve günlük ibadet rehberi.
Bir tanışma görüşmesiyle başlarız. Kapsamı ve takvimi birlikte netleştirir, size yazılı bir teklif göndeririz.
hello@amgsoftwarestudio.com