Your Browser Storage

This site keeps a few small things in your browser so it remembers what you were doing — your theme, tutorial progress, bookmarks, audio settings, and similar UI preferences. Nothing leaves your device. No personal information is collected, no analytics are sent off-site, and no data is shared with third parties.

Below is the complete inventory of every cookie and localStorage key this site can write to your browser. Each row shows whether the value is currently set, and you can delete entries individually with the button, remove a whole category, or wipe everything.

Cookies

Stored as HTTP cookies, scoped to this site only. None are session-tracking cookies; all are pure UI preferences.

UI & reading preferences

Cookie Purpose Status Delete
dark-mode Light/dark theme preference (true/false).
show-highlights Whether yellow text highlights are visible in articles and the SE Book.
highlights Older alias of show-highlights, used on the blog index page only.
read-aloud Whether text-to-speech (read-aloud) controls are visible by default.
uml-accent-color Custom accent color used by UML diagram renderers in tutorials.
more-confetti Whether "more confetti" mode is on (true/false). When true, confetti also fires after each correctly answered quiz question and each flashcard marked "I got it right", not only at the end of a workout.

SE Book bookmarks

Cookie Purpose Status Delete
se-bookmarks-active Whether the bookmarks feature is enabled.
se-bookmarks JSON list of pages you bookmarked in the SE Book (URL + title).

SE Gym

Cookie Purpose Status Delete
se-gym-active Whether the personal gym feature is enabled.
se-gym-timed-practice Whether SE Gym shows the optional timed-practice countdown during workouts.
se-gym-timer-mode Timed-practice mode: one total time limit or a per-card time calculation.
se-gym-timer-total-minutes Total workout minutes used when timed practice is set to one total time limit.
se-gym-timer-seconds-per-question Seconds per card used when timed practice computes the countdown from workout size.
se-gym JSON list of items (questions/flashcards) you added to your personal gym.
analyze-performance Whether per-question performance tracking is enabled.
se-gym-show-difficulty Whether SE Gym shows each card’s difficulty level (basic, intermediate, advanced, expert) before you answer. The difficulty is always shown on the explanation panel after you answer.
se-gym-active-difficulties JSON array of difficulty levels currently included in workouts (subset of basic, intermediate, advanced, expert). Default when unset is all four. Cards without an assigned difficulty are always included regardless.

Browser localStorage

Stored using the browser's localStorage API, scoped to this site only. All entries are pure preferences and progress data — never personal information.

Accessibility & audio

Key Purpose Status Delete
prefersReducedMotion Persistent override of the OS “reduce motion” preference (set by visiting ?reduce-motion=1).
abbr-underlines Whether glossary abbreviations are visibly underlined (false hides the underline; unset uses the site default).
cap_volume Last-used volume of the audio player (text-to-speech / podcast playback).
cap_speed Last-used playback speed of the audio player (e.g. 1.5).
tts-voice-name Selected text-to-speech voice for the read-aloud feature.

SE Gym performance statistics

Key Purpose Status Delete
se-gym-stats Per-question seen/correct counters used to surface your most-difficult questions. Only written when Track Performance is enabled.

Tutorial progress & debugger state

These keys are per-tutorial — one entry per tutorial you have ever opened. Static keys are listed first; dynamic keys (those including a tutorial id or page path) are discovered from your browser and listed at the end.

Key Purpose Status Delete
tutorial-autosave Whether autosave is enabled for tutorials.
Key (with prefix) Purpose Status Delete
Scanning your browser…

Prefixes: tutorial-progress-<id> — saved code & current step · tutorial-editor-split-<id> — split-pane editor on/off · tutorial-cooldown-<id> — per-step "Test My Work" cooldown end times · tutorial-popout-state-<path> — detached editor crash-recovery snapshot · tutorial-debug-bps-<id> — debugger breakpoints · tutorial-debug-watchpoint-remove-choice-<id> — remembered watchpoint removal choice · tutorial-debug-section-<id>-<name> & tutorial-debug-subsection-<id>-<name> — debugger panel collapse/expand state.

Standalone tutorials

Key Purpose Status Delete
regex-tutorial-progress Completed exercises in the regex tutorial.
regex-tutorial-advanced-progress Completed exercises in the advanced regex tutorial.

