Ayaan Siddiqui

Third-year CS and Mathematics at UVA. Most of the code I've written has had someone's health or privacy on the other end of it — an electronic health record for clinics in Bangladesh, a surgical case atlas inside UVA Health, and the access controls over both.

Charlottesville / Manassas, VA · seeking a software engineering internship for summer 2027

Work

four things, in the order I'd want to be asked about them

Every figure below came off the repository it describes. Where a claim rests on something specific — a file, a measurement, a date — it's named underneath in orange, so you can check it rather than take it.

SmashSet

solo · live Aug 2026 — present

Keyboard-driven set reporting for Super Smash Bros. tournament organizers, built against the start.gg API and live at smashset.gg. I run tournaments myself; reporting a set through start.gg's own interface takes 15–20 seconds of clicking, and at a local with a hundred sets that's most of an hour spent looking at a laptop instead of at the room. SmashSet does it in 5–10 seconds, entirely from the keyboard.

113source files
41test modules
9,299lines of test, against 10,385 of source
2events run on it so far
  • An OAuth 2.0 flow written directly rather than through a library — authorization-code exchange, concurrent-safe token refresh, AES-256-GCM encryption of tokens at rest. The client secret stays out of the authorize URL that start.gg's own published example puts it in, because that URL is a front-channel browser redirect and lands in history, referrers and logs. server/src/startggOAuth.ts · scoped to user.identity + tournament.reporter, nothing wider
  • A production outage, and the fix that wasn't a smaller number. The bracket stopped loading because a query-cost constant had been measured once and then hardcoded; adding fields to the query silently pushed a page past the API's object cap. Pagination now derives page size from a declared cost-per-row, reads the cost the API reports back on every response, and resizes itself when a request is rejected. A scheduled contract test re-measures against the live API daily and fails when reality drifts. server/src/routes/sets.ts — fetchSetsPaged · .github/workflows/startgg-canary.yml
  • Reports queue to an outbox and deliver behind the organizer. Venue wifi produced a measured 25-second freeze against a socket that accepts a connection and never answers. Delivery now retries with capped exponential backoff and jitter. Deliberately not optimistic: nothing reads as reported until the API confirms it, because an organizer who sees a tick and walks away leaves a set unreported. Retries are made safe by a stricter server-side rule rather than an idempotency key — the upstream refuses to re-report a finished set, so the ambiguous timeout resolves without inventing one. web/src/outbox.ts · up to 25 s of frozen UI, measured on venue wifi

TypeScript · React · Express · PostgreSQL · GraphQL · OAuth 2.0 · Railway · GitHub Actions

Axis Health

founding engineer · sole engineer May 2026 — present

An early-stage startup building an electronic health record for clinics in Bangladesh, where no widespread EHR exists. I took it from a Figma file to beta builds on TestFlight and the Play Store, and I'm the only engineer on it. A monorepo spanning a React web app, an Expo mobile client and a FastAPI backend, with the shared business logic in one TypeScript package so the two clients can't drift apart.

22.6Kmedication formulary
160Kdrug-interaction pairs
k=11anonymity floor on every export
1,744strings, in each of two languages
  • A clinical drug-safety engine that blocks a prescription before it can be sent — allergy contraindications and high-severity interactions, hard-blocked at the point of prescription rather than warned about afterwards. formulary and interaction data sourced from MedEx and DDInter
  • The de-identification layer over everything an administrator can see. k-anonymity small-cell suppression at k=11, the HHS/CMS convention, plus complementary suppression and age/region generalization on every analytics export. Paired with a chart authorization model where privilege narrows as it rises: a doctor needs an active care-panel relationship rather than the doctor role alone, and administrators are denied individual patient charts entirely while keeping aggregate analytics. app/core/deident.py · app/core/access.py — admins see populations, never people
  • Diagnosed platform-wide latency to two distinct bottlenecks and fixed both. Per-keystroke sequential scans over the formulary became PostgreSQL trigram GIN indexes, after a leading-wildcard ILIKE turned out to defeat the B-tree index that was already there; redundant full-table reloads became a thread-safe TTL cache. pg_trgm + gin_trgm_ops · 17 Alembic migrations, 16 pytest modules, run in CI against a Postgres service container on every push

