A Greek Grammar SRS, Built as a Single React Island
A browser-based study tool for Koine Greek that drills three discriminations a generic flashcard app can't reach — translation, case, and the *specific* use of that case — backed by a modified SM-2 engine tuned for cram-cycle pedagogy and zero backend services.
Pedagogy a Generic Flashcard Tool Can't Reach
A Koine Greek grammar curriculum has more pedagogical structure than a vocabulary list. Each example phrase carries a case, a *specific* use of that case, a highlighted word inside a longer example, and an explanation of why that word takes that case in that context — three discriminations to drill, not one. Anki-style flashcards solve the easy axis and stop there.
The hard axis is distinguishing "Genitive of Content" from "Genitive of Source" — two correct-looking answers where only one fits the context. A study tool that picks distractors at random makes the question trivial; the discrimination only works when the wrong answers are plausible.
And the scheduling unit is wrong. Standard SM-2 schedules reviews in days — designed for years-long retention. A seminary student preparing for a parsing quiz on Thursday wants tight feedback within a single thirty-minute study session, not a card that disappears for a day after they get it right. The tool needed to fit cramming, not lifetime retention.
A Modified SM-2 Engine, Smart Distractors, One Static Bundle
Modified SM-2 — Minutes, Not Days
A hand-rolled SM-2 calculator with the interval unit swapped from days to minutes. Four ratings — YIKES / HARD / GOOD / EASY — map onto SM-2's repetitions and ease-factor math, with an ease floor of 1.3 to prevent runaway-low intervals. Items the user knows fade into the background within a single session; items they don't keep cycling.
Category-Aware Smart Distractors
A parameterized distractor generator with three strictness modes — strict (same category only), balanced (two-thirds same category), and fallback (random) — picked per question type. Wrong answers are always plausible, so the question asks "which Genitive use?" not "is this Greek or English?" Set-based deduplication catches the case where two entries share the same answer string.
Single Static React Island
The whole app mounts as one client:only="react" island inside an Astro static page. Fourteen curriculum JSON files load in parallel via Promise.all on first paint; localStorage stores SRS state and the miss log behind a hydration flag that prevents the read-then-write race. No SSR, no backend, no API calls after first load.
~9,000 Lines of Static JSON, One Round-Trip
What We Delivered
A study app whose value is concentrated in two pure functions — the SRS calculator and the distractor generator.
10
Distinct Study Modes
Flashcard, two multiple-choice modes, four drill modes, two quiz banks, and a 20-question challenge mode that randomly shuffles question types — all backed by one shared SRS state.
19
Reducer Cases
A single useReducer + Context state machine drives every mode. Switching modes is a state mutation, not a route — the deck filter, SRS state, and miss log all carry over.
SM-2
Modified SRS Algorithm
Standard repetition / ease / interval math with the unit swapped from days to minutes. Tuned for cram-cycle pedagogy where short-term mastery before a deadline is the goal.
14
Parallel Data Fetches
Every curriculum file — definitions, prepositions, verbal, two quiz banks, and nine case files — loads concurrently via Promise.all, with cancellation-safe state setting on unmount.
localStorage
Hydration-Gated Persistence
Two keys hold SRS state and the miss log. A hydration flag gates the write side of the persistence effect, so the empty initial state never overwrites the user's saved progress on mount.
0
Backend Services
No origin server, no database, no API. Every request after first load is a static asset GET; everything else runs in the browser against build-time-baked curriculum JSON.
Built With
Building a learning tool with real pedagogy behind it?
We design study tools whose hard problems — scheduling, distractors, persistence — are solved as small pure functions, not bolted-on features. Built to fit how people actually learn.