Changelog · Product update

What shipped in the last two weeks — leak-proof PDFs, teacher bypass codes & an inline exam timer

Five small pieces of the platform got a lot more useful for schools this fortnight. Here's the honest teacher-facing version of the changelog — what it does, why we built it, and how you turn it on.

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.

Why it matters for teachers: if a shared mock paper turns up in a WhatsApp group, one Firestore query against the audit log tells you which student's account originated it. No polygraph required.

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:

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:

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.

What students see: a small "Have a teacher code?" link on every AI-marking surface — the badge, the preview-cap modal, the Bridging photo-upload page. Enter the code once → full AI access for the lesson.

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 →

← All blog posts