MoonDust (@MoonDustFarms) header
MoonDust (@MoonDustFarms) profile picture

It went to the moon. The moon did not survive. Free browser farming game. Play the week; Sundays it rains SOL. CA: 8KVACmtshYCUhxBFYJgcunWst8DsdkvvNjjXouQ1pump

Under a cracked moon
Joined August 2026
Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)Photo by MoonDust (@MoonDustFarms)
Oh boy, a lot has changed since launch, for the better: hybrids, a Moon Kitchen, regulars with cravings, a Night Market, roads to explore, neighbours who watch your farm. Sorry for going quiet. Hard week, a whole story update, and we're still learning video editing.
7
8
211
Our funnel logged where new players left by listening for pagehide, but a phone that switches apps or locks its screen never sent it, so for the half of our new phone players who left before their first harvest, we never saw the step where they left. We now also send one beacon per tutorial step when the page turns hidden, because in a mobile funnel missing data looks exactly like no problem.
1
3
84
Cross two crops into a hybrid with moondust, brew the harvest in the Moon Kitchen, serve it at your gate.
1
1
72
Free in your browser, phone or laptop. No wallet needed to farm. moonfall.farm/play
38
Field data showed new players who planted three seeds right after picking a character leaving before the next story beat, and the first seed's tap froze for a 320 to 470 ms frame while the crops' shader compiled. Our three.js farm now draws an invisible stand-in crop with the same material, shadow and instancing from its first frames, so the first seed compiles nothing and its frame is 250 ms.
1
52
In our React Three Fiber game, a one-finger pan across the farm made 4,800 mesh raycasts, because R3F raycasts every object with a hover handler on each pointermove, and a finger can't hover anyway. With hover handlers left unregistered when the screen matches (hover: none), the same pan makes 0, and a tap still selects what it lands on.
115
We build our three.js farm game with AI coding tools and a lot of human taste, and one rule keeps it safe: our visual polish lanes ship behind a default-off flag and merge only if frozen frames with the flag off match main pixel for pixel, otherwise the branch is dropped. One lane's check came back 12 of 12 frames byte-identical to main, with draw calls and triangles recorded next to each shot.
1
1
461
We sent a thank-you in SOL to 3 early farms, picked by the team, straight from our own wallet. Each farm sees its gift in the game, and every transaction is public on the Ledger: moonfall.farm/ledger
3
3
230
Saturday night is Market Night in our farm game: every lantern stall in the Square lights up at once, and farms trade their hybrid seeds for favours, never money. Each trade leaves a lantern with the other farm's name by your gate.
1
3
327
Field telemetry showed one real phone losing its WebGL context about every five minutes, and nothing in our three.js game remembered it or lowered the load. Now a lost context steps that device's quality ceiling down one tier for seven days, and we never change tier mid-loss, because our post-processing composer reads getContextAttributes(), which returns null until the context is restored.
2
5
246
Our NPC dialogue and number counters kept their per-frame progress in React state, and a render census found up to 126 React commits in the second after one tutorial tap, down to 23 once both wrote straight into span refs from requestAnimationFrame. How do you animate typewriter text in React: refs and textContent like us, or a cleaner pattern that still gives screen readers the whole line?
125
Free in your browser, phone or laptop. No wallet needed to farm. moonfall.farm/play
24
We almost shipped a 30 fps cap for phones on our three.js farm game's medium tier, because the first A/B ran in headless Chromium, whose 120+ unpaced frames a second made the cap look like a win. Paced to a 60 Hz screen on a throttled Pixel 7 profile, the cap made taps slower (p98 288 to 384 ms) and frames rougher (p95 25 to 79 ms), so we reverted it before any player saw it.
3
4
112
On our dev host, a tab left open across a web deploy asked for hashed chunks the new deployment no longer served (23 of its 86 game files were gone), so its first lazy screen fell into our crash card. Our deploy now adds every file the live build's version.json lists that the new build lacks, and in a rehearsal the old tab kept all 86 files, where without the carry 7 lazy chunks returned 404.
1
1
2
211
Moonfall Farms, a cozy farm under a cracked Moon. Cross two crops into a hybrid with moondust, brew the harvest in the Moon Kitchen, and serve it to whoever's waiting at your gate.
2
4
184
Every object in our farm game is built in code, this cauldron included: each ingredient drops in with its own splash, the brew blends toward its new colour, and the ladle goes round twice.
1
4
242
On launch evening, 12 of the 19 new players who left during our browser game's intro had picked their character and then never tapped the one object the tutorial asked them to tap. We cut that step: the object now hands over its seeds by itself, and planting is a new player's first tap on the farm.
6
5
243
Our AI coding agent fixed a false render-stall report (a phone asleep with the tab open had logged a stall of over twenty minutes) by treating any late timer check as a frozen page, and that quietly hid the real main-thread blocks the beacon exists to catch. A separate review pass caught it before release, and now the page's own visibilitychange decides what counts as time away.
2
175
On an iPhone, a finger's pointerdown did not unlock our game's AudioContext, and because our unlock helper removed all its listeners after the first event, the touchend that would have worked was already gone and the whole session stayed silent. Which events do you listen for to unlock Web Audio on iOS, and do you keep retrying after a call or Siri suspends the context?
1
2
296
Field telemetry showed a desktop flipping our three.js game's quality tier four times in two minutes and then staying stuck on the one tier it could not hold. The cause was drei's PerformanceMonitor: flipflops counts every verdict, even an incline when quality is already at max, so with flipflops={3} it stops watching for good after its fourth verdict, even on a device that never changed tier.
1
4
199