Every part of an examination, modelled properly.

Xamina is not a quiz tool with a proctoring add-on. It is seven domains (tenancy, banking, assembly, delivery, integrity, integration and audit) designed together so that the answer to “can you prove that?” is always yes.

78

Things it keeps track of

from questions to certificates

13

Background queues

BullMQ on Redis, each with its own retry policy

11

Scheduled jobs

from event relay every 10s to weekly retention

99

Things a role can control

so each job sees only what it needs

How it all fits together

These are the real names of the real files. Nothing in the list below is a roadmap item.

Identity & tenancy

Who the institution is, who works there, and what each of them may touch.

  • Tenants, branding, settings, per-tenant SMTP and storage
  • Departments, users, roles, permissions, memberships
  • Devices, sessions, login history, one-time tokens
  • API keys for machine access, hashed at rest

Question banking

The item library, versioned, reviewed and measured over time.

  • Banks, categories and tags for the taxonomy you already use
  • Questions with choices, media and full version history
  • Peer review workflow before an item is allowed near a paper
  • Item statistics accumulated from every sitting

Exams & scheduling

The paper itself: how it is assembled, when it opens, and who may sit it.

  • Exams, sections, blueprint items and randomised pool rules
  • Schedules with windows, late entry and per-cohort overrides
  • Enrolments, access codes and their redemptions
  • Partners and voucher orders for resold seats

Sittings & results

What happened in the room, captured as it happened rather than reconstructed after.

  • Attempts, per-question snapshots and every answer revision
  • An append-only event stream per attempt
  • Results with category and difficulty breakdowns
  • Certificate templates and issued certificates

Integrity

Evidence, not footage. Clean frames are analysed and discarded, never stored.

  • Per-exam proctor configuration: strictness is a policy, not a build
  • Proctor sessions and flagged integrity events
  • Human review queue with a decision on every flag
  • Identity checks: document and face, before the paper opens

LMS integration

The exam appears inside the learning system your students already use.

  • Platform registrations, deployments and resource links
  • Launches with replay-protected nonces
  • User links, so an LMS identity maps to one Xamina account
  • Grade sync back to the gradebook via AGS

Audit & events

The layer that makes every claim above checkable a year later.

  • Audit log written by a database client extension, not by callers
  • Your other systems get told what happened, and nothing goes missing
  • Notifications, templates and per-user preferences
  • Webhook endpoints with delivery history, feature flags, import/export jobs

Four properties an examination has to have

A form that does not travel

Pool rules draw each candidate a paper from the bank by blueprint: so many items at this difficulty, from that category. The draw is seeded by attempt, so it is reproducible for an appeal and useless to the person in the next seat.

Built to your blueprintA different paper each timeSections shuffledAny paper can be brought back

A named, verified sitter

Identity check-in reads the document, matches the face against it, and matches the name against the enrolment, all before the paper opens. Fail it and the attempt does not start; there is no version of this that quietly lets someone through.

Document + face matchName matched to the rosterPer-exam requirement flagRefer to a human reviewer

A reproducible paper

Each attempt stores a snapshot of the questions as they were at the moment they were served. Edit an item afterwards and last month’s sitting is unchanged. The paper a candidate disputes is the paper you can still produce.

Per-attempt question snapshotEvery answer revision keptAppend-only event streamImmutable audit log

Numbers that survive a question

Results break down by category and by difficulty, and item statistics accumulate across sittings, so a question that everyone gets wrong is visible as a bad item rather than a hard cohort.

Category & difficulty breakdownItem difficulty and discriminationCohort comparisonScheduled recomputation

It has to fit the systems you already run

An examination platform that cannot receive a cohort from the student system, hand a grade back to the LMS, or let a reseller issue a seat is a platform somebody re-keys by hand at two in the morning.

Works inside your LMS

Register the platform once and Xamina appears as a launchable activity in Canvas, Moodle or Blackboard, with grades posted back through Assignment & Grade Services.

Reseller API

Partners fetch a catalogue and turn a completed payment into a single-use voucher. Every request is HMAC-signed over method, path, body and timestamp inside a five-minute window.

Webhooks

Your systems can be notified the moment something happens, with automatic retries if they are down and a full history of every attempt, not a fire-and-forget POST from inside a request handler.

Bulk import & export

Candidates, questions and results move in and out as jobs with a progress record and a failure report, rather than a browser upload that times out at row nine thousand.

Underneath

For your IT team — skip if that is not you

Modular monolith

NestJS 11, one deployable, module boundaries enforced in code. Easy to run, easy to split later if it ever needs to be.

PostgreSQL + Prisma 6

Tenant scoping and audit writing are client extensions, so no query can forget them.

BullMQ on Redis

Thirteen queues and eleven schedules. Grading, certificates and grade sync retry on their own terms.

Next.js 15 · React 19

Server components for the pages that read, client components only where something actually moves.

Self-hosted or managed. The same image either way. There is no cloud-only feature set.

See it against your own paper

Sign in with an institutional address, author a bank, publish an exam and enrol a cohort: the whole loop, on your own content.