Journey to nuworm


I made a free web-based puzzle game called nuworm. While it might take you three hours to beat, it took me three years to make. In this post, I'll show some of my journey, including the long lineage of related unfinished games and prototypes as well as changes to the gameplay, art style and level design of the game itself.

Spoilers for nuworm ahead! Play it here, right in the browser and come back to the article later if you want to. It's a tricky game without a story, a soundtrack or ambitious graphics, but I hope you'll discover some emergent but carefully curated surprises.


How it started

In the primary school computer room, we had access to software with interactive problems related to math, language, and so on. What stood out and captured my interest was the included series of block-pushing puzzle games, with mechanics like crates you can push into water, buttons, doors, teleporters, bombs, rafts and slingshots.

With my Stephens Sausage Roll poisoned brain, I look back and see a take on Sokoban that is perhaps not the most elegantly designed, but the mixture of game mechanics felt like a wonderful invitation to dream up my own additions.

The first game in the included series lacked many of my favorite elements and took place in a simple gray environment, but it had a level editor. That probably inspired me, because I filled notebook pages with ideas for custom objects and later used something like a custom chess board made from ordered Lego pieces to design levels that my brother would have to try.


Finishing projects? What's that?

Screenshot of the puzzlescript editor showing a dungeon layout full of different Sokoban-style elements like crates

By 2016 I was making my own digital puzzle games. Potentially one of the first was motivated by the intrigue I felt exploring dungeons in 2D Zelda games, but featured only puzzle gameplay, closer to the maximalist approach to Sokoban I was familiar with. To be clear, I had no idea how to make good puzzles.

I don't remember how or when I found out about PuzzleScript, the web based, block-pushing game creation tool. But I know that it was my main exposure to programming for years, because its paradigm just clicked with me like nothing else did. I first learned about browser dev tools and CSS to modify how the PuzzleScript editor looks, I first learned about GitHub to host some of my early small games with it.

I used the PuzzleScript Google Group a few times, and later the Thinky Puzzle Games Discord to share what I made. In almost all cases, what I linked to were 'work in progress' games, eternally stuck in that state.


How I ended up at nuworm

Nuworm has a fairly direct, but oddly long lineage of other, mostly unpublished PuzzleScript projects, most crucially a tiny single screen game I only finished and uploaded late 2022 because there was a time constraint for once.

But it really starts with a project I published in February 2020:


Initial level of my game Un-Lock, showing two doors, one of which leads nowhere, and a single key to pick up

Un-Lock (a name similar to nu-worm, right?) started from a mildly amusing musing inspired by ongoing conversation about locks and keys on Discord. What if you try to use a key on a locked door, but for some reason, the other door opens instead?

The short game features other oddities, like doors that are somehow also pushable boxes, and is intentionally cryptic. When I shared it, it seemed to intrigue others too, maybe the feeling of 2D Zelda dungeons came across. I got quite positive feedback from people whose work I admire, so I thought of ways to expand the game, make the art neater and iterate on mechanics. This never resulted in a final version, I just moved on to something else eventually.

This process did make me notice something I like in puzzle games: rules with effects that neither apply everywhere globally, nor only in directly adjacent tiles locally. I had a mission: find tactile, understandable ways to make 'action at a distance' happen.

This could be cables between buttons and doors, areas of effect and flood fills, labelled pairs of teleporters, but many of those options felt static, hard to use in emergent ways. In later versions of Un-Lock, I was thinking about applying the effect to everything on the same 'island', and started to look beyond the initial locks and keys idea: Applied to block pushing, it could mean that when the player pushes one block, the other blocks move instead.


A fairly big example level of a PuzzleScript game featuring areas of different colors with boxes on some tiles. The boxes have symbols that stand for their effect, such as pushing or breaking.

Iterating on the same idea in September 2021, I was working on a game that looks very different. Levels feature boxes that react to being pushed and colored areas on the ground. Some boxes simply move, others break or grow into a multiblock. Over a colored area, attempting to move into boxes no longer affects them but instead applies their effect to other boxes in that area instead. Just like in nuworm and Un-Lock, the goal is just to get to the exit, there are no targets on the ground. I made barely any levels before getting lost trying to implement complicated additions, but I liked the art and the idea.


