Embed a 12 KB SDK in your testing platform. Get a timeline you can defend, screen and webcam evidence, and on-device face detection — without rebuilding your exam runner.
No credit card1,000 sessions/mo freeYour data, your Postgres
proctor.app/sessions
Proctor
Acme University
Owner
Workspace
Sessions
Overview
App keys
Workspace
Sessions
3 live
Case studies coming soon
We're piloting Proctor with a handful of universities + certification bodies right now. The first published case studies land later this year — subscribe to hello@example.com for early access.
For proctors
See every session the moment it goes live.
A timeline you can defend in an integrity hearing — every focus loss, clipboard event, shortcut and screenshot attempt with millisecond timestamps and idempotent IDs. No third-party blackbox.
Filterable event timeline by category & search
Screen + webcam evidence stitched on demand
Integrity score from first principles, not a vendor heuristic
Export incident packets straight from the dashboard
Session · alex@uniwest.edu
ses_2c4a8b…
Session started
10:02:14
Built for engineering teams
The proctoring layer your stack was missing.
Designed by engineers tired of vendor blackboxes. Open SDK, your own Postgres, self-hostable from day one.
Timeline you can defend
Every focus loss, clipboard event, shortcut and screenshot attempt is logged with millisecond timestamps and idempotent IDs.
Screen + webcam evidence
Chunked screen recording and continuous webcam capture, stitched on demand. Random snapshots when bandwidth is tight.
SDK
Three lines and you’re proctoring.
The SDK is a single import, framework-agnostic, runs in a dedicated Worker. It owns its own IndexedDB queue so your test runner stays focused on what it does best: serving questions.
Bundle
12 KB gzipped
Browsers
All evergreens + Safari 16+
Worker isolation
Dedicated per tab
Queue
≤ 8 MB IndexedDB
exam-runner/src/proctor.ts
TypeScript
1// Drop the SDK into your test runner
2import { }
12 KB
Gzipped SDK
47 ms
p95 ingest latency
100%
Idempotent ingest
13 MB
On-device face model
Simple, capped pricing
Pay per workspace, not per candidate.
The candidate’s test session never costs them anything. You pay one predictable bill — that’s it.
Free
$0forever
Everything you need to ship your first proctored test.
For testing platforms moving past the prototype phase.
Questions, answered before you ask.
If you don't see your question here, drop a line — we usually reply within a day.
Where does my data live?
Sessions, events and media metadata land in your Postgres. Recording chunks land in your S3 bucket (or any S3-compatible store). We don't ship your data anywhere — there's no SaaS data broker in the loop.
Does the SDK work offline?
Yes. Every observer feeds an IndexedDB-backed byte-budgeted queue (8 MB default). When the network returns the worker flushes in order. Events are idempotent at the server, so retries can't double-count.
How does on-device face detection compare to cloud detection?
We bundle MediaPipe Tasks via a Worker — about 13 MB downloaded once per origin. Detection runs at 5-15 fps on a 2019-class laptop. Cloud detection is more accurate, but it requires shipping every frame upstream and that's a non-starter for most universities.
Can I self-host?
Ship proctoring this week, not this quarter.
Sign up, drop the SDK in your test runner, and watch the first session land in your dashboard before your coffee gets cold.
Yes. The dashboard is a Next.js app, the server is a NestJS app, and the SDK is a pure ES module. Everything runs on K3s. The Enterprise tier ships with the Terraform we use ourselves on Hetzner.
How are app keys scoped?
App keys are public (they appear in candidate browsers) but per-origin-locked. Revoking a key takes effect within seconds across all caches. Events that arrive with a revoked key are accepted, tagged and quarantined — never silently dropped.
Is the SDK CSP-friendly?
Yes. The Worker bundle is self-contained — no remote workers, no eval, no inline scripts. Only the MediaPipe model and WASM are fetched, and you can host them on your own CDN.