Why I still blog after 15 years

Time flies when you’re having fun.

Before you know it, your little babies have started school, you celebrate the 30th anniversary of Jurassic Park, and that little blog you started have now been going for 15 years.

15 years is a long time; longer than I’ve been waiting for Winds of Winter, and that wait has felt like an eternity. How did I—who frequently abandon projects for the next shiny thing—manage to continue this blog for so long?

I’m as surprised as anyone but I’ve tried to make a retrospective of how this may have happened.

Why I started the blog

I started this blog because I wanted to create a bunch of fast game prototypes and I wanted somewhere I could write about my plans and, ultimately, the games.

You see, I was a budding programmer and I wanted to learn how to program by making a game. Not a simple game like Tetris—that would be way too sensible—no, I wanted to make a big RTS game, like StarCraft or Supreme Commander. And to do that you needed a game engine.

So I got stuck developing my engine with truly groundbreaking features such as:

  • A menu with keyboard and mouse support.
  • A console you could bring up with F2 where you could update variables (such as unit speed) without having to recompile.
  • You could select units with proper Ctrl, Shift, and right click behavior.

… But, embarrassingly, I didn’t have anything even resembling a game, and with the development speed I had I doubt I’d be finished to this day.

I’d gotten stuck in the Game Engine Trap, and I hated it.

Then I found The Experimental Gameplay Project (of World of Goo fame) that promoted the idea that you should be able to create a game prototype in just 7 days. That sounded like the perfect cure against the Game Engine Trap, so I created this blog to document my progress.

Why I’ve continued to blog

While the blog fulfilled it’s initial purpose as I developed around a dozen game prototypes that got me out of the Game Engine Trap (and that gave me a small “game engine” library at the end), I soon started write about other things.

There are a number of reasons I continued to blog:

  1. I enjoy writing.

    I realize now that the biggest reason I blog is that I enjoy the writing process. I can’t put my finger on why, I just generally like it.

    This isn’t always true though and I’ve had years where I’ve barely written anything at all (2022 for example). Sometimes I’ve had to force myself to write something.

    I guess the motivation ebbs and flows sometimes.

  2. Writing helps me think more clearly and helps me flesh out ideas.

    The act of writing something down helps me find errors in my thinking and helps me consider different viewpoints. Rewriting the text you’ve written has a similar benefit to refactoring your code; your thoughts will be more polished afterwards.

  3. Publishing something forces me to do better.

    If I’m going to put something out there I’m going to re-read and rework my text/code/ideas more than if I had kept it for myself. (Even if nobody will read your posts, the mere act of putting something out there has this effect I think.)

    For example, my custom keyboard layout wouldn’t have been nearly as well-developed if I hadn’t published it for everyone to see.

    Being more thoughtful about how I write is something I’ve become more cognizant of as the years have gone by. My first posts where little more than a stream of thoughts, while the larger posts I gravitate towards today have gone through multiple revisions and rewrites before I publish them.

  4. The blog is a place to document my personal projects.

    Over the years I’ve done other projects, such as built a 3D printer and wrote a book. It’s nice to have a place where I can write about them.

  5. Looking at a log of things I’ve done makes me feel better.

    I’ve been doing a small yearly review every year where I try to list the highlights of the past year. It’s been super helpful for me as it helps counteract the depressing feeling that nothing has happened and that I haven’t done anything.

    Doing a yearly review of some sort is a practice I highly recommend everyone to try, and of course you don’t have to publish it for everyone to see.

  6. I enjoy developing the blog as a project that exclusively solves my problems.

    Programming is my biggest hobby and I can’t see myself ever stopping. The blog is a great project as it’s something that exists only for me so I can rewrite, refactor, and add whatever silly features I want and I only have myself to answer to. It’s a nice feeling.

  7. Blogging helps me become a better writer, which in turns helps me become a better developer.

    I think communicating well is an important and underrated part of being an effective software developer. Writing well is a skill that can be developed by practice, and maintaining a blog is a pretty good way to practice I’d say.