Standalone tools

These are interactive tools that store user-authored content (forms, drafts) so you can leave the page and come back to your work in progress. One row per saved card / draft.

Key (with prefix) Purpose Status Delete
Scanning your browser…

Prefixes: spec-card-<id> — saved Spec Card draft from /SEBook/tools/spec-card (one row per card id; the default tool page uses id default).

UML Playground pane sizes

Two keys remember how you've sized the editor and properties panes in the UML Playground. Drag the splitter handles between panes to resize; the new sizes are saved here.

Key Purpose Status Delete
uml-pg-editor-size Width (in px) of the ArchUML source editor pane in the UML Playground.
uml-pg-props-size Width (in px) of the Properties side-panel in the UML Playground.
uml-pg-help-dismissed Flag (1) recording that you've dismissed the “Tips” banner shown above the UML Playground canvas. The banner appears once per browser; this key prevents it from re-appearing.
Key (with prefix) Purpose Status Delete
Scanning your browser…

Prefixes: uml-pg-autosave-<diagramType> — autosaved ArchUML draft for each diagram type in the global UML Playground (one row per type you’ve edited — class, sequence, state, component, deployment, usecase, activity, er, venn, gitgraph — created lazily as you switch types).
uml-pg-autosave-<tutorialId>-<diagramType> — autosaved ArchUML draft scoped to a specific UML tutorial, so each tutorial keeps its own drafts separate from the playground and from other tutorials.

Where else does this site store data?

For full transparency, here is everything else the site touches that could be considered storage — with what's actually used:

  • sessionStorage — not used persistently. A single one-time migration step reads and clears a legacy prefersReducedMotion entry to promote it into localStorage. The generated Python workspace may briefly store archuml-generated-python-payload in the popup tab so the code survives the one-time cross-origin-isolation reload needed by the Python debugger. It also receives or mirrors that same temporary payload in the popup window name for browsers that detach opener storage during the isolation transition. Both copies are removed as soon as the workspace starts.
  • IndexedDB — v86 tutorials may store compressed VM reset snapshots in database sebook-tutorial-vm-snapshots, object store snapshots. These records are per-browser tutorial state used to speed up reset and restore flows. WebSQL and File System Access API (showDirectoryPicker, showSaveFilePicker) are not used.
  • Cache API (caches.open) — the service worker (see below) stores the in-browser Linux VM's static assets here under cache key vm-assets-v2: the post-boot snapshot (vm/dist/state.bin.gz, ~50 MB), the kernel (bzImage), the root filesystem (rootfs.cpio.gz), and the v86 engine + BIOS files (v86.wasm, libv86.js, seabios.bin, vgabios.bin). They are byte-for-byte copies of what the server already ships — no per-user data. Clearing site data in your browser settings removes them; the next tutorial load will refetch.
  • Service worker — tutorials that need cross-origin isolation (for example, WebContainers-backed exercises, Python debugger workspaces, and generated Python tutorial workspaces) and tutorials using the in-browser Linux VM register coi-serviceworker.js. It (a) injects COOP / COEP response headers so SharedArrayBuffer works on GitHub Pages, and (b) caches the VM assets described above so repeat visits skip the multi-MB downloads. It does not store any per-user data.
  • BroadcastChannel — used as in-memory messaging between the main tutorial window or generated Python workspace and detached editor / instructions / debugger / output / UML pop-out windows (channel names ttsync-<path>, uml-sync-<path>). Messages live only while at least one of the windows is open and are not written to disk. The browser-based Linux VM (v86) also uses a v86-inbrowser-<n> channel for its virtual networking; same lifetime, no persistence.
  • Third-party CDNs — this site loads fonts, FontAwesome icons, jQuery, Bootstrap, Mermaid, marked, KaTeX, Monaco, Pyodide, and the WebContainers runtime from public CDNs. We don't send those services any user data, but their networks see the request. No analytics, telemetry, or trackers are loaded.
  • Cross-origin cookies — embedded YouTube videos and similar third-party iframes set their own cookies on their own origin. Those are governed by those services' privacy policies and can't be reached or deleted from this page.