6. Exams and Proctoring
An exam in BodhiTree is a lab with exam mode turned on. It gains a fixed duration, a start window, IP restrictions, a live proctoring dashboard, and the ability for you to start and end it for everyone at once.
Who can use this: Course owner, INSTRUCTOR, and STA — these two roles have identical exam powers. JTAs cannot start, end, approve, or proctor an exam.
6.1 Creating an exam
Go to Course Content → Labs and click to create a lab.
Give it a title (required — “Lab title is required”).
Turn on Is an Exam.
Turning on exam mode hides the date pickers and replaces them with:
Field |
Default |
Minimum |
Meaning |
|---|---|---|---|
Duration |
30 min |
30 min |
How long each student gets |
Buffer time |
5 min |
5 min |
How late a student may start without being flagged |
IP range |
|
— |
Which machines may sit the exam |
Below the minimums you get “Exam duration must be at least 30 minutes” and “Buffer time must be at least 5 minutes”.
⚠️ The 30-minute and 5-minute minimums are enforced only in the browser form. They are not enforced by the server. Do not treat them as a safety net if you are scripting anything against the API.
If you leave the IP range blank it defaults to “everywhere” — every address from
0.0.0.0 to 255.255.255.255. That is not a restriction; set a real range if you
intend to lock the exam to a lab room.

Other settings that matter
Setting |
Default |
Effect |
|---|---|---|
Enforce IP address |
On |
IP checks are active |
Enable live dashboard |
Off |
Turns on the real-time proctoring view |
Additional time |
0 |
Extra time granted to everyone |
Visible for all |
Off |
⚠️ Bypasses every proctoring and IP check. See the warning below |
⚠️ “Visible for all” disables proctoring entirely. With it on, no IP check or proctor log applies. It exists to release an exam’s content after the fact. Be aware that saving a lab edit can reset this flag — if an ended exam’s content suddenly disappears for students, this is the setting to check first.
6.2 Running the exam
Starting
Students cannot begin until you start the exam. Before you do, a student pressing Start just gets the toast “Exam is not started yet”.
Once you start it, each student presses Start, confirms, and their individual timer begins.
The start buffer
A student who starts within buffer time of the exam start is treated as normal. A student who starts after that is flagged LATE_START and lands in your approval queue — they see “Access not granted. Please contact your instructor.” until you act.
Ending
Ending the exam ends it for everyone immediately. Every connected student gets a live notification — “The instructor has ended the exam. No further submissions are allowed.” — with no page reload needed.
Once an exam is ended you cannot approve any more students. Approval returns an error. End the exam only when you are finished handling the approval queue.
6.3 The proctoring dashboard
The dashboard lists every student with their IP, approval state, start time, duration, and any flag.
Flag reasons
Flag |
What happened |
|---|---|
IP_COLLISION |
This IP is already in use by another active student |
IP_CHANGED |
The student moved machines, but stayed inside the allowed range |
IP_OUT_OF_RANGE |
The student connected from outside your IP range |
LATE_START |
They started after the buffer expired |
MANUAL_FLAG |
You flagged them yourself |
When more than one applies, the priority is IP_COLLISION → IP_OUT_OF_RANGE → LATE_START.
Each flag carries a detail line you can read directly, for example:
“IP 10.2.3.4 already in use by student@example.com”
“Changed from 10.2.3.4 to 10.2.3.9”
“Accessed from 8.8.8.8 (OUTSIDE allowed range). Original IP: 10.2.3.4. Allowed range: 10.2.0.0-10.2.255.255”
“Started 7 minutes after buffer expired”

6.4 Approving a flagged student
Approving is the action that lets a flagged student into the exam. When the flag involves a changed IP, you must decide which machine is the real one:
Choice |
Effect |
|---|---|
Accept new IP (default) |
The new machine becomes the student’s machine. The old machine’s session is killed. |
Keep original IP |
The original machine stays. The new machine’s session is killed. |
In both cases the rejected machine is forcibly logged out — its login tokens are deleted and its browser is disconnected immediately. This is the correct response to a suspected impersonation: whichever machine you reject stops working at once.
Flags are kept after approval. Approving does not erase the record — the flag, timestamp, and detail text remain for your audit afterwards.
How much time do they get?
Option |
Time granted |
|---|---|
Full time |
The full exam duration plus any additional time |
Remaining time |
Buffer + duration + additional time, minus the time already elapsed since the exam started |
Use remaining time for a late arrival you do not wish to advantage; use full time when the delay was not their fault.
6.5 Mark as Left — freeing a machine
When a student finishes early and leaves, or abandons the exam, use Mark as Left.
This does three things:
Frees their IP immediately so another student can use that machine without triggering an IP collision. You will see “Student x@y.com marked as left. Their IP is now free.”
Blocks that student from re-entering. If they try, they get “You have been marked as left by the instructor.”
Is fully reversible with Undo, which reports “Student x@y.com unmarked. Their IP is locked again.”
This is the tool for running an exam in shifts through a lab with fewer machines than students.
Manual flag lets you flag a student with your own free-text reason; it un-approves them and records “Manually flagged: {your reason}”.
6.6 Adjusting time mid-exam
You can add or subtract minutes:
For everyone — adjusts the shared additional time plus each student’s end time
For one student — same, for a single person
Negative results are clamped to zero. If you add time to an exam that has already expired, the new end time is calculated from now.
Students’ countdowns update live, with no reload required.
You cannot modify time after you have ended the exam — you get “Exam has already been ended by instructor.”
6.7 Exporting the proctor log
Download the proctor log as a CSV. The columns are exactly:
Student_email, Student_Name, Roll_No, Exam_name, ipaddress, newipadd,
is_approved, start_time, duration, given_duration, flag_reason,
flagged_at, flag_details
Both the original IP (ipaddress) and the changed IP (newipadd) are included, along
with the granted duration, so this file is sufficient evidence for an academic
integrity case.
6.8 What students experience
Summarised here because you will be asked; the full list is in Appendix A.
All block and end screens arrive live over a WebSocket — students do not need to refresh, and cannot avoid them by not refreshing.
Each block screen names its reason, so a student telling you “it says IP address conflict” is quoting the system accurately.
Their submission status is shown live as it is saved.
Known limitations
Duration and buffer minimums are browser-side only — not enforced by the server
Virtual (CLab) activities have no exam enforcement. The exam gate for virtual labs was designed but never built on the BodhiTree side. Do not rely on exam mode to restrict a virtual lab activity
“Visible for all” bypasses all proctoring, and can be reset by editing the lab
Ending the exam permanently closes the approval queue
Previous: 5. Labs and Activities · Next: 7. Grades and the Gradebook