Work

Internships, research, and projects — what I did and what came of it.

A mix of paid work, research, and things I built because nobody was going to build them for me. Newest first.

Projects

  1. This website

    A personal site with two halves — a public portfolio, and a private one where every visitor sees exactly the slice I gave them and nothing beyond it.

    The public half is a portfolio. The private half holds photos, memories and a calendar, and the whole design question was the word private: not "hidden behind a login", but private in the sense that there is no request you can construct, signed in or not, that returns something you weren't granted.

    That turned out to be mostly a story about defaults. Access is graded — friend, family, partner — and every one of them is a floor, never a guess: an entry with a missing tier is readable by nobody rather than everybody, and an unrecognised value stops the publish instead of picking an audience. A photo's URL is not a key to that photo; the tier is re-checked on every request for it, including the ones a browser makes on its own to ask whether its copy is still good.

    The failures I care most about are the quiet ones. A page rendered ahead of time would be served by the edge before any of that code runs — correct-looking, and readable by anyone who guesses the address — so the build fails rather than let one through. Signed-out and not-allowed are answered differently on purpose, and a real photo and an invented one come back byte-for-byte identical, so no response can be used to find out what exists.

    Four rounds of adversarial review found four real bugs, none of which my own passing tests had noticed. That ratio is the part of this project I'd repeat.

    Built with SvelteKit on Cloudflare Workers, D1 and R2. The code is public; the contents are not.

  2. Archer Aviation — Data Science Intern

    A summer building telemetry into the internal Python tooling used by 100+ engineers — and making the measuring invisible to the people being measured.

    Archer builds electric aircraft; I worked on the ground, in the internal tooling their engineers live in. The task was user telemetry for an enterprise-grade internal Python package: knowing which tools get used, how, and by whom, so the team maintaining them could stop guessing.

    The design constraint that shaped everything was zero friction. Telemetry that asks engineers to opt in, configure something, or tolerate latency gets turned off. Collection had to ride along invisibly — no setup, no perceptible cost — for over a hundred engineers.

    The pipeline ran end to end on Snowflake's serverless ingestion and tasks: collection, storage, and analysis with effectively no infrastructure to babysit and near-zero cost. The part that made it stick wasn't technical — I partnered with the owners of each internal tool to roll the update out inside their own workflows, so adoption happened without anyone taking on new overhead.

    Along the way I built Claude Skills automating the repetitive parts of engineering workflows — the kind of ten-minute tasks that recur forever — saving engineers an estimated 10–20 hours a week between them.

  3. Spatial Deep Learning — Capstone Research

    Teaching a model to read hand-annotated WW2 troop maps and return them as 3D spatial data a GIS can actually use.

    Historians have thousands of WW2 maps annotated by hand — troop positions, movements, front lines — that exist only as flat images. Locked in 2D, they can't be queried, overlaid, or analyzed. My capstone, in collaboration with a research professor, was a deep learning model that converts those human-annotated maps into 3D annotated spatial data for GIS software — turning archival paper into something you can ask questions of.

    I also led the team: eight senior data science students, with the coordination running through a Jira space I managed. Research with eight people and one deadline turns out to be as much an organizational problem as a modelling one — keeping the annotation pipeline, the model work, and the GIS integration moving in parallel was the job under the job.

  4. Medusa — UAS/UGV Ground Station

    Real-time flight telemetry for Purdue Aerial Robotics' SUAS competition entry — from onboard radio to live dashboards on the ground.

    Purdue Aerial Robotics' entry to the SUAS competition paired an autonomous aircraft with a ground vehicle, and somebody had to make the aircraft legible from the ground. I built the telemetry path: receiving data from onboard transmission and moving it through RabbitMQ into Django's ORM, with Grafana on top showing altitude, velocity, waypoint tracking and the rest of the flight picture live, as it happened.

    The other half was making the software testable without risking the airframe. I set up ArduPilot's SITL — software-in-the-loop flight simulation — on Linux, so navigation and flight software could fly full waypoint missions on a desk. Crashing a simulated plane costs nothing, and we did it often, on purpose.

  5. LeagueOS — Data Science Intern

    Instrumenting a sports platform end to end — collecting user interaction data in the frontend and turning it into dashboards people checked.

    LeagueOS (Spectator Sports) runs software for sports leagues, and wanted to actually see how people used it. I built the instrumentation into the React/TypeScript frontend — collecting and tracking user interaction data with attention to it being right, because interaction data that's silently wrong is worse than none.

    Downstream, I parsed and cleaned that data into MongoDB and PostgreSQL, then designed interactive dashboards visualizing user activity across time ranges — daily spikes, seasonal patterns, the shape of how the product was really used. First time seeing the full arc from a click in a browser to a chart a decision gets made from; I've been partial to owning the whole pipeline ever since.