Inspiration

When students finish an experiment, they usually have a table of numbers but no clear way to check if the data is actually reliable. They still have to think about missing values, possible outliers, repeated trials, uncertainty, and confounds. A normal chatbot can skip all of that and write a confident conclusion immediately.

I wanted to build something that helps with the hard part without doing the science for the student. This means EvidenceLab can point out patterns and problems, but the student still decides what the evidence means.

What it does

EvidenceLab takes a student through five steps:

  1. Describe the experiment without entering a name, school, or other direct personal information.
  2. Check safety before giving any data coaching. High-risk projects do not receive procedural or next-trial guidance.
  3. Paste a CSV-like dataset and confirm what the headers and blank cells mean.
  4. Run TypeScript checks for missing data, possible anomalies, group summaries, reliability, uncertainty, and possible confounds.
  5. Build an evidence brief showing patterns, strengths, limitations, unknowns, safer next measurements, and questions for the student. It never writes the final scientific conclusion.

Guest mode works without OpenAI, Supabase, or Stripe credentials, so a judge can open the paper-helicopter sample and try the full flow immediately. I also wanted the first page to feel more like entering a lab than opening another dashboard. It uses a four-part scroll experience—Promise, Observe, Audit, and Decide—with a static option for people who prefer reduced motion.

How it was built

I built the frontend with React, TypeScript, and Vite. The API uses Express with request-size checks, rate limiting, exact route handling, and production-origin controls.

The main analysis does not depend on AI. TypeScript checks the data first and calculates anything that can be calculated locally. This makes the result repeatable and keeps the model from inventing statistics.

If the optional OpenAI feature is enabled, it runs on the server and only receives privacy-safe summaries, not the student's raw rows. It can help phrase the evidence brief, but it cannot calculate the statistics, browse the web, or write the final conclusion. Its response has to match a strict schema and is rejected if it uses verdict language. If the model, credentials, or schema fails, EvidenceLab uses the deterministic result instead.

I used Vitest for the analysis, imports, exports, API limits, privacy boundaries, rate limits, and fallback behavior. Playwright tests the full guest flow in Chromium, Firefox, WebKit, and mobile Safari, including safety blocking, responsive layouts, reduced motion, local storage, and the production build.

Challenges

The biggest challenge was deciding where AI had to stop. It would have been easy to let the model write a polished lab conclusion, but then what would the student actually learn? I separated calculation from wording, kept raw guest data in the browser by default, blocked high-risk coaching, and left the final conclusion out of the app and exports entirely.

Another challenge was making the site feel cinematic without making it slow or difficult to use. The scroll world only animates transforms and opacity, does not hijack scrolling, reduces its intensity on smaller screens, and turns off the motion when the user requests reduced motion.

Accomplishments

  • Built a complete guest flow that requires no service credentials.
  • Put safety screening before data entry or coaching.
  • Added bounded CSV validation, group summaries, anomaly review, and formula-safe exports.
  • Kept raw rows in the browser unless the student chooses a local save or one-time download.
  • Added optional server-side AI wording with a strict schema and deterministic fallback.
  • Built an immersive four-part scroll experience with generated depth art and reduced-motion support.
  • Preserved the original Ouija app at /legacy instead of deleting its history.
  • Passed 579 unit and integration tests, 92 cross-browser end-to-end tests, lint, typecheck, production builds, artifact scans, and a moderate-level dependency audit. Overall branch coverage is 87.13%.

What I learned

It is easy to make an AI app sound confident. It is harder to make it honest. I learned that educational AI becomes more useful when it shows its limits, keeps calculations repeatable, and leaves the important judgment to the student.

What is next

The next step is a small teacher-reviewed pilot with consent and no identifying data. I want to measure whether students find problems in their data faster and explain their evidence more clearly. Production Supabase rules, Stripe webhooks, optional AI behavior, and the legal and privacy language still need separate live testing and human review before I claim they are fully validated.

Originality and AI use

EvidenceLab is original work and has not won a hackathon. I used OpenAI Codex while building it for implementation, debugging, tests, review, media packaging, and documentation. Some of the landing-page visuals were generated. The experiment checks still run in TypeScript first, and the optional AI wording follows the same safety boundaries described above.

Built With

Share this project:

Updates

Submission history