A sound piece scored for one intersection at night. Click a pin on a hand-drawn map of Myrtle and Broadway and a rat reviews the venue above it, Yelp style, spoken in recorded squeaks. Reviews layer up as you click, over the sound of the corner. The interface is the score.
Two rats outside my apartment. A rat couple lived outside my apartment and came out together at night to forage. They might be dirty, but they were pretty good at dirty dancing. Then exterminators came through the block, and I was sadder than I expected. A few days later the burrow opened up again. I wanted to know what they were saying.
The form came from a Scientific American piece on researchers recording New York's rats with ultrasonic microphones. One rat talked to itself inside a garbage bag, "perhaps offering a Yelp review for passing comrades." I took that literally, for my final project in Sam Mejias's Sound in Art class at Parsons School of Design.

Yelp is the form.
The reviewers are fictional and the places are real: ten pins around the JMZ stop, including the platform, an alley and two venues that closed this year. The reviews borrow the voice of Grime Square's writers, credited on the piece, and the epigraph is Aaron Tomey's line from it, "The vermin aren't the customers."
The mechanism is the voice. Every word is a recorded squeak. Most come from rodent recordings on Freesound. The rest come from Tachibana's laboratory dataset, ultrasonic calls of rats on cocaine, slowed down into human hearing.
In the default register each word gets one squeak, picked fresh on every click by the squeak's length, the word's punctuation and the rat's personality. No playback repeats.
In the second register the rats speak their own language. Words become runs of syllables, and each syllable's squeak is seeded from its consonants and vowel, so "rat" and "rats" sound the same, and so do "crumb" and "crumbs". Every rat says a syllable the same way, in its own voice. The language is stable because its rules are.
Keywords trigger effects on the voice: one word opens a hole in the sound, another fizzes.
Thebackstockroomratsconsiderthemselvesresidentproletariatandgatekeepthespilled-ricecornerfromusstreetcomrades,internalcontradiction.
TakenGenerative by default, so every click picks fresh squeaks.
RejectedOne fixed rendering per review.
TakenEach word waits for the last squeak to finish.
RejectedA fixed gap between words.
TakenThe cocaine recordings are a register some rats live in and others slip into.
RejectedGiving the whole bank to one rat.
The corner keeps playing.
Under it all runs the corner itself: the JMZ overhead, the drone of the street, small bits of activity. Every ninety seconds to three minutes, a train passes overhead.
A review keeps playing, quieter, after you close it. Older voices sink under a low-pass filter and more reverb as new ones arrive, each placed in the stereo field where its pin sits on the map. By the end, the corner is louder than when you arrived.
I designed the engine and wrote the rats, with Claude Code for the code. Madhura Redij illustrated the map and every pin, and the piece looks the way it does because of her.
Looking back
A joke needs a rigorous system to stay funny for more than a minute. The comedy is in the premise. The staying power is in the rules that keep each rat consistent, so a listener learns a rat by its voice. The default register works against that: if every click picks new squeaks, nobody can send a friend the take that made them laugh. That's why the stable register exists, and why it's opt-in.
I kept the build plain: no framework, no build step, and one serverless function for the shared reaction counts, with no accounts and no tracking. The voices are 172 audio files, so there's a lot to load before the rats can speak. At first a slow connection let people in before they were ready, into silence. Now the way in only lights up once they can talk, and a failed load says so instead of going quiet.
The mobile layout went through ten iterations in one day, each fixing the symptom in front of it, before I had the whole layout audited from the root. Then iOS 26 Safari began clipping the review sheets at the bottom of the screen, and I hid the clip under a fade instead of rebuilding the modal. The fade holds.
I wrote every review, every bio and the About page myself, with a standing rule that Claude Code didn't touch the voice. The argument of the piece lives in the engine, though. Generative playback is the claim about orality, and I specified it and listened to it rather than writing it line by line. I'm still working out how to describe that kind of making.
- 0023buildAQI SynthThe other New York sonification. There the air drives the sound; here a review does, and the rats supply the voice.
- 0018installSights and Sounds of the Body PoliticLanguage read by machines and turned into sound, with Sam Mejias, whose Sound in Art class this piece was made for.
- 0017buildCreative TraceThe same month, the opposite split. There Claude writes the warm part; here I wrote every word the rats say.


