7da98d786cb39f295ba4a9141b69586d8368ea94
Add SRS-driven noun and adjective flashcards modeled on the existing verb flashcard flow: - SharedModels/Lexeme — catalog of non-verb vocab, frequency-ranked, with gender for nouns and optional example sentences. Seeded from a bundled vocab_lexemes.json built by Scripts/vocab/build_lexemes.py, which joins frequency.csv + es-en.data from a pinned doozan/spanish_data commit (CC-BY-SA: hermitdave/FrequencyWords + Wiktionary). 1,449 nouns and 600 adjectives, each with Wiktionary-sourced gender and (where available) an example sentence with English translation. - LexemeReviewCard + LexemeReviewStore — cloud-synced SM-2 SRS, keyed by partOfSpeech + lexemeId + drillMode so future drill modes can coexist. - LexemeSessionQueue + LexemePool — parallel to VocabSessionQueue; fresh cards sort by frequency rank. - LexemeStudyGroup — cloud-synced resumable session per (partOfSpeech, drillMode). - NounFlashcardPracticeView + AdjectiveFlashcardPracticeView — same flow as VocabFlashcardPracticeView: English prompt → tap to reveal Spanish → Again/Hard/Good/Easy. Nouns reveal with their article (la taza, el problema) so gender is taught alongside meaning, not as a separate quiz. Example sentence shown when present. CEFR-style level toggles: - LexemeLevel enum (A1/A2/B1/B2/C1+) derived from frequencyRank with standard Spanish-frequency-dictionary cutoffs (250/500/1000/2000). - UserProgress.selectedLexemeLevels — cloud-synced multi-select, defaults to A1+A2 on first launch. - SettingsView gains a "Vocabulary Levels" section with five toggles; the existing "Levels" section is renamed "Verb Levels" for clarity. - Due SRS cards always surface regardless of toggles. Disabling a level only stops new cards from that band entering the pool. PracticeView gets "Nouns" and "Adjectives" rows under "Books". DataLoader: new lexemeDataVersion gate that re-seeds the Lexeme table from vocab_lexemes.json independent of book seeding. project.yml lists the new JSON resource and the existing book_olly-vol2.json (which the previous build was silently excluding because xcodegen rewrote the project from project.yml). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Conjuga
A Spanish-learning iOS app that combines verb conjugation practice, a full textbook reader, an AI conversation partner, offline dictionary lookups, grammar exercises, and more. Runs entirely on-device where possible (Foundation Models, Speech framework, Vision OCR).
Features
Verb practice
- Six conjugation modes — flashcards, typing, multiple choice, handwriting (Apple Pencil / finger), sentence builder, and full-table (conjugate all persons at once)
- Focus modes — weak verbs (SM-2 spaced repetition), irregularity drills (spelling / stem / unique), common tenses
- 1,750 verbs across 5 levels (Basic → Expert) with 209 K pre-conjugated forms and 23 K irregular-span annotations
- 20 tenses — every indicative, subjunctive, conditional, and imperative tense, each with character-level irregular highlighting
- Verb list filters — search by level, by irregularity (Any / Spelling Change / Stem Change / Unique Irregular), or by reflexive only (curated 100-verb list); filters compose
- Practice pool filters (Settings) — multi-select per level, per tense, per irregular-type, plus a "reflexive verbs only" toggle. Practice pool = intersection of all four.
- Verb detail pages — conjugation table, six AI-generated example sentences (one per core tense), and reflexive infinitive + preposition hint for curated reflexive verbs
- Text-to-speech on any form
Content & study
- Textbook reader — 30 chapters of Complete Spanish Step-by-Step with 251 interactive exercises (keyboard + Apple Pencil), 931 OCR'd vocab tables rendered as Spanish→English grids (~3 100 paired cards extracted via bounding-box OCR)
- Course decks — weekly vocab decks with example sentences, week tests, and cumulative checkpoint exams
- Stem-change toggle on Week 4 flashcard decks (E-IE, E-I, O-UE, U-UE) showing inline present-tense conjugations
- Grammar guide — 20 tense guides with usage rules and examples + 36 grammar topic notes (ser/estar, por/para, preterite/imperfect, reflexives, subjunctive triggers, etc.), each with 100+ practice exercises
- Grammar exercises — interactive quizzes for 5 core topics (ser/estar, por/para, preterite/imperfect, subjunctive, personal a)
- Curated YouTube videos — 54 hand-picked videos attached to guide and grammar items (preference for The Language Tutor's numbered lessons + BaseLang). Each item offers three actions: Stream (opens YouTube app / Safari), Download (YouTubeKit extraction + AVFoundation mux for modern adaptive-stream videos), Play (full-screen AVPlayer from local MP4). Settings → Downloaded Videos lists all downloads with total size, per-item delete, and a 500 MB warning.
AI & speech
- Conversational practice — on-device AI chat partner (Apple Foundation Models) with 10 scenario types; chat bubbles have tappable words that open dictionary / on-demand AI lookup
- AI short stories — generated stories with tappable words and comprehension quizzes
- Listening practice — listen-and-type + pronunciation scoring via the Speech framework
- Pronunciation check — word-by-word match scoring
Vocabulary & tools
- Offline dictionary — reverse index of 175 K verb forms + 200 common words, cached to disk for instant lookups
- Vocab SRS review — spaced repetition over course vocabulary with Again / Hard / Good / Easy rating
- Cloze practice — fill-in-the-blank sentences with distractor generation
- Lyrics practice — search, translate, and read Spanish song lyrics; long-press any word for an instant definition + tense/person readout (for verbs)
Tracking & sync
- Progress — streaks, daily goals, accuracy stats, achievement badges, study-time tracking per day
- CloudKit sync — review progress, test results, saved stories, conversations, and textbook attempts sync across devices
- Widgets — combined dashboard + word-of-the-day, refreshed daily and on backgrounding
Architecture
- SwiftUI + SwiftData with a dual-store configuration:
- Local store (App Group
group.com.conjuga.app) — reference data + per-device artifacts: verbs, forms, irregular spans, tense guides, course decks, vocab cards, textbook chapters, and downloaded videos. Seeded from bundled JSON on first launch. Self-healing re-seeds trigger on version bumps or if rows are missing on disk. - Cloud store (CloudKit
iCloud.com.conjuga.app, private database) — user data: review cards, course reviews, user progress, test results, daily logs, saved songs, stories, conversations, textbook exercise attempts.
- Local store (App Group
- SharedModels Swift Package shared between the app and widget extension. Widget schema must include every local-store entity or SwiftData destructively migrates the shared store.
- Foundation Models for on-device AI generation (
@Generablestructs for typed output) — conversation partner, short stories, verb-detail example sentences. - Vision framework for OCR of textbook pages and vocabulary images.
- Speech framework for recognition and pronunciation scoring.
- YouTubeKit (SPM) for video stream URL extraction, paired with AVFoundation (
AVMutableComposition+AVAssetExportSessionpassthrough) to mux separate DASH video + audio tracks into a single MP4 when progressive streams aren't available. - Textbook extraction pipeline (
Conjuga/Scripts/textbook/) — XHTML and answer-key parsers, macOS Vision image OCR + PDF page OCR, bounding-box vocab pair extractor, NSSpellChecker-based validator, and language-aware auto-fixer. - Video curation tooling (
Conjuga/Scripts/generate_videos_markdown.py) — regeneratesConjuga/youtube_videos.mdwith per-video channel, upload date, duration, view count, and like count (pulled via yt-dlp).
Requirements
- iOS 26+ (Foundation Models, Liquid Glass, modern Swift concurrency)
- Xcode 26+
- Apple Intelligence-capable device for AI features (conversation partner, AI stories, verb-detail examples); other features degrade gracefully
Building
Open Conjuga/Conjuga.xcodeproj in Xcode and run on a simulator or device. Reference data seeds automatically on first launch. To regenerate textbook content, run Conjuga/Scripts/textbook/run_pipeline.sh locally — the generated textbook_data.json / textbook_vocab.json are committed so fresh clones build without the pipeline.
Description
Languages
Swift
86.1%
Python
11.9%
HTML
1.7%
Shell
0.3%