Interactive Quiz App

Privacy Policy

Last updated: 17 August 2026

The app runs on your device. Your questions, libraries, whiteboards, scores and student roster are stored in your own browser and stay there unless you deliberately sign in and turn on sync.

You can use every feature of this app without an account, without Google Sign-In, and without an internet connection.

We do not run advertising. We do not build profiles. We do not sell, rent, lease or share personal information with anyone, for any purpose.

1. Who this is for

This is a mixed audience application, built for tutors, teachers and students. It is not directed primarily at children.

Signing in with a Google Account is strictly optional, and every feature works without it. That matters beyond convenience: Google's API Services policy prohibits applications directed primarily at children from using Google Sign-In, and the optional-account architecture is what keeps this app correctly positioned as mixed audience.

If you are a student under 13, you do not need an account and should not create one. Nothing about taking part in a lesson requires you to sign in.

2. What stays on your device

By default, this is everything:

DataWhere it lives
Quiz libraries and questionsYour browser's local storage (synced only if you turn sync on)
Missed questions, per-topic progress, item statisticsYour browser's local storage
Per-skill mastery scoresYour browser's local storage
Your own quiz scoresYour browser's local storage (a score line syncs only if you turn sync on)
Whiteboards and their pagesYour browser's local storage
Annotations saved with a quiz attempt — including the other person's, after a live sessionYour browser's local storage — see below
Imported PDF page imagesIndexedDB, on your device
Class rosters and student names you typeYour browser's local storage
Group Jam class results the teacher chooses to saveYour browser's local storage — see below
Assigned practice you have been given, and results waiting to be handed inYour browser's local storage — see below
Local account credentials and 2FA secretsYour device only
A count of how far you got in the first few minutes, and whether live sessions connectYour browser's local storage — see below
A copy of the last few quizzes you deleted, so you can put one backYour browser's local storage — see below

Deleting a quiz keeps a copy on your device for a little while, so that deleting the wrong one is not permanent. When you delete a quiz, the app holds a copy — its questions, its title, and where it sat — and offers to put it back from a line under your shelves. It exists because the alternative is a one-click action with no way back.

Three things about it, plainly:

There is deliberately no timer. A copy is not deleted on a day nobody chose; it is displaced when you delete more, or removed when you say so. That is the same bargain the annotation ring buffer makes, and it puts the decision with the person who made the deletion.

Group Jam results a teacher saves stay on the teacher's device. During a live Group Jam session, each student's score reaches the host's device directly over the peer-to-peer connection — that is how the game works, and our server is never in that path. When the session was launched from a class roster, the host can press "Save results" on the results screen. That is the only way a session's results persist, and what is kept is deliberately reduced: each student's total score, correct/incorrect counts, accuracy, a per-topic summary, and who was absent. The per-question answer log is discarded at the moment of saving and is never stored. Saved results live in the teacher's own browser storage, are never uploaded, have no table on our server, and are deletable one session at a time, per class, or by deleting the class. They are labelled — in the app and in any exported spreadsheet — as practice results reported by each student's own device, not invigilated grades. A session not launched from a class roster cannot be saved at all.

Assigned practice stays on your device until a lesson is already running. A teacher can hand out a link that carries a set of questions plus two study preferences — guided pathway and spaced review — and a due date. That link travels from teacher to student and contains no information about any student: no name, no class identifier, no roster entry, no teacher identity.

When you complete assigned practice, the result is written to your own browser storage and nowhere else. It is not uploaded, it has no table on our server, and it is not sent anywhere at the moment you finish. It waits. The next time you join that teacher's live session, it is handed over the same direct peer-to-peer connection the session already uses — so no new connection, no account, and no server are involved at any point. If you never join another session, it simply stays on your device and nothing is ever sent.

What is kept and handed over is the same reduced summary a live session produces: totals, correct and incorrect counts, accuracy, and a per-topic summary. The per-question answer log is discarded when the result is recorded and is never stored or sent. Results waiting to be handed in are visible to you in the app, and clearing this site's data removes them.

