Hundreds of laptops,
and none of them yours.

Exam monitoring tool login screen with student number, name, and exam code fields

Karel de Grote Hogeschool needed a way to monitor student computers during exams. Instructors had no visibility into whether students were connecting to external networks, running virtual machines, or launching unauthorized applications.

The existing approach relied on watching the room, which does not scale across exam halls with hundreds of machines, most of them the students' own laptops. KDG needed something that checks each machine before the exam begins, records what matters while it runs, and hands the result in with the exam. Students see the whole thing: they log in, the app tells them what to change, and they submit the log themselves at the end. The monitoring falls under the study-data agreement they sign at enrolment.

3
operating systems, one codebase
6
signals watched during the exam
1
encrypted log, handed in with the work
0
people who can read it without the instructor's key

Building a desktop monitoring tool that captures system-level activity across Windows, macOS, and Linux requires going beyond what Dart can do alone. Network packet capture, VM detection, and hardware enumeration all need native code.

Using our six-step framework, we built a Flutter desktop app in Dutch and English that wraps C and C++ libraries via dart:ffi, encrypts what it records on the machine itself, and gives instructors a CLI tool to open those logs afterwards.

1. IDENTIFY & VALIDATE

1. IDENTIFY & VALIDATE

We worked with KDG's IT team to define what 'exam integrity' means in practice. We identified six monitoring dimensions: network connections, Bluetooth status, connected adapters, running applications, VM presence, and system heartbeat. Each was validated against real exam scenarios.

The result runs on every exam machine, whatever it boots and whoever owns it. It puts the student through a pre-flight check, records six kinds of system activity while the exam runs, and hands over one encrypted log that only an instructor can open.

Facing a similar challenge?

A checklist first, then six things it watches

Before the exam starts, the tool shows the student what is still wrong and will not let them begin until it is fixed. During the exam it watches the system from six angles, timestamping and encrypting every event where it happens.

Pre-exam warnings showing connected WiFi and Bluetooth that need to be disabled
Exam monitoring tool login screen with student number, name, and exam code fields Pre-exam checklist showing system status checks and session information

Real-time packet inspection through a native library. Captures TCP, UDP and ICMP traffic with source and destination addresses, ports and protocol flags. Runs in a separate Dart isolate so the interface never blocks.

Detects VMware, VirtualBox, Hyper-V and other hypervisors through a C++ library behind an FFI wrapper, and reports both how certain the detection is and which hypervisor it found.

Enumerates physical and virtual network adapters with their hardware details, and notices when one is connected or removed during the exam. Each platform is handled the way that platform allows.

Tracks running processes and flags prohibited applications. Detects when new applications are launched or existing ones are terminated during the exam session.

Reports whether Bluetooth is on before the exam starts and whether it comes back on during it. This is the one students most often forget, so the checklist calls it out by name.

A steady signal that says the app is still running. A gap in it is as interesting as anything in the log, because it is what quitting the tool mid-exam looks like.

Flutter desktop with C/C++ native wrappers, encrypted local storage, and a CLI decryption tool

The app is structured as a monorepo. The Flutter UI coordinates six monitoring services, each extending a common MonitoringService base class. Two services (packet capture and VM detection) use FFI wrapper packages with auto-generated bindings. All log events pass through an encryption layer before hitting disk.

We wrote up the FFI work behind this build in detail. Read the insight post →

Architecture: Flutter desktop app with C and C++ FFI wrappers, an AES-GCM encryption layer, local encrypted logs and a Dart CLI decryption tool

Built with Flutter for Windows, macOS and Linux from a single codebase, in Dutch and English. Native C and C++ code compiled per platform via CMake and CocoaPods.

The student logs in with their name, student number and exam code. the tool checks the machine and says what to change, in plain language: disable this Wi-Fi adapter, turn off Bluetooth. Once everything is in order the exam starts. When it ends, the app points at a single zipped log for the student to hand in along with their work. Instructors open those with a Dart CLI tool, which turns each one into a timeline of what happened on that machine.

Exam monitoring tool log upload screen for submitting encrypted exam logs

Run the same exams at your own institution?

Karel de Grote Hogeschool built this for its own exam halls and is open to licensing it to other institutions. Same app, your branding, your rules on what gets checked, adapted and integrated by the team that built it. Tell us how you run exams today.

Free, no obligation 30 minutes With a senior consultant