Recent Activity
Quick Actions
Live Exams
Configure New Assessment
Complete all sections then add your questions using any method below.
Choose who can sit this exam. Registered mode requires students to be in your class roster.
Import a previously exported HMG CBT exam package JSON. This restores the exam configuration and question bank into this form so you can edit and publish it as a new assessment.
Choose how you want to add questions. You can switch between methods — questions are merged into one pool.
A, B, C, or D — whichever option is correct.Cols 2–5 (A B C D): All four option texts. Leave C and D blank only if your question genuinely has two options.
Cols 9–14: Leave all blank.
"What is the capital of Nigeria?","Lagos","Abuja","Kano","Ibadan","B","FCT moved to Abuja in 1991.","mcq",,,,
A,C or A,B,D. Order does not matter.Col12 (MRQ_AON): Write
true for all-or-nothing scoring (student must get every correct option to earn any mark). Write false or leave blank for partial credit (student earns a fraction for each correct option chosen).Cols 9–11, 13–14: Leave blank.
"Which are products of photosynthesis?","Glucose","Water","Oxygen","Carbon dioxide","A,C","CO₂ is consumed, not produced.","mrq",,,,false,
True.Col3 (B): The label shown on the False button — usually just write
False.Cols 4–5 (C, D): Leave blank — True/False only uses A and B.
Col6 (CorrectAnswer): Write
A if the statement is True, or B if it is False.Cols 9–14: Leave all blank.
"Lagos is the capital of Nigeria.","True","False","","","B","The capital is Abuja since 1991.","tf",,,,
Col6 (CorrectAnswer): The primary correct answer. Grading is case-insensitive exact match.
Col11 (Accept): Optional. Additional accepted answers separated by the pipe symbol
|. Use this for spelling variations, abbreviations, or alternate forms — e.g. H₂O|water|h2o.Cols 9–10, 12–14: Leave blank.
"The chemical symbol for water is ___","","","","","H₂O","H₂O or water are both accepted.","short",,,,"H2O|water|h₂o",
Col6 (CorrectAnswer): The exact correct number — e.g.
9.81 or 42.Col9 (Tolerance): Acceptable margin of error. Write
0 for exact match, or a number like 0.5 to accept answers within ±0.5 of the correct value. Leave blank for exact match.Col10 (Unit): Optional display unit shown to the student — e.g.
m/s², kg, °C.Cols 11–14: Leave blank.
"Calculate the acceleration due to gravity (standard value)","","","","","9.81","g = 9.81 m/s²","numeric","0.05","m/s²",,
Cols 2–5 (A B C D): Leave all blank.
Col6 (CorrectAnswer): Leave blank — correctness is determined by the pairs in Col13.
Col13 (Pairs): The matching pairs written in JSON format. Each pair is
{"left":"...","right":"..."} and all pairs are wrapped in a JSON array. Distractors (extra right-side options that do not match any left item) are appended as {"left":"DISTRACTOR","right":"Extra wrong option"} — the system recognises the keyword DISTRACTOR and uses only the right value as a decoy.Cols 9–12, 14: Leave blank.
""). The cell itself must be wrapped in double-quotes.Cols 2–5 (A B C D): Leave all blank.
Col6 (CorrectAnswer): Leave blank — the correct order is defined by Col14.
Col14 (Items): All items written as a JSON array in their CORRECT order. The system automatically scrambles them for the student. Write each item as a string — e.g.
["Prophase","Metaphase","Anaphase","Telophase"]Cols 9–13: Leave blank.
"".["mass|m","acceleration|a"].essay — long response scored by keywords/minimum word count. Col11 = keyword list; Col14 = JSON rubric. Teacher review is recommended because no AI API is used.
categorization — student assigns each item to a category. Col14 = JSON array of
{"item":"...","category":"..."}.multi_numeric — several numeric answers in one question. Col14 = JSON array of
{"label":"x","answer":3,"tolerance":0}.
mrq — Fill A–G. Column F = comma list of correct letters e.g.
A,C. Column H = mrq. Column L = true or false for all-or-nothing. Leave I,J,K,M,N empty.tf — Column B =
True, Column C = False, leave D and E empty. Column F = A (if true) or B (if false). Column H = tf. Leave I–N empty.short — Leave B,C,D,E empty. Column F = the correct answer text. Column H =
short. Column K = pipe-separated alternates e.g. H₂O|water. Leave I,J,L,M,N empty.numeric — Leave B,C,D,E empty. Column F = the correct number. Column H =
numeric. Column I = tolerance (e.g. 0.5). Column J = unit (e.g. m/s²). Leave K,L,M,N empty.matching — Leave B–F empty. Column H =
matching. Column M = pairs as JSON array: [{"left":"Sodium","right":"Na"},{"left":"DISTRACTOR","right":"Au"}]. Leave I,J,K,L,N empty.ordering — Leave B–F empty. Column H =
ordering. Column N = items as JSON array in CORRECT order: ["Prophase","Metaphase","Anaphase","Telophase"]. Leave I,J,K,L,M empty.
A) 3
B) 4
C) 5
D) 6
Answer: B
Explanation: 2 + 2 = 4.
A) Glucose
B) Water
C) Oxygen
D) Carbon dioxide
Answer: A,C
Explanation: Glucose and Oxygen are produced.
Answer: A,CA) True
B) False
Answer: B
Explanation: The capital is Abuja since 1991.
Answer: H₂O
Accept: H2O|water|h₂o
Explanation: Water is H₂O.
|.Answer: 9.81
Tolerance: 0.05
Unit: m/s²
Explanation: g = 9.81 m/s² at sea level.
Left: Sodium | Right: Na
Left: Potassium | Right: K
Left: Iron | Right: Fe
Distractor: Au
Explanation: Na=Sodium, K=Potassium, Fe=Iron.
Left: [item] | Right: [match]. Optional distractor lines add extra right-side options that do not match any left item: Distractor: [wrong option]. No A/B/C/D or Answer line needed.Item: Prophase
Item: Metaphase
Item: Anaphase
Item: Telophase
Explanation: The correct sequence is P-M-A-T.
Item:. The items must be listed in the CORRECT order — the platform scrambles them for the student automatically. No A/B/C/D or Answer line needed.Active Assessments
Filter and manage all published assessments.
Diagnostic Overview
Filter by any dimension then Generate Insights.
| Student | Class | Subject | Term | Type | Topic | Score | % | ✓/✗/– | Mode | Integrity | Time | Date | Actions |
|---|
Add Students
Add students individually or import a class list via CSV.
CSV format: FullName, StudentID, Class — one student per row, with a header row.
Example: ADEWALE SAMSON, SS/2024/001, SSS2A
Class Roster
All registered students. Students use their Student ID to access registered-mode exams.
| # | Full Name | Student ID | Class | Added | Action |
|---|
📈 Performance Analytics
Visual summary of student performance across all your assessments.
Score Distribution
How many students fell into each score band.
Pass vs Fail Ratio
Overview of passing and failing students.
Submission Trend (Last 30 Days)
Daily exam submission volume.
🏆 Top Students
Highest-scoring students across all exams.
Account
Your HMG Academy CBT account details.
HMG Brand & Support
This dashboard is part of HMG Technologies under HMG Concepts — a Nigerian education and technology brand founded in 2015.
Adewale Samson Adeagbo
Data Scientist · STEM Educator · AI-Augmented Solutions Developer · 15+ years classroom teaching across Lagos and Ogun State.
WhatsApp/Hotline: +234 810 086 6322
Phone: +234 907 790 7677
Brand Email: hismarvellousgrace@gmail.com
Tech/Partnerships: buildingmyictcareer@gmail.com
🏢 Enterprise Operations
Free institution-ready workflows for HMG Academy, schools, tutorial centres, and partner academies. These features use browser downloads and Supabase data already available to your teacher account — no paid API required.
⚙️ Supabase Setup Guide
Run all these SQL statements once in Supabase Dashboard → SQL Editor. This sets up data isolation, security, and all required columns. Run them in order.
This is the master switch. Without this, all teachers see each other's data.
Each teacher is completely isolated. They can only read, create, update, and delete their own exams.
⚠️ The standard subquery approach (SELECT teacher_id FROM exams WHERE id = exam_id) causes a recursive RLS deadlock because the exams table also has RLS enabled.
This version uses a SECURITY DEFINER helper function that bypasses RLS safely for the lookup only.
Adds columns for per-question answer data, violation counts, and integrity logs.
Share this with your students. Each exam appends ?code=XXXXXX automatically. The URL below reflects whichever deployment you are currently using (Vercel or GitHub Pages).
🌐 Vercel: https://hmgacademy-cbtsystem.vercel.app/student.html
📄 GitHub Pages: https://cssadewale.github.io/cbt-system/student.html
These columns enable registered-student exams and track how each student sat the exam.
This table stores your class roster for registered-mode exams. Each teacher only sees their own students.
If teachers registered BEFORE the profiles table was created, they have no profile row and will be blocked on login. Run this SQL to create active profiles for all existing auth users. Change 'buildingmyictcareer@gmail.com' to your actual admin email.
After running this, any new teacher who signs up will automatically get a 'pending' profile via the trigger (Step 4 in the admin SQL guide), and the admin must approve them before they can log in.
Your CSV must follow this column order. The Explanation column is optional.
When importing your class roster on the Students page, your CSV must follow this format. Row 1 is the header.
Required for storing student identity photos and periodic exam snapshots from the anti-cheat system.
These three columns store the correct, wrong, and skipped counts computed by the student's browser at submission time.
This is the ground truth — the teacher dashboard reads these directly instead of re-scoring from answers_data,
which could produce different results if the question bank was edited after students submitted.
Run this if your teacher dashboard shows different wrong counts than students see.
These functions let the admin panel see ALL teachers' data across RLS boundaries.
The DROP … CASCADE lines remove any old version first — this fixes the
"cannot change return type" error.
⚠️ If you still get a column error, run Step 8 first to add the
proctor_data, time_taken, and attempt_number
columns, then re-run Step 9.
Run this in the Supabase SQL Editor to confirm everything is working. You should see rows returned for exams and results if data exists.
If students complete exams but results don't appear in your dashboard, run this single SQL block. It safely adds every required column (skipping any that already exist), recreates the INSERT policy that lets students submit, and verifies the setup. Run this in Supabase Dashboard → SQL Editor.
Click below to run a live test of your Supabase connection and RLS setup. Results appear instantly.
Update your account password.