Skip to content

Learnguai — Proje Tanıtım Dokümanı

"Dil öğrenmek sıkıcı olmak zorunda değil. Ve pahalı olmak zorunda da değil."


Içindekiler

  1. Problem & Vizyon
  2. Ürün Nedir?
  3. Teknik Mimari
  4. Temel Algoritma: The Deep Drill
  5. Spaced Repetition: Öğrenme Motoru
  6. Veri Modeli
  7. Gelir Modeli
  8. Şu Anki Durum & Yol Haritası
  9. Neden Biz Kazanabiliriz?

1. Problem & Vizyon

Mevcut Pazar Sorunu

Duolingo, dil öğrenme pazarının tartışmasız devi. $700M+ yıllık gelir, 500M+ kullanıcı. Ama temel bir sorunu var: içerik üretimi insan editörlere bağlı, skalası sınırlı, ve pedagojik derinliği yüzeysel.

ChatGPT / Gemini ile kendi kendine çalışmak ise yapısız. Her soru için AI'ya ödeme var, tutarlılık yok, ilerleme takibi yok.

RakipGüçlü YanıZayıf Yanı
DuolingoKullanıcı tabanı, gamificationİçerik skalası sınırlı, AI yok
BabbelPedagoji kalitesiPahalı, eğlenceli değil
ChatGPTSonsuz esneklikYapısız, takip yok, her sohbet maliyeti
AnkiSpaced repetitionTeknik, kullanıcı dostu değil

Learnguai'nin Cevabı

AI'yı bir kez kullan, milyonlara sun.

İçerik üretimini AI ile otomatize et, öğrenme deneyimini SRS (Spaced Repetition) ile kişiselleştir, ve bunu neredeyse sıfır içerik maliyetiyle yap.

Vizyon: Her dil için, her seviyede, sonsuz ve kişiselleştirilmiş içerik sunan — Duolingo'nun kullanım kolaylığı + Anki'nin bilimsel derinliği + AI'nın ölçeklenebilirliği.


2. Ürün Nedir?

Learnguai bir mobil dil öğrenme uygulaması (React Native / Expo). Şu an hedef kitle: Türkçe konuşanlar için İngilizce öğrenimi. Mimari diğer dil çiftlerine hazır.

Kullanıcı Akışı

Uygulama Açılır
      |
      v
[Neural Link Ekranı] -- Onboarding animasyonu
      |
      v
[Dil Seçimi] -- Kullanıcının anadili
      |
      v
[LessonFlow] ──────────────────────────────────────────┐
      |                                                 |
      v                                                 |
[SmartCard Gösterilir]                                  |
      |                                                 |
   ┌──┴──┐                                              |
   |     |                                              |
Doğru  Yanlış                                          |
   |     |                                              |
   |     ├─ [AI Açıklama Sheet] ← Gemini açıklama       |
   |     └─ Kart deck'e 3 sıra ileriye eklenir          |
   |                                                    |
   └──── Kart Vault'a kaydedilir                        |
         Sonraki karta geç ─────────────────────────────┘

5 Kart Tipi

Dil yetkinliği tek boyutlu değil. Her kart tipi farklı bir öğrenme boyutunu hedefler:

TipHedef BeceriAI Üretim MaliyetiEn Kritik Seviye
quizKelime anlamı (lexical)DüşükA1–C2
fillGapBağlamsal kullanım (grammar)DüşükA2–C2
sentenceBuilderSözdizimi, kelime sırasıDüşükA1–B2
idiomKalıp, deyim, phrasal verbOrtaB1–C2
errorCorrectionHata farkındalığı, gramer içselleştirmeSIFIRA2–C1

1. Quiz (Kelime Anlamı)

Soru: "Ephemeral"
[A] Eternal   [B] Short-lived ✓   [C] Heavy   [D] Bright

2. Fill the Gap (Boşluk Doldurma)

"The system _____ automatically upon detection of an error."
[reboots ✓] [deletes] [sleeps] [ignores]

3. Sentence Builder (Cümle Kurma)

Hedef: "Güvenlik protokolleri nedeniyle erişim reddedildi."
Parçalar: [Access] [denied] [due] [to] [security] [protocols]
Kullanıcı sıraya dizer → cevap kontrol edilir

4. Idiom (Kalıp & Deyim)

Türkçe'de phrasal verb kavramı yok. "Give up / give in / give away / give out" — bunların hiçbiri tek tek kelime bilgisinden türetilemiyor. B1→C1 geçişinin önündeki en büyük engeldir. Kolokasyonlar da bu tipe girer: "make a decision" doğrudur, "do a decision" değil; ama neden? Çünkü kalıp böyle.

Bağlam: "Doktoru uyardıktan sonra sigarayı bıraktı."
"She _____ smoking after the doctor's warning."

[gave up ✓] [gave in] [gave away] [gave back]
Bağlam: "Uzun bir toplantıdan sonra bir ara vermek istiyorsun."
"I need to _____ for a while."

[take a break ✓] [make a pause] [do a rest] [have a stop]

Kaynak: COCA Phrasal Verb List, BNC Idiom Frequency Lists.

5. Error Correction (Hata Tespiti)

Türk öğrenciler sistematik, tahmin edilebilir hatalar yapar: 3. tekil şahıs -s, perfect tense çekimi, article kullanımı, preposition seçimi. Bu hataları görmek ve düzeltmek kuralları pasif ezberden çok daha iyi içselleştirir.

Hangi cümle dilbilgisel olarak DOĞRU?

[A] She don't know the answer.
[B] She doesn't knows the answer.
[C] She doesn't know the answer.  ✓
[D] She not know the answer.
Hangi cümle DOĞRU?

[A] I have went to the market yesterday.
[B] I went to the market yesterday.  ✓
[C] I was went to the market yesterday.
[D] I did went to the market yesterday.

Pipeline avantajı: errorCorrection kartları Gemini gerektirmiyor. Tatoeba'dan alınan doğru bir cümleye algoritmik hata dönüşümleri uygulanır (yanlış tense, eksik -s, yanlış preposition). Maliyet: $0.00 / kart.

