···11+# UXET
22+33+**UX Evaluation Tool** — a browser-based framework for running usability tests with eye-tracking, interaction capture, and heatmap generation. Load any web app, give a user a task, and get back a full session debrief with gaze heatmaps and interaction stats.
44+55+## What it does
66+77+1. **Load** a testable web app into a sandboxed iframe.
88+2. **Calibrate** eye-tracking via webcam (powered by [WebGazer](https://webgazer.cs.brown.edu/)).
99+3. **Record** a session — gaze data, mouse movement, clicks, keypresses, and scroll events are all captured while the user completes a task.
1010+4. **Debrief** — when the task is done (or a win condition fires automatically), UXET renders per-screen gaze heatmaps and a full stats summary.
1111+5. **Export** the raw session data as JSON for further analysis.
1212+1313+## Getting started
1414+1515+UXET is a static site — no build step, no `npm install`. You just need a local HTTP server.
1616+1717+### Start the server
1818+1919+```bash
2020+./scripts/server-tui.sh
2121+```
2222+2323+This opens an interactive menu where you can:
2424+2525+| Option | What it does |
2626+|--------|-------------|
2727+| **Start server** | Launches a Python HTTP server on a port you choose (default `8080`) |
2828+| **Stop managed server** | Gracefully kills the server UXET started |
2929+| **Status** | Shows whether the server is running, on which port, and its PID |
3030+| **Show log tail** | Prints the last 20 lines of the server log |
3131+| **Quit** | Exits the menu (the server keeps running in the background) |
3232+3333+Once the server is up, open the URL it prints (usually `http://127.0.0.1:8080`) in your browser.
3434+3535+> **Requires:** `python3` (used for `python3 -m http.server`). That's it.
3636+3737+### Run a test
3838+3939+1. Pick an app from the dropdown.
4040+2. Click **Load App** — this launches eye-tracking calibration.
4141+3. Follow the calibration prompts (look at each dot and click it).
4242+4. When calibration passes, click **Start Test** to begin recording.
4343+5. Complete the task. The session ends automatically when the win condition is met, or press **Shift+Escape** to end it manually.
4444+6. Review the debrief screen — heatmaps, timing, click counts, fixation stats, etc.
4545+7. Click **Export Data** to download the session as JSON.
4646+4747+### Debug mode
4848+4949+Expand **Debug Controls** on the setup screen to:
5050+5151+- **Skip Calibration** — bypass eye-tracking calibration entirely.
5252+- **Use mouse as gaze** — substitute mouse position for eye-tracking (useful for development and demos without a webcam).
5353+- **End Test** — force-stop a running session.
5454+5555+## Adding your own apps
5656+5757+Drop your app into the `testable-apps/` directory and add a new `<option>` to the select in `index.html`:
5858+5959+```html
6060+<option
6161+ value="testable-apps/your-app/index.html"
6262+ data-task="Describe the task for the user"
6363+ data-win="selector:#success-element">
6464+ Your App Name
6565+</option>
6666+```
6767+6868+The `data-win` attribute defines when the test ends automatically. Supported formats:
6969+7070+- `selector:.some-class` — fires when the CSS selector matches a visible element.
7171+- `text:Some text` — fires when the specified text appears in the page.
7272+7373+## License
7474+7575+Unlicensed — do whatever you want with it.