Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2069 commits
Select commit Hold shift + click to select a range
076b723
small code cleaning changes
ZachCutler04 Feb 23, 2026
1fd4ef5
Fix upset version
JackWilb Feb 23, 2026
025fe61
Fix typo
jaykim1213 Feb 23, 2026
5463e89
Add correct answers to graph literacy test
jaykim1213 Feb 23, 2026
fb27466
Bump minor versions
JackWilb Feb 23, 2026
f6bc764
Merge branch 'dev' into remove-vis-react
JackWilb Feb 23, 2026
c9f218b
Merge pull request #1099 from revisit-studies/remove-vis-react
JackWilb Feb 23, 2026
655ba74
Merge branch 'dev' into jk/graphLiteracyScale
jaykim1213 Feb 23, 2026
0229ec0
Fix up answers
JackWilb Feb 23, 2026
a2c0060
Merge pull request #1102 from revisit-studies/jk/graphLiteracyScale
jaykim1213 Feb 23, 2026
daed81b
Remove duplication
JackWilb Feb 23, 2026
699c9ed
Merge pull request #1093 from revisit-studies/jk/testing
JackWilb Feb 23, 2026
ae01f8c
update test case for new demo study
dyr429 Feb 23, 2026
bc29d5e
Enhance SliderInput: replace custom thumb value display with Tooltip …
JackWilb Feb 23, 2026
6595d8f
Merge pull request #1068 from revisit-studies/updating-react-trrack
ZachCutler04 Feb 23, 2026
852d3cc
Merge pull request #1104 from revisit-studies/slider-hover-thumb
JackWilb Feb 23, 2026
334ae60
Fall back to local storage if firebase auth is not enabled
jaykim1213 Feb 23, 2026
43e54b3
Add release follow-up checklist to README for documentation verificat…
JackWilb Feb 23, 2026
7c9ac9c
Fix save audio and screen recording for data collection disabled
shresthalucky Feb 23, 2026
16c14aa
Merge pull request #1106 from shresthalucky/issue-1081
JackWilb Feb 23, 2026
3fcdcc0
Revert
jaykim1213 Feb 23, 2026
d54130e
Verify that conditionals work with latin square balancing
JackWilb Feb 23, 2026
0aa10b7
fix for dynamic components
hilsonshrestha Feb 23, 2026
4557b1a
Merge branch 'dev' into fix-crash-with-same-sequence-name
hilsonshrestha Feb 23, 2026
9afd532
Fix firebase auth error handling
jaykim1213 Feb 23, 2026
300cddd
bug fix for audio recording not stopping when navigating to a complet…
dyr429 Feb 24, 2026
5325277
Use separate localforage for each engine
JackWilb Feb 24, 2026
fccba77
Merge pull request #1110 from revisit-studies/yd/bugfix-audio-recordi…
ZachCutler04 Feb 24, 2026
caa4292
updates to llm study
alexsb Feb 24, 2026
afccf0a
Merge branch 'dev' into th/ai-chatbot-demo-study
alexsb Feb 24, 2026
accb293
Merge pull request #1016 from revisit-studies/th/ai-chatbot-demo-study
alexsb Feb 24, 2026
2c48706
fixed global config
alexsb Feb 24, 2026
855ff16
Update the iteration in unit test
jaykim1213 Feb 24, 2026
f9bdf4f
Merge pull request #1108 from revisit-studies/jk/firebase
jaykim1213 Feb 24, 2026
81bb822
Merge pull request #1109 from revisit-studies/fixes
JackWilb Feb 24, 2026
e3ef025
Allow navigate to previous and next
JackWilb Feb 24, 2026
d4fd480
Update dates in config and fix spacing in introduction md
jaykim1213 Feb 24, 2026
1f06ccf
Remove currentTrial, fix tab sync
JackWilb Feb 24, 2026
774c4f5
Fix typo
jaykim1213 Feb 24, 2026
5803e2f
Fix minor bug
JackWilb Feb 24, 2026
af0c91e
Merge pull request #1111 from revisit-studies/jk/configs
jaykim1213 Feb 24, 2026
5aecc62
Merge pull request #1098 from revisit-studies/fix-crash-with-same-seq…
hilsonshrestha Feb 24, 2026
9f7bea4
Merge pull request #956 from revisit-studies/dev
JackWilb Feb 24, 2026
317436d
Release version v2.4.0
JackWilb Feb 24, 2026
c16aeaf
Fix typos
jaykim1213 Feb 26, 2026
f00d1c0
Add generate library command
jaykim1213 Feb 26, 2026
533c4d8
Fix typo
jaykim1213 Feb 26, 2026
7d2bb27
Fix broken path
jaykim1213 Feb 26, 2026
bd221e1
Add maxWidth and maxHeight
jaykim1213 Feb 26, 2026
19354cd
Add maxWidth and maxWidth logic
jaykim1213 Feb 26, 2026
f7f0066
Clamp configured component widths to container bounds
JackWilb Feb 26, 2026
f2220b5
Update src/utils/componentStyle.ts
JackWilb Feb 27, 2026
d61d63b
Merge pull request #1120 from revisit-studies/fix-max-width
JackWilb Feb 27, 2026
6619079
Initial plan
Copilot Feb 27, 2026
8f5eaf1
Don't force the study browser open in analysis
JackWilb Feb 27, 2026
f2bd7df
Add parser warning when default contact email is left in config.json
Copilot Feb 27, 2026
f808ca1
Refactor ConfigVersionWarningModal to use Affix instead of Modal and …
JackWilb Feb 27, 2026
b9a09d8
Merge pull request #1121 from revisit-studies/copilot/add-contact-inf…
JackWilb Feb 27, 2026
ab2001e
Initial plan
Copilot Feb 27, 2026
6a889c9
feat: add close-tab confirmation during participant flow
Copilot Feb 27, 2026
5416c7a
Add getDynamicComponentsForBlock function and corresponding tests
JackWilb Feb 27, 2026
2a56d65
enhance close-tab confirmation logic with completion and mode checks
JackWilb Feb 27, 2026
173b5bf
Merge pull request #1124 from revisit-studies/copilot/add-confirmatio…
JackWilb Feb 27, 2026
3da65b9
Add test for excluding answers from similarly prefixed indices and fi…
JackWilb Feb 27, 2026
83d950f
Merge pull request #1122 from revisit-studies/small-bugs
JackWilb Feb 27, 2026
37a56be
Fix typo
jaykim1213 Feb 27, 2026
25c2902
Fix typo
jaykim1213 Feb 27, 2026
6b9a5ac
Fix typo
jaykim1213 Feb 27, 2026
f1965ee
Fix participant data description
jaykim1213 Feb 27, 2026
ca4acb5
Add quotes
jaykim1213 Feb 27, 2026
a2f6273
Fix asterisk style
jaykim1213 Feb 27, 2026
f6e16f9
Merge pull request #1115 from revisit-studies/jk/2.4
jaykim1213 Feb 27, 2026
fedc4ae
fix issue with test in handleRandomSequences when test config missing
JackWilb Feb 27, 2026
4b4ad27
Use node:fs so it builds
JackWilb Feb 27, 2026
499c401
Add link to docs for getting started
JackWilb Feb 27, 2026
0aae8e6
Bump rollup from 4.57.1 to 4.59.0
dependabot[bot] Mar 1, 2026
39f02a8
Initial plan
Copilot Mar 2, 2026
7acf63c
Merge pull request #1126 from revisit-studies/dependabot/npm_and_yarn…
JackWilb Mar 2, 2026
d49d209
fix(parser): error on conditional URL params with random or latinSqua…
Copilot Mar 2, 2026
80a24fb
chore(parser): tighten conditional/order validation checks
Copilot Mar 2, 2026
16ae26c
Add blocked message to display rules
jaykim1213 Mar 2, 2026
a02bf0a
Move resolution warning to device warning
jaykim1213 Mar 2, 2026
3fd2302
Add display size check and add current device info text
jaykim1213 Mar 2, 2026
0c63ac7
Merge branch 'dev' into jk/maxWidthHeight
jaykim1213 Mar 2, 2026
230e324
Update src/components/interface/DeviceWarning.tsx
jaykim1213 Mar 2, 2026
d25eee8
Fix typo
jaykim1213 Mar 2, 2026
083e1b9
Add input to title
jaykim1213 Mar 2, 2026
6bdd526
Merge branch 'jk/maxWidthHeight' of https://github.com/revisit-studie…
jaykim1213 Mar 2, 2026
778a5d0
Fix device detection logic to handle undefined navigator and window s…
jaykim1213 Mar 2, 2026
7373086
Fix device restriction playwright test
jaykim1213 Mar 2, 2026
84aac70
Remove duplicate test
jaykim1213 Mar 3, 2026
9639f31
Merge pull request #1125 from revisit-studies/jk/maxWidthHeight
JackWilb Mar 4, 2026
96ba058
Initial plan
Copilot Mar 2, 2026
606f2cb
Add default values for form response types
Copilot Mar 2, 2026
882b770
Refine default value normalization and review fixes
Copilot Mar 2, 2026
2113184
Fix response default initialization and checkbox handling
JackWilb Mar 4, 2026
d8658e5
Clarify default value docs and regenerate parser schemas
JackWilb Mar 4, 2026
f163fd9
Add default-value coverage section to demo form config
JackWilb Mar 4, 2026
d152095
Fix form elements
JackWilb Mar 4, 2026
811493f
Merge pull request #1130 from revisit-studies/copilot/add-default-par…
JackWilb Mar 4, 2026
a16acc1
Fix conditional sequence validation for dynamic blocks
JackWilb Mar 4, 2026
5f55012
Refine conditional latin-square validation and tests
JackWilb Mar 4, 2026
a2a0141
fix(parser): scope conditional/random validation to nested conflicts …
JackWilb Mar 4, 2026
85894f2
Merge branch 'dev' into copilot/throw-error-for-url-parameter
JackWilb Mar 4, 2026
ea332b1
fix(condition-logic): enforce id for conditional blocks at runtime
JackWilb Mar 4, 2026
9bfcd51
Merge pull request #1131 from revisit-studies/copilot/throw-error-for…
JackWilb Mar 4, 2026
1689ccd
Allow failed training progression after max attempts
JackWilb Mar 4, 2026
f371233
Merge pull request #1138 from revisit-studies/allow-failed-training-n…
JackWilb Mar 4, 2026
b8c548a
Remove parser warnings about email on localhost
JackWilb Mar 4, 2026
9aa3637
Merge pull request #1139 from revisit-studies/fix-warnings
JackWilb Mar 4, 2026
028aa74
Fix forced video completion next-state and add regression test
JackWilb Mar 4, 2026
8313aa5
Fix timer-only replay scrubbing during playback
JackWilb Mar 4, 2026
f39ead9
Use svg-local coordinates for replay timeline seeking
JackWilb Mar 4, 2026
1d22a45
Merge pull request #1140 from revisit-studies/fix-force-video-completion
JackWilb Mar 4, 2026
7058e13
Merge pull request #1141 from revisit-studies/fix-provenance-scrub
JackWilb Mar 4, 2026
0d79119
Merge pull request #1135 from revisit-studies/dev
JackWilb Mar 4, 2026
0246def
Release version v2.4.1
JackWilb Mar 4, 2026
884fba5
Add i don't know option to matrix
jaykim1213 Mar 4, 2026
c40c3f6
Fix lint warning
jaykim1213 Mar 4, 2026
61f30cb
Update QUIS library to use matrix responses
jaykim1213 Mar 4, 2026
b715adb
Fix dotted study IDs in routing/config lookup and add tests
JackWilb Mar 5, 2026
75e6c63
Apply suggestions from code review
JackWilb Mar 5, 2026
7f77337
Add device restriction and audio/video icon to study listing
jaykim1213 Mar 5, 2026
7814b64
Add device restriction button to app header
jaykim1213 Mar 5, 2026
b5f1800
show notification while speaking with mic muted
hilsonshrestha Mar 6, 2026
8b84c1e
Add tooltip and blinking warning when muted for more than 5 seconds
hilsonshrestha Mar 6, 2026
10dc2f9
Update device restriction style
jaykim1213 Mar 6, 2026
e13a1c3
Update device warning page title to have dynamic title
jaykim1213 Mar 6, 2026
6490db6
Remove unused test
jaykim1213 Mar 6, 2026
6322c1b
Address PR comments
jaykim1213 Mar 6, 2026
a3e01c7
Fix test
jaykim1213 Mar 6, 2026
1af2b2d
Fix device restriction message by splitting into separate text nodes
jaykim1213 Mar 6, 2026
407f8f5
Add I don't know to matrix
jaykim1213 Mar 9, 2026
3f33c37
Add test
jaykim1213 Mar 9, 2026
06b9aef
fixing problem with plyr types
ZachCutler04 Mar 9, 2026
06a2634
Address PR comments #1143
jaykim1213 Mar 11, 2026
ec6eb56
Initial plan
Copilot Mar 12, 2026
86f4113
fix: apply acceptable range bounds in training feedback correctness c…
Copilot Mar 12, 2026
21ca4d7
Merge pull request #1157 from revisit-studies/copilot/fix-acceptable-…
JackWilb Mar 14, 2026
ba2374e
Add paper citation and repository citation metadata
JackWilb Mar 16, 2026
ec8f3e8
Merge branch 'main' into dev
JackWilb Mar 16, 2026
669352c
Fix checkbox dont-know hydration normalization
JackWilb Mar 18, 2026
ffaeded
Reflect matrix don't-know in effective options
JackWilb Mar 18, 2026
4cb83c4
Fix checkbox dont-know validation
JackWilb Mar 18, 2026
0bd200d
Clarify instructions for interacting with the ReVISit codebase and Gi…
JackWilb Mar 18, 2026
f8a9f76
Bypass required-value checks for don't-know
JackWilb Mar 18, 2026
979c84b
Fix checkbox response spec typing
JackWilb Mar 18, 2026
8bee3ee
Merge pull request #1143 from revisit-studies/jk/matrixIdontknowOption
JackWilb Mar 18, 2026
e748591
Canonicalize resolved study IDs for storage
JackWilb Mar 18, 2026
6c4d35a
Fix analysis route access for sanitized study IDs
JackWilb Mar 18, 2026
bd89339
Merge pull request #1144 from revisit-studies/handle-period-in-study-…
JackWilb Mar 18, 2026
f9e8938
Merge branch 'dev' into jk/studyOverview
JackWilb Mar 18, 2026
f0c1d61
Fix analysis route access spec typing
JackWilb Mar 18, 2026
0216615
Merge pull request #1145 from revisit-studies/jk/studyOverview
JackWilb Mar 18, 2026
5b8006c
Fix muted recording reminders for audio-only steps
JackWilb Mar 18, 2026
6ce8d8a
Merge branch 'dev' into 650-think-aloud-audio-mic-mute-on-demand-remi…
JackWilb Mar 18, 2026
ccbbdc8
Fix muted recording reminders
JackWilb Mar 18, 2026
51177ad
Polish recording instructions and labels
JackWilb Mar 18, 2026
86f43e7
Merge branch 'dev' into zc/plyrFix
JackWilb Mar 18, 2026
4b18ff7
Revert lock file changes and fix plyr
JackWilb Mar 19, 2026
8ae510e
Update plyr-react resolution and lint imports
JackWilb Mar 19, 2026
a8d972b
Fix lint warning
JackWilb Mar 19, 2026
92ee52d
Add custom response React response type
JackWilb Mar 19, 2026
4ffb0f2
Fix dont-know validation for custom responses
JackWilb Mar 19, 2026
6380e13
added auto redirect after a delay
abhsarma Mar 19, 2026
81ba3f2
Fix linting issues
JackWilb Mar 19, 2026
a7af7fd
Fix study end auto redirect timing
JackWilb Mar 19, 2026
0d3f286
Rename study end auto redirect config
JackWilb Mar 19, 2026
3ba598e
Fix custom response validation and grading
JackWilb Mar 19, 2026
34af0d1
Rename custom response type to custom
JackWilb Mar 19, 2026
92efd60
Fix random interruption placement
JackWilb Mar 20, 2026
ef857d4
Merge pull request #1162 from abhsarma/main
JackWilb Mar 20, 2026
940673a
Merge pull request #1152 from revisit-studies/zc/plyrFix
ZachCutler04 Mar 22, 2026
71b17b1
Bump flatted in the npm_and_yarn group across 1 directory
dependabot[bot] Mar 23, 2026
d18b4b1
Merge pull request #1165 from revisit-studies/dependabot/npm_and_yarn…
JackWilb Mar 23, 2026
8c5f9c3
Add interruption slot limit coverage
JackWilb Mar 23, 2026
1ac5630
Merge pull request #1163 from revisit-studies/fix/random-interruption…
JackWilb Mar 23, 2026
32957a4
Add audio icon in timeline
jaykim1213 Mar 23, 2026
0a00dc6
Address PR comments
jaykim1213 Mar 24, 2026
b3751fd
Update src/analysis/individualStudy/replay/AllTasksTimeline.tsx
jaykim1213 Mar 24, 2026
332c269
Update icon margin to icon size and gap
jaykim1213 Mar 24, 2026
49fbe1c
Address PR comment
jaykim1213 Mar 24, 2026
7d39e89
Fix skip condition block correctness
JackWilb Mar 26, 2026
defc00d
Treat blank custom response objects as empty
JackWilb Mar 26, 2026
5ac3305
Resolve inherited components in correctness views
JackWilb Mar 26, 2026
af6c155
Preserve falsy stored response values
JackWilb Mar 26, 2026
282d10a
Merge branch 'dev' into custom-response
JackWilb Mar 26, 2026
b705ef7
Remove never cast from custom response value
JackWilb Mar 26, 2026
d792e77
Fix audio to use the study config
jaykim1213 Mar 26, 2026
19eeda8
Update current config to the config that participant used
jaykim1213 Mar 26, 2026
3f08b05
Merge pull request #1166 from revisit-studies/jk/showAudioInTimeline
jaykim1213 Mar 27, 2026
6128f81
Load public modules asynchronously
JackWilb Mar 28, 2026
a3d41e9
Improve custom response validation feedback
JackWilb Mar 28, 2026
f0e2eff
Simplify custom response loading
JackWilb Mar 30, 2026
f0ca9c1
Merge remote-tracking branch 'origin/dev' into custom-response
JackWilb Mar 30, 2026
48c2c8c
fix: exclude spec files from public module globs
JackWilb Mar 30, 2026
631cc17
chore: remove public spec and restore eslint config
JackWilb Mar 30, 2026
b94443f
Harden participant storage finalization
JackWilb Mar 30, 2026
d171301
Update Study End finalization UX
JackWilb Mar 30, 2026
6c82f04
Add retry backoff and recovery options to study completion
JackWilb Mar 30, 2026
f5d50a4
Show retry count on study completion upload errors
JackWilb Mar 30, 2026
d562e8a
Bump the npm_and_yarn group across 1 directory with 2 updates
dependabot[bot] Mar 26, 2026
6ebd03b
Merge pull request #1170 from revisit-studies/dependabot/npm_and_yarn…
JackWilb Apr 4, 2026
10b6fe6
Merge branch 'dev' into latency-safe-participant-completion
JackWilb Apr 4, 2026
54a2dc9
Improve participant data recovery during finalization
JackWilb Apr 4, 2026
6431e0b
Refactor storage engine helpers into named modules
JackWilb Apr 4, 2026
ccfd1cf
Bump the npm_and_yarn group across 1 directory with 3 updates
dependabot[bot] Apr 6, 2026
23c7a39
Fix StudyEnd retry handling for asset uploads
JackWilb Apr 6, 2026
c008a96
Add return type for asset upload wait helper
JackWilb Apr 7, 2026
64b76c1
Deduplicate participant answer metadata helpers
JackWilb Apr 7, 2026
d604ed0
Await answer persistence before advancing
JackWilb Apr 7, 2026
cc723f9
Allow zero-answer participants to finalize
JackWilb Apr 7, 2026
f3ca915
Handle participant completion with missing media uploads
JackWilb Apr 7, 2026
f31ff40
Handle unexpected next-step failures
JackWilb Apr 7, 2026
91a8bc3
Merge pull request #1192 from revisit-studies/dependabot/npm_and_yarn…
JackWilb Apr 7, 2026
12910a3
Convert example survey steps to questionnaires
JackWilb Apr 7, 2026
7fe4ffc
Merge pull request #1147 from revisit-studies/650-think-aloud-audio-m…
JackWilb Apr 7, 2026
836ea9f
Merge pull request #1158 from revisit-studies/custom-response
JackWilb Apr 7, 2026
60da5ea
Filter tasks list to exclude entries without identifiers or component…
jaykim1213 Apr 9, 2026
78d3f97
Derive participant completion from sequence assignments
JackWilb Apr 9, 2026
976ba0f
Stabilize the study end submission flow
JackWilb Apr 9, 2026
f3c2b25
Refactor answer persistence logic in useNextStep and add unit tests
JackWilb Apr 9, 2026
38f6375
Merge branch 'dev' into latency-safe-participant-completion
JackWilb Apr 10, 2026
59e7ce1
Refactor goToNextStep to remove async/await and improve error handlin…
JackWilb Apr 10, 2026
ae4b2e5
Merge pull request #1186 from revisit-studies/latency-safe-participan…
JackWilb Apr 10, 2026
1126ae1
Merge branch 'latency-safe-participant-completion' into latency-safe-…
JackWilb Apr 10, 2026
c32ba8e
Fix broken test
JackWilb Apr 10, 2026
fd3d816
Merge pull request #1195 from revisit-studies/latency-safe-participan…
JackWilb Apr 10, 2026
53c4adf
Merge pull request #1194 from revisit-studies/jk/fixReplay
JackWilb Apr 10, 2026
d2b52be
Don't lint src/public
JackWilb Apr 13, 2026
61e115b
Bump the npm_and_yarn group across 1 directory with 4 updates
dependabot[bot] Apr 17, 2026
fc36d50
Enhance study analysis components with allConfigs support and stored …
jaykim1213 Apr 20, 2026
936e8fb
Update src/analysis/individualStudy/summary/utils.tsx
jaykim1213 Apr 20, 2026
630decf
Update the
jaykim1213 Apr 20, 2026
627af38
Fix study summary with config handling
jaykim1213 Apr 23, 2026
162e3e9
Update src/analysis/individualStudy/summary/SummaryView.tsx
jaykim1213 Apr 23, 2026
f708cd6
Address PR comments
jaykim1213 Apr 23, 2026
6b4d1b7
Merge branch 'jk/studySummaryBug' of https://github.com/revisit-studi…
jaykim1213 Apr 23, 2026
bb1c460
Merge pull request #1199 from revisit-studies/dependabot/npm_and_yarn…
JackWilb Apr 23, 2026
e1be716
Fix filtering and sorting in study analysis
jaykim1213 Apr 27, 2026
6199524
Update participant counts handling
jaykim1213 Apr 27, 2026
1a54cb8
Merge branch 'dev' into jk/studySummaryBug
jaykim1213 Apr 27, 2026
8d7ad4d
Update message
jaykim1213 Apr 27, 2026
6024d30
Address PR comments
jaykim1213 Apr 27, 2026
38c1573
Merge pull request #1203 from revisit-studies/jk/studySummaryBug
JackWilb Apr 28, 2026
c7923e3
Merge pull request #1212 from revisit-studies/dev
JackWilb Apr 28, 2026
1342408
Release version v2.4.2
JackWilb Apr 28, 2026
9c1a02f
Merge tag 'v2.4.2' into jay/2.4.2
jaykim1213 Apr 30, 2026
422aa16
Remove unused file
jaykim1213 Apr 30, 2026
dd5dd46
Update tab names
jaykim1213 Apr 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
25 changes: 25 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
.git
.github
node_modules
dist
docs
docsLibraries
playwright-report
test-results
verbose
supabase
tests
.vscode
.husky
.DS_Store
*.log
.claude
.idea
/playwright/.cache/
coverage
*.tsbuildinfo
*.local
.env.local
.env.*.local
public/__revisit-widget
src/public/__revisit-widget
31 changes: 16 additions & 15 deletions .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,45 @@ jobs:
name: 🧪 ${{ matrix.project }} E2E Tests
runs-on: ${{ matrix.os }}
timeout-minutes: 20
env:
PLAYWRIGHT_BROWSERS_PATH: ${{ matrix.cache_dir }}
PW_CI_REPORTER: dot
PW_CI_WORKERS: ${{ matrix.workers }}
strategy:
fail-fast: false
matrix:
include:
- project: chromium
os: ubuntu-latest
cache_dir: ~/.cache/ms-playwright
cache_dir: /home/runner/.cache/ms-playwright
workers: 3

