Çok Platformlu Kilo Takip Uygulaması: FastAPI + Docker + Expo ile Tam Stack Geliştirme
Neden Bu Projeyi Yaptım?
Kilo takip uygulamalarının büyük çoğunluğu ya çok karmaşık ya da Türkçe gıda veritabanına sahip değil. Aynı zamanda hem telefonda hem bilgisayarda çalışan, Docker ile tek komutla kurulabilen bir şey istedim. Sonuç: KiloTakip.
Mimari Karar: "Tek Beyin, Çok İstemci"
En kritik tasarım kararı: tek bir FastAPI backend, birden fazla istemci.
FastAPI (Python) ← merkezi beyin
↓
┌───┼───┐
Web PWA Mobil
(React) (nginx) (Expo RN)
Bu yaklaşımın avantajı: mantık tek yerde. Kalori hesaplama, BMR/TDEE formülleri, veri doğrulama — hepsi Python'da, test edilebilir, değiştirilebilir.
Gemini AI ile Fotoğraftan Yemek Tanıma
Projenin en çarpıcı özelliği: fotoğraf çekip "bu yemek kaç kalori?" diye sorabilmek.
@app.post("/api/photo-recognize")
async def recognize_food(file: UploadFile):
image_data = base64.b64encode(await file.read()).decode()
response = genai.GenerativeModel('gemini-1.5-flash').generate_content([
"Bu yemek ne? Kalori, protein, karbonhidrat ve yağ değerlerini JSON olarak ver.",
{"inline_data": {"mime_type": "image/jpeg", "data": image_data}}
])
return parse_gemini_response(response.text)
Gemini'nin multimodal yetenekleri burada gerçekten parlıyor. Türkçe yemek isimlerini tanıyabiliyor, yaklaşık porsiyon boyutlarını tahmin edebiliyor.
607 Türkçe Yemek Veritabanı
Piyasadaki uygulamaların en büyük eksikliği Türk mutfağı. Ev yemekleri, sokak yemekleri, fast food — her şeyi içeren 607 yemeklik bir veritabanı oluşturdum. Türkçe karaktere duyarsız arama (ş/s, ğ/g gibi) için özel normalizer yazdım.
Docker ile Tek Komut Kurulum
services:
backend:
build: ./backend
ports: ["8000:8000"]
volumes: ["kilo-data:/app/data"]
frontend:
build: ./frontend
ports: ["3000:80"]
depends_on: [backend]
docker compose up -d --build — ve uygulama hazır. Tarayıcıdan açıp "Ana ekrana ekle" dersen PWA olarak da kurulabilir.
Expo ile Native Android APK
Web PWA yetmez diyenler için Expo React Native ile aynı arayüzü native uygulamaya dönüştürdüm. expo build:android ile üretilen APK doğrudan telefona kurulabiliyor. Backend olmadan da çalışabiliyor — SQLite veritabanı ve Gemini API key telefon içinde saklı.
Öğrendiklerim
- Docker volume yönetimi: SQLite veritabanını container dışında tutmak için named volume şart.
- Expo + local API: Telefon ve bilgisayar aynı Wi-Fi'da olmalı,
localhostdeğil IP adresi kullanılmalı. - PWA manifest:
"display": "standalone"+"start_url"doğru ayarlanmazsa "Ana ekrana ekle" düzgün çalışmıyor. - Gemini rate limiting: Ücretsiz Gemini API'de dakikada 15 istek sınırı var, kullanıcıya açıklayıcı hata mesajı göstermek gerekiyor.
Projeyi görmek için: GitHub