My motivations aren’t dependent on external feedback

It’s important to point out that it’s not external feedback that has kept me going all these years. Yes, of course, it’s nice to get the occasional email with compliments, but that’s just a bonus.

I keep this blog for me to write, not necessarily for others to read.

Many of these kinds of retrospectives contain graphs of views over time or the most popular posts; but I’m not showing it to you because I can’t—I don’t keep any statistics whatsoever.

I don’t really care—and I don’t want to care—about how many readers I have or what posts are and aren’t popular. I worry that if I add statistics to the blog it’ll change from an activity I perform for the activity’s sake, to an exercise in hunting clicks where I write for others instead of for myself.

If I were chasing views I would certainly not have continued to blog for as long as I have, and I’d have missed out on the many benefits I’ve gotten from the blog.

Evolution of the tech stack

One of the reasons I’ve been blogging so long is that I’ve been able to play around with the tech stack of the blog. I’ve changed the tech stack a number of times; from choosing languages I wanted to learn, to a boring setup that “just works”, and back again.

I started out with PHP using the Kohana Framework and I still have fond memories of their excellent documentation. Although I had figured out how to create a website, it never graduated to a real blog.

Then I moved on to rewrite the site in Perl using Mojolicious. I’m not sure my efforts ever resulted in anything tangible but I remember if was fun to play around with.

I stumbled upon the idea of using a static site for my blog and therefore abandoned Perl for Jekyll, a popular static site generator at that time.

I believe it was a smart choice because it helped me start writing, instead of jerking around with cool tech.

Eventually, I grew tired of the boring backend that just got the job done and in my quest to learn Haskell I replaced the generator with Hakyll, another static site generator with a pretty neat DSL.

The earliest Git commit on record. I’m fairly sure I used Git before this point
(I abandoned SVN for my games in 2009).

Sadly, I never truly graduated from the “throw shit at the wall until it sticks” stage of my Haskell journey, which is why I barely added any features to the blog for many years.

Having outgrown existing solutions I decided to join the Rewrite in Rust club (or is it a cult?)

Religious weirdness aside, having complete control of the site generator made it fun again to tinker and add small features.

Honestly though, my favorite piece of technology on the blog is CSS. I just really like to spend time to fiddle with the design and to make small tweaks here and there. I do use Sass but 95% is just plain CSS.

Modern CSS is honestly great.

Almost by accident I started using Djot instead of Markdown to write my posts. I couldn’t find a Tree-sitter grammar for Djot so I created one.

I’m in the process of connecting the site generator to Neovim to provide autocomplete, diagnostics, jumping between posts, and other cool features.

There’s lots of potential for spending tons of time in this swamp but these IDE-like features really elevate the writing experience.

At the moment the blogging software is a whole project in and of itself (by design; it’s a fun project to tinker with).

Posts have changed focus and increased in scope

