Inspiration

Eyewitness misidentification remains the top contributor to wrongful convictions. I wanted to show how easily attention drifts in high‑stakes moments and pair that insight with concrete reforms advocates can act on.

What it does

Eyewitness guides people through a 10‑second “museum heist” video, captures their gaze with webcam-based tracking, and visualizes attention hotspots, blink patterns, and bias signals. After the reveal, it surfaces research-backed insights and state-specific advocacy actions so users can email lawmakers or join local reform efforts immediately.

How we built it

Eyewitness combines a Next.js frontend with a Python-based gaze-tracking service built on EyeTrax and MediaPipe. Gaze samples are streamed through a lightweight REST interface into a custom heatmap renderer powered by OpenCV and NumPy.

A serverless proxy in Next.js routes secure API calls to OpenStates v3 for representative lookups, while advocacy modules pull from curated JSON action catalogs. The frontend uses Tailwind CSS for styling and Framer Motion for minimal visual feedback.

Challenges we ran into

Browser-based gaze estimation is noisy and required calibration tricks to stay stable. Integrating OpenStates meant reworking ZIP-to-state mapping and caching. Balancing immersive storytelling with clear reform calls took several iterations on copy and UX.

Accomplishments that we're proud of

Users can see their own attention gaps moments after the demo, then email real officials with a single click.

What we learned

Attention data makes wrongful-conviction statistics tangible, but only if the UX stays frictionless. I also learned how fragmented legislative APIs are and why defensive error handling matters when data sources fluctuate.

What's next for Eyewitness

Next steps include swapping in live LLM-generated summaries tied to a user’s gaze metrics, expanding the action library per state, and refining calibration so I can ship a lightweight classroom toolkit.

Built With

  • eyetrax
  • framer
  • mediapipe
  • next.js
  • numpy
  • openstates
  • python
  • tailwind
Share this project:

Updates