https://svonberg.org/wp-content/uploads/2026/03/fruit011.html
Spent some time tonight building out a fruit merge game, which started as a very small idea and then kept quietly expanding in every direction.
The core of it is simple enough. You drop fruit into a container, they bounce and collide using Matter.js, and when two of the same type meet they merge into the next one up. It is the kind of loop that explains itself within a few seconds, especially with the little evolution guide sitting across the top showing the path from cherries up to a full watermelon. No instructions needed, just a gentle nudge in the right direction.
What makes it feel good is the physics. Everything has weight and presence, so even small interactions feel intentional. A piece rolls a little too far, bumps something else, and suddenly you have a chain reaction you did not plan for. It never feels scripted, which makes even the messy moments feel earned.
I built the interface to sit comfortably on a phone screen, keeping everything vertical and easy to reach. The layout behaves nicely, even with mobile browser quirks, and the theme toggle lets it slip into a darker mode that feels a little calmer at night. It is the kind of thing you can pick up for a minute or two without thinking about it too much.
Of course, it did not stay that simple. There is a hidden tools panel that opens up into something closer to a sandbox. You can slice fruit apart, drop a bomb when things get too crowded, shake the entire playfield, or turn on a brief zero gravity effect and watch everything drift. There is even an autoplay mode that takes over and makes its own decisions, sometimes better than you would, sometimes much worse.
The audio ended up being one of my favorite parts to work on. Instead of using sound files, everything is generated on the fly with the Web Audio API. Small tones for drops, brighter notes for merges, and a kind of layered progression when combos start stacking. It gives the whole thing a subtle rhythm that matches what is happening on screen.
There is also a quiet bit of persistence in the background. High scores are saved through Firebase with anonymous login, so it remembers your best run without asking you for anything. It just sits there, keeping track.
One small feature that ended up changing the feel of everything is the size toggle. With a single button press, the entire game scales up or down, including fruit that are already in play. It shifts the balance immediately. Suddenly the space feels too tight or oddly empty, and you have to adjust how you think about each drop.
Somewhere along the way, it stopped feeling like a simple merge game and started feeling more like a small interactive space. Something you poke at for a bit, watch it react, and then try again when it inevitably collapses in on itself.
It is a nice kind of loop. Quiet, a little unpredictable, and easy to come back to.