Bert Hausmans f5000d3c58 fix(import): set owner on auto-created lessons + nest lesson_path under started lesson
Two bugs surfaced by Excel import on a lesson with a lesson_path column:
1. resolveLesson created lessons without owner_id, so after the ownership
   model (sub-project B) they never appeared in getLessonTree — import
   reported success but nothing was visible.
2. lesson_path was resolved at the root; cards landed in new root lessons
   instead of under the lesson the import was started from.

Now: auto-created lessons get ownerId + visibility 'private'; lesson_path is
resolved relative to the started lesson (each segment a sublesson). Also drop
the stale eager card_progress insert (progress is per-user and lazy since B).
2026-05-21 07:45:49 +02:00

Flashcard

Single-user lokale flashcard webapplicatie met hiërarchische lessen, spaced repetition (Leitner), Excel import/export en statistieken.

Snelstart

npm install
npm run db:migrate
npm run db:seed       # optioneel, voegt demo data toe
npm run dev           # backend op :3000, frontend op :5173

Open http://localhost:5173.

Build (productie)

npm run build
npm start             # backend serveert frontend + API op :3000

Tests

npm test              # unit tests (backend)
npm run e2e           # playwright smoke

Excel-formaat

Eén werkblad met header-rij. Kolommen:

  • question (verplicht)
  • answer (verplicht)
  • hint (optioneel)
  • lesson_path (optioneel, bv. Spaans/Begroetingen)

Bij import kun je kiezen of bestaande kaarten (zelfde vraag in dezelfde les) worden bijgewerkt en of onbekende lessen worden aangemaakt.

Architectuur

Monorepo (npm workspaces):

  • packages/shared — gedeelde TypeScript types en Zod schemas
  • packages/backend — Express 4 + Drizzle ORM + better-sqlite3
  • packages/frontend — React 18 + Vite + Tailwind + Zustand + Framer Motion

Spaced repetition

Leitner-systeem met 5 dozen:

  • Nieuwe kaart → doos 1 (direct due)
  • Goed → naar volgende doos, langer wachten (1d, 3d, 7d, 14d)
  • Fout → terug naar doos 1

Binnen een sessie wordt een fout beantwoorde kaart na ~3 posities opnieuw getoond.

Auth & e-mail

De applicatie zit achter een login. Eerste registratie (POST /api/auth/register via /register pagina) wordt automatisch sysadmin.

Lokaal e-mail (Mailpit)

docker compose up -d mailpit
# Web UI: http://localhost:8025
# SMTP:   localhost:1025

Kopieer .env.example.env in repo-root, of zet de waarden inline.

Productie (Amazon SES)

In productie:

SMTP_HOST=email-smtp.eu-west-1.amazonaws.com
SMTP_PORT=587
SMTP_USER=<SES SMTP username>
SMTP_PASS=<SES SMTP password>
SMTP_FROM="Flashcard <noreply@yourdomain.com>"
COOKIE_SECURE=true
APP_URL=https://yourdomain.com

Fallback (geen SMTP)

Als SMTP_HOST ontbreekt, schrijft het systeem de e-mails (incl. links) naar de server-log.

Description
No description provided
Readme 473 KiB
Languages
TypeScript 98.6%
CSS 0.7%
Dockerfile 0.4%
HTML 0.2%