Cookies and local storage
Storage purposes, retention and privacy settings. Updated 12 November 2026.
Your choice
Essential storage remembers your privacy choice and supports local game functions. Optional Google Analytics cookies are enabled only after an explicit analytics choice on the production site. There are no advertising cookies or advertising SDKs.
Leaving the choice pending or rejecting optional cookies still allows online Google Consent Mode measurements without cookies. Your choice controls analytics cookie storage; it does not stop all analytics requests. Open Cookie settings below or in the footer to change your choice.
Storage inventory
The inventory below lists browser storage used by the game, including saved games, offline resources, analytics cookies and the optional offline analytics queue. These items have separate purposes and clearing rules. Saved game records are kept on your device. The separate analytics queue holds events for later transmission only with a current accepted analytics choice.
Deletion and browser controls
Reject optional cookies to withdraw analytics cookie permission. Existing accessible _ga cookies are removed. Browser site-data controls can also remove cookies, localStorage, IndexedDB and caches for this site; this may reset preferences, saved progress and downloaded questions. The browser can evict stored data independently.
The Storage panel clears every cache on this origin except quasi-precache, including downloaded HTML and runtime static caches. Emergency offline recovery instead clears only caches whose names start with quasi-. Neither action deletes persistent localStorage, sessionStorage or IndexedDB records for saved games, players, statistics, question history, consent, the analytics queue or cache metadata. Routine cache clearing does not reload the page. Emergency recovery reloads open pages, losing any memory-only fallback state, including unsaved progress and events held only in memory. Offline readiness must be checked again after clearing. Browser site-data clearing is broader and may also remove those persistent records.
Deleting browser data does not remove analytics already delivered to a provider. Google Analytics is configured for 2 months of event data and 14 months of user data, with user retention reset on new activity. Standard aggregated reports are not governed by those periods. See the privacy policy for recipients, transfers and your rights.
Storage inventory
quasi_cookie_consent
Implemented
localStorage. Remembers necessary storage, your analytics choice, decision, policy version, time and internal opaque analytics grant identity (never an outgoing SDK field). No automatic expiry; replaced when you change your choice or removed when you clear site data. Advertising is always false. An invalid or old version asks again.
_ga / _ga_<stream suffix>
Implemented
First-party Google Analytics cookies, only when analytics storage is accepted and a production stream is enabled. _ga distinguishes browsers; _ga_<stream suffix> keeps session state. The tag is configured for host-only cookies. Google's default expiry is two years and is refreshed on activity; actual browser limits may be shorter. Rejecting removes accessible _ga cookies and denies future analytics cookie storage.
quasi_analytics
Implemented
IndexedDB offline queue with sanitized events, internal consent grant provenance, lease and revocation metadata. Maximum 500 events; overflow evicts the oldest 50, and events expire after 24 hours. Revocations are limited to 500 and 24 hours with a conservative creation-time floor and a persistent epoch. The flush lease lasts 30 seconds. Only a current persisted accepted grant can queue or replay; legacy accepted choices without identity allow online Consent Mode only. A fresh explicit analytics grant issues an internal identity; rejection retains it and regrant rotates it. Withdrawal cancels work and attempts deletion; inaccessible storage cannot guarantee physical deletion, but an old grant cannot replay under a later grant. An uncertain first event after historical withdrawal may be dropped. IndexedDB failure uses isolated memory, without cross-tab guarantees. SDK acceptance followed by a storage abort can duplicate a request. No service worker sends analytics. Online pending/rejected events are cookieless and never stored for replay. The queue is integrated into the app’s consent-aware analytics runtime. These local limits do not set provider retention.
quasi_game_setup
Implemented
sessionStorage lobby-to-game handoff: local game ID, player IDs/names/emoji and settings. Validated on read; malformed data is removed. No timed expiry; cleared by the session flow or tab/site-data clearing. An in-memory same-tab fallback is used when needed. This is not outgoing analytics.
quasi.local.v1
Implemented
Active local recovery snapshot, valid for 12 hours after its save. Contains pinned game content/progress, roster and settings, plus LOCAL analytics game identity, action counts, active time and dedupe metadata in the same saved record. It contains no outgoing analytics queue. The active writer selects shared localStorage, isolated sessionStorage or bounded same-page memory; explicit discard removes recovery and preserves lobby preferences.
quasi.lobby.v1
Implemented
Retained player IDs, names, emoji and settings; no game ID. Uses the active writer's shared/session/memory storage. No automatic expiry. Discarding recovery preserves these preferences; browser site-data clearing removes persistent copies.
quasi.stats.v1
Implemented
Atomic local completion ledger with per-player completed/won counters and local game-ID dedupe entries. Uses writer-authorized shared/session storage, or isolated memory after failure. Dedupe entries are retained at least 12 hours and the active game's entry is preserved; aggregate counters have no automatic expiry. Not outgoing analytics. Browser site-data clearing resets persistent statistics.
quasi.seen.v1
Implemented
Best-effort localStorage question history: up to 1,000 question IDs and 1,000 local game/round reveal dedupe identities, FIFO. No timed expiry; memory fallback if storage fails. Cleared with browser site data. No names or outgoing analytics.
quasi.active-game.writer.v1 / quasi_analytics_flush
Implemented
Native Web Lock and BroadcastChannel quasi.active-game.writer.v1 coordinate active-save ownership and release requests using ephemeral request IDs. There is no separate localStorage lock/session key. Missing/denied locks isolate active recovery in sessionStorage or memory. quasi_analytics_flush is the analytics Web Lock; its 30-second fallback lease lives only in queue metadata. Release/disposal closes local channels and locks.
quasi-precache
Implemented
Cache Storage for build-versioned app resources, including scripts, fonts, content and offline documents. No fixed time expiry is configured. The Storage panel's clear action preserves this cache; emergency offline recovery deletes it. Browser eviction or site-data clearing can also remove it. Downloading resources alone does not prove that all required content is ready for offline play.
quasi-html
Implemented
Cache Storage for EN/ES home, lobby, game and offline page documents, plus visited navigation pages. Network-first navigation and current-build checks support offline preparation. No fixed time expiry is configured. The Storage panel's clear action, emergency recovery, browser eviction or site-data clearing can remove these documents; prepare again online afterward.
quasi-static
Implemented
Cache Storage for runtime static resources. The expiration policy limits it to 300 entries and 30 days, with cleanup as the cache is used rather than a guaranteed deletion timer. The Storage panel's clear action, emergency recovery, browser eviction or site-data clearing can remove it. Cache expiration metadata is stored separately in IndexedDB.
serwist-expiration
Implemented
IndexedDB cache-entries store used by the offline cache library for resource URLs, cache names and last-use timestamps. It supports the quasi-static 300-entry/30-day cleanup policy. Direct cache clearing and emergency recovery do not delete this database, so metadata can remain until later expiration cleanup or browser site-data clearing. It is local cache bookkeeping, not the analytics queue.
quasi_completed_game
Implemented
localStorage flag recording an earned completed game for install-prompt and persistent-storage eligibility. It is separate from analytics consent and contains no player name or game ID. No automatic expiry; browser site-data clearing removes it.
quasi_install_resolved
Implemented
localStorage flag set when the install prompt is shown or dismissed, preventing repeated prompts. No automatic expiry; browser site-data clearing removes it. No player names or game content are stored in this flag.
quasi_update_first_observed / quasi-pwa
Implemented
localStorage timestamp for when a waiting update was first observed; removed after an update applies and reset on reconnect while one is pending. No independent time expiry. The quasi-pwa BroadcastChannel carries ephemeral update-coordination messages and closes on disposal; it adds no persistent storage record. Browser site-data clearing removes the timestamp.
quasi-pwa-game
Implemented
Ephemeral native Web Lock coordinating game entry and worker updates. A shared lease lasts through game-session and save-writer disposal; an exclusive update lease lasts through actual worker activation. No personal data is persisted in localStorage, sessionStorage or IndexedDB by this lock. It is released when its owning activity ends or its execution context closes.
quasi:christmas-dismissed
Implemented
localStorage value identifying the Christmas season whose home banner was dismissed. It affects only the matching season and is replaced by a later dismissal. No timed deletion; browser site-data clearing removes it. It contains no player name or game ID.
Offline session measurements (memory only)
Implemented
Per-tab memory keeps offline start time, visited route paths, cache-hit/miss counts and a completed-game flag until reconnect, then resets after producing a sanitized aggregate event through the existing analytics permission and delivery path. Reloading or closing the page loses this in-memory session. There is no additional durable queue or storage key, and the worker never sends analytics itself.
Guifré Ballester Basols · C/ Barcelona 33, 3r 1a, Esparreguera 08292, Barcelona · Spain
guifre.ballester@gmail.com