Drill smarter, not harder.
Use filters or quick random picks to start fast. Attempt first, then check official answers and marking points to learn efficiently.
Random pick is off.
code blocks keep pseudocode verbatim, table blocks render as real HTML tables, and diagram blocks render with Mermaid with their plain-English altText shown underneath for checking. Structured questions (Paper 1B and all of Paper 2) drill differently: type your answer for each part, submit, then tick the official marking points your answer earned — tables, SQL answers and full pseudocode programs stay as blocks inside the parts.Your results
Saved on this device only. Use Know / Shaky / Gap honestly — Shaky and Gap questions automatically join your re-drill queue.
Reset everything? This clears all attempts, scores and Know / Shaky / Gap ratings on this device.
Practice Zone
Your saved questions, re-drill queue, progress and full practice record (including how certain you were each time).
Analysis
Mastery by module: strengths sit near the outer edge, areas to improve near the centre.
Flashcard-style: read each question, say your answer out loud, then reveal the standard answer and check the keywords — the words and phrases the official marking schemes award marks for. Rate yourself Know / Shaky / Gap on each card; ratings are saved with the rest of your progress on this device.
Showing all matching FAQ entries.
Settings
Everything here is optional. With nothing set, the question bank and FAQ load automatically from the project’s GitHub data repo (with the built-in copies as fallback), and there is no AI.
AI is connected through a server endpoint (for example Vercel /api/ai) so model details and API keys stay on the server as environment variables, not in browser settings. If the AI endpoint is not configured or unreachable, the AI buttons stay hidden and drilling works as normal.
Sign in with Google to sync progress across devices. Firebase config is loaded only from your secure server endpoint (/api/firebase-config). If Firebase is not configured, the app keeps using device-local progress only.
The questions are loaded from a question-bank.json file — the format the project’s bank builder produces. On start the page tries, in order: the URL saved here (pre-filled with the project’s GitHub data repo, so the bank auto-syncs whenever the repo is updated), a question-bank.json sitting beside this page, then the built-in copy. You can also load a file from this device for this session. Your saved progress is keyed by question ID and survives any bank swap.
Pre-filled with the GitHub default, which auto-syncs whenever the data repo is updated. You can point it at another copy instead — clear the field back to empty and save to restore the GitHub default.
The FAQ loads independently from its own faq.json (same pattern: saved URL — pre-filled with the project’s GitHub data repo → file beside this page → built-in copy), so it auto-syncs with the repo, can be updated on its own, and can be reused for flashcards or a matching game.
Pre-filled with the GitHub default, which auto-syncs whenever the data repo is updated. Clear the field back to empty and save to restore the GitHub default.