A small Sokoban style level with targets for crates. Each crate is either white or black.

In another simplified iteration from December, the player can move into white pieces to push black ones and move into black pieces to push white ones. Now a more traditional Sokoban game with targets, I tried to generate levels automatically and I got some compact and tricky ones. But then I realized this hard-core block-pushing approach was not really my thing compared to more conceptual level design.

Months later, I'd be sketching other game mechanics with inputs leading to outputs somewhere else. Maybe pipes would be cool, water goes in one and comes out another? Maybe you attack one enemy and another takes damage?


A prototype setup with a tile based snake player character, where each tile is a conveyor belt facing towards the tail. Moving on a tile with a crate would make it follow the path of conveyors.

Action at a distance needs some system for how the cause in one place and the effect in another are connected. Pre-placed cables, matching colors or matching symbols aren't satisfying solutions to me. Well, I had a weird thought in August of 2022: a snake can also transfer an input on one end to an output on the other. I tried a few game ideas, like one about pushing two headed snakes to make the other head move, followed by a prototype where the player directly controls such a snake where both heads try to move. Many moves are neutral as a result, so you need to make ones that intentionally only work for one head. Weird! Then I had a much more intuitive idea, a snake game where the body acts like a conveyor and can transfer boxes to the back end, where they would fly out.


The single screen level of my game Snug Snek, shown with some initial moves done. The player has grown and split part of their body off. There are 3 eggs the player needs to cover with these snake parts.

I then made another snake game more closely related to nuworm. It is also, still, different in almost every way. For the upcoming Confounding Calendar event, I could submit a single-screen puzzle, and it would have to be done before Advent. I kept experimenting with snake mechanics, now in a side-view perspective with gravity. What if the snake keeps growing and growing with every move, but can push against its own tail to split it off, and then keep growing again and so on. In many snake games, the player can't move in a direction blocked by itself, so the initial thought was "what if that did something?" The complex way that previous moves influence the shape of the snake seemed like a good basis for puzzles.

Aside from the gameplay, there's also similarities in the art. Using sprites that overlap their cells, I went with 2px wide outlines that are right on cell edges, an approach I still use in nuworm now. It makes it easy to tell apart blocks that are just adjacent vs. ones that are connected. Often there is simply a gap in between, but pushing a crate when the player is technically not even touching it always seemed a bit odd to me.

The specific puzzle I made for Snug Snek :) had an 'elegant' solution barely anyone spotted but also much more complex ways to solve it I was not even aware of. While the deadline got me to finally publish something on itch.io, I was soon back to working on the game to add many more introductory levels and really explore the complex movement.


The first level in my game SNEKrifice that features the splitting mechanic. The screenshot shows the player just having used the mechanic, so the last tile is replaced with a cartoon bone and the actual part has fallen to the floor.

Around Christmas, I made a big change: the snake would no longer grow but stay at a fixed length. I realized how chaotic the solving process was otherwise. The goal in each level would once again be, as had become a favorite of mine at this point, to leave out the side of the screen. With gravity present, the game felt a lot like Snakebird, with some extra tricks like splitting to get shorter and falling to connect with another piece and get longer. I never shared the game publically, but you can try SNEKrifice here.

Friction turned out to be full of edge cases, and I started thinking that splitting is just too complicated. I was wondering if the game needed a zero gravity tutorial zone... or if I should remove gravity altogether? It's so common in games, but that omnipresent downwards movement certainly has big consequences when applied every turn to every object. Later, I thought it felt quite similar to controlling multiple players or keeping track of other simultaneous movers, which are somewhat unpopular with thinky puzzle fans. In this case, the effect of gravity after every turn makes it hard to parse how a certain move played out right before gravity applied. Truly smooth animation would help, but would also be hard to achieve in PuzzleScript.


The same player character as in the last game, but in an untextured top down environment surrounded by water. The places where the snake has split look like simple stitches, maybe implying they can be recombined at split freely now.