Ekranlar

EkranAçıklama
LessonFlowAna öğrenme ekranı, kart akışı
VaultKaydedilen kelimeler + hatalı kelimeler
Profileİstatistikler, seviye yolculuğu, streak
AI SheetYanlış cevapta açıklama + doğru cevap
SubscriptionPro pass satın alma ekranı

Pedagoji Katmanları

Dil yetkinliği tek boyutlu değil. Uygulamanın öğretme gücü 4 katmanda derinleşiyor. Her katman bir öncekinin üzerine inşa edilir.

Katman 4 ░░░░░░░░░░  KONUŞMA & AKICILIK       — keşfedilecek
Katman 3 ▒▒▒▒▒▒▒▒░░  AKTİF ÜRETİM             — planlandı
Katman 2 ▓▓▓▓▓▓░░░░  KAVRAMA & ADAPTASYON      — planlandı
Katman 1 ██████████  TANIMI & SEÇME            — mevcut (MVP)

Katman 1 — Tanıma (Recognition)

Mevcut durum. Şu an uygulama bu katmanda.

Kullanıcı içeriği görür, doğruyu seçenekler arasından bulur. Beyin pasif modda çalışır: "Bu bana tanıdık geldi mi?"

Kapsayan tipler: quiz / fillGap / idiom / errorCorrection / sentenceBuilder
Kapsanan beceri: kelime anlamı, gramer tanıma, kalıp tanıma
Sınırı:          Tanıdık gelme ≠ Hatırlayabilme

Katman 2 — Kavrama & Adaptasyon

Mevcut 5 kartın üzerine 3 bileşen eklenir.

2A — reading Kart Tipi

Kısa paragraf (3–6 cümle) + anlama sorusu. B1 sonrasında kelime öğreniminin asıl bağlamı metindir. Kart bazlı öğrenim tek cümle sınırını burada aşar.

"Scientists discovered that during deep sleep, the brain replays
 memories and moves them to long-term storage. This is why a
 good night's sleep before an exam improves performance."

Soru: Uykunun hafızaya etkisi nedir?
[A] Anıları siler
[B] Uzun süreli belleğe aktarır  ✓
[C] Yeni anılar oluşturur
[D] Beyin aktivitesini durdurur

Üretim: Tatoeba yerine Gemini, Wikipedia extract veya BBC Learning English kaynaklarından kısa pasajlar. Seviye (A2–C2) kelime frekansına göre belirlenir.

2B — Zayıf Alan Hedefleme (Adaptive Difficulty)

Şu an SRS ne zaman gösterileceğini biliyor ama neyin daha fazla gösterileceğini bilmiyor. grammar_rule alanı zaten var — sadece seçim algoritmasında kullanılmıyor.

Kural: Kullanıcı aynı grammar_rule'dan kartı
       3 kez üst üste yanlış yaparsa →
       o kural için ek 5 kart önce sıralanır

Örnek:
  "article_countable" kuralında 3 hata
  → sistem A2 seviye article kartlarını öne alır
  → kullanıcı farkında olmadan o alanda yoğunlaşır

Yeni içerik gerektirmiyor. Sadece SRS seçim mantığına grammar_rule failure count ağırlığı ekleniyor.

2C — CEFR Seviye Testi

Her CEFR geçişinde (A2→B1, B1→B2...) 20 soruluk kapı testi. Yeni içerik üretilmiyor — mevcut kartlardan seçiliyor, sadece zamanlama ve eşik mantığı ekleniyor.

A2 packlerini %75 tamamla


"B1 Seviye Testi" (20 soru, karma tip)

     ┌──┴──┐
  ≥%70  <%70
     │      │
  B1 açılır  A2 paketi tekrar önerilir

Bu özellik hem motivasyon hem de kullanıcının gerçek sertifika yolculuğunu (IELTS/TOEFL) simüle etmesi açısından güçlü.


Katman 3 — Aktif Üretim (Free Production)

Tanıma → Üretim geçişi. En kritik pedagojik atlama.

Araştırmalar net: kelimeyi seçenekler arasında bulmak ile o kelimeyi boş sayfada üretmek farklı beyin bölgeleri kullanıyor. Gerçek akıcılık ikincisini gerektiriyor.

3A — Hard Mode (Yazarak Cevap)

Mevcut quiz/fillGap kartlarına ek render modu. Seçenekler gösterilmez, kullanıcı cevabı klavyeyle yazar. Aynı 235K kart, farklı zorluk.

Normal Mode:              Hard Mode:
"The sun _____ in         "The sun _____ in
 the west."                the west."

[sets ✓] [rises]          [         ] ← kullanıcı yazar
[falls]  [stays]

Validasyon: exact match (lowercase, trim) + Levenshtein distance ≤ 2 (typo toleransı). Runtime'da AI çağrısı yok.

B1+ seviyede unlock, Pro kullanıcılara açık.

3B — Ters Çeviri (TR → EN)

Mevcut kartların sentence_native / question_native alanları zaten var. Bunlar ters yönde kullanılır:

Türkçe gösterilir:   "Güneş batıda batar."
Kullanıcı yazar:     "The sun sets in the west."

Bu kart tipi için yeni içerik üretilmiyor. Mevcut fillGap kartlarının çift yönlü kullanımı.

3C — Açık Cümle Tamamlama

Cümlenin başı verilir, kullanıcı devamını yazar. Validation LLM gerektirdiğinden bu en pahalı feature — kullanıcı başına bir Gemini çağrısı.

"If I had more time, I would ___________________"

Serbest cevap → Gemini "dilbilgisel olarak doğru mu + bağlama uygun mu?" değerlendirmesi yapar. Pro kullanıcılar için günlük 5 hak.


Katman 4 — Konuşma & Akıcılık (keşfedilecek)

Bu katman teknik ve iş modeli açısından ayrı bir tartışma gerektiriyor.