Python · FastAPI · TypeScript · React · React Native (Expo) · PostgreSQL · SQLAlchemy · Docker · Railway

Facial Reconstruction Atlas

UVA Health, Otolaryngology May 2026 — present

A searchable atlas of facial plastic surgery reconstruction cases, for surgical education inside UVA Health. I'm the sole technical member of the research team. The most useful thing I did on it involved no code at all.

  • I read the governing IRB protocol and the patient consent forms before development started, and found a HIPAA blocker nobody had caught — the team's plan to share patient photographs with surgeons outside UVA wasn't supported by the consent patients had actually given. I spent four months as the sole technical liaison across UVA Research Computing, Health IT and the department chair, and proposed the internal-only pivot that unblocked hosting approval. IRB protocol 18181 · scope reframed before a line of the application was written
  • Patient media is served through a single server-side chokepoint, never a direct file URL. Three independent path-traversal checks, an extension allowlist, and PBKDF2-SHA256 session authentication extended to every data endpoint. That one-door design is what makes per-user authorization and access logging a single instrumentation layer instead of a re-architecture. 21 endpoints · 143 de-identified cases · 16-page security review authored for the hosting evaluation

Python · FastAPI · SQLite · JavaScript · institutional review, security documentation

RAG Evaluation Framework

team of five · client: LMI Nov 2024 — Jun 2025

A benchmark measuring how retrieval-augmented generation performs on questions that need several documents to answer. I owned the measurement and persistence layer — the LLM-as-judge scoring, the SQLite schema, and the dashboard the team read results in. The interesting part is what the data showed.

  • The pipeline failed in different ways depending on the reasoning the question required, and the two halves failed on opposite categories. Inference queries were hardest to retrieve for — recall 0.31 against 0.46 on comparison queries — but when the model did answer them it stayed grounded, at 0.85 faithfulness. Temporal queries were the reverse and the more worrying case: retrieval was fine, and faithfulness collapsed to 0.30. Those are two different fixes, and neither is visible in the aggregate. 2,255 scored responses · segmented by query type, because the overall faithfulness number of 0.55 says nothing

Python · DeepEval · LangChain · ChromaDB · SQLite · Streamlit

Also

Teaching
Undergraduate TA and engineering tutor for systems programming at UVA — 30+ students a week in office hours and lab sections, most of it hands-on debugging in C and at the Linux command line.
Robotics
Mechatronics and Robotics Society at UVA. Built the first prototype of the drive team's React telemetry control station for the NASA Lunabotics Challenge, and authored the team's STEM Industry Plan competition deliverable as Outreach Chair.
Before UVA
Thomas Jefferson HSST, 2024. A sequence in artificial intelligence, machine learning and computer vision where things were built from first principles — backpropagation derived by hand rather than called, Canny and a Hough circle transform written in C++ before being rebuilt with OpenCV.

Stack

Languages
Python · TypeScript · JavaScript · SQL · Java · C/C++
Web
FastAPI · Django · React · React Native · Node.js / Express · Next.js · REST · GraphQL
Data
PostgreSQL · SQLite · trigram and GIN indexing · schema migrations
Security
OAuth 2.0 / OIDC · JWT and JWKS · AES-256-GCM · PBKDF2 · role-based access control · k-anonymity
Operations
Linux · Docker · GitHub Actions · Railway · Heroku · Vercel · pytest · Vitest

A note on the numbers

Every count on this page is one I can reproduce — find, wc, git, or a query against the database it describes. If any of it comes up in conversation I'd rather walk you through the mechanism than the adjective, and where something is a limitation I'd rather say so first.