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, and what was wrong with each one.

Systems

03

The ones I went deep on. I can walk through any fault below line by line.

Live

AisleClear

2026.07

Automated accessibility auditing for Shopify storefronts. A shop owner submits a URL and gets back a plain-English PDF ranking the five issues most likely to matter, with the theme or app responsible for each one.

Fault found The crawler happily audited password-gated and placeholder pages, producing a confident report about a storefront it had never actually seen. It now aborts and alerts instead of guessing.
Playwright / axe-core / Netlify Functions / GitHub Actions / Claude API / Resend / Turnstile
In build

AgentDesk

2026.08

A three-agent pipeline — researcher, drafter, reviewer — connected by strict JSON contracts. The reviewer scores every draft against the researcher's sourced claims and nothing below an 8 reaches a human. Work that fails twice escalates rather than shipping.

Fault found The run record was only written to disk inside one except branch, so any crash outside that path silently discarded the entire audit trail. It cost me the transcript of the best run I ever had.
Python / Anthropic API / JSON schema contracts / eval fixtures / n8n
In build

AI, Plainly

2026.08

An AI literacy site for people who have never used it once — built for my dad's generation, not for developers. It explains how the major free assistants actually differ, then walks you to a finished, ready-to-paste prompt with your own details left as blanks to fill in.

Design call My first design was nested dropdowns — pick a field, then a subcategory, then narrow again. Efficient, and completely wrong for the audience. Someone who has never used AI doesn't need fewer clicks; they need to never be looking at more than one decision at a time. I threw it out for a wizard that asks one question per screen.
Next.js 16 / TypeScript / Tailwind v4 / static export / Vitest / vitest-axe

Smaller builds

03

Finished, playable, built fast. Listed for range and shipping discipline, not depth — the design call under each is mine, the debugging mostly wasn't.

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
In build

Oracle Eight

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 / Cloudflare Pages
About this page. Hand-written HTML and CSS — no framework, no build step, no dependencies. Skip link, visible focus states, landmark structure, status conveyed in text rather than colour alone, and reduced-motion preferences honoured. It passes the same audit AisleClear runs on other people's sites. 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.