Privacy
How Keep Calm and Quiz On handles your data, in plain language.
Last updated
April 30, 2026.
Who we are
Keep Calm and Quiz On is operated by Consensus ApS, the data controller under the GDPR. For privacy questions, or to exercise any of the rights described below, email privacy@consensus.dk.
What we collect and why
Essential diagnostics. We collect operational error data so we can detect failures and keep games running. This is on whenever the app loads, because without it we cannot keep the service reliable. Lawful basis: legitimate interest in operating a working service (GDPR Art. 6(1)(f)).
Optional analytics. If you select Accept analyticsin the cookie banner, we also record usage events (which screens you visit, when a quiz starts, how long sessions last) and may enable PostHog session replay so we can improve the product. Lawful basis: your consent (GDPR Art. 6(1)(a)). You can change your mind at any time by clearing this site's data, or by removing both the analytics_consent localStorage entry and the analytics_consent cookie; the next page load will ask again.
We do not collect your name, email, address, or payment data through the app. Game content you enter, including quiz titles, questions, slides, player nicknames, free-text answers, brainstorm ideas, and avatar choices, is stored with the game and visible to the host or other players where the live game experience requires it.
Who processes the data
We use PostHog (PostHog Inc., United States) for diagnostics, optional analytics, and optional session replay. PostHog receives events from your browser when the app is loaded. Data may be transferred to the United States under the European Commission's standard contractual clauses.
If you use AI quiz generation, we send your topic, audience context, generated-question settings, and any uploaded source PDF to OpenAI so it can generate draft quiz content. If you ask AI to draft answer options, we send the question text, question type, and existing answer options to OpenAI. If you use map-pin place search, the search text is sent to Nominatim / OpenStreetMap, and map tiles are loaded from the map tile providers used by that editor. If a host adds a YouTube or Vimeo video embed to a slide, that provider receives the iframe request when the slide is rendered.
How long we keep things
Diagnostics events: typically up to 90 days. Analytics events (if you opted in): typically up to 12 months. Finished games and their associated rounds, player nicknames, answers, generated content, and uploaded game assets are retained for 30 days after the game finishes, then cleaned up. Browser storage entries listed below remain on your device until you clear them or until the listed expiry passes.
Cookies and browser storage
The app uses your browser's local storage, session storage, and cookies. Nothing here is used for advertising.
Consent
analytics_consentlocalStorage + cookie- Records your "Accept analytics" or "Only essential" choice. The cookie expires after 1 year; the localStorage entry persists until you clear it.
Analytics and diagnostics
kcqo_observability_browser_session_idlocalStorage- Browser session identifier sent to PostHog. Written only when you have accepted analytics.
ph_<PostHog project key>_posthoglocalStorage + sessionStorage- PostHog SDK persistence for diagnostics context and consented analytics. The exact key includes the configured public PostHog project key.
__ph_opt_in_out_<PostHog project key>localStorage- PostHog SDK opt-in / opt-out state for analytics capture.
ph_<PostHog project key>_window_idsessionStorage- PostHog SDK tab identifier used to separate browser windows.
ph_<PostHog project key>_primary_window_existssessionStorage- PostHog SDK tab lifecycle flag that is cleared as the page unloads.
Host
kcqo_hasCreatedLobbylocalStorage- Onboarding flag noting that you have created a lobby.
kcqo_create_draftlocalStorage- Auto-saved draft of a quiz you are currently editing, so you do not lose work on reload.
kcqo_hostCredentialslocalStorage- Client-readable host credentials that let you reclaim a hosted game after a reload or browser restart. Server-side copies are stored only as hashes.
dhaka_hostCredentials / dhaka_hostRecoverySecrets (legacy)localStorage (read-only migration)- Legacy host credential keys that may be read once to recover access from older browser state. New writes use kcqo_* keys.
kcqo_sessionIdlocalStorage- Stable browser session identifier used by the app.
kcqo_finalRevealPacing_v1localStorage- Your preferred pacing for the final reveal animation.
kcqo_soundMutedlocalStorage- Whether you have muted the in-game sound effects.
kcqo_hostTransferSecret:*sessionStorage- Short-lived host-transfer secret for this tab when sessionStorage is available.
kcqo_hostTransferSecretshistory.state fallback- Fallback map of host-transfer secrets kept in the current tab history entry when sessionStorage cannot be written.
kcqo_hostRecoveryAttempt:*:*sessionStorage- Tracks an in-flight host recovery attempt. The key includes the game code and host recovery secret; the value is the retry attempt ID.
kcqo_hostEliminationBaseline:*sessionStorage- Host-console snapshot used to show how many players were eliminated in the current round.
Player
kcqo_joinPreferences_v1localStorage- Your saved nickname and avatar choices for joining games.
kcqo_playerJoinRouteNotice_v1sessionStorage- Pending tab-scoped notice about a join preference storage save/clear failure, including the failure reason; removed after it is shown.
kcqo_offlineAutoRetrysessionStorage- Short-lived retry guard containing the current route/query and retry timestamp to avoid repeated auto-retries after reconnecting.
kcqo_nextGameAutoJoin:*sessionStorage- Pending auto-join for the next game in a series.
kcqo_playerEliminationRecap:*sessionStorage- Tab-scoped flag noting that a player has already seen their elimination recap for a round.
Preview
kcqo_preview_datasessionStorage- Quiz data used while previewing a draft, scoped to the preview tab.
sessionStorage entries are cleared when you close the tab. localStorage entries persist until you clear them in your browser. The history.state fallback entries live in the current tab history entry and are removed after transfer recovery.
Your rights
Under the GDPR you have the right to access, rectify, or delete personal data we hold about you, to restrict or object to processing, and to data portability. To exercise any of these, email privacy@consensus.dk. You can also lodge a complaint with the Danish Data Protection Authority (Datatilsynet) at datatilsynet.dk.
Changes to this page
If we change how we collect or use data, we will update this page and bump the “Last updated” date above.