arrow_back Back to Projects
SPACED REPETITION SYSTEM

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.

10
Study Modes
~1,800
TypeScript LOC
0
Backend Services
01 / Challenge

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.

02 / Solution

A Modified SM-2 Engine, Smart Distractors, One Static Bundle

schedule

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.

filter_alt

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.

bolt

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.

Curriculum Model

~9,000 Lines of Static JSON, One Round-Trip

~600
Grammar Entries
Across nine case files — Article, Anarthrous, Nominative, Genitive, Dative, Accusative, Vocative, Adjective, Pronoun
~180
Definitions
Term-and-definition pairs feeding the definition-drill and multiple-choice modes
~250
Prepositions + Verbal
Preposition entries plus verbal-grammar items grouped by mood, voice, person, and number
03 / Results

What We Delivered

A study app whose value is concentrated in two pure functions — the SRS calculator and the distractor generator.

check_circle

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.

check_circle

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.

check_circle

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.

check_circle

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.

check_circle

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.

check_circle

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.

Technology Stack

Built With

rocket_launch Astro 5
bolt React 19
code TypeScript
palette Tailwind 3
animation framer-motion
memory useReducer + Context

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.