← All work
Language learning platform
- What it is
- An online language learning system in three parts: a public course website, a learner platform and a content management system. The admin builds courses on their own, without a developer: the system turns the entered vocabulary into interactive exercises, manages course access through activation codes, tracks learner progress and issues a certificate when a level is completed.
- Status
- Actively developed.
Exercises generated from the vocabulary
The admin enters a word once, and the system builds up to eight types of exercises from it.
- Exercise types: flashcard, word in a sentence, listen and choose, match the pairs, missing word, sentence building, translation in both directions, picture choice and a manual question.
- Before generating, you see how many exercises will be created and which are missing data (e.g. audio).
- Wrong answer options are picked from words of the same topic.
- Regenerating doesn't duplicate exercises, and manual ones are kept.
- “Shuffle” mixes the exercises so a word's flashcard always comes before that word is tested.

A learning path for the learner
The learner follows a clear path: lessons, tests, review and a certificate. Progress is stored on the server and isn't lost when switching devices.
- Answers are checked instantly; letter case and punctuation don't matter, and missing Lithuanian diacritics or a single typo are accepted with a note.
- Topics and tests unlock in order, based on progress.
- Tests are graded on the server against a pass mark.
- Words are reviewed at intervals of 1 → 3 → 7 → 21 days.
- Completing a level issues a PDF certificate with a unique number.

A whole course from one Excel file
A whole course can be uploaded as a single Excel file, and before saving the system shows what will be created.
- A blank and a sample template can be downloaded from the system.
- Before import, columns are checked, duplicates are found and the target location is shown.
- Missing audio or images are linked automatically when uploaded later under the same name.
- Imported lessons can be published right away.

Technical side
- Role
- I built the whole system on my own: the database, server logic, learner platform, content management and tests.
- Decisions
- Exercise engine built from pure functions: each exercise type is a single rule in a registry, so a new type doesn't require changing the engine. Randomness is passed in as a parameter, so the logic is tested deterministically. The same engine powers lessons, tests and review.
- Security in three layers: in the interface, in server actions and in the database (Row Level Security on every table). RLS policies are covered by separate integration tests, because interface protection can be bypassed by calling the API directly.
- Atomic operations in the database: activating a code and other multi-step operations run in a single transaction with a row lock, so the same code can only be redeemed by one person.
- Strict data layer: component → hook → service → database. When two admins edit the same record, the conflict is detected and other people's changes are never silently overwritten.
- Quality automation: checks before every commit, an ESLint rule that guards the design system, spam protection on the contact form, and IPs stored only as a hash and deleted after a day.
- Scale
- 33 screens · 25 DB tables and 64 RLS policies · 9 exercise types · 433 tests (110 RLS and 16 E2E among them) · 2105 translation keys
- Stack
- Next.js, React, TypeScript, Tailwind CSS, shadcn/ui, TanStack Query, React Hook Form + Zod, next-intl · Supabase (PostgreSQL, RLS, Auth, Storage), pg_cron · @react-pdf/renderer, xlsx · Vitest, Playwright