Category: nonsense

  • I Spent 47 Days Making a Game That Lasted for 30 Minutes

    Once a month my coworkers and I play a game together. This is the story of a game that I worked on for 47 days, a game meant to be played for only 30 minutes at one of those sessions.


    My turn to host our team’s online “Social” was on May 28, 2026. Far in advance, I already knew what I wanted them to play. This game was just an idea in my head, but no matter: I figured that I could manually “run the game” by hand using ChatGPT.

    My personal philosophy is to first do a thing 100% manually, then semi-automate it, then fully script it. Usually the “manual version” is good enough. So it was settled: I’ll make my game idea come to life as the jankiest manual version of itself.

    The game I had in mind

    The Dark Lord, and Anubis-looking dude

    We are all in a Hell Dimension.

    Monsters from all over the galaxy have gathered to battle each other on a desolate planet, under the eyes of a Dark Lord.

    Each player picks a noun and their monsters’ image is AI-generated from it. Players are encouraged to choose a silly noun – so you may get a “bubblegum monster” or an “old shoe monster”.

    The monsters do battle, with each player typing in attacks as fast as they can for 25 seconds. Finally the Dark Lord (really a ChatGPT adjudicator) looks at the monster’s images and attacks to decide the winner.

    Here’s the twist: the winner absorbs the loser.

    After the battle, a new monster is created. The new monster is made up of 75% of the Winner’s body and 25% of the Loser. The losing player continues to be part of the new creature. This duo will then fight in a 2-on-2 battle against another duo (with their own composite monster). The “winner’s” attacks are weighed at 75%, but the previous round’s “loser” can still contribute to victory at a 25% weighting. And so on for smaller fractions at future rounds.

    The game concludes with an everyone-against-everyone brawl that’ll synthesize the final winner.

    Proof of concept

    On November 28, 2025, I went ahead and checked if this idea was even feasible. I had ChatGPT do the following:

    1. Generate two monster images,
    2. Decide which one would win in a battle, and
    3. Combine them at a 75/25 ratio into a new monster

    The concept looked feasible:

    We were in business, baybeeeee!

    Are we truly in business, baybeeeee?

    I couldn’t think of a way to manually run this experience over a Zoom call. Like, I could collect nouns from roughly 12 teammates, generate initial monsters for them and then what? Make pew-pew noises while they watch me screenshare a ChatGPT session?

    I guess I’ll have to build a multiplayer game.

    On April 10, I started coding.

    Time for tradeoffs

    Dear Reader I’ve nevor made a multiplayer game in moy loife.

    I’ve only made 1 game before. While it catapulted me to the top of the “violent canal-boat games” category, I built it with the Godot game engine and I had no clue how to use Godot for multiplayer games.

    May 28 was fast approaching. The pressure was on, but my work schedule had recently changed in a way that juuust gave me a chance to finish on time.

    It was feasible because this game was going to be a home-cooked meal.

    The fact this game was meant for a specific group of people meant that I could skip certain challenges:

    • Scaling – only between 10 and 16 people would be playing.
    • Logins – no need for logins or passwords.
    • Anti-cheat – this wasn’t some competitive Counter Strike game. Nobody was cheating (and if they were, it would be fugging awesome!)
    • Sleek design – this game could be real rough, because it’s charm was going to be in the fact that I hand-created it specifically for my coworkers.
    • Asset hosting – our Team Social will last only 30 minutes, so I didn’t have to worry about storing the monster images. I could just hotlink to the images that my chosen AI platform generates – these image URLs each had an ample 1-hour lifetime.

    Funny enough, the unpolished look of the game made it feel like a “quick and simple” creation to me (and I know it was neither!). My programmer sister, immediately picked up on the tonne of work that went into this game, though.

    I chose not to vibe-code this thing. Partly because I don’t have experience with coding harnesses. Partly because I wanted to put my own energy into this game so it felt like a gift to others. Finally, I wanted to learn some new technologies and you can’t learn if an LLM is doing all the work for you!

    No regrets here. Although there was a tetchy night with just 4 hours of sleep right before the deadline.

    Me learn little

    I’m a strong believer that you should “only have one crisis at a time”.

    You could rephrase this as “learn one new thing at a time, while keeping everything else familiar”.

    For this project, that meant running the game on my existing – NEARLY UNLIMITED – $90/year shared hosting (affiliate link because I’ve been with them since 2008 and this is what love feels like).

    This dictated that I use a “polling” architecture where each player’s computer repeatedly hits the server for updates, instead of a more appropriate WebSockets/Sockets.io approach where the server proactively sends updates to the players only when an update is available.

    I also leaned heavily on Python, and SQLite which is my “comfort zone database”.

    The 3 new things I decided to learn were:

    1. Building multiplayer capabilities into an app
    2. HTMX: an easy way to do polling, and to make use of data from the game server
    3. Using AI APIs throgh an Inference Platform (I chose Replicate.com)

    Hot take: Git is awful version-control software.
    If it takes everyone a lifetime to understand the mental model of a tool, then it’s been designed very badly. I don’t care how pretty the internals are or that 100 tiny Linuses created it in 1 night while dancing on the head of a pin.

    I ended up using “Fossil” version control for the first time. But as an amateur from the “just use CTRL Z as version control” school of programming, I still don’t understand the benefits of it. Finally, I had to learn Mermaid as that was the easiest way to visualize the tournament brackets.

    Things that happened along the way

    Here are some interesting parts of the 47 day journey:

    Everything’s a Chinese Dragon

    Initially, I was using “prunaai/z-image-turbo” to quickly generate monster images. But it was really difficult to get the look I wanted. Here’s an example of tweaking the prompt to generate a “crystal goblet monster”:

    All the monsters had a particular look. Eventually I thought maybe this image generation model was trained in a way that biases it. Turns out that the Z-Image foundation model was created by Alibaba’s AI division. They must’ve used a lot of images from China during model training, as well as lots of e-commerce imagery. That must be the reason why all the monsters look like Chinese Dragons and/or product hero-shots!

    I ended up switching to Flux.2 Pro. That one was created by Black Forest Labs, a German company. Their images more closely matched my concept of a monster. It’s interesting to note that this means my aesthetic preferences have a Western cultural bias.

    With all generative image models, I found that some concepts are so strong that they completely override my prompting. As an example, an “owl inspired monster” would strongly snap to being… just an owl:

    Attempts to create an owl monster mostly ended up as just an owl. Similarly, some models spotted the word “predatory creature” or “alien being” and would generate monsters that looked identical to the Predator and Alien movie monsters.

    I had to put lots of work into the monster-generating prompt. It had to be generic enough to work with any noun, but also consistent enough to give a certain look. This won’t be surprising to anyone who frequently creates AI images, but it was eye-opening to me (or maybe eye re-opening, as I’d previously used Midjourney and all the prompt tweaking was exhausting).

    Click to expand the final monster-generation prompt I went with.

    Here is the typical look of the monsters this prompt generated:

    Notice that they’re all bipedal lizardy dudes, framed by the background on boths ides, have the right number of limbs and 5 fingers on their hands. It’s a very standard look and I would use more extreme random elements in the prompt next time (“3 hands”, “a horn coming out of the chest”, “spraying acid”). The look came out a bit vicious. It would’ve been better for a game with coworkers if it was more goofy and lighthearted

    Adjudication took longer than expected

    I thought that, after a battle, deciding on a winner would be quick and my players could read through the decision right away (with the slow work of generating a composite monster image happening in the meantime).

    Things worked out the opposite way.

    The Dark Lord takes his sweet time to declare a winner

    In case of timeout or error, I made the Dark Lord choose a winner at random and say “X wins, because I like the cut of their jib and don’t owe anyone an explanation”. A simple solution for rare errors in a 1-time game!

    For some reason, OpenAI’s GPT-5-nano and GPT-5-mini would take 15 – 30 seconds to analyze the monsters’ images and attacks while generating a decision in the Dark Lord’s style. This slowed down gameplay significantly.

    In contrast, combining multiple monster images into one only took 13 – 17 seconds. I believe that it’s the analysis of 2 or 3 monster images that slowed down the adjudication. In the end, I chose to use Google’s Gemini-2.5-Flash model for generating the final decisions – it took only 5 – 7 seconds.

    Adding some spice

    I’ve already listed the things I could remove because this was a game for one group and one time – scalability, authentication, etc.

    Towards the very end, I realized that I could add certain in-jokes for the specific individuals playing the game. Each monster had a semi-random name and I made the name sometimes end similarly to a team member’s name. So it would sound eerily familiar but not quite.

    Monster name suffixed that would appear 1 out of 25 times

    In retrospect, I should’ve made these suffixes a lot more probable. After all, we’re playing this game only once together!

    Did my tech choices work out?

    With 20/20 hindsight, if I were to build this game again I would’ve upgraded my hosting to a VPS so I could have long-running apps and use Socket.io.

    Socket would let the server inform the players when there is a game event / new command to run. I had to build a polling system instead, and that was unnecessarily time consuming. I believe Socket.io would’ve also helped with synchronizing the “current time” between the server and players, to avoid key events like Battle End happening at different times for different people.

    I liked HTMX!
    I never understood the hassle of having the server send JSON objects that then influence the HTML structure of the page. HTMX cuts all that out by having the server respond to REST requests with a finished HTML fragment, that the client then jams into the existing page.

    In case you’re curious, the last programming language I actually liked was Perl 5.

    I still hate Python but I’ve gotten more comfortable with it because of this project. So, maybe I hate it a little less now?

    The final battle: everyone against everyone

    Replicate.com was a good tool for testing and switching AI models quickly. Kudos to my sister for educating me about OpenRouter and similar middleware. Replicate made it a breeze to call a variety of AI APIs, a big benefit to the project.

    What I didn’t like about Replicate how difficult it was to find a suitable AI model for a given task. Their UI is unusable for this (they provide marketing-speak instead of a comparison of features/speed). I had to use artificialanalysis.ai to choose models for the project. I also didn’t like that Replicate throttles their API usage unless you set up auto-deposits to top up spend. This wasn’t called out upfront and their documentation showed conflicting figures for the amount of preloaded cash that lifts the throttle. Finally, I thought that I’d be able to use one simple API for all models on Replicate, but each one required slightly different parameters and setup. None of these were deal-breakers.

    Was the outcome good?

    Yes!

    The whole team and I played the game and we had fun.

    I’m very satisfied with what I built! Visually, the game came out looking very Boris Vallejo (NSFW) / “pulpy” because of the font and the classic hero-stance of the monsters.

    The tournament ended and the final monster is born. The player with the “Fluffy” monster is the winner – because their original monster constitutes the biggest portion of this final creature.

    The beauty of throwing your life away

    Isn’t it funny to spend so much time on creating a 30-minute experience?

    On projects like these I am usually torn between two feelings:

    As a creative man I often feel like life is slipping away from me. With 2 kids occupying evenings and weekends and a full-time job, I would have to make brutal decisions about how I use my free time. This was especially relevant prior to April, when I’d had only ~2 hours free for projects after the kids went to bed (in practice, this often meant a lack of sleep for me).

    But also, I find that these projects – where the effort is comically disproportionate to the output – are the most satisfying to undertake (and read about! obligatory Mehran’s Steakhouse mention). I get to learn something new and, ironically, the noncommercial nature of the project gives me the stamina to carry it out to completion.

    Ultimately silly projects like “Monster Mash” are what abundance looks like. They are undertaken out of curiosity and generosity.

    Besides… this “1.5 months for 30 minutes” project is a marked improvement over my last game: that one took 3 months for 3 minutes of gameplay!

    “OK Jacob, I really wanna play it now”

    If you’ve fallen in love with the Hell Dimension Extended Universe, and you’re a loyal reader of the blog (disloyal readers will be chased out!) then reach out to me and I might set up some games for you & your friends/colleagues. No promises.

    As always, I’m <my first name> at <this website>.

    Adjudication for one of the initial 1-on-1 battles.
  • What women want


    Women want a man that
    turns his head back to look at her
    The pupil pushing to the edge, the eye crazy white
    He cracks a smile:
    Long canines. Avril Lavigne.
    Two. Three. Four of them.

    Why are your gums so dark?
    Is it all the coffee you drink? Port wine at night to unwind?
    Your breath smells like freshly killed rabbit
    Are you on that keto shit again?
    Hairy masculine arms

    She runs her hands over them,
    hair bunches up between her fingers
    Muscles moving under skin
    Those alpha-male eyes
    Tapetum lucidum glints
    when the headlights bounce off them
    What women want is a sensitive man.
    Sensitive to smells
    Acqua di Gio on the torn shirt bit she holds up to his nose
    Find a path

    Sensitive to sounds
    The snap of a twig in the nighttime forest
    Quarry

    Sensitive to the little details
    Careful: that man by the bar hides a gun in his jacket.
    And the waitress is with him
    You're getting up there into middle age
    A bit of a pouch around your midsection, no?
    But you've also been accumulating
    Scars
    Scars are like medals on a man's body
    She's lightly tracing her finger on your skin
    Starting from the belly button, up to the chest
    Burns slashes old gashes

    Her mouth turns up in a gentle smile
    Do you remember when you got this big one?
    Three AM in Busan. We were running through back alleys

    I don't

    The moon was full
    All you remember is a harsh white circle in the sky. And pain.
    Pain breaks the rhythm she winks
    Women want a man who forgets the bad times
    Her finger is still travelling up your chest
    Down her pale arm is a constellation of lines, tattooed
    Once, you asked about them
    Ley-lines on my skin
    To direct my Body Energy
    Sometimes she sticks in acupuncture needles. To send it all to one finger.
    You can't make energy from thin air
    You have to snatch it away from somewhere
    You don't need to be rich
    You just need to know that every desire has a price
    Women want a man who's willing to pay the price.
    You don't need to be strong
    You don't need to be smart
    You don't need to be handsome
    What women want
    is a man who is utterly focused
    When she opens her mouth
    and whispers

    When she parts her blood-red lacquered lips
    And you see the tips of her little teeth
    And you are willing to do anything
    She whispers

    When she parts her shiny red lips
    A man who is completely obedient
    Teeth like little porcelain pebbles
    They gently click against each other
    when she whispers

    When she opens her red lips
    A man obsessed
    All you see is the reflection of the moon
    blitting across hard small teeth
    And she whispers:
    KILL KILL KILL
  • Lice Pliskies

    Sometimes I mishear things, and then I have to go and create them.

    Dear reader: I’d love for someone to create a cereal where the 3 mascots are named Hork, Dribble and Plop. If you’re up for the challenge then send me an image of your creation!

  • GHOST

    A Slack drama based on true events. If you don’t get automatically redirected then click here to start the story.

    (more…)
  • adultsonly

    Freshly back from a trip to London, England. Here are some illustrations inspired by ducks that followed us around a pond.

    “Where are the ducks’ ears?”

    Well…

    And some more animals that have no business having ears:

  • Thanks for the Nightmare Fuel, Midjourney!

    If she should ever
    If she should ever
    If she should ever darken your couch with
    her presence
    burn the sage and sulphur
    and never ever do look at your own shadow
    lest you never unlearn you are just
    as
    unbelonging
    in
    this
    place
    as
    her

  • Canal boat simulator

    Dear Reader,

    Alcohol is a hell of a drug.

    It’s night. I’m sitting and drinking my Jura. Relaxing with an episode of “Narrow Escapes“, a show about life on Britain’s inland canals.

    Tonight’s feature is about a pair of young canal boaters: Amy is a game streamer and Wes is a game level designer.

    Everything is going swimmingly until Wes says1:

    So I goes PFFFFFFTTT I BET ITS GOING TO BE A GRITTY CANAL BOAT GAME!!!!

    And… and then…

    And then in my addled state I go

    🧠 Pff ff ff t, I bet… it’s going to be a… gritty… canal boat game. 🧠

    Days later, the idea stuck and wouldn’t leave… so I went and made the game!

    I’ll tell you all about it. But first you gotta play the game. Crank the volume up. Go on. I’ll wait until you finish:

    Now, you can’t judge the game harshly because it is a prototype.2 For the full epic story of making the game, read on:

    Previously, I created a stunning true-life 3D simulation of life on a Victorian London street. So I had mastered a game engine and could make the boat game real quick.

    Pictured: “Fancy an oyster, ‘guvna?” – an uncanny simulation of London street life

    I figured “how hard could it be?”

    Just steal some aerial photos of canals, slap invisible 3D walls on the canal’s sides so the boat bumps against them, make the camera follow the player from above and 💲💲💲💲💲💲’yknow?

    Except, I don’t know how to use actual 3D modeling software.

    Nevermind. There must be a simple way to create those 3D canal borders. Apparently “Paint 3D” is great for beginners like me. Oh, what’s that? It’s been discontinued you say? Well, I’ll go on a quest to download an old version and what is this extruded sausage nonsense?

    Pictured: Paint 3D’s extruded sausage nonsense

    It’s fine. No worries. Maybe we’ll represent the borders of the canal with these things called heightmaps so it’ll kinda make the walls happen on their own?

    Ummm… no?

    Well, lets try a whole bunch of things and oh Sweet Jesus of Nazereth:

    What 3 days of work looks like.

    So, Dear Reader, how far do you think that one should go for a joke game conceived in an addled state of mind?

    Pretty flippin’ far I tell you.

    I had to get serious.
    Learn to develop with a Real Game Engine™.
    Man up.
    Hit the gym.

    I reviewed a variety of engines and decided to use a popular engine called Godot. I called up my developer friend Chad G. Petey and we set to work on this gritty canal extravaganza.

    From start to finish, the whole game took 2 months and 22 days to finish. This includes the “false start” with the CopperLicht engine that I knew from before. Working in the evenings for about 2 hours a day.

    Getting the thing to just function as a Web game on mobile took a lot of tweaking. Getting it to work well took even more. This part was so challenging that I wrote a separate article with all the tricks for exporting a Godot game to HTML5 on mobile.

    The game itself takes just 3 minutes to complete3. I think of it as my month-a-minute game as each minute of gameplay took a month of dev.

    What I learned as a game tycoon

    • I am astonished at how powerful and straightforward the Godot game engine is. In my career, I have seen the perfection that is Excel and Salesforce.com. But I didn’t realize that other industries also have heavyweight software that’s just a pleasure to use.
    • The “fun” element makes game development different from other kinds of programming. The game code might “technically work” but that doesn’t accomplish the mission of being fun. You have to keep playing and perfecting an enjoyable formula. There’s real challenge and magic here.
    • Once you get one game level working, with the core dynamics dialed-in to be fun, building out additional levels feels very simple.
    • You can get away with a lot of mistakes if you keep the player moving fast and focused on a certain part of the screen. For example, Canal Carnage is missing portions of the background, but you wouldn’t notice because you’re focused on escaping the tsunami. You’re not looking around at leisure.
    • You can keep polishing a game forever. I’d like to improve the animation of the explosions, move the health meter next to the player, add a leaderboard + timer for calculating how fast you completed a level, add mobile boat enemies, create a proper splash screen, and and and and… all of these tweaks take time and push out the launch. You need to be disciplined and stop yourself.
    • It was very difficult to publish the game as a mobile-friendly HTML5 game. This drove home that you really need to know the internals of your game engine. For game developers, this presents a real barrier to switching engines.
    • I gained an added appreciation for the work of artists. For example, while finishing up the game, I watched Alien: Romulus and I could spot certain tricks that the director/writers used for heightening tension. These elements were completely unnecessary to the story, but I could see them using the same cheap tricks that I used to heighten urgency. (“There’s a xenomorph attacking her in the elevator shaft! Oh no, there’s also a face-hugger that joined the fight!!! Now she’s really done for!”)
    • ChatGPT set me up with all the boat dynamics, vector velocity, rotation, friction from water resistance, applying drift as an additional vector… I wouldn’t be able to figure this all out myself by reading tutorials (unless there’s literally a “boat controls” tutorial). I moved very fast. Also, by using ChatGPT I missed out on learning the underlying physics of the game. But, frankly, I don’t have any interest in that.
    • When ChatGPT fails, it looks like the conversation going around and around in circles. It takes some time to notice when this is happening. At that point, Youtube videos become invaluable. I especially benefited from the videos Godot particle emitter tutorial and Godot Control Node (UI) masterclass.
    • If you want to be the best at something, just pick a weird niche that nobody would ever want to build something in. Like gritty canal boat games. I’m truly #1 in this space. For more “useful” life advice like this, subscribe to my RSS feed.
    • I vibe-coded a game in 3 months that an experienced developer could’ve made in a weekend. Take from that what you will.
    • Both my friend Rafal and I were surprised that the child-oriented Kidscancode Godot tutorials had genuinely valuable information that was unavailable elsewhere.

    Game Soundtrack

    Here is are the music credits for all the scenes in the game4:

    Level 1

    The track “Turbokiller”, shamefully stolen from Carpenter Brut

    Level 2

    Klasey Jones – Romanova

    Smoke break at the canal locks

    BACKWHEN – Flashback

    Level 3

    Miho Nakayama – Sherry

    Level 4

    CRYPT – PSYCHO [INSTRUMENTAL]

    Level 4, redone on massive amounts of drugs

    Hannah Laing – Poppin’

    Interlude at the boat dock

    Midnight Premiere – Your gaze

    Background music in Yakuza nightclub where you lock eyes with a new, younger boat

    iacon – suchatease

    Scene where the hot new boat dumps you because of your hero complex. You limp back to your old battle-boat.

    Danz CM – I don’t need a hero

    Scene where your old boat takes you back. (Jeez, you better not blow it again. You’re a real piece of work.)

    Funny Falentine – Together

    Boss battle where you have to defeat L.T.C. Rolt on the bridge of the canal boat. He’s dressed head-to-toe in Gucci and you a scrub.

    iacon – redalert

    Game victory celebration music

    Dylarama – Comme des dominos

    Credits roll – you and your canal boat are relaxing in the sauna

    Stepa – Sauna

    Credits

    Closing words

    Want to play a better canal boat game in glorious 3D?
    Try Narrowboat Simulator by Michael Donning!


    1. For the record, what Wes actually says is: “I’d definitely like to make my own small game at some point. Probably narrow-boat themed … Like a cute little, relaxing feel good little indie game. About just stuff on the narrow boats”. Absolutely the opposite of the hot garbage I made. Wes and Amy have a wonderful Youtube channel that you should check out. Start with this behind-the-scenes look at the filming of their Narrow Escapes episodes. ↩︎
    2. A “prototype” is a word I discovered that lets me serve up unfinished junk to my readers and get away with it. ↩︎
    3. The game is so short because it is just 1 level. I told you: it’s a prototype! That makes everything OK. ↩︎
    4. What is that you say? That none of these levels exist in the game, and that this is just my excuse to post a playlist?!
      Well – of course – IT’S A PROTOTYPE!
      You know, Dear Reader… sometimes I worry about you. ↩︎
  • Jacob’s phone simulator

    Below is a simulation of how I browse the web now.
    Not everyone uses phones in the same way. I hope this tool helps Web Designers ensure that their website is readable and accessible for all sorts of folks 🙏


    Press backspace button in the browser to go back.

    This project was inspired by my crappy phone. Love you lots, “Mr. Crackles”!

  • Corgizstan

    Corgizstan Tourism Poster by Jacob Filipp is marked with CC0 1.0. To view a copy of this license, visit https://creativecommons.org/publicdomain/zero/1.0/

    This little guy has been living rent-free in my brain for months. The Corgizstan Tourism Ministry welcomes you with open paws.

    This poster is marked CC0 1.0 – you are free to use it however you like.