A diagnostic sends less about you than it knows. A skills check works out which topics you can already do, which one you are ready for next, and which are still out of reach. That full picture stays on your device. What is handed to your teacher is deliberately narrower: the topics you are ready to learn next, by name, because that is what a teacher acts on; counts only for how many topics you have already mastered and how many the check could not settle — numbers, never a list of names; and how many questions the check used, with the note explaining that the result is a position within your teacher's own material and not a grade level.

The list of topics you cannot do yet is never sent. It is the largest part of the result and it is the part a teacher cannot act on, so it stays on your device. The record of which individual questions you were asked, and how you answered them, is discarded when the result is recorded — exactly as for ordinary assigned practice. Diagnostic results travel by the same route and only by it: they wait on your device, and are handed over the direct connection the next live session already opens. Nothing is uploaded, and there is no table for them on our server.

On the teacher's side, a returned result is stored with that class's records at the moment it arrives — the deliberate acts here are assigning the work and opening a session for the class, so the hand-in completes without a further click, and the student's device is told it arrived so it can stop holding a copy. A session with no class attached refuses hand-ins entirely, and the work simply stays on the student's device. What the teacher's device stores is the same reduced summary, attributed to the class-register entry the student's typed name matched (or held under the typed name, visibly, when nothing matched — the app never guesses). It stays on the teacher's device until deleted — per assignment, or with the class — is never uploaded, and is labelled as self-reported practice in the app and in any exported spreadsheet, exactly like live session results.

"Your browser's local storage" means localStorage, and — once a profile approaches what localStorage allows — IndexedDB in the same browser. Both live only on your device: moving data between them changes which drawer it sits in, never whether it leaves the machine. The app also keeps a verified backup copy of your content in IndexedDB as protection against running out of space. Quota problems are reported on screen, to you, and nowhere else.

There is no telemetry, no analytics service, no crash reporter and no background upload. Signed out, this app never sends your content to a server The app counts a few things about itself, on your device, and sends none of them. Two small tallies exist so the people building this can tell a confusing first five minutes apart from a broken one: how far a new user got (opened it, looked for content, added content, ran a quiz) as counts and dates — never a record of what you added or teach — and whether live sessions actually connect. Both live in local storage and have no network path at all: no endpoint, no request, no identifier, no beacon, and no opt-out to forget to use, because there is nothing to opt out of. They are not analytics; an analytics system reports somewhere, and these have nowhere to report to. If you want to tell us how you got on, run Activation.report() in your browser console and read the result — it prints plain text, and you decide whether to send it..

Imported PDFs are converted in your browser. The file is never uploaded. This is deliberate: a tutor's PDF is often a student's marked work or a school's own paper, and rendering it on a server would put student records into a third party's logs purely to save some processing on your machine.

3. What reaches our server, and only when

Our server receives data in exactly five situations, all of them optional.

When you sign in with Google

We store, for the account holder only: an opaque Google subject identifier, your email address, and your display name and chosen handle. We never receive your password, and we request no access to Gmail, Drive, Calendar, Contacts or any other Google service.

Sessions are stored as a hash of a random token, never the token itself, so a database disclosure does not hand anyone a working login. Sessions expire after 30 days.

When you turn on sync

Signed in and syncing, three kinds of content are uploaded so they reach your other devices: your whiteboards, your quiz libraries — the quizzes you have written or imported, their topic structure, and the order you have arranged them in — and your own practice score lines, described below. The first two also carry merge bookkeeping: per-item edit timestamps and a random per-device identifier, which is how two of your devices that both edited offline combine their changes without losing either side's work. The identifier is random characters with no connection to your account, your hardware, or you. The server stores all of it as opaque text and does not read the content of it — with one precise exception. When two of your devices edit the same library while offline, the server resolves the collision, so the outcome is the same whichever device syncs first. To do that it works with the structure of your library and its merge bookkeeping: which quiz and question entries exist (their identifiers), their order, and which side's edit timestamp is newer. The content of your questions — the text, the choices, the answers, anything you typed — is copied through as opaque units the server never parses, compares, or logs; an automated test fails our build if the merge code ever names a content field, or if replacing every piece of content could change any merge decision. The overwritten side of a collision is returned once to the device that synced, for its local restore list, and is kept nowhere on the server. Whiteboards are not merged this way; they remain fully opaque.

