Drop a NotebookLM shim .html or .json. Each quiz gets a stable Firestore ID β renaming won't break user progress.
π
Click to browse or drag & drop
Accepts .html (shim) or .json (any NB format)
Auto-detects shim, NB JSON, or flat array.
Manage quizzes
Rename weeks, topics, or quizzes β user progress is never affected.
Some older attemptHistory tries have no usable at time (missing field, empty, or legacy 0). This scan lists user sessions that still have at least one such untimed try in any question slot. Running cleanup removes duplicate untimed rows (keeping the last per slot), stamps the surviving untimed try with Jan 1 2026 12:00 UTC, and leaves properly timed tries unchanged (across all users).
User
Quiz ID
Timed tries
Untimed tries
Slots w/ untimed
Used when you click Topics on a quiz. Each provider needs its Cloud Function secret (OPENAI_API_KEY or GEMINI_API_KEY).
Question Note RAG links
Preview or merge-write topic-to-note path matches for the current section. Matching uses your saved note titles under quizSessions/<you>/notesDocuments into noteTopicLinks/{sectionId}__{weekId}__{topicId}.
Loadingβ¦
AI Prompt Templates
These prompts are sent to Claude, ChatGPT, Perplexity and Google when a user clicks an AI button. Use {{variable}} placeholders. Changes apply to all users immediately after Save.
Available variables {{stem}} β question stem |
{{options}} β all options (A. β¦ B. β¦) |
{{chosen}} β letter the user picked |
{{chosen_text}} β text of chosen option {{correct}} β correct letter |
{{correct_text}} β text of correct option |
{{query}} β search bar text (search template only) |
{{scratchpad}} β student's scratchpad notes for the question
Explain suffixes β appended after the base prompt above
Solve prompts β stem only, no options
Search bar β custom format for search bar queries
Verify note β tick button (β) on expand grid
VIVA Practice
Author short-answer viva questions and edit the AI prompt templates used by the VIVA AI buttons. The VIVA prompts here are independent from the AI prompts in the Prompts tab.
vivas/{vivaId} in Firestore
Loadingβ¦
Available variables {{scenario}} β question stem |
{{subquestion}} β current subquestion prompt |
{{marking_scheme}} β marking scheme |
{{user_answer}} β what the user typed {{prior_context}} / {{prior_context_stem_ans}} β prior subq + scheme + your answers |
{{prior_context_stem_only}} β prior subq + scheme only (no answers) {{viva_title}} |
{{question_title}} {{body}} β (search wrapper only) the rendered prompt body
made by Zi Lin
Edit VIVA
Each VIVA has a stable Firestore document ID (shown below). Week and topic options come from your other VIVAs in that section (or use + New) β they are independent from quiz week/topic lists. Stable weekId/topicId are reused only when labels match another VIVA, not quizzes.
π
Click to browse or drag & drop
Accepts .json (questions array or object with "questions")
Questions only; section/week/topic from form.
Delete quiz?
Rename
Append questions to quiz
Drop a NotebookLM shim .html or .json. Extracted questions are appended to β¦ (currently 0 questions). The quiz's Firestore ID stays the same β no user progress is affected.
π
Click to browse or drag & drop
Accepts .html (shim) or .json (any NB format)
Auto-detects shim, NB JSON, or flat array.
Edit Quiz
Change any field. The quiz's Firestore ID stays the same β no user progress is affected.