{"id":45104008,"url":"https://github.com/muhittincamdali/educationai","last_synced_at":"2026-02-19T21:56:30.238Z","repository":{"id":308989698,"uuid":"1032155110","full_name":"muhittincamdali/educationai","owner":"muhittincamdali","description":"📚 AI-powered education platform for personalized learning","archived":false,"fork":false,"pushed_at":"2026-02-04T23:17:01.000Z","size":265,"stargazers_count":2,"open_issues_count":9,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-05T11:39:12.654Z","etag":null,"topics":["ai","coreml","edtech","education","ios","learning","machine-learning","swift","swift-package-manager","swiftui"],"latest_commit_sha":null,"homepage":"https://github.com/muhittincamdali/educationai#readme","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/muhittincamdali.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["muhittincamdali"]}},"created_at":"2025-08-04T22:37:39.000Z","updated_at":"2026-02-04T23:17:04.000Z","dependencies_parsed_at":"2025-08-16T01:46:09.702Z","dependency_job_id":null,"html_url":"https://github.com/muhittincamdali/educationai","commit_stats":null,"previous_names":["muhittincamdali/educationai"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/muhittincamdali/educationai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhittincamdali%2Feducationai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhittincamdali%2Feducationai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhittincamdali%2Feducationai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhittincamdali%2Feducationai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/muhittincamdali","download_url":"https://codeload.github.com/muhittincamdali/educationai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muhittincamdali%2Feducationai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29634516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T18:02:07.722Z","status":"ssl_error","status_checked_at":"2026-02-19T18:01:46.144Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","coreml","edtech","education","ios","learning","machine-learning","swift","swift-package-manager","swiftui"],"created_at":"2026-02-19T21:56:29.464Z","updated_at":"2026-02-19T21:56:30.224Z","avatar_url":"https://github.com/muhittincamdali.png","language":"Swift","funding_links":["https://github.com/sponsors/muhittincamdali"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eEducationAI\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003ePrivacy-first adaptive learning framework for Apple platforms\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/muhittincamdali/educationai/actions/workflows/ci.yml\"\u003e\n    \u003cimg src=\"https://github.com/muhittincamdali/educationai/actions/workflows/ci.yml/badge.svg\" alt=\"CI Status\"/\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Swift-5.9+-FA7343?style=flat-square\u0026logo=swift\u0026logoColor=white\" alt=\"Swift 5.9+\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/iOS-15.0+-000000?style=flat-square\u0026logo=apple\u0026logoColor=white\" alt=\"iOS 15.0+\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/macOS-12.0+-000000?style=flat-square\u0026logo=apple\u0026logoColor=white\" alt=\"macOS 12.0+\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/SPM-Compatible-FA7343?style=flat-square\u0026logo=swift\u0026logoColor=white\" alt=\"SPM\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT-green?style=flat-square\" alt=\"License\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e •\n  \u003ca href=\"#architecture\"\u003eArchitecture\u003c/a\u003e •\n  \u003ca href=\"#documentation\"\u003eDocumentation\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Why EducationAI?\n\nMost learning apps treat every user the same. **EducationAI** brings six powerful learning engines into a single Swift package — all running on-device with zero server dependency. No data ever leaves the user's phone.\n\n```swift\nlet engine = EducationAI()\n\n// One function call keeps everything in sync\nlet result = engine.recordStudy(card: flashcard, rating: .good, responseTime: 3.5)\n\nprint(\"Next review:\", result.nextReviewDate)   // Spaced repetition\nprint(\"XP earned:\", result.xpEarned)            // Gamification\nprint(\"Streak:\", result.currentStreak)           // Daily streak\nprint(\"New badges:\", result.newBadges)           // Achievement system\n```\n\n## Features\n\n| Engine | What it does |\n|--------|-------------|\n| 🧠 **Spaced Repetition** | SM-2 algorithm schedules reviews at optimal intervals |\n| 📝 **Quiz Generation** | Auto-generates quizzes from flashcard decks (MC, T/F, fill-in-the-blank) |\n| 📈 **Adaptive Difficulty** | Real-time difficulty adjustment based on sliding-window performance |\n| 📊 **Progress Tracking** | Per-subject mastery, accuracy, study time, and event history |\n| 🎯 **Content Recommendation** | Suggests what to study next based on overdue, weak, and new content |\n| 🏆 **Gamification** | XP, levels, streaks, and 14 badge types to keep learners engaged |\n\n### Privacy First\n\n- **100% on-device** — all processing happens locally\n- **No network calls** — works completely offline\n- **No analytics SDKs** — zero third-party tracking\n- **COPPA/FERPA/GDPR** friendly by design\n\n## Installation\n\n### Swift Package Manager\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/muhittincamdali/educationai.git\", from: \"1.0.0\")\n]\n```\n\nThen add `\"EducationAI\"` to your target's dependencies.\n\n### Requirements\n\n| Platform | Minimum Version |\n|----------|----------------|\n| iOS      | 15.0+          |\n| macOS    | 12.0+          |\n| watchOS  | 8.0+           |\n| tvOS     | 15.0+          |\n\n## Quick Start\n\n### 1. Create Flashcards\n\n```swift\nimport EducationAI\n\nlet subject = Subject(name: \"Spanish Vocabulary\", category: .language)\n\nlet cards = [\n    Flashcard(subjectID: subject.id, front: \"Hola\", back: \"Hello\"),\n    Flashcard(subjectID: subject.id, front: \"Gracias\", back: \"Thank you\"),\n    Flashcard(subjectID: subject.id, front: \"Por favor\", back: \"Please\"),\n]\n```\n\n### 2. Study with Spaced Repetition\n\n```swift\nlet engine = EducationAI()\n\n// Get today's study queue\nlet queue = engine.spacedRepetition.studyQueue(\n    from: cards,\n    maxNew: 20,\n    maxReview: 100\n)\n\n// After the user answers, record the result\nlet result = engine.recordStudy(\n    card: queue[0],\n    rating: .good,\n    responseTime: 4.2\n)\n\n// The updated card has the new review schedule\nlet updatedCard = result.updatedCard\nprint(\"Review again:\", updatedCard.nextReviewDate.relativeDescription)\n```\n\n### 3. Generate Quizzes\n\n```swift\n// Multiple choice quiz from your flashcards\nlet quiz = engine.quizEngine.generate(\n    from: cards,\n    count: 10,\n    types: [.multipleChoice, .trueFalse],\n    difficulty: .medium\n)\n\n// Score the answers\nlet quizResult = engine.quizEngine.score(\n    quiz: quiz,\n    answers: userAnswers,   // [questionID: selectedAnswer]\n    timeTaken: 120.0\n)\n\nprint(\"Score: \\(Int(quizResult.score * 100))%\")\nprint(\"Passed: \\(quizResult.passed)\")\n```\n\n### 4. Check Progress\n\n```swift\nlet progress = engine.progressTracker.progress\n\nprint(\"Total reviews:\", progress.totalReviews)\nprint(\"Overall accuracy:\", progress.overallAccuracy)\nprint(\"Global mastery:\", progress.globalMastery)\n\nif let spanish = progress.subjects[subject.id] {\n    print(\"Spanish accuracy:\", spanish.accuracy)\n    print(\"Spanish mastery:\", spanish.masteryScore)\n}\n```\n\n### 5. Get Recommendations\n\n```swift\nlet recommendations = engine.recommendationEngine.recommend(\n    cards: allCards,\n    progress: progress,\n    limit: 5\n)\n\nfor rec in recommendations {\n    print(\"[\\(rec.priority)] \\(rec.title)\")\n    print(\"  \\(rec.description)\")\n    print(\"  ~\\(rec.estimatedMinutes) min\")\n}\n// [critical] Review overdue cards\n//   12 card(s) need review to maintain retention.\n//   ~6 min\n```\n\n### 6. Gamification\n\n```swift\nprint(\"Level:\", engine.gamification.currentLevel)\nprint(\"Total XP:\", engine.gamification.totalXP)\nprint(\"Streak:\", engine.gamification.currentStreak, \"days\")\nprint(\"Progress to next level:\", engine.gamification.levelProgress)\n\nfor badge in engine.gamification.earnedBadges {\n    print(\"🏅 \\(badge.title) (\\(badge.tier.displayName))\")\n}\n```\n\n## Architecture\n\n```\nEducationAI/\n├── EducationAI.swift              # Main entry point \u0026 recordStudy()\n├── Core/\n│   ├── Entities/\n│   │   ├── Flashcard.swift        # Card with SM-2 metadata\n│   │   ├── Quiz.swift             # Quiz, Question, QuizResult\n│   │   ├── Subject.swift          # Subject \u0026 category\n│   │   ├── LearningProgress.swift # Progress snapshots\n│   │   ├── Achievement.swift      # Badges, XP events, streaks\n│   │   └── Enums.swift            # DifficultyLevel, RecallRating\n│   └── Protocols/\n├── SpacedRepetition/\n│   ├── SpacedRepetitionScheduler.swift  # SM-2 implementation\n│   └── SM2Parameters.swift              # Tunable parameters\n├── Quiz/\n│   └── QuizEngine.swift           # Quiz generation \u0026 scoring\n├── Adaptive/\n│   └── AdaptiveDifficultyEngine.swift   # Real-time difficulty adjustment\n├── Progress/\n│   └── ProgressTracker.swift      # Progress recording \u0026 queries\n├── Recommendation/\n│   └── RecommendationEngine.swift # Study recommendations\n├── Gamification/\n│   └── GamificationEngine.swift   # XP, levels, badges, streaks\n├── Storage/\n│   └── LocalStorage.swift         # On-device persistence\n└── Extensions/\n    └── Date+Extensions.swift      # Date helpers\n```\n\n### Design Principles\n\n- **Value types by default** — All entities are `struct` + `Codable` + `Sendable`\n- **Protocol-oriented** — Engines are swappable via protocols\n- **Thread-safe** — Concurrent access handled via `NSLock`\n- **Zero dependencies** — Pure Swift, no third-party libraries\n- **Testable** — 113 unit tests with comprehensive coverage\n\n## Spaced Repetition Algorithm\n\nEducationAI uses a refined SM-2 (SuperMemo 2) algorithm:\n\n```\n┌─────────────────────────────────────────────┐\n│              SM-2 Flow                       │\n│                                              │\n│  New Card ──► 1 day ──► 6 days ──► EF × I   │\n│       ▲                                │     │\n│       │         Lapse (forgot)         │     │\n│       └────────────────────────────────┘     │\n│                                              │\n│  Easiness Factor adjusts after each review   │\n│  EF = EF + (0.1 - (5-q) × (0.08 + 0.02×q))│\n│  (clamped to minimum 1.3)                   │\n└─────────────────────────────────────────────┘\n```\n\nParameters are fully configurable:\n\n```swift\nlet params = SM2Parameters(\n    initialInterval: 1.0,      // First correct → 1 day\n    secondInterval: 6.0,       // Second correct → 6 days\n    minimumEasinessFactor: 1.3,\n    defaultEasinessFactor: 2.5,\n    lapseMultiplier: 0.5,\n    maximumInterval: 365.0,\n    easyBonus: 1.3\n)\n\nlet ai = EducationAI(configuration: .init(sm2Parameters: params))\n```\n\n## Adaptive Difficulty\n\nThe engine maintains a sliding window of recent study events per subject:\n\n```swift\nlet snapshot = engine.adaptiveEngine.performanceMetrics(for: subject.id)\nprint(\"Accuracy:\", snapshot.accuracy)\nprint(\"Trend:\", snapshot.trend)              // .improving / .stable / .declining\nprint(\"Recommended:\", snapshot.difficulty)    // .easy / .medium / .hard / .expert\n```\n\nTarget accuracy zone is 70–85%. The engine steps difficulty up or down to keep the learner in a flow state.\n\n## Badge System\n\n14 built-in badges across 5 tiers (bronze → diamond):\n\n| Badge | Requirement | Tier |\n|-------|------------|------|\n| Getting Started | 3-day streak | 🥉 Bronze |\n| Week Warrior | 7-day streak | 🥈 Silver |\n| Monthly Master | 30-day streak | 🥇 Gold |\n| Century Scholar | 100-day streak | 💎 Diamond |\n| First Century | 100 reviews | 🥉 Bronze |\n| Dedicated Learner | 1,000 reviews | 🥈 Silver |\n| Knowledge Seeker | 10,000 reviews | 🥇 Gold |\n| Sharp Mind | 90% accuracy | 🥈 Silver |\n| Precision Expert | 95% accuracy | 🥇 Gold |\n| Rising Star | 1,000 XP | 🥉 Bronze |\n| Powerhouse | 10,000 XP | 🥈 Silver |\n| Legendary | 100,000 XP | 🏅 Platinum |\n| First Mastery | Master a subject | 🥈 Silver |\n| Renaissance Learner | Master 3 subjects | 🥇 Gold |\n\n## Configuration\n\n```swift\nlet config = EducationAIConfiguration(\n    storageSuite: \"com.myapp.learning\",  // UserDefaults suite\n    sm2Parameters: .default,              // SM-2 tuning\n    adaptiveSensitivity: 0.5,            // 0 = sluggish, 1 = aggressive\n    maxNewCardsPerDay: 20,               // New card limit\n    maxReviewsPerDay: 100                // Review limit\n)\n\nlet engine = EducationAI(configuration: config)\n```\n\n## Examples\n\nSee the [Examples](Examples/) folder for complete sample projects.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eBuilt for learners who care about privacy ❤️\u003c/sub\u003e\n\u003c/p\u003e\n\n## 📈 Star History\n\n\u003ca href=\"https://star-history.com/#muhittincamdali/educationai\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=muhittincamdali/educationai\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=muhittincamdali/educationai\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=muhittincamdali/educationai\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuhittincamdali%2Feducationai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuhittincamdali%2Feducationai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuhittincamdali%2Feducationai/lists"}