secco.tech
...
A pixel-art developer codes at a desk while a moonlit idle RPG world outside shows combat and loot flowing toward a server citadel, with a side path leading to a texture upscaler

Idle Game Devlog — Week 2

6 min readYgor Secco
Building in PublicNext.jsIdle GamesDevlogGaming

Last week's devlog ended on a confession: the whole game runs in your browser, the server just believes whatever the browser tells it, and I promised to start fixing that. Week two, I did — the most important piece of that fix is done. I also got pulled into two things I hadn't planned for, one of which quietly turned into a second project. So this one's a devlog about real progress and cheerful derailment in roughly equal measure.

Moving the referee onto the server

Last week's headline was making the server stop blindly trusting the client. The full system is designed now, and the single most important piece is built: combat resolves on the server. Your browser no longer decides what you hit, what died, or — the part that actually matters — what dropped. The server runs the fight and generates the loot.

That's the exact seam I described last week. The UI posts intents across a bridge, the simulation applies them — and I said that bridge was "the same seam I'll later split across the network." This week I split it: combat and loot generation crossed over to the server, which was the biggest hole in the whole thing, because a determined client could previously invent kills and conjure drops out of nothing.

The inventory-side interactions — shops, item refining, crafting — follow the same pattern, and they're still in progress. But I deliberately did the hardest, most abusable part first. The idempotency layer that wraps all of this — making the exchange replay-proof and reconciled — is still being built; what's done is the thing it most needed to protect.

Autoloot, and a sneak peek at how this pays for itself

Small feature, bigger implication. The game now has autoloot — drops get collected automatically instead of making you babysit your bag. Pure quality of life.

Here's the sneak peek: it won't be free. Autoloot is the first feature I've built with the paid tier already in mind — it'll ship as a VIP perk. I'm starting to draw the free-versus-premium line through the convenience features as I build them, rather than bolting a paywall on later. A game that wants to still be running in five years has to earn its keep, and deciding now which comforts are premium is a lot cheaper than retrofitting it once players have gotten used to everything being free.

A navigation bar, and a debt I'm choosing to take on

The game finally has a real navigation bar, and it works. It's also wearing a set of AI-generated icons I don't love — placeholder-grade art that's fine for a pre-alpha and wrong for a launch.

I could have rabbit-holed on icon design for two days. Instead I did the grown-up thing and wrote it down as debt: a "fix before release" note, filed and deferred on purpose. Half of shipping is being honest about which rough edges you're allowed to leave rough for now — and this is one I get to.

A side quest: the texture problem that grew legs

Quick detour — and I do mean a detour. The game is the main questline here; this was a side quest that got a little out of hand, so I'll keep it short and come back to it properly another time.

The game's world is genuinely old — its original art was drawn for the small screens of two decades ago — so on a modern high-resolution display, some of it looks rough. I needed to upscale a lot of it. First I tried the cheap, honest route: a small Python script doing plain mathematical (Lanczos) upscaling — no AI, no per-image cost. It's a fair baseline, but for this art it just wasn't sharp enough. So I rebuilt it around PyTorch, running real super-resolution models on my own GPU — no cloud, no per-image bill — and the difference was night and day.

Then the idea that actually ran away with a chunk of my week: I already had a browser-based image compressor I'd open-sourced (Compress) that does everything client-side — no uploads, no server. What if the AI upscale could work the same way, entirely in your browser, on your own GPU? I got the models running client-side through WebGPU, and it worked — a GPU-powered upscaler with effectively no server bill, because the compute is the visitor's. It's half-built and needs an actual business plan, so I'll dive deeper into it in a future post. Back to the main quest.

The part where I admit I didn't finish

Time for the honest ledger. Last week's priority was that server work — and I did not fully land it.

Before I started, I let myself get pulled into an essential, signature visual feature of the character: one of the specific things that set this game apart from everything else back in its day, and a piece I care about more than I probably should. It looks great now. It also took far longer to get right than I'd budgeted, and it shoved the server work down the week.

On a personal, unreleased project a slipped deadline costs nothing but my own pride — so I'm not going to dress it up. I chose a shiny visual over the priority task, the priority task slipped, and that's on me. Noted for next week.

Next week

  • Finish the idempotency layer. The combat core lives on the server now; next is making the whole exchange replay-proof and reconciled so the server can trust it end to end. Third time it's made this list. It gets done.
  • Offline progress. You shouldn't have to leave the game running to get anywhere. Close it, go live your life, come back tomorrow to a character that kept going — within sensible limits. That's the whole promise of the genre.
  • Loot that depends on where you grind. The reward system is one-size-fits-all right now. I want different monsters and different hunts to drop meaningfully different sets, so where you fight is an actual decision.
  • A second class. There's exactly one playable class today — the warrior. Time to start planning, maybe building, a second, which means rethinking skills and gear around more than one way to play.

Week two: the server started refereeing its own fights, the money model quietly took shape, and a texture chore mutated into a second project I didn't ask for. I also still owe last week a feature. Onward — and this time the referee gets finished.

Related Posts