AutoTyperc. 2019
Types a block of text into a field, character by character, at a rate you choose.
Rendered by AutoTyper.tsx
I build across the stack: zero-to-one services, AI and voice systems, infrastructure, and, off the clock, worlds that run in a browser.
At Notable, a healthcare AI company, I work across the stack: integrations, voice AI, the conversation and API layers, frontend to database, and the occasional flight to a customer’s site to make it work in the room.
01 / Playground
3 running inline
All three run here in the page, on their original code. Go ahead.
Types a block of text into a field, character by character, at a rate you choose.
Rendered by AutoTyper.tsx
Give it a mean, a spread and a sample size for two distributions and it samples both and overlays the histograms. Homework that turned into a small tool and then stayed.
Rendered by DeviationFrame.tsx
legacy-deviation.webp
Not made by the image recipe. No crop is on record for it.

Swipe sideways for the second distribution
Original artifact Its own 2015 colours
Doodle Jump in three dimensions, built while I was learning three.js. Its keyboard library vanished along with a CDN, so the dependencies now live in the repo.
The jump is not a control: landing on a platform is what throws him.
Rendered by GameFrame.tsx
legacy-grinchjump.webp

A central place for UMass students to find each other through the classes they were taking. Everyone’s assignments in one calendar, a chat per lecture, and, that year, a Zoom link where the room number used to be.
React · Redux · Flask · PostgreSQL · GCP
Rendered by astro:assets Picture
rendezvous-dashboard.webp
rendezvous-day.webp
rendezvous-night.webp
rendezvous-chat-day.webp
rendezvous-chat-night.webp
PICKLE
Designed, built and calibrated low-cost air pollution monitors to make the problem visible. Hardware, firmware, cloud and data science in one project, with Sonoma Technology, BAAQMD and Manylabs.
02 / Experience
Physics research, university software, first-engineer jobs, and production healthcare AI. Most of my work has been building first versions of new systems.
8 roles, all shown
Rendered by StackFilter.tsx
Summer 2017
Air Quality Scientist and Data Analytics Intern · C · Python · Cloud data pipeline
Built, tested and calibrated low-cost air pollution monitors, and built the cloud networking interface for viewing their data from anywhere. Secured a $3,000 grant for Los Altos High School to bring monitor building into its APES curriculum.
Summer 2018
Software Engineering Intern · JavaScript · Node.js
Led a marketing campaign for a YouWeb project and built its campaign website and web application.
Jun 2019 - Aug 2019
Software Engineering and AI Intern · Python · JavaScript · Chrome extensions
Built the ExcelChat Chrome extension, and a microservice automating dataflow through Got It Study while holding problem volume steady. Helped serve the QueryChat AI demo.
Oct 2019 - Oct 2020
Research Assistant · Python (numpy, scipy, pandas, matplotlib) · MATLAB
Simulated fluid dynamics for CO2 cooling in particle physics detectors.
Apr 2020 - Sep 2020
Software Engineering Intern · React · Google Cloud
First engineer at an education non-profit. Built a database and a React site helping students from non-traditional backgrounds find careers and programs.
Jan 2021 - May 2022
Student Software Developer · Express · React · PostgreSQL
Built and maintained the software professors used to acquire and share demonstrations across 20+ courses and 1000+ students. Ported a legacy WordPress site with a JSON backend to an Express, React and PostgreSQL application deployed on site. Published résumé · 2026
Jul 2021 - Jan 2022
Software Architect and Engineer · Flask · React Native · PostgreSQL
First significant engineer on the product. Built the backend and database engineering for a mobile application and architected its microservices.
Aug 2022 - Present
Current role
Software Engineer · Python · TypeScript · Node.js · React · PostgreSQL · BigQuery · SIP · GCP · Kubernetes · Terraform
My team owns the voice and conversations platform at a healthcare AI company serving 100+ enterprise customers: the AI-driven patient calls and the whole stack under them, from the conversation services and workflow APIs down to carrier-facing telephony. It handles around 250,000 patient calls a month at 99% uptime, and I set the technical direction for patient identity, routing, observability and reliability. Published résumé · 2026
Tech lead, mentor, and the primary reviewer for a distributed contractor team. Evidence pending
Education · 2018 - 2022
Both degrees at once, in four years.
03 / Projects
7 entries · 5 open to anyone
Five are live today. Two aren’t finished yet.
06:31 · 14.0 kn · seed 4193
Sailing, actually simulated. 06:31, sea state moderate, wind at forty degrees, seed 4193. Sail full, 14 knots, no heel - all of it read straight off the HUD. Capture on this page · 6 Aug 2026
Rendered by astro:assets Picture
saltline-lead-dawn.webp
Age of sail in a browser, with a real sailing model under it.
An age-of-sail game you play in a browser. You captain a sloop, trade between islands, and get chased by raiders. The part I care about is the sailing itself: the boat isn’t steered like a car.
The ocean is generated from a seed. Drag the clock below - same seed, same wind, and the water reads completely differently at four in the morning than it does at sunset.
One seed at six times of day. Sea state moderate, wind at forty degrees, crest sharpness 0.68, seed 4193, identical in all six. Only the clock moved.
Drag the clock, or use the arrow keys
At golden hour the sloop is doing 15 knots through the water but only 2.3 toward the mark; at sunrise it’s 13.6 and 11. Picking the angle is the whole game.
Rendered by Arc.tsx
saltline-arc-night.webp
saltline-arc-sunrise.webp
saltline-arc-dawn.webp
saltline-arc-daylight.webp
saltline-arc-golden.webp
saltline-arc-sunset.webp
Rendered by astro:assets Picture
saltline-proof-panel.webp
This is the 16:46 frame, uncropped. The panel on the left is the simulation’s actual inputs: time of day, sea state, wind angle, crest sharpness, seed. New seed, new ocean, same rules.
Fallowmere · level 30 · dusk
A voxel MMORPG, shipped. Fallowmere at dusk, level 30, nine thousand fame in. World state, quests and loot all live on the realm server - the browser just renders it.
Rendered by astro:assets Picture
ember-spread-fallowmere-dusk.webp
Browser-based voxel MMORPG. Designed, built, and in production.
A voxel MMORPG that runs in a browser tab. I designed it, built it, and put it in production on Fly.io, where a web tier and a separate realm service keep one world consistent for everyone in it.
Seven regions, one level-30 character.
Choose a region, or use the arrow keys
Where everyone starts. A river, a goblin headman, and a field note telling you that you can tilt the camera.
Rendered by FrameSwitcher.tsx
ember-region-hearthvale.webp
ember-region-fallowmere.webp
ember-region-greenmarch.webp
ember-region-fenmarch.webp
ember-region-ashen-waste.webp
ember-region-greywall-peaks.webp
ember-region-black-plateau.webp
Rendered by astro:assets Picture
ember-proof-two-players.webp
This frame is two of us in the same Hearthvale from two browsers, and a realm holds up to 64 at once. Everyone in it is simulated by the same server, which was the hard part. Capture on this page · 6 Aug 2026 Project configuration
ribbon · 620k particles · 97 fps
A field that listens. Ribbon style at 1.6x sensitivity, 620k particles, 97 fps. Captured against Pink Floyd, four minutes in.
Rendered by astro:assets Picture
murmuration-lead-ribbon.webp
A music visualiser that works out what the music is doing, not just how loud it is.
A million grains of light pushed through a curl-noise flow field in a WebGPU compute shader, then drawn as velocity-stretched additive sprites. Play it anything - the bundled track, a file you drop on it, or your microphone.
The part I care about is that it is listening rather than reacting. Loudness is easy and it is what most visualisers use. This works out the key and whether the piece is major or minor, the tempo, where the transients are, whether a band is being struck or held, and - the one I am most pleased with - where the music stops to breathe.
Two styles and a lull, all from one session. Only the style and the music changed.
Pick a style, or use the arrow keys
Ribbon draws each grain as a long continuous strand. 78 fps at 1.4x sensitivity.
Rendered by FrameSwitcher.tsx
murmuration-frame-ribbon.webp
murmuration-frame-constellation.webp
murmuration-frame-lull.webp
Rendered by astro:assets Picture
murmuration-proof-interface.webp
Mode, style, sensitivity, quality and frame rate along the bottom are live controls, not captions. B cycles the render mode, V the style, and the minus and equals keys scale how hard the music drives the field.
Blender Cycles, offline · 116 fps live
Rendered by astro:assets Picture
hidamari-spread-canopy.webp
Ambient app. Japanese for a sunny spot, the pool of light you stand in.
A calm ambient app: one autumn canopy path at golden hour, still enough to leave open on a second monitor. It holds 116 frames per second on hardware that could not path-trace a single frame of it.
None of the lighting is computed live. The frames are rendered offline in Blender Cycles and reprojected against a depth pass, so the camera gets real parallax through pre-lit plates - the browser is compositing photographs of a place that doesn’t exist. It’s not public yet; I want the audio right first.
Browser-native tower defense. Playable greybox, and an architecture argument.
A browser-native tower defense. The part that’s done is the part I care about: the simulation is fully separated from everything that draws it.
The sim can’t touch the DOM, import three.js, read the clock, or call Math.random - and that’s enforced by the compiler and the linter, not by me remembering.
Three captures of the same board.
Click a tab, or use the arrow keys
Greybox geometry, no art pass.
Rendered by FrameSwitcher.tsx
elderwood-default.webp
elderwood-coverage.webp
elderwood-stress.webp
Greenhollow · wave 16 of 16 · the last road
Rendered by astro:assets Picture
blockhold-lead-battle.webp
Voxel tower defense. Ten maps, 249 authored waves, and three boards that each break a rule the other nine keep.
Elderwood Vale, one row up, is a tower defense as an architecture argument. This is the one that shipped. Ten maps and 249 authored waves, and under them four tower families that go three levels deep, split into two elite branches, and end in two different tier-5 crowns - so the branch you pick decides how the map ends. Plus road traps, a shard economy that overcharges and ascends towers, Veiltide surges under a violet sky, three heroes taking A* move orders, and an endless mode 200 waves deep with a record to chase.
The last three boards are past the finale, and each one breaks a rule the other nine keep. Sunderfall Terraces runs four roads at four heights, and a tower shoots from its own footing, so a ridge above you blocks the shot. Emberwind Reach sets a firestorm that follows your hero: lead it into the horde and it burns him too. Tidereach Causeway closes causeways and opens others mid-battle, and the traffic reroutes onto whatever is still standing, so the defense you paid for is not the one you keep.
Almost none of it is a file. Every model is colored voxel boxes placed in code, every sound is synthesized by WebAudio the moment it plays, and every symbol in the UI is a hand-drawn SVG. The deliberate exception is the painted art on the menus - map cards, heroes, bosses, a title screen - because a campaign screen wants a picture of the place, and a box cannot be one.
Built this August, working with agents - one writing under direction, one reviewing adversarially. Six rounds of that against the code, then a three-round design review where both models wrote independently and then attacked each other. Every report is committed next to the source.
Four of the ten boards.
Click a tab, or use the arrow keys
The first board entire: one road, thirteen plots, and the meadow you learn the trade on.
Rendered by FrameSwitcher.tsx
blockhold-frame-greenhollow.webp
blockhold-frame-veiltide.webp
blockhold-frame-cinderwake.webp
blockhold-frame-tidereach.webp
Space held · layers apart
Rendered by astro:assets Picture
cubit-lead-peek.webp
2048, cubed: slide and merge inside a 3×3×3 cube, across six directions instead of four.
It’s 2048 with a third axis: twenty-seven cells, six slide directions, the same merge rule. The axis you can’t see is the one that kills you, so tiles blocking your view of other tiles go translucent, and holding Space spreads the layers apart to let you read the inside of the board.
Vanilla JS with a vendored three.js, bundled into a single HTML file you could attach to an email. The input got the most iteration: swipes are matched to the on-screen projection of all six directions, and on a phone you can lean the device a capped twelve degrees to peek around the cube, without changing what any swipe means.
Rendered by astro:assets Picture
cubit-inset-board.webp
04 / About
Two degrees, one habit
I did two degrees at once, computer science and astrophysics, because I couldn’t choose between them. Some weeks that meant Algorithms and General Relativity in the same problem-set pile.
In college I simulated CO2 cooling for particle detectors. Now I simulate an ocean for a sailing game.
05 / Skills
28 of 32 turn up above
Pick one to see where it turns up.
Turns up in Notable HealthUMass Physics, researchGot It.AIBay Area AQMDPICKLE
Turns up in Elderwood ValeNotable Health
Turns up in Got It.AIYouWebAutoTyperdeviation.html
Turns up in Notable HealthHarvest FintechUMass Physics, softwareRendezvous
Turns up in Bay Area AQMDPICKLE
Turns up in Elderwood ValeNotable HealthHarvest FintechUMass Physics, softwareThe ArenaRendezvous
Turns up in Ember WildsElderwood ValeGrinchJump
Turns up in saltline
Turns up in AutoTyperdeviation.htmlGrinchJump
Turns up in hidamari
Turns up in Notable HealthYouWeb
Turns up in Harvest FintechRendezvous
Turns up in UMass Physics, software
Turns up in Notable HealthHarvest FintechUMass Physics, softwareRendezvous
Turns up in Notable Health
On the résumé only.
Turns up in saltlineEmber Wilds
Turns up in Notable Health
On the résumé only.
Turns up in Notable HealthThe ArenaRendezvous
Turns up in Notable Health
On the résumé only.
Turns up in Notable Health
Turns up in saltlineEmber Wilds
On the résumé only.
Turns up in Notable Health
Turns up in UMass Physics, research
Turns up in UMass Physics, research
Turns up in UMass Physics, research
Turns up in UMass Physics, research
Turns up in UMass Physics, research
Turns up in Notable HealthGot It.AICoursework
06 / Contact
I read it, and I answer it. Send me a hard systems problem, an overambitious browser idea, or a reason Python isn’t the best language. Email is the fastest way in.
aj8uppal@gmail.com