TutorLoom
The learning platform for companies, colleges and training institutes. Free and open source, with an Enterprise edition.
Master Japanese with interactive quizzes: practice kana words, kanji readings, numbers, and dates. Track streaks, customize difficulty, and build fluency at your own pace.
EducationTypeScript · JavaScriptGitHub @franprinceOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Japanese practice for kana, vocabulary, kanji, numbers and dates. Multilingual, responsive sessions with saved settings and missed-question review, built on shared game state and reliable static datasets.
Taken from the repository README
Loading the full README.
Read the full README ↗Practice kana, vocabulary, kanji, numbers, and dates with short sessions or unlimited play. Review missed questions, save your settings, and learn on mobile or desktop in English, Spanish, or Japanese.
The application centers on these four practice games. The experimental Ollama quiz subsystem has been removed.
# Install dependencies
bun install
# Run dev server
bun dev
Visit http://localhost:3000
# Build for production
bun run build
# Start production server
bun start
This project uses a comprehensive testing strategy with both unit and E2E tests.
# Run all unit tests
bun test src
# Run unit tests in watch mode
bun test --watch src
# Run specific test file
bun test src/lib/core/__tests__/game-registry.test.ts
Framework: Bun Test + React Testing Library + happy-dom
Guidelines:
getByRole, getByText, etc.)See TESTING.md for detailed testing guidelines.
# Run all E2E tests
bun run test:e2e
# Run E2E tests with UI
bun run test:e2e:ui
# Run E2E tests in headed mode
bun run test:e2e:headed
# Debug E2E tests
bun run test:e2e:debug
Framework: Playwright
Coverage:
E2E tests verify critical user flows including game interactions, settings changes, mode switching, and feedback mechanisms.
The project uses Husky for Git hooks:
This project uses semantic-release for automated versioning and changelog generation.
Commit Convention: Conventional Commits
# Examples
feat: add new game mode
fix: correct romaji conversion
docs: update README
Release Process:
develop.release/* branch from develop, incorporate current main, and open a PR against main.main, semantic-release analyzes Conventional Commits and updates the version, CHANGELOG, tag, and GitHub release. Do not manually bump the release version in the PR.data/jmdict-spa-3.6.1.json from jmdict-simplified (tracked via Git LFS).scripts/build-wordset.ts filters dictionary sources into public/wordset-en.json and public/wordset-es.json with kana, romaji, and localized vocabulary meanings./wordsets/<lang>-<sha256>.json assets and a small revalidated /wordsets/manifest.json. See the artifact and deployment contract.scripts/build-kanjiset.ts creates the complete dataset:
data/most_used_kanjis.json (frequency-ranked list from kanji-frequency)public/kanjiset-vN.json with all enriched datachar, reading, meaning_en, meaning_es, jlpt, rank (frequency rank)public/kanji-n1.json through public/kanji-n5.json for lazy loadingMaintenance scripts (Bun):
bunx tsx scripts/build-kanjiset.ts
bunx tsx scripts/report-n1-missing-es.ts --input data/kanjiset-v7.json --jlpt jlpt-n1 --output data/kanjiset-n1-missing-es.json
bunx tsx scripts/merge-n1-translations.ts --input data/kanjiset-v7.json --translations data/kanjiset-n1-missing-es.json --output data/kanjiset-v7-merged.json
bun run check:boundaries.See Words module boundaries, static wordset delivery, and desktop/mobile visual evidence.
kanaDictionary.json (kana groups) and jmdict-spa-3.6.1.json / jmdict-eng-3.6.2.json (vocabulary).scripts/build-wordset.ts filters and merges sources into versioned payloads in public/wordset-<lang>.json.scripts/publish-wordsets.ts validates both languages and emits exact-byte, SHA-256-named assets and a small metadata manifest during dev and production builds.Pipeline Details:
public/kanji-n*.json for lazy loading by JLPT level.scripts/build-kanjiset.ts) fetch missing data from external APIs (Jisho) and scrape supplemental info.scripts/merge-n1-translations.ts) allow collaborative translation updates.The application is deployed on Vercel.
# Deploy to production
vercel --prod
Features:
Create a .env.local file for local development (see .env.local in the project for required variables).
# Development
bun dev # Start dev server
# Building
bun run build # Build for production
bun start # Start production server
# Testing
bun test src # Run unit tests
bun run test:unit # Run unit tests (explicit)
bun run test:e2e # Run E2E tests
bun run test:e2e:ui # Run E2E tests with UI
bun run test:e2e:debug # Debug E2E tests
# Data Generation
bun run wordset:build # Build word datasets
bun run kanji:build # Build kanji dataset
# Code Quality
bun run lint # Run ESLint
bun run typecheck # Check TypeScript
bun run check:boundaries # Verify feature boundaries
Contributions are welcome! Please follow these guidelines:
Commits: Use Conventional Commits
feat: for new featuresfix: for bug fixesdocs: for documentationtest: for testsrefactor: for refactoringTesting:
Code Quality:
any typesGit Hooks: Pre-push hooks will run tests automatically
This project uses data from:
Both are provided by the Electronic Dictionary Research and Development Group under their license.
For detailed changes, see CHANGELOG.md