How often your device talks to the server, and what it says when it does. Syncing happens on its own: when the app opens, when you sign in, a few seconds after you change something, when you return to the tab, and — while the app is left open — on a timer you control, set to every 15 minutes by default. That timer only asks. It uploads nothing: it sends an empty list and the question "has anything changed since last time", and on the ordinary answer of "no" it receives an empty reply. Your content still goes up when you actually change something, which is the moment it should. The timer pauses while the tab is in the background, and can be set to 5 minutes, an hour, or off entirely in Settings → Sync. It carries no content of yours.

You can turn each kind off separately. Settings → Sync has a switch for libraries, for whiteboards, and for your own score lines. Your account mode sets the starting position of each, and a switch you change yourself overrides it — including turning something back on that your mode had off, in which case the app says so at the moment you do it rather than afterwards. Turning one off stops that kind of content leaving from then on; it does not by itself remove what is already on the server, which you can do at any time by deleting the content or the account.

K-12 classroom mode narrows this in code, not just in settings. With the mode on: whiteboards and practice score lines are not uploaded at all, short share links cannot be created (received links still open), and AI features run only on-device — no text reaches a hosted model. The one content path that remains is your own quiz libraries, with the warning above unchanged. These limits are enforced at the code paths themselves and asserted by automated tests on every build.

Know what this means. If you write a student's name on a whiteboard, import a PDF of their marked work, or type a student's name into a question, and sync is on, that content is on our server. If that is not appropriate for the material in front of you, keep sync off — the app is fully functional without it.

Your own practice history — a score line, and only yours. A quiz you took while signed in to this account syncs as a score line: which library and quiz, the quiz title, when you took it, and how many you got right, wrong and in total. That is the entire row. It exists so your own practice on a laptop shows up on your desktop.

What makes an attempt eligible is decided before anything is sent, and the rules are deliberately strict:

There is no column on the server for a name, a per-question answer or a missed-question list, so no fault in the app can put one there.

What sync still never uploads. Which questions were missed, per-question answers, per-topic accuracy, item statistics, class registers, tutoring client records and session notes are not uploaded and have no table on the server. Anyone's results but your own stay on the device, in full. Syncing the questions is what makes a second device useful; the item-level record of how an identifiable learner performed is the most sensitive thing this app holds, and it stays where it was made.

When you create a short share link

Share links normally send nothing anywhere. A share link carries the quiz itself, compressed into the part of the web address after the # — and browsers never transmit that part to any server. Sharing a quiz that way is between you and the person you send it to, and it stays the default.

That breaks down for a large pack. A quiz with pasted diagrams produces a very long address, and mail clients wrap long addresses while course sites truncate them, so the link arrives broken. For those, you can choose to create a short link instead.

This is opt-in, one share at a time. Nothing is uploaded automatically because a pack got big. The long link is always built first and always offered; the short link is a separate button, shown only when the long one is at risk, next to a description of what it does. You must be signed in.

If you have typed a student's name into a question, that text is uploaded with it. The confirmation says so before anything is sent. If that is not appropriate for the material, send the exported file instead — that path never touches our server.

When you start a live session

