Type something to search...

I named the VM. This is what passes for commitment around here.

It all started because I wanted a couple of simple screenshots for the blog.

Nothing fancy — just a few in-game shots of Papniskin so I could actually show what I’ve been quietly working on. So I fired up the folder, opened the Godot project… and the last-commit timestamp hit me right in the face: eleven months ago.

Eleven. Months.

Well. That’s how it goes sometimes. The last year has been mostly planning, documenting, scribbling notes, and telling myself “I’ll get back to the actual code soon.” Famous last words.

The ritual of the fresh VM

First thing I did was spin up a fresh virtual machine. I’ve started doing this with every new — or revived — project lately: a completely separate VM for each one. Clean Linux environment, nothing bleeding over from my daily driver setup, no mystery package conflicts down the line. It’s one of those small, boring system-admin choices that actually makes me feel like I know what I’m doing.

The practical argument is solid. Coming back to a project after eleven months, a dedicated VM means not having to reconstruct the question “wait, which version of Godot did I actually have installed? Was it the flatpak? The manual build? Did I patch anything?” The machine remembers, because the machine was built for exactly this project and nothing else. No bleed from other work, no accidental dependency upgrades, no “it works on my main box but not here” mysteries. And the real killer feature: before any risky dependency change or engine upgrade, I take a snapshot. If it breaks, I roll back in thirty seconds. No drama, no lost afternoon, just back to the last known-good state. For a side project that already moves slowly enough, not losing a Saturday to a botched Godot update is genuinely valuable.

The less rational argument is that it just feels right. There’s something about the isolation that makes the project feel real — contained, intentional, its own small world rather than another folder on a cluttered drive.

I named this one “papniskin-dev.” That small act of naming felt strangely like a commitment — as if giving the machine a proper identity made it harder to just walk away. I felt very organised for about three whole minutes.

Then I opened the actual code.

The crash, right on schedule

For the first couple of minutes I was properly buzzing. “Oh look, there’s the player controller… hey, the movement code isn’t as bad as I remembered…” That familiar little rush of “maybe I’m not completely terrible at this.”

And then, like clockwork, the motivation just… evaporated.

I sat there staring at the project tree, suddenly convinced the whole thing was a waste of time. I seriously considered closing the editor, archiving the folder, and never speaking of Papniskin again. Impostor syndrome didn’t even knock — it kicked the door in. “You’re a thirty-something dad with two kids, a day job, zero artistic talent, and a one-man mission that’s borderline impossible. What exactly are you doing here?”

I laughed at myself (out loud, alone in the home office) because this exact scene has played out so many times before. The enthusiasm, the two minutes of optimism, then the full weight of what this actually is landing on you all at once. It’s basically a ritual at this point. An annoying one.

So I tidied instead

But instead of quietly folding the project away — that slow, tired surrender where there’s no dramatic moment, you just stop opening the folder — I made a different call this time. I decided to start refactoring.

Nothing glamorous. I pulled up the little note file I’d scribbled eleven months ago — a mix of actual bug reports and half-finished thoughts, some of which I could parse immediately, some I had to read three times before they meant anything, and at least one that I genuinely have no memory of writing. (“movement jitter on stairs — check step_height??” Thanks, past me. Very helpful.) Going through that list felt like archaeology.

But I started fixing things. Tidying the code, making it readable again, closing the obvious broken bits one by one. Baby steps. The kind of work that doesn’t feel like “creating” but still moves the project forward — and, if I’m honest, the kind I genuinely enjoy. There’s something deeply satisfying about putting a messy project back in order. The code was written by a version of me who knew less and had less patience, and cleaning it up felt less like a chore and more like a conversation with that person. A quiet, slightly condescending one. But still.

The tidying itself is the reward.

Then something shifted

While I was poking around the level system, I started feeling the itch to actually draw again.

Not just fix code — but open Aseprite and actually start. There’s a specific kind of intimidation that lives in a blank 16×16 canvas: it’s tiny, it shouldn’t be frightening, and yet the first pixel always feels like a commitment. I want to place the first tile, wince at it, place the second one slightly better, and keep going until a rough corner of underground exists where there was nothing an hour before.

The good news is that I know exactly what to draw. The level design has been sitting in the doc for months — fully mapped, every section annotated, every platform and passage accounted for. It’s been perfect on paper for a long time. The problem is that paper doesn’t run in Godot.

The placeholder rectangles in the test scene have always done their job — a white square is a platform, a grey rectangle is a wall, fine, it works — but there’s a point where testing movement and climbing and combat on coloured boxes stops feeling like development and starts feeling like stalling. I want to see the actual tiles. The hand-drawn ground, the rough stone walls, the first real corner of the underground.

The basics are already in the engine: four-direction walking, running, wall climbing, stair navigation, even the three-hit combo attack (though there’s still no enemy to hit with it, which is a strange thing to have implemented). I suddenly wanted to see all of that working on something real instead of something provisional.

So now I’m in this weird but genuinely nice spot: motivation to both clean the code and start making the ugly-but-functional first level pieces. No pressure to make anything beautiful yet. Just “good enough to test the mechanics” pixel art. If it ends up looking like something an enthusiastic kindergartener drew, that’s fine — I’m not promising screenshots. But if a section turns out decent enough and I feel like it, maybe I’ll throw one up here. We’ll see.


Right now I’m still mostly writing about it instead of actually doing it.

Classic.

Still, it feels like a small, honest win. After all — I didn’t give up on my dream today either. Balancing iron and silicon, family first — always — and quietly refusing to let another eleven months slip by without at least trying. Honest pixels in a world of slick lies. Even if the pixels are currently terrible.

Maybe this is the part where I finally sit down and do the work instead of just talking about it.

We’ll find out soon enough.

Related Posts

Making a game is not like building software. I know this now.

I'm a developer. I thought that would help. Six things about solo game dev that turn out to be genuinely hard, even when you know how to code.

read more

I don't even know how to start writing about this game

Six years of notes, and it finally has a design document. Two extinct civilizations, a hybrid creature, a soul-devouring false god — this is Papniskin.

read more

Six weeks, zero pixels

A follow-up to the post where I swore I'd finally get back to Papniskin. Six weeks later: nothing. And I'm strangely fine with that.

read more