Skip to main content

Scanpath Studio

PyPI Python versions Live demo Docs CI Coverage License: MIT DOI

Scanpath Studio shows you how people read. Load eye-tracking-while-reading data and watch each trial unfold over the text, exactly where it sat on the screen — then compare participants, analyze a corpus, and export figures ready for a paper.

Using Scanpath Studio: stepping through trials, a heatmap, a replay, a two-participant comparison and Corpus Analysis

Get started

The desktop and pip installs keep your data on your own machine, handle large datasets, and download the public corpora (PoTeC, OneStop) in one click. The hosted demo runs on Streamlit Community Cloud, with limited memory and no corpus downloads.

What you can do

  • See the reading: fixations, saccades, heatmaps and raw gaze over the text at its true on-screen position, with fixations colored by any column.
  • Replay it in real time or faster, and export it as HTML, GIF or MP4.
  • Compare participants: overlay two trials or place them side by side — even from two different datasets.
  • Analyze a corpus per text, participant or group, from the reading measures your data brings, each defined in the computation register.
  • Triage, export and share: tag and filter trials, export one figure or a zip for every trial, and share a link that reopens the exact view.
A scanpath replayed fixation by fixation Two participants reading the same paragraph, overlaid on one canvas
A trial, replayed fixation by fixation Two participants on one paragraph, overlaid (animated)

The app has three views: 🗺️ Scanpath for one trial at a time, 📊 Corpus Analysis for the whole dataset, and 🗂️ Data Management for loading and configuring datasets. The feature guides walk through each one.

See it in action

One task each, recorded in the app on the bundled demo. The bar at the top counts the clicks as they happen and names each step.

Adding a dataset from EyeLink fixation and interest-area reports Narrowing the trials by condition and participant
Add your own data: EyeLink's fixation and interest-area reports, their columns detected for you Find trials: narrow them by condition and participant, then step through what is left
Starring and tagging trials, then showing only the starred ones Coloring regressions apart and adding word boxes, the reading order and another palette
Star and tag trials, then show only the starred ones Style the plot: regressions in their own color, word boxes, the reading order, a palette
Switching between the Heatmap, Illustration and Scanpath designs The subtabs under the figure: annotations, stimulus and context, comparisons, export and share
Ready-made designs: Heatmap, Illustration, Scanpath, then a heatmap on top Under the figure: annotations, the stimulus and its context, matching trials, export, share
Replaying a reading, sped up to four times real time Rendering the replay to a GIF and downloading it
Replay the reading fixation by fixation, here at ×4 Save the replay as a GIF for a talk
Two readers of one text side by side, stepping through the texts together Corpus Analysis: a measure on the stimulus, against surprisal, and between two groups
Compare two readers of a text side by side, stepping through the texts together Corpus Analysis: a measure on the stimulus, against surprisal, and between two groups
Exporting the figure 180 mm wide at 300 dpi Exporting every trial's figures and tables as one zip
Export a figure for a paper, 180 mm wide at 300 dpi Export every trial, figures and tables, as one zip
Copying a link that reopens the same trial and design
Share a link that reopens the same trial and design, or the code that redraws it

Your data

Load word, fixation and raw-gaze tables in CSV, Parquet, Excel or another common format. Scanpath Studio adapts to how your study was recorded, so there is rarely anything to reformat first — see Loading public and own data.

Command line & Python API

Everything the app draws is also available headless — same pipeline, same figure. These run as-is on the bundled demo:

scanpath-studio render --sample --list-trials          # the demo's trials
scanpath-studio render --sample -o scanpath.html       # one trial, interactive HTML
scanpath-studio render --sample --animate -o replay.html
scanpath-studio render --sample -p l37_1129 -t l37_1129_2_1_1_Ele_r0 \
  --compare-with l7_1090:l7_1090_2_1_1_Ele_r0 -o compare.html
import scanpath_studio as sps

words, fixations = sps.load_sample_data()
print(sps.list_trials(words, fixations).head())
fig = sps.plot_scanpath(words, fixations, "l37_1129", "l37_1129_2_1_1_Ele_r0")
sps.save_figure(fig, "scanpath.html")

For your own files, pass --words ia.csv --fixations fix.csv to render, or use sps.load_scanpath_data("ia.csv", "fix.csv"). HTML output needs nothing else; PNG, SVG and PDF (and GIF/MP4 replays) go through Kaleido, which needs Chrome, Chromium or Edge, or run plotly_get_chrome -y once. The CLI reference and the Python API reference list every flag and parameter.

Where next

The full documentation is at https://lacclab.github.io/scanpath-studio/:

Contributing

git clone https://github.com/lacclab/scanpath-studio.git
cd scanpath-studio
pip install -e ".[test]"          # or: uv sync --extra test --extra lint
streamlit run streamlit_app.py --server.address 127.0.0.1
pytest -n auto

CONTRIBUTING.md covers setup, the checks that gate CI, and how work is tracked in GitHub Issues; AGENTS.md is the architectural map. To preview the docs site locally, run pip install -e ".[docs]" and then mkdocs serve.

Taking part means following the Code of Conduct.

Citation

A paper is in preparation. Until then, cite the software by its DOI, 10.5281/zenodo.22933884 (GitHub's Cite this repository button formats it as APA or BibTeX). If you use the bundled demo, a subset of OneStop Eye Movements, please also cite:

@article{berzak2025onestop,
  title     = {{OneStop}: A 360-Participant {E}nglish Eye Tracking Dataset
               with Different Reading Regimes},
  author    = {Berzak, Yevgeni and Malmaud, Jonathan and Shubi, Omer
               and Meiri, Yoav and Lion, Ella and Levy, Roger},
  journal   = {Scientific Data},
  year      = {2025},
  publisher = {Nature Publishing Group},
  doi       = {10.1038/s41597-025-06272-2},
  url       = {https://www.nature.com/articles/s41597-025-06272-2},
}

AI-assisted software

Scanpath Studio was built with AI assistance. Cross-check results before publishing. If something looks wrong — or if you have a feature request or suggestion — report it.

Metadata

Release files for scanpath-studio 0.38.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for scanpath-studio 0.38.0
File Size Uploaded
scanpath_studio-0.38.0.tar.gz 3.2 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for scanpath-studio 0.38.0
File Interpreter ABI Platform
scanpath_studio-0.38.0-py3-none-any.whl Python 3 none any Details

Total release size: 6.4 MB

Release files / scanpath_studio-0.38.0.tar.gz

Download URL scanpath_studio-0.38.0.tar.gz
Size 3.2 MB
Tags Source
SHA-256 checksum
How to use checksums
8f172839ae7bc4c0399da95b48e27fb1e097fd10916fb1ec3849db5c45e74713
BLAKE2b-256 checksum
How to use checksums
533919ec9ffd5418c34c1af05778fb65c00477393ffccc508151b8b35dd457d5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / scanpath_studio-0.38.0-py3-none-any.whl

Download URL scanpath_studio-0.38.0-py3-none-any.whl
Size 3.2 MB
Tags Python 3
SHA-256 checksum
How to use checksums
f4aa662fd8fb5c33a0dc526978060e7d94b9d745589996741ff53a2d36381987
BLAKE2b-256 checksum
How to use checksums
b57239a164a519683d15f7516f8234170f1eb68e5f9d0f26cb8213bc50d71013
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release history Release notifications | RSS feed

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page