Case study · EyeContactDX

Taking an eye-tracking risk model into pediatric offices

A research model is not a product. I built the two systems that turned EyeContactDX's autism risk model into something clinicians could actually use: a clinical reporting platform and a secure physician portal.

RoleSoftware engineer, primary builder
PeriodMay 2025 to present
StackPython, Flask, React, AWS
Outcome23 pediatricians, first paying customers

The problem

The company had a promising eye-tracking model. To use it in a clinic, three things had to exist that didn't: a way to turn raw gaze data and questionnaires into a clear clinical report, a way to get that report to the right pediatrician securely, and delivery that fits how clinics really work, including fax.

The constraint underneath all of it was handling sensitive health data carefully while moving fast enough to onboard real customers.

What I built

Two products that meet at finished PDF reports in S3.

Clinical reporting platform

For internal report writers. Picks an eye-tracking session, runs the gaze analysis, drafts the report, supports review and editing, and publishes final PDFs per clinic.

React · Flask · EC2

Physician portal

For clinicians. Sign in, see only your clinic's reports, and view or download them. Every access is logged.

Vite SPA · CloudFront · API Gateway · Lambda · Cognito · DynamoDB

Five hard problems

These are the decisions that took the most thought, and the trade-off I accepted in each.

01

Two coordinate systems for the same gaze

ProblemThe tracker and the annotation tool use different resolutions. Left alone, that skews calibration, hit detection and the overlays shown on reports.

ChoiceScale once, up front, then run every analysis in a single space.

Trade-offThe two spaces still exist at the edges, so changes need care and cached results have to be rebuilt.

02

Real gaze images on reports without storing patient images

ProblemClinicians benefit from seeing the actual screening frames, but those frames are sensitive and shouldn't be kept.

ChoiceKeep nothing durable. Frames are held in temporary memory-backed storage, and each URL carries a recipe to redraw the image on demand.

Trade-offImages expire and redrawing costs CPU, in return for not retaining sensitive data.

03

One report, two delivery paths

ProblemThe portal can show a rich color PDF. Fax cannot, and clinics still use fax.

ChoiceGenerate a separate black-and-white variant for fax, and send it through a dedicated serverless function.

Trade-offTwo artifacts per report that must stay in step.

04

Report logic that changes without a deploy

ProblemReport wording and rules were hardcoded in PDF modules, so every small clinical edit needed an engineer and a release.

ChoiceMove the logic into JSON with an editor, and keep a fallback to the older path.

Trade-offTwo code paths to maintain, and the stored configuration has to stay in sync.

05

Fast, private video review

ProblemServing gaze review video through the application server was too slow.

ChoiceSwitch to signed CloudFront links with pre-rendered MP4 overlays, so media stays private but streams from the edge.

Trade-offMore infrastructure and signing logic, for a much faster review experience.

Security by design

Logging in is not the same as being allowed to see a report. The portal is built on that distinction.

Shipping with confidence

The model work

Beyond the applications, I developed and benchmarked alternative machine-learning approaches for autism risk prediction against the company's flagship model, using stratified cross-validation and held-out real sessions. A key lesson was evaluation discipline: I dropped approaches that looked strong only because of data leakage, and kept the simpler, more stable design for production.

Working with AI, deliberately

I built a structured AI-assisted development workflow rather than just prompting. It has about 34 project rules, automation hooks and trigger phrases that encode the whole delivery loop: ticket, isolated working branch, implementation and tests, an adversarial review of my own diff before a human sees it, then merge and deploy.

By the numbers

2,700+commits across the platform
137API endpoints
~2,000automated tests
200k+lines of code

How it grew

Details here are generalized. No patient data, customer names or proprietary model internals are shown, and the product described is a clinician-support tool that complements standard clinical care.

Get in touch Back to portfolio