typeover
curriculum

Privacy

The short version: typeover runs entirely in your browser.

What we store

typeover keeps a handful of pins in your browser's localStorage:

  • typeover:progress — which exercises you've passed, how many hints you used, when you last opened an exercise. Per-device only.
  • typeover:theme — your chosen colour theme. If you haven't pinned one we follow your OS preference.
  • typeover:density + typeover:radius + typeover:style + typeover:palette — your appearance preferences (compact / normal / airy spacing; sharp / normal / rounded / pill shape; terminal / cardboard / textbook / glass / islands style; and one of 22 named colour palettes or `default` to follow the active style's default).
  • If a progress payload ever fails validation, the original is copied to typeover:progress:corrupt-<timestamp> before we reset — so a future forensic pass can recover what was there. No data is silently lost.

What leaves your device

  • Nothing about you or your progress. There are no analytics, no cookies, no third-party trackers, no server-side accounts.
  • Page assets and Google Fonts load from CDNs the way any static site's do.
  • If you tap Share on a module-completion screen, that uses your operating system's share sheet (or your clipboard) — the text and link go wherever you send them. typeover doesn't see it.

Code execution

Code you type into freeform and fill-line exercises runs locally in your browser — on your device, not on any server. Your code never leaves the browser tab.

Each language uses a different runtime inside a Web Worker: Go code runs through a WebAssembly Go interpreter (Yaegi); Zig code runs through the real Zig compiler (compiled to WebAssembly), which then executes the produced wasm in a second nested WASI context. Both ship as static assets and run entirely client-side.

Clearing your data

Clearing site data in your browser (or using an incognito window) wipes everything typeover knows about you. There's no "delete my account" form because there's no account.

Want a backup of your progress, or to move it between devices? That's not built yet — the offline-first design and the lack of sync infrastructure mean any export is just a JSON file with no consumer until import lands. If you'd use it, open an issue on GitHub and we'll prioritise it.

Auditing what's stored

If you want to see exactly what typeover has saved in your browser, open DevTools (⌥⌘I on Mac, F12 on Windows / Linux) and run the snippet below in the Console tab. It lists every key typeover writes — progress, appearance pins, and any corruption backups — without leaving your browser.

Object.fromEntries(
  Object.entries(localStorage).filter(([k]) => k.startsWith("typeover:"))
)

You can also delete any single key from the Application → Local Storage tab in DevTools — same surface, no special UI needed.

Questions? Open an issue on GitHub ↗.