10 pages · 11 API routes · 7 features (1 stub) · 21 components
| Name | Description | Status |
|---|---|---|
| / | Landing — redirects to /onboarding if no profile | live |
| /onboarding | Agent-driven interactive assessment flow (multi-turn Claude conversation) | live |
| /profile | Profile display + preferences form | live |
| /stories | Story list, filtering/sorting, generation form | live |
| /stories/[id] | Story reader with furigana, word popups, mark-as-read | live |
| /stories/[id]/practice | Exercise session for a story | live |
| /credits | Attribution (JMdict, Kanjium, JLPT lists, Claude) | live |
| /dev/onboarding | Review onboarding chat transcript, assessment results, LLM call stats | live |
| /dev/srs | SRS dashboard — card state, scheduling simulator, seed test cards, review log | live |
| /reviews | Review session UI — FSRS-scheduled flashcard review | live |
| Name | Description | Status |
|---|---|---|
| POST /api/onboarding | Multi-turn assessment — start + respond actions | live |
| GET/POST /api/profile | Profile CRUD + PUT for preferences | live |
| GET/POST /api/stories | List stories + generate new via pipeline | live |
| GET/PATCH /api/stories/[id] | Fetch story + update read status | live |
| GET/POST /api/stories/[id]/exercises | Fetch/generate exercises for story | live |
| POST /api/exercises/[id]/submit | Score non-translation exercises + vocab transitions + FSRS stability | live |
| POST /api/exercises/[id]/evaluate | Claude-powered translation evaluation + grammar obs | live |
| GET /api/reviews/due | Due card count + backlog status | live |
| POST /api/reviews/session | Start review session — returns due cards with component data | live |
| POST /api/reviews/[cardId]/rate | Rate a review card — FSRS scheduling + vocab transitions | live |
| GET /api/reviews/stats | Review statistics for dashboard | live |
Learner profile, onboarding assessment, preferences
getProfilecreateProfileupdatePreferencesbuildOnboardingSystemPromptcreateConversationgetConversationdeleteConversationAssessmentDisplayPreferencesFormStory pipeline: prepare > generate (Claude) > process (tokenize/annotate) > save
runStoryPipelinegetStoryByIdlistStoriessaveStoryupdateReadStatusprepareStoryGenerationgenerateStoryprocessStoryStoryReaderExercise generation, submission, translation evaluation
buildExerciseGenerationPromptgenerateExercisesForStorysaveExercisesgetExercisesForStorygetExerciseByIdsaveExerciseResponsegetStoryExerciseResultsbuildTranslationEvaluationPromptevaluateTranslationExerciseSessionSessionSummary3-tier state model (inferred/learning/confirmed), JLPT word selection, encounter tracking
setInferredVocabularygetKnownVocabgetGapWordsgetAdvancedKnownWordsselectTargetWordslookupVocabByFormsmarkWordsAsLearningincrementEncounterCountgetVocabStatsBasicVocabStateEngineapplyVocabTransitionEmergent grammar tracking via vector DB observations
saveGrammarObservationsFSRS-5 spaced repetition — card generation, scheduling, review sessions, backlog management
generateReviewCardssaveGeneratedReviewCardsgetDueReviewCardsgetReviewStatsstartReviewSessionprocessRatinggetBacklogStatusgetRecommendedNewWordCountReviewSessionReviewSummaryDaily activity and streak tracking
LLM outputs { component, props } invocations; ComponentRenderer validates against Zod schemas and renders from registry.
| Name | Description | Status |
|---|---|---|
| comprehension_mc | Multiple-choice comprehension question with explanation | live |
| cloze | Fill-in-the-blank — option buttons or free-text, with hint toggle | live |
| translation | Sentence translation with Claude-powered scoring and grammar feedback | live |
| tap_to_pair | Two-column matching game with attempt tracking | live |
| self_assessment | Radio-style self-assessment with labeled options | live |
| text_input | Free-text input (single/multiline) with submit handling | live |
| srs_meaning_recall | SRS meaning recall — reveal Japanese word from English meaning | live |
| srs_reading_recall | SRS reading recall — reveal reading from kanji | live |
| Name | Description | Status |
|---|---|---|
| StoryReader | Full story renderer with furigana toggle, sentence list, word popups | live |
| SentenceDisplay | Single sentence with furigana + translation toggle | live |
| FuriganaText | Ruby text rendering — smart/all/none modes | live |
| WordPopup | Word detail modal — reading, meaning, POS, pitch accent, status | live |
| Name | Description | Status |
|---|---|---|
| Button | CVA button — variants: default, outline, secondary, ghost, destructive, link | live |
| Card | Card + CardHeader, CardTitle, CardDescription, CardAction, CardContent, CardFooter | live |
| Input | Text input primitive with focus/disabled/invalid states | live |
| Label | Form label (Radix UI) | live |
| Badge | CVA badge — variants: default, secondary, destructive, outline, ghost | live |
| Progress | Progress bar | live |
| Skeleton | Loading skeleton placeholder | live |
| Sonner | Toast notifications | live |
| SpeakerButton | Japanese TTS button — browser speechSynthesis | live |
| Name | Description | Status |
|---|---|---|
| VocabStateEngine | Interface + BasicVocabStateEngine for vocab state transitions (FSRS-aware) | live |
| SrsScheduler | FSRS-5 scheduling — createNewCard, scheduleReview, isStable | live |
| AudioProvider | Browser speechSynthesis for Japanese TTS | live |
| Exercise generation | Strategy interface for exercise generation (Claude-based) | live |
| Tokenizer | MeCab abstraction for morphological analysis | live |