0a099c3fc9360e6db3c771931626e46dbb77cfc9
YouTubeKit returns stream URLs only; its own README punts on the progressive-vs-adaptive problem. Most modern YouTube videos above 360p serve video and audio as separate DASH tracks, so the previous "any MP4" fallback silently grabbed a video-only track and the downloaded file had no audio. VideoDownloadService now resolves a DownloadPlan up front. Progressive MP4 (when one exists) still streams straight to the final destination. Otherwise the service downloads the best MP4 video track + best M4A audio track to temp files, then combines them into a single MP4 via AVMutableComposition + AVAssetExportSession. Passthrough preset first (lossless container rewrite) with a fallback to highestQuality if the codec combination requires re-encoding. Temp files are cleaned up on both success and failure. DownloadStatus replaces the bare Double progress so the UI can show per-phase labels (Video %, Audio %, Finalizing…). Muxing progress is rendered as an indeterminate spinner since AVAssetExportSession's progress property doesn't cross actor boundaries cleanly. Also retires the deprecated Stream.subtype comparison in favor of Stream.fileExtension, matching YouTubeKit's current API. 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
- Irregularity filter — search the verb list by Any Irregular / Spelling Change / Stem Change / Unique Irregular, combinable with level filter
- 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 + 20+ grammar topic notes (ser/estar, por/para, preterite/imperfect, etc.), each with 100+ practice exercises
- Grammar exercises — interactive quizzes for 5 core topics (ser/estar, por/para, preterite/imperfect, subjunctive, personal a)
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
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: verbs, forms, irregular spans, tense guides, course decks, vocab cards, textbook chapters. 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). - Vision framework for OCR of textbook pages and vocabulary images.
- Speech framework for recognition and pronunciation scoring.
- 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.
Requirements
- iOS 18+ (iOS 26 for Foundation Models features)
- Xcode 16+
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%