So in February 2023, I explored a top-down prototype. It would still feature gravity in some way: gaps in the floor you have to cross and can drop parts of your body into to use as a bridge. After all, there needs to be a reason to split and connect shapes. Splitting would create stitches, so you could re-combine and re-split the shapes over and over. However, I did not yet see a way for the player to get longer, since the tail always points at the now empty tile it came from and no force or other agent is ever moving it towards something else.


An abstract purple metallic lab environment, otherwise clearly a similar game to the last one. The face of the snake is now one big eye, and another piece has a plus shaped socket.

So there's a missing ingredient here. While snake parts could be stitched together and split, the player always happened to control the same bit, and you can only really get rid of the tail once or twice per puzzle, only get shorter. Considering all objects are themselves snake shaped, what about a way to transfer control from one to another? I made bumping into the head of another snake transfer the eye and player control over to that one. A sort of socket would indicate this possibility, which felt a little random and lacked thematic explanation. The prototype was called Snek Lab.


The same art style, but the stitching and snake texture is gone, instead the parts look more like pipes, with the places that have been split acting as openings.

Still in February, I actually had the idea that would lead to the final published game more than two years later. What if those various shapes you can split from yourself had another purpose? Unlike the bridging, maybe one where the orientation of the split faces actually matters? I made the snake shapes act like pipes, allowing flight between them and through them. It just sounded satisfying to play with, and it totally was.

I knew that this choice would stick around. In fact, the player being able to fly through the shapes now eclipses the splitting mechanic in importance. I still went on to not just design levels, but rethink the visual metaphors, art direction and many other game mechanics multiple times.


Progress Snapshot: 21. February 2023

Overview of the 4 levels I made at this point

Here are the four levels I made to begin with. There are pipes connecting levels, as well as ones within the levels the player can push, fly through and swap between.

When the player controls a single block without a 'tail', it does not really feel like typical snake movement. Realizing this, I thought it would be cool to not reveal that behaviour until later. For a long time, I was unsure if hiding an important mechanic for many levels was risky, but in the end, I realized that making plenty of levels without it is perfectly fine, as long as they are interesting. A trailer for the game could theoretically work without showing it, although the name might not hide much.


Progress Snapshot: 22. April. 2023

Overview of the 42 levels I made at this point

You can take a closer look at this iteration (maybe opening the image in a new tab, zooming in or even downloading following overviews to toggle between), but since certain game mechanics were changed before release, details may only make sense if I manage to explain those differences.

One of those changes was to splitting, which I'll talk about soon. Also, blocks could still be dropped into holes to make bridges. This top-down way of keeping gravity felt necessary at the time to really get mileage out of the splitting mechanic. What was lava in the previous version was now meant to be a lower level of elevation that blocks could rest on to create more floor.

It was time to think about where I wanted the game to take place. While I prefer 'island' theming given the bridging mechanic, being able to fly in a straight line in any direction forced me to still surround levels with walls. I changed the environment to something like dirt or rock, like a video game cave system. I was imagining a potential story for the game where researchers observe some kind of small organism, so perhaps this is all in a lab setting after all?

Considering moving away from PuzzleScript eventually, I tried to visualize the game in 3D in Blender. I was drawing these kind of halfpipe shapes often on paper too, kind of inspired by marble runs made out of wooden blocks.

A quick mockup of a possible 3D version of the game made in blender, with the pipes looking like halfpipes

The levels were organized in a way roughly similar to now, but with a much more inconsistent difficulty curve. For some reason, I tried to hide block pushing initially, it doesn't show up in the first area (first row). Swapping control of endpoints by flying between them was revealed later still, which surprised me looking back since now the very first level features it.

You can also see a level here that gives the player an S-shape, to use as a hook to retrieve a block. Later on, I'd play the wonderful Can of Wormholes and realize tricks like this can make for good puzzles but only really contribute if they actually involve key mechanics, in my case connecting or splitting or using the pipes in any way.

There were 9 levels just about moving as a snake, usually to cross over a hole or to use as a bridge, probably pretty redundant. Then, finally, the splitting mechanic shows up. I felt like I had barely explored it and had only made the tutorial levels, which I think is pretty much true.


