11+ practice and tutoring platform. Sister product to MedRevisor (the UCAT platform) — this repo was forked from it and converted, so nothing UCAT-specific should remain.
Deploy URL: https://revisorplus.onrender.com — live since 2026-08-25, backed by
Postgres. It runs on Render's free tier, so the instance sleeps after 15 minutes idle
and the first request after that takes roughly 30 seconds while it wakes.
(The old medrevisor.onrender.com link belongs to MedRevisor, a different product.)
You can create your own account as a parent or a tutor. Pupils never self-register — a
parent creates their child's login from their own /family/ dashboard.
Parents and tutors can also sign in with Google, once GOOGLE_OAUTH_CLIENT_ID and
GOOGLE_OAUTH_CLIENT_SECRET are set in the environment (the button only appears when
both are present). Pupils never can: the adapter refuses a Google login whose email
belongs to a pupil, and a Google login is never auto-connected to an existing parent
or tutor account by email — an adult connects it themselves from inside their own
logged-in session.
Demo accounts (parent, student, tutor) are only created when seed_demo is run with
DJANGO_DEBUG=1, or with DEMO_ACCOUNT_PASSWORD / DEMO_SHOWCASE_PASSWORD set in the
environment — no demo passwords are published here, and none exist in production unless
those variables are explicitly set. A production superuser is created separately with
python main.py createsuperuser (guarded by DEMO_ADMIN_PASSWORD where applicable), not
seeded with a published password.
| Role | What they can do |
|---|---|
| Parent | Create and manage their children's logins, see each child's progress and homework on their own parent dashboard at /family/child/<id>/, message the tutor |
| Student | Practise, see progress analytics, complete homework |
| Tutor | Oversee student progress, assign and track homework |
| Admin | Full system access at /admin/ — tutor accounts, payments, data, and adding/removing questions |
Four sections, matching the 11+ papers: English (ENG), Maths (MAT), Verbal Reasoning (VR) and Non-Verbal Reasoning (NVR). All questions are multiple choice.
The bank is built from JSON packs in elevenplus_data/. Anything named contrib_*.json
is auto-imported on deploy, so a merged pack goes live without touching build.sh.
See elevenplus_data/CLAUDE.md for the authoring contract and CONTRIBUTOR_QUICKSTART.md
for the non-developer walkthrough. CI validates every pack on the PR.
- Backend: Python 3.12 + Django 5.1
- Auth: django-allauth (email login for adults, username for pupils; role-based: parent/student/tutor/admin), plus optional Google sign-in for parents and tutors (
allauth.socialaccount) - Frontend: Django templates + Bootstrap 5 + Chart.js
- Database: SQLite (local) → PostgreSQL (production)
- Payments: Stripe (test-mode Checkout)
- Serving: Gunicorn + WhiteNoise (static files)
- Hosting: Render (web service + managed Postgres)
- Version control: Git / GitHub
~4,600 questions, generated procedurally by main.py generate_bank and balanced
across the four papers (roughly 1,150 each). Difficulty is derived from each
question's parameters rather than assigned, and every wrong option records the
mistake it represents so feedback can name the slip. Re-running is safe: questions
are matched on gen_key, so a regenerate never deletes a question a pupil has
answered. Non-verbal figures are drawn as SVG from stored parameters — no image
files involved.
Two author-written exam papers live in elevenplus_data/ and import via
main.py import_paper.
- Deploy URL — fill in above once RevisorPlus has its own Render service.
- Adaptive selection —
practice.views.start()still picks at random.difficultyis recorded on every question but no query reads it yet, so the landing page deliberately claims weakness targeting rather than adaptivity. - Nothing is gated behind Premium — a free account currently gets the whole product. Pricing describes the plan honestly, but there is no paywall.
- Written answers have nowhere to go — rubric-marked questions set
awaiting_markingand no tutor marking queue exists to clear it. - Thin subtopics — Reading Comprehension (5, needs passages), VR Analogies (29) and NVR Rotation (49) are limited by source data, not by the generator.
- SQLite is rebuilt on every deploy — see the note in
render.yaml. Fine while the bank is generated; not fine once anyone authors via the admin.