Live tutoring is peer-to-peer. Ink, everything drawn during a session, and any quiz the participants share or edit together travels directly between browsers and never passes through our server. Shared editing of a quiz is off until the quiz's owner offers it and the other person explicitly accepts; accepting saves a copy of that quiz on the accepting device, which its owner keeps and can delete like anything else stored locally. Annotations from a session are saved on both devices, and that changed on 14 August 2026: the drawings kept with a saved attempt now include the other person's, so a student keeps the tutor's worked explanation for the question it was drawn on and a tutor keeps the student's working. They do not sync, ever — these drawings are held in local storage, and turning sync on does not upload them; the one way they can leave the device is inside a lesson summary you deliberately send, as a file or as an encrypted link whose key we never receive (below). They are not labelled with who drew them: the record of which participant made which stroke is deliberately discarded when the attempt is saved, and kept only while the session is live so the app can show you who is drawing. You can delete them like anything else stored locally. A lesson you never finish is saved too, from a few seconds after you start drawing on it — since 15 August 2026 — it used to be discarded unless you reached the results screen, which lost a whole lesson of annotation for anyone whose session simply ended, and that is what a tutoring hour normally does. It is saved while you work, not when you leave: the moments a browser gives an app on the way out are too short to compress a lesson of drawings, so waiting for one would mean losing the work of anyone whose tab was closed, crashed, or discarded by the browser. One record is kept per quiz and refreshed as you go. The same rules apply to it as to any other saved attempt, and it counts against the same bounded archive; finishing the quiz replaces it, so one lesson leaves one record. Reopening a saved attempt does not re-share it: drawings restored from your archive are shown to you and held back from anyone who joins a later session, because the app can no longer tell which of them were yours. Showing restored work to somebody takes a deliberate action. A saved attempt can become a lesson summary PDF: the summary — the score (or how far an unfinished session got), the questions to revisit, what to practise, and the worked pages — is composed entirely on your device and saved as a file there. Creating one sends nothing to any server; sending the file — an email to your student, a print-out — is between you and them, through tools of your own choosing. If you would rather send a link, the next section describes the one way a lesson summary can touch our server: encrypted on your device first, with a key we never receive. Because saved drawings are not labelled with who drew them, the summary shows the lesson's working without saying who wrote which stroke. What the server holds briefly is the connection handshake: a short room code, WebRTC connection descriptors, the host's display name, and — in a group room — the name each student types when joining.

Student names entered to join a room are limited to 40 characters and are automatically deleted 30 minutes after the room is created by an expiry sweep on the server. They exist only so a host can tell participants apart during the lesson. Students can join with an initial or a nickname; nothing verifies or requires a real name.

When you send a lesson summary as a secure link

A lesson summary is composed on your device and saved as a file — that stays true and stays the default, forever. If you are signed in, you can additionally send one as a secure link. Because the summary's worked pages can contain a student's handwriting, this is the one place student work can touch our server — so it is engineered to arrive unreadable. It is encrypted before it leaves: the PDF is encrypted on your device with AES-256-GCM, using your browser's built-in WebCrypto, before anything is sent; what our server stores is ciphertext. We never hold the key: the decryption key is placed in the link itself, after the # — the URL fragment — and a fragment is never transmitted to any server by any browser. When your student opens the link, their browser fetches the encrypted copy and decrypts it locally, on their device. We cannot read what we store, and there is nothing we could be compelled to hand over that would change that: we hold ciphertext and no key. It is opt-in, one record at a time: creating a summary uploads nothing, and the link is a second, separate step behind a confirmation that says all of this. It expires after 7 days, automatically — deliberately shorter than share links, because this is a lesson handout in transit, not an archive; you can revoke it sooner from Attempt history, and deleting your account deletes every lesson link immediately. Anyone with the full link can open it — the link carries both the lookup code and the key, so treat the link the way you would treat the file itself and send it directly to your student. What is stored in clear is the quiz title, so your own revoke list is readable, and the timestamps; there is no field for a student's name. K-12 classroom mode does not create these links at all — the same code-level switch that blocks pack short-links blocks this, encrypted or not.

4. AI features, and what leaves the device when you use them

Two features use an AI model: generating questions, and writing a study guide from a whiteboard. Both can be run from the text on a board, and both are the only features that send your content to a company other than us, so they get their own section.

You choose the backend, and the choice decides where the text goes:

BackendWhere the text goesWhose account
On-device modelNowhere. It never leaves the browser.
Your Anthropic keyDirectly from your browser to AnthropicYours
Your Google keyDirectly from your browser to GoogleYours
Bundled Gemini keyDirectly from your browser to GoogleThe publisher's

Three things follow from that:

If the board has a student's name on it, and you generate questions or a study guide from it with a hosted model, that name goes to the model provider. Use the on-device backend, edit the name out, or don't use the feature for that board.

The brand kit

Your logo and colours are stored on this device only. They are presentation, not account data, so they are never uploaded and never synced.

A logo pointed at a URL on someone else's server would let that server see your IP address on every page load. The app's security policy now blocks such a fetch outright, in every copy — the hosted site, the portable folder, and the desktop app all carry the same policy, so the image simply does not load. Use a data: URL, which embeds the image on your own device; it is both the private choice and the one that works. (This paragraph used to warn that the leak was possible in copies run off disk. Since 13 Aug 2026 the policy travels with the pages themselves, and the warning became a description of a blocked request.)