Progress Snapshot: 10. August 2023

Overview of the 37 levels I made at this point

One immediate difference to the last version is the color palette. The bright green snakes, reddish brown dirt and purple-ish dark floor seemed a bit all over the place, so I went with a unified ramp from lighter greens to dark desaturated blues. Because they previously felt distracting, I made the pipes in the walls that go from level to level use the darker shades.

I was apparently confident in the structure and order of levels being close to done, because I went through the effort of making all the pipes line up from one room to the next, with rooms connecting horizontally or vertically. You might notice the levels now having the same dimensions (though not odd numbered yet, meaning the pipes aren't ever centered), so I could connect them together into one big map... which was way too ambitious.

To try different colors and make other art changes, I made a mockup in Aseprite and kept duplicating the frame and making variations, of which I'm showing a few here:

A selection of color palettes and styles applied to the same level mockup

At this point, the shorter snake movement section contained a new discovery: when pushing a "C" shape from within the open tile, the tail is blocked from following the player. At the time, this would cause the player snake to move as if a rigid body, sideways. Even a 1 tile long player would not turn when pushed. I really wanted a way to grow, so the open end of the snake attaching to something else seemed useful. Well, I also found another way that would make it to the final version as seen in the second to last row of levels. You might also spot that there are already levels about closing the snake you are in.


Progress Snapshot: 28. September 2023

Overview of the 41 levels I made at this point

Art wise, this is the result of dozens of tweaks to colors and shapes I made on another example level mocked up in Aseprite. First I tried a more sci-fi color scheme with a bit of greebling, later a more minimal redesign that would simplify how the blocks are drawn. With the more flat style implemented, I realized there was no reason why the snakes/ blocks had to be green. I went with a color scheme vaguely inspired by the ancient tech in Zelda Breath of the Wild.

Next, what if pipes in the walls are made from the same blocks used in the levels? This felt like a satisfying epiphany for me, but it broke a lot of levels since you'd be able to fuse other blocks to these pipes. And once again, it made connections between levels visually distracting. My solution was to make the entrance and exit single tiles with little holes, as if the pipes disappeared underground and to tweak the level design to fix potential cheese.

You can see some of the art process here:

Mechanically, I realized that it was odd that the entire snake could rigidly move when attempting to move sideways in a "C"-shape. It seemed more consistent to make it split off instead, since it becomes flexible when the player is controlling it. So I added a section about this added way of splitting that takes place first.

Comparison of splitting by pushing agaist yourself before and after the location of the split was moved

Because you can easily get short pieces like a single corner with the new other way to split, and the self push method left the player with tons of options as a longer snake, I made a major change to the way splitting has worked ever since the Advent calendar game. It would now always be the head that splits, so the remaining tail would be in more specific bigger shapes (at least an L-shape), which I could design more intentional levels around, with fewer unintended solutions to fight.

This version of the game was used to test pattern:script compatibility in PS Next, and is included as an example project in the editor as of writing. I don't recommend playing this over the finished game, but oh well.


Progress Snapshot: 7. March 2024

Overview of the 32 levels I made at this point

I was thinking about the environment and theme of the game again. Trying to workshop extra mechanics, I was looking for a more local version of sideways gravity, think conveyor belts or currents in the water. Initially seemingly unrelated: something about a single block controlled by an eyeball looked awkward to me. So I went with an abstract underwater theming where the player would be some kind of fish, or tadpole perhaps. While the idea for a water current mechanic did not stick around, I ended up realizing I could totally strip the color palette back to just four colors by simplifying the ground tiles and no longer using different colors for walls.

I also made the player bounce back from walls instead of being destroyed on impact. How I did not think of this sooner, I don't know. It's so much more fun and less punishing, as the player does not need to undo anymore, all around a very important change! This allowed me to make the first level much more open.

An even more massive change that could explain the removal of half the previous levels was to the way holes work. Now they're actually holes and you can no longer put blocks in them to use as bridges. While I am a big fan of that mechanic, I felt like it wasn't really the game's core identity at this point, and that Can of Wormholes managed to do more with it already. The last time I worked on the game was long enough ago that it didn't hurt to throw out so many levels.


Progress Snapshot: 13. March 2025

Overview of the 35 levels I made at this point

Here's a snapshot of the game right before a last hiatus.

I was testing how the game would embed on itch.io. Since the website has text and other elements, it felt important to separate the game somewhat by giving it a different background color. Looking at this rectangle in the middle of the screen, I thought it could use something like a picture frame. Wanting to add further decoration, I considered re-adding the paths from level to level as dotted lines, but ultimately settled instead on gut or brain-like 'wrinkles' in the walls in some places. I thought of the game as taking place perhaps in a larger body of some kind of creature. Öoo would have been a cool reference if I'd seen that yet.

Gameplay wise, I figured out another way to use straight pipe segments in a level, found more uses for turns and thought of a late game puzzle where you actually need to close yourself to backtrack.

The final level here is interesting to me but was later removed. It was a bit too tall, but I like that it makes the player swap between enclosed blocks that all move together, following the path of a 4x4 Hilbert Curve. This might have inspired the 'wrinkles' in the walls and especially the new space filling curve-like frame I went with in the final version, as seen in level transitions and the title screen. To me, the game is a way to appreciate geometry, I find it satisfying that the snaking patterns of lines show up at a smaller scale in the pixel art and a larger scale through arrangements of pipes.


Progress Snapshot: 23. November 2025

Overview of the 59 levels I made for the final versionThe final version. The reason I came back to work on the game regularly for this last push was the addition of a color palette changing feature to PS Next, the fork of PuzzleScript I was using to get features like level select. I'd finally get to adjust the colors per area, something I planned on doing way earlier.

A lot of big and small level and gameplay feel changes I am very happy about happened here and almost all of them are thanks to playtesting. Detailed feedback is really useful, like from video recordings of gameplay — asking for that early on might have been a good idea.

I spent a lot of time trying to add some sort of in-game manual or infographic about the self-push splitting mechanic, as there are already a total of 16 different shapes you can make from just a 4 tiles long worm. Finding the right sequence of moves I need for a particular result has been unintuitive even for me and I thought the visualization was somewhat of an unintended challenge, separate from the actual puzzle ideas. None of my attempts were received that well, they just added to the confusion. In the end, I added a subtly different frame to the area, which I assume players have missed and thought was purely for decoration. Oh well.

It's incredible to me how many level concepts I hadn't thought of before this playtesting phase. Maybe if I kept working on the game, I'd discover many more interesting interactions, even without adding extra mechanics? Speaking of extra mechanics, I actually tried to add new elements many times over the years, for example other items that could fly through pipes. They were harder to implement than anything else in the game and I had made dozens of levels for them alone, but in the end I can conclude that the extra mechanics never quite fit. If I think of something that feels perfectly natural, almost obvious in hindsight, I suppose I can come back once more and expand the game after release. See you in another 5 years? x_x


Closing thoughts

Besides the Confounding Calendar single-screen puzzles, and a social media post for Un-Lock 5 years ago, this is the first time I'm finishing a puzzle game. I like this Theseus-ship process of finding something that stands out to me, iterating on it once in a while, until I end up in a totally different place years later. Is it the best use of my time? Probably not, but the early phases of a project are the most fun to me, so I just need to start new ones all the time, right? :P

I still hop from project to project like I did ten years ago, between programming, music, graphic design, painting, whatever current rabbit hole interests me most. Because they all feel related to me, I don't really see it as a wrong choice to stop working on projects — any idea can come back in a new form or merge with another, as I slowly get a more complete picture of what feels good to work on, most personally meaningful.

I'm looking forward to my next puzzle game iteration, although it might be nice to make an effort to do something very different. I wanted nuworm to have a bit of a story, but could not think of anything to say. I wanted to create a tangible world, but rewriting the game elsewhere so I can add 3D graphics or a metroidvania-style connected world ultimately seemed too ambitious. I want to include other interests like making music, typography and generative art in future games, while still working with tools equally lo-fi and unique as PuzzleScript, possibly my own. We'll see. Until next time!

Leave a comment

Log in with itch.io to leave a comment.