trending

My game writes a new song every day and ships zero audio files

GRAZE has a soundtrack now. It is a different song every day, nobody recorded any of it, and the app did not get any bigger.
Here is how it works and why I built it this way.
THE CONSTRAINT
GRAZE has never shipped a single asset. No image files, no audio files. Every obstacle, particle and glow is drawn with canvas primitives at runtime, and every sound is a Web Audio oscillator. That started as a practical decision, since I was building this in twenty minute windows at 3am after my son was born and could not afford a toolchain, but it turned into the thing that made the soundtrack possible.
Adding music the normal way would have meant bundling megabytes of audio and picking one track everyone hears forever. Generating it meant I could do something a file cannot.
THE IDEA
The daily course in GRAZE is generated from the date. Seed a small PRNG with today's UTC date string, and every phone on earth produces an identical course, with no server and nothing downloaded. The date is the level file.
So: do the same thing to the music.
Seed a second PRNG with the date and let it choose key, tempo, chord progression, bass figure, hi-hat pattern, arp figure and rate, waveform, filter resonance, and how long each chord lasts. Every player hears the same song on the same day. Tomorrow is a different one. Nothing is stored, nothing is streamed, and yesterday's song is reproducible forever because the date has not changed.
WHAT MAKES TWO TRACKS SOUND DIFFERENT
My first version varied key, tempo and chord progression. It sounded identical every day.
That was the lesson. Key is almost inaudible without an A/B reference, eight BPM is nothing, and six progressions that are all cousins of each other read as one progression. What actually separates two house records is rhythm and timbre.
So the seed now picks a bass figure from five patterns over sixteen steps, a hat figure from four, sixteenth or eighth note arps, saw or square oscillators, filter resonance, and one or two bars per chord. It also picks from eight progressions chosen for contrast rather than similarity: a Phrygian flat-II for a dark day, a Dorian major IV for a bright one, a harmonic minor major V when it should feel tense.
Now the days sound like different tracks instead of transpositions.
THE PART I LIKE MOST
The arrangement is gated on your score, not on time.
Under 150 points you get a pad. At 150 the kick arrives, 250 brings the bass, 600 the arp, and it keeps filling in until the whole thing is playing at 10,000. Score only ever rises, so a part can never drop back out mid-run.
The effect is that you can hear how a run is going before you look at the number. A great run sounds like a great run. And because most players never break 10,000, completing the arrangement is a real thing to chase.
Heat, the risk multiplier, does not add parts. It rides the filter, so grazing an edge audibly opens the track up and playing safe closes it down. Layers gated on Heat lurched in and out, because Heat can go from nothing to sixteen times in a few seconds and it decays when you play safe. That was version two of three.
TWO THINGS THAT BIT ME
The arp was playing a minor third over every chord. I had written the arp figure as fixed semitones, which meant it sounded a minor triad against the major chords in the progression. Indexing the chord itself instead of hardcoding intervals fixed it, and it is a mistake that is completely invisible until you look at the numbers.
And audio must never be scheduled from the animation frame. Notes are scheduled ahead on a timer, roughly 100ms of lookahead, because frame-driven audio jitters the moment the game gets busy, which is exactly when the music matters most.
ALSO IN THIS UPDATE
The soundtrack picks back up where it left off if you watch an ad to continue, keeping its place in the bar and every layer your score has earned, rather than restarting like a new run.
GRAZE: Edge Rush is free on iOS. Score by almost dying: the closer you graze the edge that kills you, the higher your multiplier climbs, and playing it safe scores nothing. Same course for everyone, every day.
Today's board resets at midnight UTC and it is still open.

100 daily players, four new obstacles, and a bug that only showed up as a feeling

GRAZE devlog: 100 daily players, four new obstacles, and a bug that only showed up as a feeling

Quick update on GRAZE: Edge Rush, the one-tap game where you score by almost dying.

Going free permanently, and the hardest design call I've had to make

We are in the final stretch of launch week, and I have some news plus an honest look at a decision that took me a while to get right.

Free for good

For the next 72 hours GRAZE is completely free. Download it, play it

Launch week has been unreal, so I decided to do something about the one barrier left.

For the next 72 hours, GRAZE: Edge Rush is completely free on the App Store. No price, no ads, no in app purchases, no catches. I want as many people as possible to actually play this thing while my launch is live, so I took the last excuse off the table.

I made a game solo in the hours around my newborn, and I have no idea how to get it seen

I want to be honest in this one instead of selling.

I built GRAZE: Edge Rush by myself in the small pockets of time around my son being born. He is 10 months old now, and the early mornings and quiet nights became the hours I taught myself to actually finish and ship a game. It is on the App Store, it works, people play it, and I am proud of it.

I added a permanent "daily wins" tally to my game and it changed how people play

I build GRAZE: Edge Rush, a small one thumb arcade game, solo. It has a daily mode where everyone on earth plays the exact same course, and the leaderboard resets every midnight.

The daily board was fun, but it was also disposable. You could top it, feel great for a day, and then it wiped and none of it was remembered. So I added a Daily Wins counter. Finish a day ranked number 1 and your win total ticks up and sticks around forever.

GRAZE: Edge Rush - Score by almost dying. One tap, one shared course each day.

A one-tap arcade game built on one idea: points come from how close you get to the thing that kills you. Graze a lethal edge and your multiplier climbs to x16. Coast safely down the middle and you score nothing at all. The daily course is generated from the date, so every player worldwide gets an identical run with no server involved. Resets midnight UTC. 1,700 lines of vanilla JS on a canvas. No engine, no assets, no build step. Free on iOS.