We never send anything to a model provider in the background, on a schedule, or without a deliberate action from you. There is no "improve our service by analysing your content" pathway of any kind.

Subprocessors

The complete list of third parties that can receive data through this app:

PartyWhat they receiveWhen
CloudflareHosting; the Worker and database in section 3Always for the website; server data only if you sign in
Google (Identity)Authentication onlyOnly if you choose Google Sign-In
Google (Gemini)The prompt text you sendOnly if you pick a Gemini backend
AnthropicThe prompt text you sendOnly if you pick the Anthropic backend

There are no others. No analytics provider, no advertising network, no data broker, no email marketing platform.

5. What we never do

6. Data minimisation and retention

DataRetention
Live-session room codes and handshake data30 minutes, then auto-deleted
Student names typed to join a room30 minutes, then auto-deleted
Login sessions30 days, then expired
Account record (email, handle)Until you delete your account
Synced whiteboardsUntil you delete them
Synced quiz librariesUntil you delete them
Packs behind a short share link30 days, then auto-deleted; revocable sooner
Lesson summaries behind a secure link7 days, then auto-deleted; revocable sooner. Stored only as ciphertext — the key stays in the link and we cannot read them
Your own practice score lines (only with sync on)Until you delete them, or your account
Anyone else's results, and all item-level detailNever uploaded — device only
A copy of a quiz you deletedNever uploaded — device only; the last 10 deletions, or fewer if they are large, then displaced oldest-first. Removed at once when you restore it or press "Forget these"
Group Jam results a teacher explicitly savesNever uploaded — teacher's device only; kept until the teacher deletes them (per session, per class, or with the class)
Assigned-work results handed in to a teacherNever uploaded — travel peer-to-peer during a live session, then teacher's device only; kept until deleted (per assignment, or with the class)
Everything stored only on your deviceUntil you clear it

Deleting your account removes your user record, your sessions, all of your synced boards, all of your synced libraries, your practice score lines, every short share link and every encrypted lesson link you have created from the server in a single transaction.

7. Schools and FERPA

Where a school or district adopts this app, we act as a school official with a legitimate educational interest in the student data processed through it, under the direct control of the school with respect to the use and maintenance of that data. We use student data solely to provide the educational service, we do not re-disclose it, and we do not use it for any commercial purpose.

Schools requiring a signed Data Processing Agreement should request one before deploying the app to students. The local-first architecture means that in most tutoring use, no student record reaches our server at all.

Parents and eligible students may request review, correction or deletion of student data through the school. Requests made directly to us are answered within 45 days.

8. COPPA and children under 13

Written data retention policy

The amended COPPA Rule requires a written data retention policy, not merely a practice. This is it.

Written information security program

Consistent with the amended COPPA Rule — effective 23 June 2025, with full compliance required from 22 April 2026 — we maintain a written information security program, scaled to the size and complexity of this service as the Rule permits. Its current commitments:

A designated person is responsible for this program. For a service of this size that is the operator named in section 12.

9. Your rights and choices

Residents of California, Colorado, Connecticut, Virginia and other states with comprehensive privacy statutes have rights to access, correct, delete and port their personal information. Because we hold so little, most are satisfied by the export and delete controls in the app itself.

Those rights follow you, not us. State privacy laws attach to where the person is, so the list above applies regardless of where this service is operated from. We do not treat our own location as a reason to offer anyone less.

Where we operate, and the two Arizona laws that apply to us

Staples Education is a sole proprietorship operated by Adam Staples from Phoenix, Arizona, United States. Arizona has no comprehensive consumer privacy statute, which changes nothing about the rights above. Two Arizona laws do bind us directly:

10. Security incidents

If we become aware of a breach affecting personal information, we will notify affected users and, where student data is involved, the relevant school, without undue delay and consistent with applicable law.

11. Changes

Material changes are reflected in the date above and, where the change affects what leaves your device, surfaced in the app itself rather than only here.

12. Contact

Staples Education — [email protected]

For a Data Processing Agreement, a FERPA or COPPA question, or a data request, use the same address and say which it is.