Admin Console · Uploader

Ship a new mock exam.

Drop a JSON or CSV file. Validated in your browser, published to the live database instantly — plus a Git-backup download.

1 · Drop your file

Drag & drop JSON / CSV here

or click to browse · validated locally · download sample JSON · download CSV template

CSV format guide
  1. Header row (exact, UTF-8): id,question,optionA,optionB,optionC,optionD,correctIndex,rationale,topic,difficulty,marks — legacy alias option1,option2,option3,option4 is also accepted on upload.
  2. One row per question (max 500 rows + header). Keep the header as row 1; data starts row 2.
  3. Quoting: wrap any field containing a comma, quote, or line-break in "double quotes"; escape a literal quote as "".
  4. correctIndex is 0-based: 0=A, 1=B, 2=C, 3=D.
  5. marks is an integer 1–100; difficulty is easy|medium|hard; question and rationale need ≥ 10 chars; all 4 options must be distinct.

2 · Validation

No file loaded yet. Same rules as tools/validate-questions.mjs.

3 · Publish

  1. Publish writes the exams row + all questions rows (upsert on exam_id,slug) — students see it instantly, no deploy.
  2. Download the Git-backup JSON and commit it as Exam Portal/questions/<exam-id>.v<YYYY-MM-DD>.json so Git stays the restorable source.
  3. Validate any Git file any time: node "Exam Portal/tools/validate-questions.mjs" "Exam Portal/questions/<file>.json".

Live preview

First 3 questions will render here.

Normalized JSON

// awaiting file…