Dil öğreniminin nihai hedefi konuşmak. Katman 1–3 okuma ve yazmayı kapsamlı şekilde öğretiyor ama konuşma boyutu henüz tanımlanmamış.

Gerekli olduğu kesin. Nasıl yapılacağı sonraki aşamada ele alınacak.


3. Teknik Mimari

Genel Stack

┌─────────────────────────────────────────────────────┐
│                  CLIENT (Mobile App)                 │
│                                                      │
│  React Native 0.81 + Expo 54                        │
│  ├── expo-router        (Navigation)                 │
│  ├── nativewind         (Tailwind CSS for RN)        │
│  ├── react-native-reanimated (Animations)            │
│  ├── expo-blur          (Glass morphism UI)          │
│  ├── expo-speech        (TTS - sesli okuma)          │
│  ├── expo-haptics       (Dokunsal geri bildirim)     │
│  └── AsyncStorage       (Local persistence)          │
│                                                      │
└──────────────────┬──────────────────────────────────┘

          (Planlanan backend)

┌──────────────────┴──────────────────────────────────┐
│                  BACKEND (Planned)                   │
│                                                      │
│  Supabase (PostgreSQL)                               │
│  ├── users tablosu                                   │
│  ├── cards tablosu  ← statik, AI ile önceden üretildi│
│  ├── user_progress  ← SRS state                      │
│  └── packs          ← kart paketleri                 │
│                                                      │
│  Edge Functions                                      │
│  └── /ai-explain    ← Gemini API çağrısı (runtime)   │
│                                                      │
└──────────────────┬──────────────────────────────────┘

┌──────────────────┴──────────────────────────────────┐
│              AI LAYER                                │
│                                                      │
│  Gemini Flash                                        │
│  ├── Offline kullanım: SIFIR çağrı (kartlar static) │
│  └── Online kullanım: sadece AI açıklama için        │
│                                                      │
└─────────────────────────────────────────────────────┘

Bileşen Ağacı

App (expo-router)
└── LessonFlow                  ← Ana state yöneticisi
    ├── AILoadingScreen          ← Onboarding
    ├── LanguageSelector         ← Dil seçimi
    ├── SmartCard                ← Kart renderer
    │   ├── Quiz variant
    │   ├── FillGap variant
    │   ├── SentenceBuilder variant
    │   ├── Idiom variant          ← YENİ: Quiz UI yeniden kullanılır
    │   └── ErrorCorrection variant ← YENİ: Quiz UI yeniden kullanılır
    ├── AIExplanation (Sheet)    ← Yanlış cevap açıklaması
    ├── VaultScreen              ← Hafıza bankası
    ├── ProfileScreen            ← Kullanıcı profili
    └── SubscriptionScreen       ← Pro satın alma

Lazy Language Pair Initialization

TR-EN tek el yapımlı dil çiftidir. Diğer tüm çiftler talep üzerine üretilir.

Kullanıcı dil seçer: "Español (ES)"


system: language_pairs tablosunda 'es-en' var mı?

     ┌────┴─────┐
    VAR        YOK (ilk ES kullanıcısı)
     │              │
     │              ▼
     │        Background job tetiklenir:
     │        "ES-EN Translation Batch"
     │              │
     │              ▼
     │        Mevcut 235K kart için
     │        Gemini'ye ES çevirisi ürettirilir
     │        translations JSONB'ye 'es' key eklenir
     │              │
     │              ▼
     │        ~1 saat sonra tamamlanır (~$0.90)
     │        language_pairs: es-en → 'ready'
     │        Kullanıcı bildirim alır
     │              │
     └──────────────┘


   ES-EN içerik statik olarak servis edilir
   Sonraki tüm ES kullanıcıları: $0, anında

Kullanıcı deneyimi (üretim sırasında): İlk ES kullanıcısı beklemek zorunda değil. TR-EN demo içeriği gösterilir ya da "İspanyolca içerik hazırlanıyor, hazır olunca bildirim alacaksınız" mesajı verilir. Kuyruktaki kullanıcı sayısına göre öncelik verilebilir.

Kart şemasına etkisi: English içerik (sentence, options, answer) tüm çiftlerde aynı — dil-agnostik. Tek değişen translations JSONB içindeki native language key'i:

json
{
  "translations": {
    "tr": { "question": "Geçici", "context": "Zaman algısı" },
    "es": { "question": "Efímero", "context": "Percepción del tiempo" },
    "ru": { "question": "Мимолётный", "context": "Восприятие времени" }
  }
}

Yeni dil çifti = mevcut kartlara yeni key eklenir. Kart sayısı değişmez.

State Akışı (Veri Katmanları)

┌─────────────────┐     loadVault()      ┌──────────────────┐
│   AsyncStorage  │ ──────────────────►  │   LessonFlow     │
│  (local disk)   │ ◄──────────────────  │   State          │
└─────────────────┘     saveVault()      │                  │
                                         │  deck[]          │
┌─────────────────┐   fetchInitialDeck() │  idx             │
│   ApiService    │ ──────────────────►  │  savedItems[]    │
│  (mock/future   │                      │  mistakeItems[]  │
│   Supabase)     │                      │  feedback        │
└─────────────────┘                      └──────────────────┘

                                          props olarak aşağı

                                         ┌────────┴───────┐
                                         │   SmartCard    │
                                         │   onAnswer()   │
                                         └────────────────┘

4. Temel Algoritma: The Deep Drill

Bu, Learnguai'nin maliyet avantajının kalbi.

Felsefe: "Write Once, Serve Millions"

Geleneksel yaklaşım:

Kullanıcı istek atar → AI çağrısı → Cevap → Para biter
(1M kullanıcı = 1M API çağrısı = $$$)

Learnguai yaklaşımı:

Bir kez: 10,000 cümle → AI ile işle → 100,000 statik kart → DB'ye yaz
Her zaman: Kullanıcı → DB'den oku → API çağrısı YOK → $0

