Data Processing

Crosstabs is built around a local-first analysis flow. This page documents what is processed locally and what can leave the browser.

Local workflow

  • Uploaded files are parsed in the browser into rows and variable metadata.
  • Crosstab computation, filters, weighting, recodes, statistics, charts, and exports are produced from browser state.
  • Saved projects use versioned browser IndexedDB when available, with localStorage as a compatibility fallback. Saved analysis templates use localStorage on the same device and browser profile.
  • A saved project includes the parsed source rows and current analysis settings so it can be reopened after a reload. It is not uploaded or synchronized to another device.

Aggregate share-link workflow

  • When a user creates a result link, Crosstabs encodes aggregate counts, row and column labels, and the context the user selected into the URL fragment after #.
  • The source file and respondent-level rows remain in the creator's browser; they are not placed in the link or uploaded by the share-link workflow.
  • A recipient's browser decodes the fragment locally. The HTTP request fetches the generic Crosstabs page without the fragment, and browsers omit fragments from HTTP referrer headers.
  • Crosstabs does not retain the fragment on a server. Anyone with the complete link can read the included aggregates and context, and the link has no account permissions, expiration, or revocation control.

AI workflow

  • Browser-local Gemma uses the configured model URL after explicit user confirmation and a WebGPU-capable browser.
  • Server AI is opt-in from the AI panel and receives a structured crosstab summary, not the original spreadsheet file.
  • The server AI path should be disabled or replaced before analyzing regulated data that cannot be sent to the configured provider.

Analytics workflow

  • Production Web Analytics receives redacted page paths, referring origins, and coarse product events. Query strings and URL fragments are removed before sending, /s aggregate snapshot routes are excluded, and a strict-origin referrer policy prevents same-site paths and queries from being forwarded as referrer data.
  • A sessionStorage funnel record contains only a coarse acquisition surface, upload-or-sample input, and started, ready, or completed stage. It contains no visitor id or user-supplied label and is not synchronized between tabs or devices.
  • Activation properties never include filenames, project identifiers, spreadsheet cells or rows, variable and category labels, filter values, AI text, or aggregate share fragments.
  • Vercel processes the analytics request and aggregate reporting data under its current Web Analytics privacy and retention terms.

Exports and retention

  • PDF and XLSX reports include audit metadata such as source file name, filters, weight variable, missing-value setting, report title, analyst, and generated timestamp.
  • CSV exports sanitize spreadsheet formula prefixes to reduce spreadsheet-injection risk.
  • Crosstabs does not currently provide account-level retention controls because the public app has no account system. Aggregate share links are not server-stored and cannot be expired or revoked.
  • Local projects can be removed from the home page or workspace. Clearing Crosstabs site data in the browser removes local projects and templates.