SubWatch AI, kullanıcıların tüm aylık ve yıllık aboneliklerini akıllıca yönetmelerine yardımcı olan, AI destekli bir mobil uygulamadır.
- Özellikler
- Güvenlik
- Kurulum
- Kullanım
- Proje Yapısı
- Environment Variables
- API Dokümantasyonu
- Geliştirme
- Katkıda Bulunma
- Lisans
- ✅ Google Sign-In (OAuth 2.0)
- ✅ Email/Password ile kayıt ve giriş
- ✅ Şifre sıfırlama
- ✅ Firebase Authentication entegrasyonu
- ✅ Güvenli token yönetimi
- ✅ Çoklu cihaz desteği
- ✅ Aylık/Yıllık abonelikleri kolayca ekleyin, düzenleyin ve silin
- ✅ Aktif ve pasif abonelikleri filtreleyin
- ✅ Yenileme tarihlerini ve ücretleri takip edin
- ✅ Otomatik ödeme durumunu yönetin
- ✅ Gmail API ile otomatik abonelik tespiti
- ✅ Akıllı Analiz: AI ile kullanmadığınız abonelikleri tespit edin
- ✅ Fiyat Optimizasyonu: Daha uygun alternatifleri keşfedin
- ✅ Tasarruf Önerileri: Kişiselleştirilmiş tasarruf tavsiyeleri alın
- ✅ OCR Teknolojisi: Fatura/ekran görüntüsü yükleyerek otomatik abonelik ekleyin
- ✅ Aylık/Yıllık harcama grafikleri
- ✅ Kategori bazlı analiz
- ✅ Harcama trendleri
- ✅ Tasarruf potansiyeli hesaplama
- ✅ Yenileme tarihi yaklaşan abonelikler için bildirim
- ✅ İptal hatırlatıcıları
- ✅ Özelleştirilebilir bildirim ayarları
- ✅ Çoklu para birimi desteği
- ✅ Otomatik döviz kuru güncellemesi
- ✅ TL, USD, EUR, GBP ve daha fazlası
Bu proje güvenlik odaklı olarak geliştirilmiştir. Aşağıdaki güvenlik önlemleri alınmıştır:
- ASLA API anahtarları, secret key'ler veya hassas bilgiler client-side kodda yer almaz
- Tüm environment variable'lar
.envdosyasında saklanır ve.gitignoreile korunur - Input validation ve sanitization ile XSS, SQL Injection ve diğer saldırılardan korunma
- React Native güvenlik best practice'leri uygulanmıştır
- JWT (JSON Web Token) ile authentication ve authorization
- Rate limiting ile DDoS koruması
- Request timeout ile uzun süren isteklerin önlenmesi
- HTTPS zorunlu iletişim
- API endpoint'lerinde yetkilendirme kontrolü
- Hassas veriler için Expo SecureStore kullanımı (önerilen)
- Tüm kullanıcı girdileri validate edilir ve sanitize edilir
- OWASP Top 10 güvenlik açıklarına karşı koruma
- ASLA
.envdosyasını Git'e commit etmeyin - ASLA API anahtarlarını veya secret key'leri kodda hardcode etmeyin
- DAIMA
.env.exampledosyasını kullanın ve gerçek değerleri.env'ye yazın - DAIMA production ortamında debug mode'u kapatın
- DAIMA HTTPS kullanın (HTTP asla!)
- Node.js (v18 veya üzeri)
- npm veya yarn
- Expo CLI
- iOS Simulator (Mac) veya Android Emulator
- Expo Go App (fiziksel cihazda test için)
- Projeyi klonlayın
git clone https://github.com/your-username/subwatch-ai.git
cd subwatch-ai- Bağımlılıkları yükleyin
npm install --legacy-peer-deps
# veya
yarn install- Environment variables'ı ayarlayın
# .env.example dosyasını kopyalayın
cp .env.example .env
# .env dosyasını açın ve gerçek değerleri doldurun
nano .env # veya istediğiniz editörÖNEMLİ: .env dosyasındaki tüm placeholder değerleri gerçek bilgilerle değiştirin!
-
Firebase Kurulumu (Authentication ve Firestore için)
a. Firebase projesi oluşturun:
- Firebase Console'a gidin
- "Add project" butonuna tıklayın
- Proje adı girin (örn: "SubWatch AI")
- Google Analytics'i enable/disable edin (isteğe bağlı)
- "Create project" butonuna tıklayın
b. Firebase Authentication'ı etkinleştirin:
- Sol menüden "Build" > "Authentication" seçin
- "Get Started" butonuna tıklayın
- "Sign-in method" tab'ına gidin
- "Email/Password" provider'ını enable edin
- "Google" provider'ını enable edin ve Web SDK configuration kopyalayın
c. Cloud Firestore'u etkinleştirin:
- Sol menüden "Build" > "Firestore Database" seçin
- "Create database" butonuna tıklayın
- "Start in production mode" seçin (şimdilik)
- Location seçin ve "Enable" butonuna tıklayın
d. Web uygulaması ekleyin ve config alın:
- Sol menüden "Project Overview" > "Project settings"
- "Your apps" bölümünde "Add app" > Web icon (</>) seçin
- App nickname girin (örn: "SubWatch AI Web")
- "Register app" butonuna tıklayın
- Firebase config değerlerini kopyalayın:
const firebaseConfig = { apiKey: "...", authDomain: "...", projectId: "...", storageBucket: "...", messagingSenderId: "...", appId: "...", measurementId: "..." // İsteğe bağlı };
- Bu değerleri
.envdosyasına ekleyin (FIREBASE_* değişkenleri)
e. Firestore Security Rules ekleyin (ÇOK ÖNEMLİ!)
⚠️ - Sol menüden "Firestore Database" > "Rules" tab'ına gidin
- Projedeki
firestore.rulesdosyasının içeriğini kopyalayın - Firebase Console'daki Rules editörüne yapıştırın
- "Publish" butonuna tıklayın
UYARI: Bu adım yapılmazsa VERİLERİNİZ HERKESE AÇIK OLUR!
⚠️ -
Uygulamayı başlatın
npm start
# veya
expo start- Test edin
- iOS için:
ituşuna basın (Mac gerekli) - Android için:
atuşuna basın - Web için:
wtuşuna basın - Fiziksel cihaz için: Expo Go uygulamasıyla QR kodu tarayın
- Uygulamayı açın
- Kayıt olun veya giriş yapın
- İlk aboneliğinizi ekleyin
Üç farklı yöntemle abonelik ekleyebilirsiniz:
-
Manuel Ekleme
- "Aboneliklerim" sekmesine gidin
- "+" butonuna tıklayın
- Abonelik bilgilerini doldurun
-
Fatura Yükleme (OCR)
- Fatura/fatura ekran görüntüsü yükleyin
- AI otomatik olarak bilgileri çıkarır
-
Ekran Görüntüsü Paylaşma
- Uygulamadan abonelik ekran görüntüsü alın
- SubWatch AI ile paylaşın
- "İstatistikler" sekmesinden tüm harcamalarınızı görüntüleyin
- Aylık/Yıllık grafikleri inceleyin
- AI önerilerini değerlendirin
subwatch-ai/
├── src/
│ ├── components/ # Yeniden kullanılabilir UI bileşenleri
│ ├── config/ # Konfigürasyon dosyaları
│ │ └── env.js # Environment variable yönetimi
│ ├── contexts/ # React Context API (state management)
│ ├── hooks/ # Custom React hooks
│ ├── navigation/ # React Navigation setup
│ │ └── AppNavigator.js # Ana navigasyon yapısı
│ ├── screens/ # Uygulama ekranları
│ │ ├── HomeScreen.js
│ │ ├── SubscriptionsScreen.js
│ │ └── StatisticsScreen.js
│ ├── services/ # API ve servis katmanı
│ │ └── api.js # API client (JWT, rate limiting)
│ └── utils/ # Yardımcı fonksiyonlar
│ └── validation.js # Input validation & sanitization
├── assets/ # Görseller, fontlar, iconlar
├── .env.example # Environment variable şablonu
├── .gitignore # Git ignore kuralları
├── App.js # Ana uygulama dosyası
├── app.config.js # Expo konfigürasyonu
├── package.json # NPM bağımlılıkları
└── README.md # Bu dosya
- src/components: Button, Input, Card gibi UI bileşenleri
- src/config: Uygulama genelinde kullanılan konfigürasyonlar
- src/contexts: Global state yönetimi (kullanıcı bilgisi, tema vb.)
- src/hooks: Custom React hooks (useAuth, useSubscriptions vb.)
- src/navigation: Ekranlar arası gezinme yapısı
- src/screens: Her bir ekran (sayfa) için ayrı dosyalar
- src/services: Backend API iletişimi, third-party servisler
- src/utils: Yardımcı fonksiyonlar (validation, formatting vb.)
.env.example dosyasını .env olarak kopyalayın ve aşağıdaki değişkenleri doldurun:
API_BASE_URL=https://your-backend-api.com/api/v1
API_TIMEOUT=30000JWT_SECRET=your-super-secret-jwt-key
API_KEY=your-api-keyOPENAI_API_KEY=sk-your-openai-api-key
AI_MODEL=gpt-3.5-turboEXCHANGE_RATE_API_KEY=your-exchange-rate-api-key
EXCHANGE_RATE_API_URL=https://api.exchangerate-api.com/v4/latestONESIGNAL_APP_ID=your-onesignal-app-id
FCM_SERVER_KEY=your-fcm-server-keySENTRY_DSN=your-sentry-dsn
GA_TRACKING_ID=UA-XXXXXXXXX-XENVIRONMENT=development
DEBUG_MODE=true
LOG_LEVEL=debugDEBUG_MODE=false yapın!
SubWatch AI, Gmail hesabınızdaki abonelik maillerini otomatik olarak okuyabilir ve tespit edebilir. Bu özellik sayesinde Netflix, Spotify, YouTube gibi servislerin ödeme maillerini otomatik olarak bulup abonelik olarak ekleyebilirsiniz.
- Google Cloud Console'a gidin
- Yeni bir proje oluşturun:
- Sol üst köşedeki proje seçiciye tıklayın
- "New Project" butonuna tıklayın
- Proje adı girin (örn: "SubWatch AI")
- "Create" butonuna tıklayın
- Sol menüden "APIs & Services" > "Library" seçin
- "Gmail API" araması yapın
- Gmail API'yi seçin
- "Enable" butonuna tıklayın
-
Sol menüden "APIs & Services" > "Credentials" seçin
-
"Create Credentials" > "OAuth client ID" seçin
-
Eğer OAuth consent screen yapılandırılmamışsa:
- "Configure Consent Screen" butonuna tıklayın
- "External" seçin (kişisel kullanım için)
- Uygulama adı girin: "SubWatch AI"
- Kullanıcı desteği email'i ekleyin
- Geliştirici iletişim email'i ekleyin
- "Save and Continue" tıklayın
- Scopes ekranında "Add or Remove Scopes" tıklayın
https://www.googleapis.com/auth/gmail.readonlyscope'unu ekleyin- "Save and Continue" tıklayın
- Test users ekranında email adresinizi ekleyin
- "Save and Continue" tıklayın
-
OAuth client ID oluşturmaya devam edin:
- Application type: "Web application" seçin
- Name: "SubWatch AI Web Client"
- Authorized redirect URIs ekleyin:
https://auth.expo.io/@your-expo-username/subwatch-ai exp://localhost:8081/--/oauth-redirect - "Create" butonuna tıklayın
-
Client ID ve Client Secret'ı kaydedin (bir sonraki adımda kullanacaksınız)
.env dosyanıza aşağıdaki değerleri ekleyin:
# Google OAuth 2.0 Credentials
GOOGLE_CLIENT_ID=YOUR_CLIENT_ID_HERE.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=YOUR_CLIENT_SECRET_HERE
GMAIL_API_SCOPE=https://www.googleapis.com/auth/gmail.readonlyGOOGLE_CLIENT_SECRETdeğeri ÇOK GİZLİDİR!- Development ortamında client-side'da kullanılabilir ancak Production'da MUTLAKA Firebase Functions veya backend kullanın
- Asla
.envdosyasını Git'e commit etmeyin
Production ortamında Google Client Secret'ı client-side'da saklamak GÜVENLİK RİSKİDİR. Firebase Functions kullanarak token exchange işlemini sunucu tarafında yapın:
-
Firebase projenizi oluşturun: Firebase Console
-
Functions'ı etkinleştirin:
firebase init functions
-
functions/index.jsdosyasına token exchange endpoint'i ekleyin:const functions = require('firebase-functions'); const axios = require('axios'); exports.exchangeGoogleToken = functions.https.onCall(async (data, context) => { const { code, redirectUri } = data; try { const response = await axios.post('https://oauth2.googleapis.com/token', { code, client_id: functions.config().google.client_id, client_secret: functions.config().google.client_secret, redirect_uri: redirectUri, grant_type: 'authorization_code', }); return response.data; } catch (error) { throw new functions.https.HttpsError('internal', error.message); } });
-
Firebase config'e secret'ları ekleyin:
firebase functions:config:set google.client_id="YOUR_CLIENT_ID" firebase functions:config:set google.client_secret="YOUR_CLIENT_SECRET"
-
Deploy edin:
firebase deploy --only functions
-
src/contexts/GmailContext.jsdosyasını güncelleyin ve Firebase Function'ı kullanacak şekilde değiştirin.
- Uygulamayı açın
- Ana sayfadaki "Gmail Senkronizasyonu" kartını bulun
- "Google ile Giriş Yap" butonuna tıklayın
- Google hesabınızı seçin ve izinleri onaylayın
- "Abonelikleri Senkronize Et" butonuna tıklayın
- Bulunan abonelikleri gözden geçirin ve onaylayın
Gmail entegrasyonu şu servislerin maillerini otomatik olarak tanır:
- ✅ Netflix
- ✅ Spotify
- ✅ YouTube Premium
- ✅ Apple (iCloud, Apple Music, Apple TV+)
- ✅ Adobe Creative Cloud
- ✅ Amazon Prime
- ✅ Microsoft 365
Not: Yeni servisler eklemek için src/utils/mailParser.js dosyasını düzenleyin.
- Sadece Okuma İzni: Uygulama Gmail'inizi sadece OKUYUR, asla mail göndermez veya silmez
- Güvenli Saklama: OAuth token'ları Expo SecureStore'da güvenli şekilde saklanır
- Kullanıcı Onayı: Tespit edilen abonelikler otomatik eklenmez, kullanıcı onayı gerektirir
- Minimal Scope: Sadece
gmail.readonlyscope'u kullanılır
- Gmail API ücretsiz tier'da günlük 1 milyon quota vardır (normal kullanım için fazlasıyla yeterli)
- Mail parsing %80-90 doğrulukla çalışır (basit regex kullanır)
- Sadece İngilizce ve Türkçe mailleri destekler
- Eski mailleri tespit etmek için 50 mail limiti vardır (değiştirilebilir)
"OAuth redirect URI mismatch" hatası:
- Google Cloud Console'daki redirect URI'yi kontrol edin
- Expo username'inizi doğru girdiğinizden emin olun
"Invalid client" hatası:
- Client ID ve Client Secret'ı kontrol edin
.envdosyasının doğru yüklendiğinden emin olun
Mail bulunamadı:
- Gmail hesabınızda ilgili servislerin maillerinin olduğundan emin olun
- Spam klasörünü kontrol edin
- Mail parser'ı geliştirmek için
src/utils/mailParser.js'i düzenleyin
POST /auth/login
Body: { email, password }
Response: { token, refreshToken, user }POST /auth/register
Body: { email, password, name }
Response: { token, user }GET /subscriptions
Headers: { Authorization: Bearer <token> }
Response: [{ id, name, price, billingCycle, nextBillingDate, isActive }]POST /subscriptions
Headers: { Authorization: Bearer <token> }
Body: { name, price, billingCycle, category, nextBillingDate }
Response: { id, ...subscriptionData }PUT /subscriptions/:id
Headers: { Authorization: Bearer <token> }
Body: { name?, price?, isActive?, ... }
Response: { success: true }DELETE /subscriptions/:id
Headers: { Authorization: Bearer <token> }
Response: { success: true }POST /ai/analyze
Headers: { Authorization: Bearer <token> }
Response: { insights, recommendations, unusedSubscriptions }GET /statistics
Headers: { Authorization: Bearer <token> }
Response: { totalSpent, monthlyAverage, categoryBreakdown }-
Sade ve Anlaşılır Kod
- Her fonksiyon için açıklayıcı yorum ekleyin
- Değişken isimleri açıklayıcı olmalı (örn:
usryerineuser) - Karmaşık işlemler için adım adım açıklama yazın
-
Güvenlik
- Hiçbir hassas bilgi kodda hardcode edilmemeli
- Tüm kullanıcı girdileri validate edilmeli
- API isteklerinde her zaman authorization kontrol edilmeli
-
Hata Yönetimi
- Try-catch blokları kullanın
- Kullanıcıya anlaşılır hata mesajları gösterin
- Hataları console'a loglayın (development modunda)
# Tüm testleri çalıştır
npm test
# Belirli bir test dosyasını çalıştır
npm test -- validation.test.js# Kod kalitesini kontrol et
npm run lint
# Otomatik düzeltmeler yap
npm run lint -- --fix# Production build
expo build:android
expo build:ios1. Expo başlamıyor
# Cache temizle
expo start -c2. Metro bundler hatası
# Node_modules'ı sil ve yeniden yükle
rm -rf node_modules
npm install --legacy-peer-deps3. Environment variables çalışmıyor
.envdosyasının root dizinde olduğundan emin olun- Uygulamayı yeniden başlatın (env değişiklikleri sonrası)
app.config.jsdosyasını kontrol edin
4. Navigation hatası
# Navigation paketlerini kontrol et
npm ls @react-navigation/nativeKatkılarınızı bekliyoruz! Lütfen şu adımları izleyin:
- Bu repoyu fork edin
- Yeni bir branch oluşturun (
git checkout -b feature/amazing-feature) - Değişikliklerinizi commit edin (
git commit -m 'feat: Add amazing feature') - Branch'inizi push edin (
git push origin feature/amazing-feature) - Pull Request oluşturun
feat:- Yeni özellikfix:- Bug fixdocs:- Dokümantasyon değişikliğistyle:- Kod formatı değişikliğirefactor:- Kod iyileştirmetest:- Test ekleme/düzenlemechore:- Build/config değişiklikleri
Bu proje MIT lisansı altında lisanslanmıştır. Detaylar için LICENSE dosyasına bakın.
Sorularınız için:
- Issue açın: GitHub Issues
- Email: your-email@example.com
Bu projeyi kullandığınız için teşekkür ederiz! Geri bildirimlerinizi bekliyoruz.
Not: Bu proje aktif geliştirme aşamasındadır. Özellikler eklenmeye devam edilmektedir.
Made with ❤️ by SubWatch AI Team