Oh the Places You'll Go
Scope creep, but make it charming
My Adafruit parts shipped from Brooklyn at 3:05 AM this morning. By 4:20 AM they’d made it to the Metro NY Distribution Center. Thirty miles from my house. USPS says Friday. The package is so close I could go get it on foot, but instead it will spend the next two days touring the greater New York metropolitan area’s sorting infrastructure.
A normal person would go outside. I built a farming sim.
Places
The old home screen was a list of locations with numbers. I replaced it with animated scenes. Each location is now a little world. Indoor locations get a window, a shelf, plants in pots. Outdoor locations get a sky, a fence, plants in raised bed cells. Phoebe hops between your plants every 8 seconds, landing next to whichever one she has something to say about.
Scenes are YAML. Layout is data, not code. Adding a greenhouse scene or a “my plant is in a college dorm bathroom” scene is a YAML file, not a refactor.
Every 6 hours, the world model rebuild generates deterministic observations. No LLM calls, just threshold checks. “Your basil is thirsty.” “Haven’t seen a photo of your tomatoes in a while.” These show up as speech bubbles that cycle with Phoebe’s hopping. Tap one and it opens the chat with that observation pre-loaded as context. Zero-cost observations that become intelligent conversations on tap.
There’s also a tour mode. Play button, Phoebe cycles through all your locations every 5 seconds. It’s a screensaver for plant people.
The inevitable descent into game dev
At some point during the scene implementation I looked at what I was building and realized I had accidentally created the skeleton of a farming sim. You have locations with grid-based plant slots. You have a character (Phoebe) that moves between them. You have weather. You have a day/night cycle. You have crop status indicators. I am one harvest mechanic and a gacha banner away from shipping this on the App Store for $4.99 with a “Top Grossing” aspiration.
I should have seen this coming. When I was in elementary school, I spent an unreasonable amount of time on Allegro.cc, the game programming library forum that was basically Stack Overflow for kids who wanted to make DOS games instead of having friends. The crown jewel was a hackathon entry: a Commander Keen clone where you played as a camel. I had collaborators. I was probably the least helpful. My clearest memory is spending a heady afternoon calibrating camel laser damage values. No narrative justification for any of it. Just a camel, platforming, with lasers.
Thirty years later, I’m sitting in my office writing CustomPainter classes that draw tiny pixel-art tomatoes on a 32x32 grid. The tools got better. The impulse is exactly the same. I am slowly reverting to my elementary school self, except now the games have cloud backends and the camel is a bird.
This is not the plan. The plan is IoT sensor hardware. But my Adafruit shipment is 30 miles away and functionally unreachable, so here we are, building Stardew Valley for people who kill succulents.
Teaching an LLM to draw
The scenes needed art. There is home video of my artistically-gifted siblings holding up watercolor masterworks, followed by a slow pan to five-year-old me proudly presenting a Sharpie-scribbled page resembling Pigpen’s personal hygiene. Thirty years later, not much has changed. I can’t draw, but I can write code that draws.
Scene YAML defines layout. Theme YAML defines visuals. Swap the theme, swap the look. I built three.
LineArt
The default. Thin strokes on dark backgrounds, no fills. Every plant, feature, and icon is hand-drawn in Dart code. All strokes, no assets.
This is the one I fought for. My early prompts kept coming back with sparkles. Gradients on everything. Lens flares, somehow. I don’t want lens flares on a fern. I want a fern that looks like someone sketched it during a boring meeting. Getting an LLM to draw with restraint is like getting a golden retriever to “just chill.” The results are, charitably, folk art. I spent an entire day on this. An entire day producing graphics that look like they were drawn on an Etch A Sketch during an earthquake. And I’m proud of them. This is not a healthy sign.
PixelArt
Retro pixel art. Limited palette, no anti-aliasing. It looks like a Game Boy game about gardening, which, to be clear, I would play.
Modern
The one I keep calling “Web 2.0” because I’m old enough to remember when gradients and drop shadows were cutting-edge design. Glossy surfaces, specular highlights, the whole early-iPhone aesthetic. Generated as SVGs from a Dart script. It’s beautiful in a way that makes you want to download Firefox 3 and check your Digg feed.



You can switch themes in the profile tab. The scene rebuilds instantly. No app restart. Going from LineArt to PixelArt feels like changing decades.
The asset pipeline
Over 160 unique pieces of art across the three themes, all generated by Dart scripts. Code all the way down. At the size these render, most of them are pushing the boundary between “charming” and “unrecognizable blob.” Leaf shape is the only differentiator that works. Monstera gets splits. Snake plant gets spikes. Fern gets fronds. Some of them you squint at and go “yeah, that’s a pepper.” Others you squint at and go “that is a green thing.” But in context, in a scene, at phone distance, they work. Mostly. Half of this probably won’t survive the week. But it was a fun detour into code-generated graphics, and the theme system itself is solid even if the art needs a human touch.
The audience review
I’ve been building this for exactly one day. In that time I have shown the scene system to two living beings in my household. The results are not encouraging.
My wife looked at the first scene render, said “that’s cute,” and looked at it again when I added tour mode. She watched Phoebe hop between a virtual windowsill and a virtual raised bed for about four seconds, said “cool,” and announced she was going to go wash her hair. She did not need to wash her hair. Even the dog, who will watch me do literally anything, took one look at me adjusting fence picket spacing at 10 PM and took herself to bed.
To be fair, the fence pickets look really good. (They don’t.)
This is still a hardware project. The sensors are the point. The world model is the brain. But while those sensors take a scenic tour of the USPS network, I’m over here drawing pixel art camels. Birds. I meant birds.
— Ben