EJU Math Vault is a Node.js + Express web app for EJU math training and content management. It delivers timed practice sessions, strict per-blank grading, and an admin editor for questions, answers, and images.
- Email login with 6-digit verification code (JWT-based).
- Timed training sessions with per-blank feedback.
- Admin tooling for question/answer edits and content integrity checks.
- Content indexers for questions, tags, patterns, and HTML rendering.
src/Express API (auth, attempts, grading, sessions)public/Frontend pages (training, login, admin)content/Questions, answers, solutions, assets, specscontent/index/Generated indexesschemas/JSON schema definitionsscripts/Indexers and build-time tools
nvm use 20
npm installGenerate content indexes:
node scripts/content_indexer.jsStart the API server:
JWT_SECRET=devsecret npm run devOptional: bind to all interfaces for LAN access:
HOST=0.0.0.0 JWT_SECRET=devsecret npm run devBuild and run with Docker Compose:
JWT_SECRET=devsecret docker compose up --buildData and content are mounted for persistence:
./data->/app/data./content->/app/contentThe container will generatecontent/index/question_index.jsonon first start if missing.
Request a verification code:
curl -s -X POST http://localhost:3000/auth/request-code \
-H 'Content-Type: application/json' \
-d '{"email":"test@example.com"}'Verify the code and receive a JWT:
curl -s -X POST http://localhost:3000/auth/verify-code \
-H 'Content-Type: application/json' \
-d '{"email":"test@example.com","code":"123456"}'/admindashboard/admin/examsexam browser/admin/question/<question_id>/editquestion editor
JWT_SECRET(required)HOST(optional bind address)PORT(default: 3000)ADMIN_TOKEN(optional admin protection)DB_PATH(optional data storage path)
- Generated files under
content/index/are not committed. content/answers/normalized.jsonis generated by admin edits.- Optional:
npm run translate:exercise-md-cngeneratescontent/exercise_cn/fromcontent/exercise/(requiresOPENAI_API_KEY).