Classroom Glen Open the app →

A private learning platform · Australia

Classroom Glen

Structured VCE courses, an AI study buddy, and exam-style assessment with AI-⁠assisted marking — private by design.

A private learning platform for VCE students — built for one family, engineered for many.

Invite-only Open the app →

small on purpose, engineered like it isn’t

One family today. Built like it’s many.

Three courses, all original material. Enrichment alongside school — not formal VCE enrolment.

Classroom Glen is an invite-only learning platform for VCE (Victorian Certificate of Education) students, currently serving one family in Australia. Students get structured courses, an AI study buddy, and exam-style assessment with AI-⁠assisted marking; parents get oversight, activity digests, and study plans. Every course is original material — enrichment alongside school, not formal VCE enrolment, and no publisher or VCAA material is hosted.

It was built multi-tenant and data-driven from day one. The platform runs one family today, and is engineered so that “commercial later” means enabling signup and billing — not a rewrite.

  • VCE General Mathematics · Units 1 & 2 13 modules · 158 sessions
  • VCE Mathematical Methods · Units 1 & 2 24 modules · 248 sessions
  • VCE Business Management · Units 3 & 4, exam technique 37 sessions

Versioned content packs with original problems and marking keys throughout.

Feature highlights

The full loop — learn, practise, sit the exam, get marked, appeal — with parents in it.

Structured course player

Sequenced sessions with worked examples, checklists and exam-style problems. Mathematics is typeset with KaTeX.

A subject-aware study buddy

Maths Buddy and Business Buddy — an AI tutor on Claude Haiku that streams replies live over SSE. Every conversation is consent-gated, capped and logged.

Exam workflow

Timed papers served as PDFs from R2 under signed URLs (≤ 120 s), capped attempts, and photo upload of handwritten work.

AI-⁠assisted marking

Multi-dimension marking on Claude Opus with a confidence-gated auto-release — low-confidence marks queue for human review, and students can appeal.

Parent oversight

A multi-guardian model (M:N) with ten per-guardian permission toggles, activity emails per course, and parent-owned study plans with reminder emails.

A real safety net

A safety pre-pass on every tutor turn, a crisis-flag sweep, and an operator triage queue.

Operator console

An eight-tab admin portal — dashboards, people, courses, exam provisioning, grading & appeals, privacy and DSAR queues, ops health, cost roll-ups.

Privacy tooling

A consent ledger, data export (DSAR), scheduled deletion purge and a PII-free audit log — plus nightly encrypted backups (AES-GCM) with monthly restore-tests.

By the numbers

440+
Sessions across three courses and 74 modules
90+
Exam-style assessments with marking rubrics
20
Database migrations, zero rewrites
31
Server test files, incl. a dedicated tenant-isolation matrix
10
Per-guardian permission toggles, all deny-by-default
≤120 s
Signed-URL lifetime for every private file

Architecture

One Worker, four storage primitives, two external services. Every box below exists.

The entire platform runs at the edge on Cloudflare. A single Worker holds all server logic; everything else is a primitive doing exactly one job. Every student-scoped read — and every signed-URL mint — must pass one permission gate.

Classroom Glen system architecture Left to right: the browser loads a React SPA from Cloudflare Pages and calls the same-origin /api/ routes on a Cloudflare Worker; the tutor streams back over SSE. Behind a permission gate — canExercise, deny by default — the Worker reaches D1, R2 and Queues for student-scoped data; the KV session cache and rate-limit counters route past the gate, because they hold no student-scoped data. The Worker alone calls Anthropic Claude and Resend, server-side only, and consumes grading jobs from the queue to mark on Opus. Cron triggers hourly housekeeping in the Worker. CLOUDFLARE · STORAGE & ASYNC EXTERNAL SERVICES BROWSER students · parents · one operator loads the SPA CLOUDFLARE PAGES React SPA — Vite · React TypeScript · Tailwind app.classroom-glen.website same-origin /api/* tutor stream · SSE CLOUDFLARE WORKER Hono · TypeScript the only server logic /api/*  · /healthz hourly triggers CRON — HOURLY invite expiry · deletion purge activity emails · study reminders crisis sweep · encrypted backups student-scoped reads PERMISSION GATE DENY BY DEFAULT canExercise(actor,student,perm) cache traffic not student-scoped KV — HOT CACHE session cache · rate-limit counters never the source of truth D1 — SQLITE AT THE EDGE relational truth — users · sessions · courses grades · consents · audit log R2 — PRIVATE BUCKETS content packs · uploads · exam papers · backups signed URLs only · ≤ 120 s TTL QUEUES — ASYNC GRADING AI-grading pipeline with a dead-letter queue server-side only consumed by the Worker → Opus ANTHROPIC CLAUDE Haiku — tutor + safety pre-pass Opus — marking + appeals no API key ever reaches the browser RESEND — EMAIL verification · digests · alerts SPF · DKIM · DMARC-verified domain

Fig. 1 — The request path, left to right. Every student-scoped read and every signed-URL mint crosses the permission gate — canExercise(actor, student, permission) — and a denial is indistinguishable from a 404. The KV session cache routes past the gate: it holds no student-scoped data and is never the source of truth.

Tech stack

Small set of primitives, each doing one job — no servers to patch, nothing idling.

Every primitive and the role it plays.
PrimitiveRole
Cloudflare WorkersAPI and all server logic (Hono + TypeScript)
Cloudflare PagesReact SPA (Vite + TypeScript + Tailwind)
Cloudflare D1relational truth — 20 migrations
Cloudflare R2private blobs, signed URLs ≤ 120 s
Cloudflare KVsession cache and rate limits
Cloudflare Queuesasync AI grading, with a dead-letter queue
Cloudflare Cronhourly housekeeping and backups
Anthropic ClaudeHaiku (tutor + safety) · Opus (marking + appeals)
Resendemail — verification, digests, alerts
Vitest + Miniflaretests run on the same workerd runtime that deploys

Seven rules the code can’t break

Privacy & security by design — this platform handles children’s data. These are invariants, not aspirations.

  1. Deny by default

    Every student-scoped read passes a permission gate — and denials are indistinguishable from “not found” (404).

  2. Consent is anchored

    AI processing, email and accounts each need explicit guardian consent, re-checked on every send and every turn.

  3. AI is server-side, capped and logged

    Every tutor and marker call goes through consent → spend caps → per-student daily caps → a safety pre-pass, and lands in an AI-processing ledger.

  4. The audit log is PII-free

    IDs and hashed emails only — nothing in the log identifies a child.

  5. Nothing public in storage

    Every file lives in a private bucket, reachable only through signed URLs that expire within 120 seconds.

  6. Secrets never in git

    Sessions are PBKDF2 with signed cookies, and the operator logs in with a password plus TOTP.

  7. Kids’ data is a liability, not an asset

    Export and deletion are first-class flows, backups are encrypted, and there is no analytics or tracking script on any page — including this one.