Pipeline: 4 Aşamalı Maden Ocağı

                    THE DEEP DRILL PIPELINE
                    ━━━━━━━━━━━━━━━━━━━━━━━

┌─────────────────────────────────────────────────────────────┐
│  ADIM 1: RAW ORE EXTRACTION (Zero Cost)                     │
│                                                             │
│  ┌──────────────┐  ┌─────────────────┐  ┌───────────────┐  │
│  │   Tatoeba    │  │ Project         │  │  Wiktionary   │  │
│  │  (cümle çiftleri│ │ Gutenberg      │  │  (kelime      │  │
│  │   En-Tr, En-Es│  │ (kamu domain   │  │   tanımları)  │  │
│  │   milyonlarca)│  │  kitaplar)     │  │               │  │
│  └──────┬───────┘  └────────┬────────┘  └───────┬───────┘  │
│         └──────────────────┼────────────────────┘          │
│                             │                               │
│                    Ham cümle havuzu                         │
└─────────────────────────────┬───────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│  ADIM 2: THE SIEVE (CPU-only, sıfır AI)                     │
│                                                             │
│  Gelen cümle                                                │
│       │                                                     │
│       ├─ Uzunluk filtresi ──► < 3 kelime? → ATLA           │
│       │                       > 20 kelime? → ATLA          │
│       │                                                     │
│       └─ CEFR Seviye Tayini (Kelime Frekans Listesi)        │
│              │                                              │
│              ├─ Oxford 3000'deki ilk 500 kelime → A1       │
│              ├─ Oxford 3000 → A2/B1                        │
│              ├─ Academic Word List → B2/C1                  │
│              └─ Düşük frekanslı ("ephemeral") → C1/C2      │
│                                                             │
│  Çıktı: Seviyelendirilmiş ham cümleler                      │
└─────────────────────────────┬───────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│  ADIM 3: THE REFINERY                                       │
│                                                             │
│  Kart tipine göre iki farklı yol:                           │
│                                                             │
│  YOL A — Gemini Flash (quiz / fillGap / idiom)              │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  PROMPT (tek seferde 50 cümle):                      │   │
│  │  "Here are 50 English sentences.                     │   │
│  │   For each:                                          │   │
│  │   1. Identify the hardest target word                │   │
│  │   2. Generate 3 plausible distractors                │   │
│  │   3. Verify the Turkish translation                  │   │
│  │   Output as JSON array."                             │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                             │
│  YOL B — Algoritmik (errorCorrection) — AI YOK             │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  INPUT: Doğru cümle (Tatoeba'dan)                    │   │
│  │  "She doesn't know the answer."                      │   │
│  │                                                      │   │
│  │  Hata dönüşüm kuralları (deterministik):             │   │
│  │  • 3. tekil -s kaldır  → "She don't know..."        │   │
│  │  • Yanlış tense        → "She didn't knew..."       │   │
│  │  • Yanlış yardımcı     → "She not know..."          │   │
│  │                                                      │   │
│  │  Çıktı: 1 doğru + 3 sistematik yanlış seçenek       │   │
│  │  Maliyet: $0.00                                      │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                             │
│  Toplam Maliyet Hesabı:                                     │
│  • Gemini Flash: ~$0.075 / 1M input token                  │
│  • quiz/fillGap/idiom: 50 kart/prompt ≈ 2000 token         │
│  • errorCorrection: $0 (algoritmik)                         │
│  • 50,000 karma kart için toplam: ~$0.20                    │
│                                   TOPLAM: < $1              │
└─────────────────────────────┬───────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│  ADIM 4: CRYSTALLIZE (Statik JSON / DB)                     │
│                                                             │
│  {                                                          │
│    "id": "c_4521",                                          │
│    "level": "C1",                                           │
│    "type": "fillGap",                                       │
│    "sentence": "The AI's logic was _____ to comprehension", │
│    "options": ["impenetrable","easy","open","visible"],      │
│    "answer": "impenetrable",                                │
│    "translations": {                                        │
│      "tr": { "sentence": "Yapay zekanın mantığı..." }       │
│    }                                                        │
│  }                                                          │
│                                                             │
│  • Değişmez (immutable)                                     │
│  • Runtime'da API key gerektirmez                           │
│  • Offline çalışır                                          │
│  • CDN'den serve edilebilir                                 │
└─────────────────────────────────────────────────────────────┘

Content Scale: Kaç Kart Üretilebilir?

Mevcut açık kaynak verilerden tek bir pipeline run ile üretilebilecek kart sayısı:

TipKaynakYöntemTahmini Kart
quizTatoeba + WiktionaryGemini batch~30,000
fillGapTatoeba (180K cümle)Gemini batch~100,000
sentenceBuilderTatoeba (5–12 kelime)Gemini batch~40,000
idiomCOCA + BNC + Gemini üretimiGemini batch~15,000
errorCorrectionTatoeba + GutenbergAlgoritmik ($0)~50,000
TOPLAM~235,000
Toplam üretim maliyeti (235,000 kart):  ~$1.30
Duolingo'nun aynı içeriği üretmesi:      editör + pedagog + studio → aylar + $$$

CEFR başına dağılım:

A1 (~18K) ██░░░░░░░░░░░░░░░░░░  8%
A2 (~28K) ███░░░░░░░░░░░░░░░░░ 12%
B1 (~52K) █████░░░░░░░░░░░░░░░ 22%
B2 (~66K) ███████░░░░░░░░░░░░░ 28%
C1 (~47K) █████░░░░░░░░░░░░░░░ 20%
C2 (~24K) ██░░░░░░░░░░░░░░░░░░ 10%

Örnek: Bir Cümlenin Dönüşümü

INPUT (Tatoeba):
"The sun sets in the west."


        ▼ SIEVE
Kelimeler: the(A1), sun(A1), sets(A1), in(A1), west(A1)
→ Seviye: A1  |  Hedef kelime: "sets" (fiil, bağlamsal anlam)


        ▼ REFINERY (Gemini)
Distractors: ["rises", "falls", "stays"]
TR çeviri: "Güneş batıda batar."


        ▼ OUTPUT CARD
{
  type: "fillGap",
  sentence: "The sun _____ in the west.",
  options: ["sets", "rises", "falls", "stays"],
  answer: "sets",
  level: "A1"
}

5. Spaced Repetition: Öğrenme Motoru

SRS (Spaced Repetition System), bilimsel olarak kanıtlanmış en etkili ezber tekniği. Temel fikir: Kartı doğru cevapladıkça gösterim aralığı uzar. Yanlış cevaplandıkça kısalır.

Ebbinghaus Unutma Eğrisi

Hafıza
  %
100 ─┐
     │╲         ← öğrenme anı
  80 │ ╲_____      SRS ile tekrar ──────────────── %90+
     │       ╲_
  60 │          ╲___
     │               ╲___
  40 │                    ╲____
     │                         ╲____
  20 │                               ╲_____
     │   Tekrarsız unutma eğrisi            ╲_____
   0 └──────────────────────────────────────────────► Zaman
     0       1s      1g      3g      1h      1ay

Hermann Ebbinghaus 1885'te bunu keşfetti: öğrenilen şey tekrar edilmezse üstel bir eğriyle unutuluyor. SRS bu eğriye karşı oynuyor — her tekrar "unutma saatini" sıfırlamak yerine belleği daha derin göçüyor, bir sonraki tekrar aralığı uzuyor.


SM-2: 35 Yıl Kullanılan Standart

Piotr Wozniak tarafından 1987'de geliştirilen SM-2, Anki'nin temel algoritmasıdır. Bugün hâlâ dünyada en yaygın kullanılan SRS algoritması.

Nasıl çalışır:

Her kartın iki parametresi var:

  • interval — kaç gün sonra tekrar gösterilecek
  • EF (Easiness Factor) — kartın kolay/zor katsayısı, 1.3–2.5 arası

Kullanıcı her kartı 0–5 arasında derecelendiriyor:

0 = Hiç hatırlamadım   3 = Zorlanarak hatırladım
1 = Yanlış             4 = Kolayca hatırladım
2 = Yanlış ama tanıdık 5 = Çok kolay

Yeni interval hesabı:

Grade < 3 → interval = 1 (sıfırla, yarın tekrar göster)
1. tekrar → interval = 1
2. tekrar → interval = 6
3.+ tekrar → interval = interval × EF

EF güncelleme:
EF = EF + (0.1 - (5 - grade) × (0.08 + (5 - grade) × 0.02))
EF minimum: 1.3

SM-2'nin sınırları:

Problem 1 — Sadece 2 parametre var (interval + EF)
  Hafızayı modelliyor mu? Hayır.
  Sadece "ne zaman göster?" sorusuna cevap veriyor.

Problem 2 — Geç veya erken tekrar cezası yok
  10 günlük kartı 20 gün sonra gördün?
  SM-2 bunu bilmiyor, o an gerçek hatırlama olasılığını hesaplayamıyor.

Problem 3 — 0-5 derecelendirme subjektif
  "Zorlandım ama hatırladım" 3 mü, 4 mü?
  Tutarsız kullanıcı girdisi = güvenilmez parametre güncelleme.

Problem 4 — Kişiselleştirme yok
  Herkes aynı formülü kullanıyor.
  Bazı insanlar daha hızlı unutur — SM-2 bunu öğrenemiyor.

FSRS: Neden Geçiş Yaptık?

FSRS (Free Spaced Repetition Scheduler), Jarrett Ye tarafından 2022'de geliştirildi. İlginç olan: SM-2'nin yaratıcısı Wozniak'ın kendi geliştirdiği DSR (Difficulty-Stability-Retrievability) modeline dayanıyor. Yani SM-2'nin mucidi, yıllar sonra çok daha iyi bir model ortaya koydu.

FSRS'in 3 temel parametresi:

D — Difficulty (Zorluk)
    Kartın kendine özgü zorluğu. 0–10 arası.
    Yüksek D = bu kart herkes için zor.
    Güncellenir ama yavaş değişir.

S — Stability (Kararlılık)
    "Bu hafıza kaç gün dayanır?"
    S=10 → 10 gün sonra %90 ihtimalle hatırlarsın.
    S=30 → 30 gün sonra %90 ihtimalle hatırlarsın.
    Doğru cevapta artar. Yanlışta sıfırlanır.

R — Retrievability (Erişilebilirlik)
    "Şu an hatırlama olasılığım nedir?"
    Her an hesaplanabilir: R = 0.9^(t / S)
    t = son tekrardan bu yana geçen gün

Matematiksel model:

R(t, S) = 0.9^(t / S)

Örnekler:
  S=10, t=10  →  R = 0.9^1   = %90  ← ideal tekrar anı
  S=10, t=5   →  R = 0.9^0.5 = %95  ← erken, ama güvenli
  S=10, t=20  →  R = 0.9^2   = %81  ← geç, unutma başladı
  S=10, t=30  →  R = 0.9^3   = %73  ← tehlike bölgesi

Hedef: R = %90 olduğunda göster. Bu demek ki: next_review = now + S gün

Doğru cevap sonrası S güncelleme:

S_new = S_old × f(D, R)

f(D, R): zorluk düşükse ve R yüksekse (erken tekrar) → küçük artış
         zorluk yüksekse ve R düşükse (geç tekrar) → büyük artış
         (formül 19 ağırlık parametresi içeriyor, makine öğrenmesiyle optimize edilebilir)

Yanlış cevap sonrası:

S_new = S_old × w  (w < 0.5, büyük düşüş)
D_new = D_old + sabit  (kart daha zor olarak işaretlenir)
next_review = 10 dakika  (acil tekrar)

SM-2 vs FSRS: Karşılaştırma

KriterSM-2FSRS
Hafıza modeliYok (sezgisel interval)Matematiksel (R = 0.9^(t/S))
Parametreler2 (interval, EF)3 (D, S, R) + 19 ağırlık
Geç tekrar etkisiYok sayılırR üzerinden doğru hesaplanır
Erken tekrar etkisiYok sayılırS artışı daha küçük olur (doğru)
KişiselleştirmeYok19 ağırlık kullanıcı verisine göre optimize edilebilir
Anlık hatırlama tahminiHesaplanamazHer an R hesaplanabilir
Aynı %90 için review sayısıBaseline%20–30 daha az
Kullanım yaygınlığıAnki (35 yıl)Anki v23.10+, yeni nesil uygulamalar
Açık kaynakEvetEvet (MIT)
Kullanıcı derecelendirmesi0–5 (6 seçenek)1–4 (Again/Hard/Good/Easy)

Neden FSRS seçtik:

  • Aynı öğrenme hedefine daha az tekrarla ulaşılıyor → kullanıcı daha az yoruluyor
  • Anlık R hesabı: "Bu kullanıcının bu kelimeyi şu an hatırlama ihtimali %67" bilgisi analytics ve adaptif içerik için çok değerli
  • Anki resmi olarak 2023'te FSRS'e geçti — sektör standardı değişiyor
  • 19 ağırlık parametresi Pro kullanıcılar için kişiselleştirilebilir — premium özellik olarak sunulabilir

FSRS Akışı (Learnguai İçin)

Kart gösterilir


R hesaplanır: R = 0.9^(t / S)
(Kullanıcıya gösterilebilir: "Bu kelimeyi hatırlama şansın: %73")


Kullanıcı cevaplar

   ┌──┴────────────────────────┐
   │                           │
DOĞRU                        YANLIŞ
   │                           │
   ▼                           ▼
S_new = S × f(D, R)          S_new = S × 0.3 (büyük düşüş)
D_new = max(1, D - 0.15)     D_new = min(10, D + 0.5)
next_review = now + S_new    next_review = now + 10 dakika
                              lapses++
   │                           │
   └────────────┬──────────────┘


        user_progress güncelle
        { S, D, next_review, lapses, last_review }

Mobil UX için derecelendirme:

Yanlış cevap → sistem otomatik "Again (1)" sayar
Doğru cevap → kullanıcıya 2 seçenek:

  [Zorlandım]          [Kolaydı]
   Hard (2)             Easy (4)
   S biraz artar        S çok artar
   D biraz artar        D azalır

Basit binary (doğru/yanlış) da çalışır — mobil UX'i bozmadan. 4'lü derecelendirme Pro kullanıcılara açılabilir (daha hassas SRS için).


Mevcut Durum vs Hedef

ÖzellikŞu An (MVP)Hedef
Kart sırasıSabit deck, döngünext_review bazlı FSRS sıralaması
Yanlış cevap3 sıra ileriye ekleS sıfırla, 10dk sonra göster
Doğru cevapVault'a kaydetS artır, next_review hesapla
Günlük hedefHardcodednext_review ≤ now olan kartlar
KişiselleştirmeYok19 ağırlık, kullanıcı verisine göre optimize

6. Veri Modeli

Entity-Relationship Şeması

┌──────────────────────────────────────────────────────┐
│                       users                          │
├──────────────────────────────────────────────────────┤
│ id            UUID  PK                               │
│ email         TEXT                                   │
│ native_lang   TEXT  ('tr','es','fr'...)              │
│ target_lang   TEXT  ('en')                           │
│ level         TEXT  (A1..C2)                         │
│ xp            INT                                    │
│ streak_current INT                                   │
│ streak_best   INT                                    │
│ last_active_at TIMESTAMPTZ                           │
│ daily_goal    INT   (dakika)                         │
│ is_pro        BOOL                                   │
└──────────────────┬───────────────────────────────────┘
                   │ 1

                   │ N
┌──────────────────┴───────────────────────────────────┐
│                  user_progress                        │
├──────────────────────────────────────────────────────┤
│ user_id       UUID  FK → users.id                    │
│ card_id       TEXT  FK → cards.id                    │
│ status        ENUM  (new|learning|review|mastered)   │
│ stability     FLOAT (SRS: kaç gün hatırlanacak)      │
│ difficulty    FLOAT (SRS: kartın zorluğu 0-1)        │
│ last_review   TIMESTAMPTZ                            │
│ next_review   TIMESTAMPTZ  ← index'lenmeli!          │
│ lapses        INT   (kaç kez unutuldu)               │
└──────────────────┬───────────────────────────────────┘
                   │ N

                   │ 1
┌──────────────────┴───────────────────────────────────┐
│                      cards                           │
├──────────────────────────────────────────────────────┤
│ id            TEXT  PK  ("c_1024")                   │
│ pack_id       TEXT  FK → packs.id                    │
│ level         TEXT  (A1..C2)                         │
│ complexity_score FLOAT (0.0-1.0)                     │
│ type          ENUM  (quiz|fillGap|sentenceBuilder|   │
│                      idiom|errorCorrection)          │
│ context       TEXT  ("Travel • Polite Requests")     │
│ content       JSONB (polymorphic: question/sentence/ │
│                      words/options/answer)           │
│ translations  JSONB ({ tr: {...}, es: {...} })       │
└──────────────────┬───────────────────────────────────┘
                   │ N

                   │ 1
┌──────────────────┴───────────────────────────────────┐
│                      packs                           │
├──────────────────────────────────────────────────────┤
│ id            TEXT  PK  ("p_nature_c1")              │
│ title         TEXT  ("Nature & Environment")         │
│ level         TEXT                                   │
│ card_count    INT                                    │
│ is_free       BOOL  ← freemium kapısı               │
└──────────────────────────────────────────────────────┘

language_pairs Tablosu

Hangi dil çiftlerinin üretildiğini ve durumunu takip eder.

┌──────────────────────────────────────────────────────┐
│                   language_pairs                     │
├──────────────────────────────────────────────────────┤
│ native_lang   TEXT  PK  ('tr','es','ru','ja'...)     │
│ target_lang   TEXT  PK  ('en')  ← şimdilik sabit    │
│ status        ENUM  (pending|generating|ready)       │
│ triggered_by  UUID  FK → users.id  ← ilk isteyen    │
│ generated_at  TIMESTAMPTZ  ← ne zaman tamamlandı    │
│ card_count    INT   ← kaç kart üretildi             │
│ cost_usd      FLOAT ← üretim maliyeti (log için)    │
└──────────────────────────────────────────────────────┘

TR-EN: status='ready', elle oluşturuldu
ES-EN: status='pending' → 'generating' → 'ready'
JA-EN: henüz kimse istemedi → tabloda yok

DB'ye Kim Yazar?

Veritabanına iki ayrı kaynak yazar. Bunların karışmaması önemli.

┌─────────────────────────────────────────────────────────────┐
│  PIPELINE YAZAR  (tek seferlik, statik, immutable)          │
│                                                             │
│  cards      ← 235K kart, bir kez yazılır, hiç değişmez     │
│  packs      ← kart grupları + curriculum graph             │
│  passages   ← Katman 2 reading paragrafları                │
│                                                             │
│  Ne zaman: pipeline çalıştırıldığında (yılda 1-2 kez)      │
│  Kim tetikler: geliştirici                                  │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  UYGULAMA YAZAR  (runtime, dinamik, kullanıcı başına)       │
│                                                             │
│  users          ← kayıt / profil güncelleme                │
│  user_progress  ← her cevap sonrası SRS state              │
│                   (stability, next_review, lapses...)       │
│                                                             │
│  Ne zaman: kullanıcı her kart cevapladığında               │
│  Kim tetikler: kullanıcı aksiyonu                          │
└─────────────────────────────────────────────────────────────┘

Ölçek: user_progress Tablosu

En çok büyüyecek tablo bu. Doğru planlanmazsa sorun çıkarır.

Aktif kullanıcı başına ortalama görülen kart: ~10,000
(Tüm 235K kartı kimse tamamlamaz, aktif kullanım böyle)

100K kullanıcı × 10K kart = 1 milyar satır
500K kullanıcı × 10K kart = 5 milyar satır

Bu rakamlar büyük görünüyor ama PostgreSQL bu ölçeği kaldırır. Kritik olan tek şey doğru index:

sql
-- Günlük "hangi kartları bugün göster?" sorgusu:
SELECT card_id FROM user_progress
WHERE user_id = $1
  AND next_review <= NOW()
ORDER BY next_review ASC
LIMIT 20;

-- Bu sorgunun hızlı çalışması için:
CREATE INDEX idx_user_progress_review
ON user_progress (user_id, next_review);
-- Bu index olmadan 1B satırda full scan → felaket
-- Bu index ile → milisaniye

Cihazda (AsyncStorage) Ne Tutar?

Uygulama internet bağlantısı olmadan da çalışmalı. Bunun için her oturum başında bir günlük kart paketi lokale yazılır.

DB (Supabase)                    Cihaz (AsyncStorage)
─────────────────                ────────────────────
• Tüm kartlar (235K)             • Bugünkü deck (~20-50 kart)
• Tüm user_progress              • Vault önbelleği
• Kullanıcı profili              • Dil tercihi

Senkronizasyon:
• Uygulama açıldığında → DB'den bugünkü kartları çek → lokale yaz
• Cevap verildiğinde   → lokale işle → bağlantı gelince DB'ye sync

Bu mimari hem hız sağlar (lokalde her şey anlık) hem de offline çalışmayı mümkün kılar.


7. Gelir Modeli

Strateji: Freemium + Subscription

FREE TIER                          PRO TIER ($7.99/ay veya $49.99/yıl)
─────────────────────────          ──────────────────────────────────
• İlk 3 pack (A1-A2)              • Tüm packler (A1-C2, tüm konular)
• Günlük 20 kart limiti           • Sınırsız kart
• Yalnızca quiz + fillGap         • 5 kart tipi (sentenceBuilder + idiom
                                    + errorCorrection dahil)
• AI açıklama yok                 • AI açıklama (yanlış cevapta)
• Offline yok                     • Offline mod
• Reklam var                      • Reklam yok
                                  • Detaylı istatistikler
                                  • Gelişmiş SRS kontrol

Gelir Projeksiyonu

Varsayımlar:
• %3 freemium → pro dönüşüm (sektör ortalaması %2-5)
• Aylık aktif kullanıcı (MAU) büyümesi

MAU     | Free  | Pro (%3) | Aylık Gelir ($7.99)
──────────────────────────────────────────────────
1,000   |  970  |   30     | $240
10,000  | 9,700 |  300     | $2,397
50,000  |48,500 | 1,500    | $11,985
100,000 |97,000 | 3,000    | $23,970
500,000 |485,000| 15,000   | $119,850

Maliyet Yapısı (Rakip Analizi)

Duolingo içerik maliyeti:
→ Editörler + pedagoglar + studio = yüzlerce çalışan
→ İçerik başına maliyet: yüksek, ölçeklenemiyor

Learnguai içerik maliyeti:
→ 50,000 kart üretimi: ~$0.30 (tek seferlik)
→ Runtime AI maliyeti: sadece AI açıklama = ~$0.001/açıklama
→ 1,000 kullanıcı günlük 10 yanlış cevap = $10/gün
→ Infrastructure: Supabase free tier → $25/ay (100k kullanıcıya kadar)

Marj: Pro kullanıcı başına ~$7.50 net (Stripe fee sonrası)

Ek Gelir Kanalları

KanalAçıklamaPotansiyel
B2B KurumsalŞirket dil eğitimi (takım lisansı)Yüksek (tek sözleşme = 50-500 kullanıcı)
Pack MarketplaceKullanıcıların pack oluşturup satmasıPlatform fee %30
API LisansıDeep Drill pipeline'ı diğer uygulamalara satPasif gelir
AffiliateDil sertifika sınavlarına yönlendirme (IELTS, TOEFL)Düşük ama pasif

8. Şu Anki Durum & Yol Haritası

MVP Durumu (Şu An)

[TAMAMLANDI]
├── UI/UX: Tüm ekranlar tasarlandı ve çalışıyor
├── 3 kart tipi tamamen işlevsel
├── Vault (kayıt + hata takibi) çalışıyor
├── Lokalizasyon altyapısı (7 dil UI)
├── TTS (sesli okuma) entegrasyonu
├── Haptic feedback
└── Mock AI açıklama sistemi

[YOK / MOCK]
├── Backend (Supabase) bağlantısı yok, hardcoded data
├── SRS algoritması yok (düz döngü var)
├── Gerçek Gemini API bağlantısı yok (simüle)
├── Kullanıcı authentication yok
└── Gerçek kartlar yok (5 demo kart)

Yol Haritası

SPRINT 1 (1-2 hafta) — Backend Foundation
├── Supabase kurulumu
├── users + cards + user_progress tablolar
├── Authentication (email + Apple/Google OAuth)
└── fetchInitialDeck → gerçek DB sorgusu

SPRINT 2 (2-3 hafta) — Content Pipeline v1
├── Tatoeba EN-TR dataset import (~450K cümle)
├── The Sieve: uzunluk + CEFR seviye filtresi
├── Konu taksonomisi tanımı (~80 leaf topic)
├── Batch Gemini Flash işlemesi (quiz / fillGap / idiom + topic tag)
├── Gramer hata kataloğu (ilk 10 kural) + errorCorrection üretici
├── Quality gate (distractor plausibility skoru)
├── Exact hash deduplication
└── İlk 1,000 gerçek kart (A1–B1, tüm 5 tip, 5 konu)

SPRINT 3 (2 hafta) — SRS Engine
├── FSRS algoritması implementasyonu
├── user_progress güncelleme
├── next_review bazlı kart seçimi
└── Günlük hedef sistemi

SPRINT 4 (1-2 hafta) — Curriculum & Scale
├── Pack schema + curriculum graph (prerequisite zinciri)
├── Pack içi kart sıralama (quiz önce → errorCorrection sonda)
├── Semantic dedup (embedding bazlı, ~$0.50 one-time)
├── Full pipeline run → 10,000 kart (A1–B2, 20 konu)
└── Pack unlock sistemi (%75 tamamlanma kapısı)

SPRINT 5 (1-2 hafta) — Monetization
├── RevenueCat entegrasyonu (subscription)
├── Free vs Pro pack ayrımı
├── App Store / Play Store submission
└── Analytics (Amplitude veya PostHog)

SPRINT 6 — Lazy Language Pair System
├── language_pairs tablosu + status tracking
├── Background job queue (Supabase pg_cron veya Edge Function)
├── "Dil hazırlanıyor" UX + push notification
├── translations JSONB'ye dinamik key ekleme
└── İlk otomatik test: ES-EN tetikleme + doğrulama

SPRINT 7+ — Growth & Full Content
├── Full pipeline run → 50,000 kart (A1–C2, 50 konu)
├── Streak + push notification sistemi
├── Gramer hata kataloğu genişletme (25 kural)
├── Sosyal özellikler (leaderboard)
└── Full run → 235,000 kart (yılda 1–2 kez pipeline tekrarı)

9. Neden Biz Kazanabiliriz?

Sürdürülebilir Rekabet Avantajları

1. Maliyet Yapısı Rakipler içerik üretimine para harcarken, biz pipeline'ı bir kez kuruyoruz. TR-EN tüm içerik: ~$1.30 (tek seferlik). Yeni dil çifti (örn. ES-EN): ~$0.90 + otomatik tetiklenir, geliştirici müdahalesi yok. Duolingo için aynı iş: aylar + editör ekibi + studio.

2. AI-Native Pedagoji Mevcut uygulamalar AI'yı "sonradan" ekliyor. Learnguai, AI olmadan var olamaz — bu bir kırılganlık değil, bir savunma duvarı.

3. Infinite Content Flywheel

Daha fazla kullanıcı


Daha fazla hata verisi


Hangi kartların zor olduğunu öğreniyoruz


Pipeline daha iyi kartlar üretiyor


Daha iyi öğrenme oranı → daha fazla kullanıcı

4. Lazy Language Pair Architecture TR-EN el ile kurulur ve tüm kararlar bilinçli alınır. Diğer tüm dil çiftleri o dili konuşan ilk kullanıcı geldiğinde otomatik olarak tetiklenir, ~1 saatte üretilir, sonsuza kadar statik kalır. Yeni bir dil eklemek için geliştirici müdahalesi gerekmez. Sistem büyüdükçe kendiliğinden genişler.

Tek Cümlelik Pitch

Learnguai, Duolingo'nun gamification'ını Anki'nin bilimi ve Gemini'nin içerik üretim gücüyle birleştiren, marjinal içerik maliyeti neredeyse sıfır olan bir dil öğrenme platformudur.


Ekler

Teknoloji Seçim Gerekçeleri

TeknolojiAlternatifNeden Bu?
React Native + ExpoFlutterJS ekosistemi, hızlı prototipleme, OTA update
SupabaseFirebasePostgreSQL (relational, SRS sorguları için kritik), open source
Gemini FlashGPT-4o miniFiyat/kalite oranı, 1M token context
FSRSSM-2 (Anki)Daha modern, açık kaynak, daha az parametre
NativeWindStyleSheetTailwind bilgisi transferi, hız
Algoritmik hata üreticiGemini (errorCorrection için)Sıfır maliyet, deterministik, ölçeksiz

Referans Linkler

  • Tatoeba Project: açık kaynak cümle çiftleri (tatoeba.org)
  • FSRS Algoritması: github.com/open-spaced-repetition/fsrs4anki
  • Oxford 3000 Kelime Listesi: oxford learner's dictionaries
  • Gemini Flash Fiyatlandırma: ai.google.dev/pricing

Doküman tarihi: Mart 2026 | Versiyon: 1.0