- project: firefox
os: ubuntu-latest
cache_dir: ~/.cache/ms-playwright
# - project: firefox
# os: ubuntu-latest
# cache_dir: ~/.cache/ms-playwright

- project: webkit
os: macos-14
cache_dir: ~/Library/Caches/ms-playwright
cache_dir: /Users/runner/Library/Caches/ms-playwright
workers: 2
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: lts/*
cache: "yarn"

- name: Install dependencies
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
run: yarn install --immutable

- name: Write out playwright version
run: yarn --silent playwright --version > .playwright-version

- name: ⚡️ Cache playwright binaries
uses: actions/cache@v3
uses: actions/cache@v4
id: playwright-cache
with:
path: ${{ matrix.cache_dir }}
Expand All @@ -53,10 +61,3 @@ jobs:

- name: Run Playwright tests
run: yarn test --project=${{ matrix.project }}

- name: Upload test results
if: failure()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: playwright-report
4 changes: 2 additions & 2 deletions .github/workflows/vitest.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Playwright Tests
name: Unit Tests

on:
pull_request:
Expand All @@ -22,5 +22,5 @@ jobs:
- name: Install dependencies
run: yarn install --immutable

- name: Run Playwright tests
- name: Run unit tests
run: yarn unittest
47 changes: 47 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
Tech Stack
- Yarn
- React 18
- TypeScript
- Vite
- Mantine UI
- Firebase or Supabase as storage and database backends (.env selects the engine)
- Redux for state management with our in-house library Trrack.js for provenance tracking
- Lodash usage is restricted to: debounce, throttle, isEqual, merge
- React Router for routing
- Eslint and airbnb style guide for code quality

Purpose
The ReVISit project aims to create a robust platform for conducting and analyzing user studies focused on interactive data visualization tools. By leveraging modern web technologies and state management solutions, ReVISit provides researchers with the necessary tools to design, deploy, and evaluate visualization interfaces effectively.

The goal is to expand the scope of user studies to beyond the visualization community, making it easier for researchers from various fields to conduct studies on interactive data visualizations. This means we need state management that can handle complex interactions and data flows, as well as a user-friendly interface for both study designers and participants.

Verbiage
- "Study Designer": The individual who creates and configures the user study.
- "Participant": The user who takes part in the study.
- "Analyst": The individual who reviews and analyzes the data collected from the study, both in the platform and externally.
- "Study Config": The configuration file that defines the parameters and settings of a user study.

Study Configs
The study configurations are defined in JSON files with schemas. These configs specify various aspects of the study, including the visualization tools to be used, the tasks participants need to complete, and the data sources involved. You can find the full definition of the study config schema in the typescript file at src/parser/types.ts. The answers and participant data specifications are stored separately from the study config to allow for flexibility in data collection and analysis, at src/store/types.ts. Study config JSON files live in the public folder under the /public/{studyName}/config.json path.

Imported Libraries
We provide several libraries to facilitate the development of user studies, such as vlat, mini-vlat, nasa-tlx, color-blindness, and more. These libraries are components and sequences that are defined in public/libraries/. Each library has its own folder containing the necessary code and assets. Use only libraries that exist under public/libraries/ (no ad-hoc local component imports in study configs). You can import these libraries into your study configs to enhance the functionality and user experience of your studies by adding the libraries to the top level `importedLibraries` field in the study config, and then referencing the components in the `baseComponent` field or in sequences and the sequences in the `sequences` field. When referencing the components and sequences use the following syntax `"$libraryName.components.componentName"` and `"$libraryName.sequences.sequenceName"` respectively.

Storage Engines
ReVISit supports multiple storage backends for storing study data, including Firebase and Supabase. This allows researchers to choose the backend that best fits their needs in terms of scalability, ease of use, and integration with other tools. The storage engines are abstracted in the codebase, allowing for easy addition of new storage solutions in the future. The storage engine implementations can be found in src/storage/ directory.

How you should interact with the codebase
When working with the ReVISit codebase, work only with the source code files available to you. If you need an external library, please ask for approval first (and include how well used the library is). Make sure to follow best practices for React and TypeScript development, including proper state management, component structuring, and code documentation. Pay extra attention to lifecycle methods and hooks to ensure optimal performance and avoid memory leaks, including any updates to existing code. If you encounter any issues or have suggestions for improvements, feel free to bring them up for discussion. You can run git commands but don't run them unless asked to. Don't interact with GitHub directly. Always check package.json for the scripts available to you for building, testing, and running the project.

Testing
When adding a new feature or modifying code try to maximize unit test coverage. Unit tests should be colocated with the files they are testing, have the same names as the file with .spec., and use the vitest framework. Apply this to both UI/react code as well as non-UI code. For UI code, we use playwright for end-to-end testing. Try to add e2e tests for any new features that involve user interaction. E2E tests are located in the tests/ directory at the root of the project. Don't run `yarn test` directly; instead, describe the tests you want to run, and I'll handle executing them. You can run unittests locally using `yarn unittest`. Preferred commands are those listed in package.json (e.g., `yarn unittest`, `yarn lint`, `yarn typecheck`, `yarn serve`, `yarn build`).

Parser
When adding new features, sometimes it's required to update the parser and the associated types. The parser is located in src/parser/. The parser is responsible for validating and transforming the study config JSON files into a format that the application can use. When updating the parser, ensure that you also update the corresponding types in src/parser/types.ts to reflect any changes made to the study config schema. Make sure to add unit tests for any new parser functionality to ensure its correctness. Additionally, changes to the parser types will require updates to the generated JSON schema files located in src/schemas/. You can regenerate these schema files by running `yarn generate-schemas`.

Sequence
The sequence logic is a crucial part of the ReVISit platform, as it defines the flow of tasks and interactions for participants in a study. A participant's sequence is essentially flattened into a list and navigated through by index. The only exception to this is the dynamic blocks, which function as a nested sequence. The nested sequence has its own index and can be navigated through independently of the main sequence.

DO NOT
- DO NOT add import('...') statements inside src code and test logic. Import at the top of the file only, even for types.
- DO NOT add new libraries without approval.
59 changes: 59 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
cff-version: 1.2.0
message: "If you use reVISit, please cite the paper below."
title: "ReVISit study"
url: "https://github.com/revisit-studies/study"
repository-code: "https://github.com/revisit-studies/study"
license: "BSD-3-Clause"
authors:
- family-names: "Cutler"
given-names: "Zach"
- family-names: "Wilburn"
given-names: "Jack"
- family-names: "Shrestha"
given-names: "Hilson"
- family-names: "Ding"
given-names: "Yiren"
- family-names: "Bollen"
given-names: "Brian"
- family-names: "Nadib"
given-names: "Khandaker Abrar"
- family-names: "He"
given-names: "Tingying"
- family-names: "McNutt"
given-names: "Andrew"
- family-names: "Harrison"
given-names: "Lane"
- family-names: "Lex"
given-names: "Alexander"
preferred-citation:
type: article
title: "ReVISit 2: A Full Experiment Life Cycle User Study Framework"
authors:
- family-names: "Cutler"
given-names: "Zach"
- family-names: "Wilburn"
given-names: "Jack"
- family-names: "Shrestha"
given-names: "Hilson"
- family-names: "Ding"
given-names: "Yiren"
- family-names: "Bollen"
given-names: "Brian"
- family-names: "Nadib"
given-names: "Khandaker Abrar"
- family-names: "He"
given-names: "Tingying"
- family-names: "McNutt"
given-names: "Andrew"
- family-names: "Harrison"
given-names: "Lane"
- family-names: "Lex"
given-names: "Alexander"
journal: "IEEE Transactions on Visualization and Computer Graphics"
year: 2026
volume: 32
issue: 1
start: 13
end: 23
doi: "10.1109/TVCG.2025.3633896"
url: "https://dx.doi.org/10.1109/TVCG.2025.3633896"
42 changes: 42 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
FROM node:lts AS builder

WORKDIR /app

COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile

COPY . .

RUN yarn build

RUN node -e "const fs=require('node:fs');const key='VITE_BASE_PATH=';const lines=fs.readFileSync('.env','utf8').split(/\\r?\\n/);let v='';for(const line of lines){if(line.startsWith(key)) v=line.slice(key.length);}v=v.trim();if((v.startsWith('\"')&&v.endsWith('\"'))||(v.startsWith(\"'\")&&v.endsWith(\"'\"))){v=v.slice(1,-1);}if(!v){throw new Error('VITE_BASE_PATH must be defined in .env');}fs.writeFileSync('/tmp/base_path',v);"

FROM nginx:stable AS runtime

COPY --from=builder /app/dist /tmp/dist
COPY --from=builder /tmp/base_path /tmp/base_path
COPY nginx-docker.conf /tmp/nginx-docker.conf

RUN set -eux; \
BASE_PATH="$(cat /tmp/base_path)"; \
rm -rf /usr/share/nginx/html/*; \
if [ "$BASE_PATH" = "/" ]; then \
LOCATION_PATH="/"; \
INDEX_FALLBACK="/index.html"; \
ROOT_REDIRECT_DIRECTIVE="try_files /index.html =404;"; \
cp -R /tmp/dist/. /usr/share/nginx/html/; \
else \
LOCATION_PATH="$BASE_PATH"; \
INDEX_FALLBACK="${BASE_PATH}index.html"; \
ROOT_REDIRECT_DIRECTIVE="return 302 ${BASE_PATH};"; \
TARGET_DIR="/usr/share/nginx/html${BASE_PATH}"; \
mkdir -p "$TARGET_DIR"; \
cp -R /tmp/dist/. "$TARGET_DIR"; \
fi; \
sed \
-e "s|__ROOT_REDIRECT_DIRECTIVE__|${ROOT_REDIRECT_DIRECTIVE}|g" \
-e "s|__LOCATION_PATH__|${LOCATION_PATH}|g" \
-e "s|__INDEX_FALLBACK__|${INDEX_FALLBACK}|g" \
/tmp/nginx-docker.conf > /etc/nginx/conf.d/default.conf

EXPOSE 8080
87 changes: 79 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,60 @@
# reVISit study – Interactive, Web-Based User Studies.
# ReVISit study – Interactive, Web-Based User Studies.

Create your own interactive, web-based data visualization user studies by cloning/forking and editing configuration files and adding stimuli in the `public` folder.
Create your own interactive, web-based data visualization user studies by cloning/forking and editing configuration files and adding stimuli in the `public` folder.

reVISit introduces reVISit.spec a DSL for specifying study setups (consent forms, training, trials, etc) for interactive web based studies. You describe your experimental setup in reVISit.spec, add your stimuli as images, forms, html pages, or React components, build and deploy – and you're ready to run your study. For tutorials and documentation, see the [reVISit website](https://revisit.dev).
ReVISit introduces reVISit.spec, a DSL for specifying study setups (consent forms, training, trials, etc.) for interactive web based studies. You describe your experimental setup in reVISit.spec, add your stimuli as images, forms, HTML pages, or React components, build and deploy — and you're ready to run your study. For tutorials and documentation, see the [reVISit website](https://revisit.dev).

## Paper

If you are using reVISit for a paper, please cite:

> Zach Cutler, Jack Wilburn, Hilson Shrestha, Yiren Ding, Brian Bollen, Khandaker Abrar Nadib, Tingying He, Andrew McNutt, Lane Harrison, Alexander Lex. [ReVISit 2: A Full Experiment Life Cycle User Study Framework](https://www.visdesignlab.net/publications/2025_vis_revisit/). IEEE Transactions on Visualization and Computer Graphics (VIS), 32(1): 13-23, [doi:10.1109/TVCG.2025.3633896](https://dx.doi.org/10.1109/TVCG.2025.3633896), 2026.

**IEEE VIS 2025 Best Paper Award**

GitHub citation metadata for this repository is available in [CITATION.cff](./CITATION.cff).

## Build Instructions

To run this demo experiment locally, you will need to install node on your computer.
To run this demo experiment locally, you will need to install Node.js on your computer.

* Clone `https://github.com/revisit-studies/study`
* Run `yarn install`. If you don't have yarn installed, run `npm i -g yarn`.
* Run `yarn install`. If you don't have Yarn installed, run `npm i -g yarn`.
* To run locally, run `yarn serve`.
* Go to [http://localhost:8080](http://localhost:8080) to view it in your browser. The page will reload when you make changes.
* Go to [http://localhost:8080](http://localhost:8080) to view it in your browser. The page will reload when you make changes.

## Adding Tests

This repo uses two test types:

* **Unit tests** with **Vitest** for parser, utility, and component logic.
* **End-to-end (E2E) tests** with **Playwright** for participant/designer flows in a running app.

### Unit tests (Vitest)

* Co-locate unit tests with the source file they cover.
* Use the same base filename and add `.spec.` (for example: `src/parser/parser.ts` -> `src/parser/parser.spec.ts`).
* Use `vitest` APIs (`describe`, `test`/`it`, `expect`).
* Run unit tests with:

```bash
yarn unittest
```

### E2E tests (Playwright)

* Put E2E tests in the root `tests/` directory.
* Name files with `.spec.ts` (for example: `tests/demo-vlat.spec.ts`).
* Keep tests focused on user-observable behavior (navigation, input, progression, reviewer/designer behavior).
* Run E2E tests with:

```bash
yarn test
```

## Release Instructions

Releasing reVISit.dev happens automatically when a PR is merged into the `main` branch. The name of the pull request should be the title of the release, e.g. `v1.0.0`. Releasing creates a tag with the same name as the PR, but the official GitGub release should be created manually. The `main` branch is protected and requires two reviews before merging.
Releasing reVISit.dev happens automatically when a PR is merged into the `main` branch. The name of the pull request should be the title of the release, e.g. `v1.0.0`. Releasing creates a tag with the same name as the PR, but the official GitHub release should be created manually. The `main` branch is protected and requires two reviews before merging.

The workflow for release looks as follows:
Develop features on feature branch
Expand All @@ -24,4 +63,36 @@ Dev branch
| PR (1 per release)
Main branch
| Run release workflow on merge
References are updated and commit is tagged
References are updated and commit is tagged

### Release Follow-Up

- [ ] Verify docs links in the [Study Repository](https://github.com/revisit-studies/study) are up to date and point to the current reVISit documentation pages.
- [ ] After the release is complete, run the template update process so downstream study templates include the latest release changes.


## QC Checklist

### [Study Repository](https://github.com/revisit-studies/study)

**Studies**
- [ ] Review all studies for any crashes/bugs
- [ ] Check provenance data (audio, screen, etc.)

**File Download**
- [ ] JSON export
- [ ] Tidy download export
- [ ] Download audio recordings
- [ ] Download screen recordings
- [ ] Download configs

**Docs**
- [ ] Update comments in `store/types.ts`, `parser/types.ts`, `storage/types.ts`, `storage/engines/types.ts`
- [ ] Update `typedocReadMe.md`

### [Documentation Repository](https://github.com/revisit-studies/reVISit-studies.github.io)
- [ ] Review docs
- [ ] Review [library list](https://revisit.dev/docs/designing-studies/plugin-libraries/)
- [ ] Check for typos / outdated docs
- [ ] Validate example code
- [ ] Update screenshots
10 changes: 7 additions & 3 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { fixupConfigRules, fixupPluginRules } from '@eslint/compat';
import typescriptEslint from '@typescript-eslint/eslint-plugin';
import react from 'eslint-plugin-react';
import globals from 'globals';
// eslint-disable-next-line import/no-unresolved -- This is throwing a false positive
import tsParser from '@typescript-eslint/parser';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
Expand All @@ -18,7 +17,7 @@ const compat = new FlatCompat({
});

export default [{
ignores: ['public/*'],
ignores: ['public/**', 'src/public/**'],
}, ...fixupConfigRules(compat.extends(
'airbnb-base',
'airbnb/rules/react',
Expand Down Expand Up @@ -46,6 +45,9 @@ export default [{

settings: {
'import/resolver': {
typescript: {
alwaysTryTypes: true,
},
node: {
extensions: ['.js', '.jsx', '.ts', '.tsx', '.d.ts'],
},
Expand Down Expand Up @@ -100,7 +102,9 @@ export default [{
'react/react-in-jsx-scope': 0,
'max-len': 0,
'react/jsx-filename-extension': 0,
'import/extensions': ['error', 'never'],
'import/extensions': ['error', 'never', {
json: 'always',
}],
'@typescript-eslint/ban-ts-comment': 'warn',
'react/destructuring-assignment': 'off',
'react/jsx-props-no-spreading': 'off',
Expand Down
Loading
Loading