2009 2012 2014 2017 2019 2022 2024 0 1000 2000 3000 4000 5000 6000 Words Establishing Habits with Habitica: 996 words Zucchini Crabcakes: 58 words The 4-Hour Chef: Scrambled Eggs: 198 words Autumn 2016 Goals Retrospective: 396 words Being Productive: 429 words The Top Idea: 489 words Embedding youtube videos with Hakyll: 393 words My MCU movie ranking: 1049 words Bitcoin Cash needs a Specification: 610 words Design for Hackers has arrived!: 106 words HandCash handles require trust and are insecure: 588 words 5 Kup: 164 words The Coinparty hackathon, take two: 127 words Habits to start: 122 words An Elixir based payment processor for the Coinparty hackathon: 1476 words IDA Summer of Code 2014: Summary: 1196 words Goals for Autumn 2016: 1161 words Now we have a Forum: 89 words Focusing Attention: Study Hacking: 460 words Moving private repositories to Bitbucket: 136 words Before the Games: The Site: 226 words 2016 Read Books: 137 words Top ten activities that make me happy: 259 words OP_RETURN based tokens are fundamentally flawed: 637 words Getting Comfortable: 383 words MenuCity: Level 0 Walkthrough: 332 words Computer upgrade: 757 words Focusing Attention: Drawing: 244 words Eduroam for wicd in Linkoping's University: 156 words Minecraft Server Hosting: 469 words 10 Games in 10 Languages: 465 words The first (worst) post: 150 words IDA Summer of Code 2014: 198 words Early Christmas Present: 91 words New Computer!: 572 words An invisible Remake: 175 words The ASIC pit of despair: 66 words 2012 Read Books: 247 words (Fake) Bittman Chinese Chicken: 100 words Long Term Goals (part 2): 143 words Mailto: links with FastMail in Firefox: 61 words Long Term Goals: 352 words Regex substitution with unicode in Haskell: 171 words Generating ideas: 585 words Friend of the Tree: 69 words Swelling with New Shiny Books: 280 words Why make games: 111 words 2013 Read Books: 267 words 2015 Read Books: 115 words A small LED Cube: 116 words Undo git reset --hard: 75 words Back to Training: 261 words Drawing a self portrait: 64 words Plans for Summer of Code: 217 words Pushing toward Git: 61 words Easy setup of a static site on Amazon S3 with SSL: 716 words Coconut Cauliflower Curry Mash: 55 words Long Term Goals Update: 401 words Minor site updates: 636 words Site restyle and update: 894 words Death to the Forum: 144 words Bitcoin's security isn't binary: 1952 words Design for Hackers: 244 words Home office renovation: 674 words Moving to FastMail: 441 words 2014 Read Books: 313 words Other Offset coordinates in Krita with Xinerama: 366 words fish_update_completions in Slackware 14.1: 234 words Reinstalling Slackware: 1741 words Installing Krita on Slackware 14.1: 182 words Failed mime type for Krita: 55 words Hearthstone on Wine: 175 words Slackware installation notes: 562 words Preventing Firefox from creating Desktop directories: 46 words addwatch: resource exhausted: 168 words ghc 8.8.3 cannot find cabal 3.0.0.0 packages: 231 words Notifications with xmonad/irssi/urxvt: 200 words Default audio card in linux: 694 words Slackware update: 626 words Fixing Problems: 177 words Linux The killer features of the Steam Deck: 1900 words My Dream Game: The RTS: 484 words Netrunner Spring Tournament: 909 words Monaco What's Yours is Mine: 83 words Netrunner Winter Kit Tournament Linköping: 1304 words Faster than Light: 242 words CS:GO AWP Nerf: 32 words A friendly game of Twilight Imperium: 1513 words Weekend Tournaments: 506 words The Decline of FPS Games: 403 words Netrunner Lindhska Store Championship Örebro: 1774 words A Vacation Filled with Obsession: 457 words On The Decline of FPS Games: 24 words Netrunner Summer Tournament Linköping: 1082 words An intriguing new puzzle: 62 words I beat FTL on Hard with all ships in the game: 884 words Recent experiences with Netrunner tournaments: 2047 words My Dream Game: The Tycoon: 226 words My first netrunner store championship: 2208 words A Christmas Game: 109 words FTL got a new victim: 145 words The great Hochstapler: 193 words Netrunner ID draft Örebro: 1592 words Gaming A Simple Thought: 138 words Food vacation in Japan: 782 words Changes: 164 words A Four-Eyed Update: 267 words Doing some online Personality tests: 791 words It's Time for More School: 85 words Motivation is Valuable: 289 words The End of the Tunnel: 572 words What's up: 225 words A Week of Headache: 229 words Battling burnout: 2427 words Going down: 104 words Done this, done that. What now?: 208 words Soda: 113 words A Nice Weekend: 186 words The I'm Great quote: 436 words Christmas break: 356 words Finishing Stuff: 191 words We moved away from the city: 2299 words Resurrection: 291 words The games that make me who I am: 460 words Vacation: 126 words Speeding Ahead: 314 words Doing Stuff: 357 words 5 Years at Linköping's University: 2920 words Going into Being Busy mode: 75 words Going to University: 171 words Robot Project Start: 85 words Stereotypes: 111 words I, Robot: 262 words Life Exploring the Gleam FFI: 1701 words The Little Things in Life: 213 words ISOC update: 301 words Favourite Programming Language: 313 words Dijkstra's Algorithm: 679 words Entering Pintos: 206 words Focusing Attention: Programming: 356 words Widening the horizon: 349 words Rewriting my Neovim config in Lua: 3362 words Extracting schedule information from timeedit: 638 words Customizing Neovim: 1828 words Language spec in code blocks: 590 words Laying off Pintos: 126 words Understanding the Computer: 622 words Why is my file so huge?: 285 words Writing a Pollen lexer in Pygments: 1407 words A simple timeline using CSS flexbox: 2464 words Autocomplete with nvim-cmp: 2847 words rustc: error while loading shared libraries: librustc_driver: 101 words Picking up rust by writing a QR code generator: 666 words 8-puzzle in rust: 1133 words Giving the blog a facelift: 1515 words Let's create a Tree-sitter grammar: 6253 words Beginning Programming: 460 words Monty Hall: 627 words Gruvbox Syntax Highlighting for Pandoc: 435 words First impressions of Pollen: 1098 words Summer job at Configura: 1157 words Browse posts with telescope.nvim: 3496 words Back to lazy.nvim: 406 words Rewriting my blog in Rust for fun and profit: 2620 words Good and Bad Programmers: 293 words Dbot: 248 words Blogging in Djot instead of Markdown: 2074 words Tufte style sidenotes and marginnotes in Pollen: 1009 words Poking at Emacs: 395 words Microfeatures in my blog: 2579 words Migrating to rocks.nvim: 2824 words Calling closures in a Vec: 198 words My first rust Contribution: 669 words Programming 2010 in review: 476 words 2023 in review: 559 words 2011 in Review: 422 words 2018 in review: 214 words 2016 in Review: 250 words 2013 in Review: 400 words 2019 in Review: 591 words 2012 in Review: 414 words 2015 in Review: 311 words 2014 in Review: 447 words 2022 in review: 1067 words 2021 in review: 857 words 2017 in Review: 154 words 2020 in review: 704 words Yearly Review Evolution of RTS games: 3324 words August theme: Bare Minimum: 54 words Postmortem: Bugger: 449 words An Epic Start: 165 words October theme says: Numbers: 42 words Beebop The Island Hopper: 100 words A *: 68 words Grand Thief Arto: 181 words Where's Teddy?: 145 words New Year, New Theme: 100 Things: 91 words Ludum Dare 20 Timelapse: 37 words Ludum Dare 17 - an hour or two into it: 79 words Postmortem: A Geek Valentine: 647 words The Chronicles of Bim: The 100 Fake Afros: 81 words Mining Incorporated (unfinished): 129 words Postmortem: Black and White: 328 words Postmortem: Jonas IceCream Stand: 448 words Postmortem: Beebop The Island Hopper: 455 words December Theme: New World Order: 89 words Ludum Dare 29 Entry: 83 words November Theme: Art Game: 85 words Hard Work: 56 words Postmortem: Balls: 821 words My Minions: 200 words Balls: 132 words Fun or Frustration? Ludum Dare 33: 233 words Breaking the rule of three: 141 words Ugly and Slow Progress: 153 words Game Design Analysis: World of Goo: 2251 words A Geek Valentine: 195 words Up like a Sun, Down like a Pancake: 129 words My first theme: Addictive Gaming: 46 words February gets Themed: Rejection: 37 words No game this month: 197 words Settled on an unoriginal idea: 15 words We can build things!: 44 words Ludum Dare 22 results!: 224 words Rising from the Dead, it's Ludum Dare: 97 words MenuCity: 122 words Ludum Dare 22 Here I Come: 263 words Making a Game Again?: 344 words Bugger: 126 words Incomplete game coming up: 278 words Ores: 67 words March Theme: 10 seconds: 46 words Ludum Dare 22 Timelapse: 47 words Life and Shields: 48 words Groar: 109 words The Arty Timeline: 51 words Postmortem: MenuCity: 713 words Postmortem: Sat-E: 904 words Bullets and AI: 68 words Competition Feedback: 289 words Jonas IceCream Stand: 71 words Black and White: 155 words Sat-E: 121 words The Experimental Games: 944 words Postmortem: The Chronicles of Bim: The 100 Fake Afros: 307 words September theme: Failure: 33 words I Made It!: 118 words Game creation My book 'Why Cryptocurrencies?' is done: 834 words How I wrote a book using Pollen: 2585 words I'm writing a book: Why Cryptocurrencies?: 173 words How I made a kick-ass cover for my self-published book: 1709 words Writing lessons learned after writing a book: 2181 words Getting the book into my hands: 431 words Why Cryptocurrencies? is now available in print: 291 words How I did the layout for my self-published book: 2250 words The eBook for 'Why Cryptocurrencies?' is now available for free: 1368 words An update on my book 'Why Cryptocurrencies?': 363 words Book writing The T-34/0 keyboard layout: 1874 words The T-34 keyboard layout: 4590 words The current T-34 keyboard layout: 1424 words The T-34/2 keyboard layout: 1446 words Geekhack Toxic: 59 words Building the GH60: 958 words The T-34/1 keyboard layout: 1486 words I designed my own keyboard layout. Was it worth it?: 2184 words Starcraft 2 Keycaps: 96 words Keyboards Printing Hextraction for my kids: 2036 words Let's build a VORON: Major failure: 502 words Let's build a VORON: Toolhead: 1346 words Let's build a VORON: Noise: 1004 words Let's build a VORON: Software: 1458 words Let's build a VORON: Wrap-up: 709 words Let's build a VORON: Filters: 1310 words Let's build a VORON: Bed & electronics: 418 words Let's build a VORON: Printing & Tuning: 1412 words Let's build a VORON: Build start: 1332 words Let's build a VORON: Wiring: 2015 words Let's build a VORON: More mods: 2058 words Let's build a VORON: Smaller fixes: 1730 words 3D printing
Posts mapped by published date and word count, grouped into lose categories. (You'll need CSS enabled to view the Graph in a nice way.)

It probably comes as no surprise that my posts have changed a lot since I started the blog. I made the above visualization that counts the words of each post and plots them on a time axis, together with loose grouping of the type of post.

I have two main takeaways:

  1. The posts have grown larger and more ambitious.

    In the beginning I treated the blog almost like a Twitter/X feed with short updates on my game making progress. Now I spend weeks or even months slowly working away on a post until I feel it’s interesting and polished enough to publish.

  2. As my interests have changed, so has the focus of my posts.

    I only write about my hobbies or things that I’m interested in at that moment so it’s only natural that the theme of the posts have changed. Gaming related posts have given way for more programming and the occasional meat-space related project.

What does the future bring?

I find almost find it obvious that the blog has changed so much during the 15 years of it’s existence; of course my posts would grow more ambitious as my writing matured and I’d obviously start gravitating away from games towards other projects.

Naturally, it’s just a lie I tell myself with the benefit of hindsight.

Predicting the future is impossible and I have no idea what the blog will look like 15 years from now. While it feels like I’ll keep blogging the same way, it would be foolish to claim that as a fact.

Sometimes it’s best to stop worrying and just enjoy the ride.