From the moment a participant submits a response to the moment you download it for analysis — every step is encrypted and auditable.
Session → Transit → Storage → Export
Session01
Participant completes study
Responses are collected trial by trial in the browser. On completion, one JSON record is assembled.
Browser runtime
Transit02
Encrypted in transit
The record travels over TLS. No plaintext leaves the participant's device.
encrypted in transit
TLS · end-to-end
TLS encrypted
Storage03
Encrypted at rest
Records are AES-256 encrypted before writing to the database. Your key, your data.
AES-256
Export04
Download & analyse
Export the full dataset as CSV or JSON whenever you're ready. No lock-in.
export formats
CSVspreadsheet
JSONprogrammatic
CSV · JSON
Incremental vs fulllab.js sends partial (incremental) data to the server after each ~3-second pause in activity, and sends the complete dataset when the experiment ends. Only incremental saves that have a matching complete dataset are automatically removed — if the experiment never ends, you keep only the incremental data and may lose the final part of the session.
Encryption layers
TLS — in transit
AES-256 — at rest
Your key — account-scoped
End properlyMake sure your experiment ends.
Add a defined duration or a final screen that signals completion. In the lab.js builder preview, a download button slides in when the experiment ends — in Open Lab, participants are automatically redirected instead.
- Builder preview: download button appears at experiment end
- Open Lab: end event triggers redirect to the next study component
- Without a proper end, only incremental data is saved — the last part of the session may be lost
Incremental vs fullTwo kinds of saved data.
During a session, lab.js periodically sends partial uploads after ~3 seconds of user inactivity. At the end, it sends one complete dataset that covers the whole session.
- Incremental datasets appear during the session as partial snapshots
- The final dataset is complete and supersedes all incremental saves
- If the experiment never reaches its end, only incremental data is kept
Dataset sizeKeep your dataset lean.
By default, lab.js stores every variable and parameter. Prefix non-essential parameters with an underscore to exclude them from the stored dataset.
- Variables like _instructionsText are excluded automatically
- Useful for long instruction texts that repeat on every row
- Underscore prefix works on any variable name in the builder