I've spent the last fortnight shipping the kind of quiet, unglamorous features teachers actually care about — the ones that reduce marking, protect content, and make classroom trials frictionless. Here's what changed, in the order it matters.
1. Every PDF download is now personalised — and traceable
Historically, if a mock paper leaked to a Google Drive share folder it was game over — we had no way of knowing whose account did it. That's changed.
Every PDF a signed-in student downloads is now stamped in the footer with:
student@school.edu · downloaded 2026-03-02 · #ab12cd34
The same string is also embedded in the PDF metadata (Subject + Keywords) so it shows up in Preview.app / Acrobat "Properties". The original PDF in Storage stays clean; the personalised copy is served through a short-lived signed URL that dies 15 minutes after the browser gets it.
2. Repeat-download alerts land in my inbox automatically
Personalised copies are useful if you catch a leak. But the harder question is spotting a leak in the first place. So the 4th time the same email downloads the same PDF within a rolling 24-hour window, I get a Resend email with:
- The student's email + Firebase UID
- The exact file path (
pdfs/slai/practice-exams/…) - A list of every watermark
#shortIdissued in the window — so I can match physical copies to the alert - A direct link to
/admin-watermarks.htmlfor the full log
Every subsequent download at or above the threshold sends a fresh email until the behaviour stops. Noisy? Slightly. But the point is to spot the leak-farming pattern early, before it spreads. A Gmail filter on "[Leak alert]" mutes the noise once you've triaged it.
3. Teacher bypass codes — hand a class one-lesson AI Marking access
The most common feedback from Heads of Maths this term: "I love the AI Marking demo but I can't put my whole class through the free-preview cap in one lesson." Fair.
Teachers with an active licence (and site owners) can now generate short-lived override codes at /bypass-codes.html. Each code looks like:
TCH-XA9K-P3RJ
Teacher chooses:
- Label — free-text ("Year 12 Wed period 3")
- Duration — 1h / 4h / 24h ("one lesson", default) / 3 days / 1 week
- Seats — 10 to 60
- Which AI features to unlock — AI Marking only, Interactive Coach only, Grade Predictor only, or all three
The alphabet deliberately excludes O/0/1/I/l — misread-safe when you're calling it out across a noisy classroom. Codes are single-use per student (a mis-click can't burn a second seat), transactionally enforced server-side, and auto-expire on the timer. No admin console. No CSV upload. No password reset flow.
4. Practice-Exam Timer feeds Path-to-7 automatically
Every practice-exam PDF (Bronze / Silver / Gold / Platinum tiers across Papers 1, 2 and 3) now has a small "▶ Start timer" chip right beside the Download button on /downloads. Click it to start a real-time clock the moment the student begins the sit.
When they hit "Finish", the duration is logged to their exam_attempts collection and mirrored into the shared scores collection with kind:"exam_attempt". That means the existing Path-to-7 miner picks up the sitting on Monday morning without any config change — the coach starts spotting habits like "she's downloading Platinum papers but never sitting them full-length" automatically.
The widget is persistent across refreshes (localStorage) so a browser crash mid-paper doesn't lose the clock. Anything under 30 seconds is treated as a mis-tap and doesn't log. Anything over 4 hours is clamped — nobody's practice paper takes that long. And the raw startedAtMs from the client is trusted-but-verified: clamped to a 24-hour window so a bad system clock can't back-date attempts into last term.
Simultaneously, a new Platinum-tier Paper 2 Set 2 has been added — a 16-page "Complex Synthesis" paper covering multi-stage annuities, 3D bearings, quadratic optimisation, Bayesian defect screening and arithmetic/geometric progression crossovers. Full worked solutions with M / A / R mark distributions and an Examiner Tip block after each question.
5. Bonus: A-Level parity + a self-clearing admin nag
All of the above works on the UK A-Level and Edexcel IAL sibling site too — same Firebase backend, same soft-gate, same bypass-code system. Photo-upload AI marking on the 6-week A-Level Bridging course + the PreIB bridging flow both consume teacher codes identically.
And a small piece of housekeeping I'm quietly proud of: the admin watermark audit page reads the GCS bucket's actual lifecycle policy via the Admin SDK and shows a bright amber "Storage lifecycle rule not applied yet" banner until I run the one-shot cleanup script. The moment the rule shows up on the bucket, the banner self-clears to a green tick. No more forgetting.
What's next
Practice-exam attempts are getting hooked into the Class Mastery Heatmap next — so the teacher dashboard will show who sat what full-length paper, when, and how long they took, alongside the existing per-topic mastery bars. Plus a dark-themed A-Level version of the bypass-codes page so students on the Edexcel side don't get cross-branded on redemption.
If you're a Head of Maths and want to trial any of this on a real class, the demo login is 48 hours, no card, no LMS integration talk. Email me directly.
Want to see it live with your own department?
48-hour trial account, preloaded with two seeded students so the Class Mastery Heatmap is populated the moment you sign in.
Request a demo login →