Joey Peluso

Burlington, MA  ·  joeypeluso.com

I keep connected medical devices talking to the network for a living — cellular, Bluetooth, fleet dashboards, and the long tail of reasons a device goes quiet. The habit that comes with that job is looking for the failure before someone else finds it. Below is what I've built on my own time — what went wrong, and what I decided.

Play something I built: CPR Hero · Letter Snake · Oracle 8

AI Systems

02

Multi-agent pipelines — contracts between stages, a gate that can say no.

Web Tools

02

Software meant for someone else to actually use.

Games

03

Playable end to end, not just demoed.

Live

CPR Hero

2026.08

A rhythm game built around chest compressions. You hold tempo and depth against a beat, and the scoring is tuned to the rate real CPR is actually taught at — the game is only fun if you're doing it correctly.

Design call The scene safety check started out thorough and accurate — and made you spend twenty seconds tidying up before compressions. The game's own premise is that survival odds drop every minute you wait. The mechanic was contradicting the content, so I cut it to two clicks.
Vanilla JS / Web Audio API / Netlify / Netlify Edge Functions / DOM rendering
Live

Letter Snake

2026.08

Snake, but the board is seeded with letters and you're filling the blanks in a target word. Only one class of letter is edible at a time, so the constraint doing the work isn't reflexes — it's knowing how the word is spelled.

Design call Adding a vocabulary mode — where a teacher loads their own word list — didn't change the mechanic at all. It changed who the game was for. That's the edit that turned it from a toy into something someone would actually open on a Friday afternoon.
Vanilla JS / Canvas 2D / Netlify
Live

Oracle 8

2026.08

A fortune-telling toy rebuilt properly: a weighted 3D shell, a die that tumbles and settles instead of cutting to an answer, swappable answer decks, and the reply spoken aloud rather than just printed.

Design call Spoken answers were going to come from pre-rendered voice clips. That pipeline was more machinery than the toy justified, so I kept it on the browser's own speech synthesis and spent the effort on selectable voices instead — a feature people will actually touch. The ball's rotation was also slowed to match the weight of a real one; the fast version felt like a spinner, not an object.
Three.js / Vite / Web Speech API / Web Audio API / Cloudflare Pages
About this page. Static HTML and CSS — no framework, no build step, no dependencies. Skip link, visible focus states, landmark structure, status conveyed in text rather than color alone, and reduced-motion preferences honored. That seemed like the minimum.
On how these were built. I don't have a CS degree. I build with AI assistance and I'm direct about that — the leverage is real and hiding it would be silly. What I'll claim is the part that isn't automatic: deciding what to build, calling when something isn't good enough yet, and refusing to ship the version that only looks finished.