Latest Posts (20 found)
Brain Baking 3 days ago

25 Years Of ADSL Speed

Twenty-five years ago, I captured a screenshot of my FTP client showcasing the download of a SuSE Linux gcc compilation package at the dazzling rate of : Downloading the gcc cross-compiler for s390x through the ftp.belnet.be mirror. Note the then very new Windows XP Olive theme. For some reason, that screenshot must have been relevant, as I found it uploaded as part of my UnionVault.NET museum from 2002. Nowadays, such a download speed can officially be scoffed at as being slower than a snarky snail. Yet in 2000-2002, that was lightning-fast. Perspectives change. In Belgium, telecom company Belgacom introduced ADSL in 1999, significantly boosting our digital lives. No longer did I have to hang up the ISDN line when chatting over ICQ when mom wanted to do a quick phone call to grandma to ask about next week’s party. No longer did we have to listen to squeaky sounds and wait and wait and wait… for an image or file to appear. The future was here! For our family, the future was here a smidge earlier than the average Flemish family as my dad worked very close to the source. He was one of the Belgacom employees responsible for testing out various early ADSL modems at home, so our dialup method changed frequently. I do remember that we too were blessed with “The Frog”: the Alcatel ‘Stingray’ ADSL SpeedTouch USB Modem that looked like a frog or ray, depending on who you’d ask: The first iteration of the Alcatel SpeedTouch modem. That lovely shape was capable of handling at most downstream but our cables/ISP was not ready to handle that just yet. In September 2002, Belgacom announced they would further increased the ADSL bandwidth : Snelheidsverhoging: alle Belgacom ADSL-abonnementen. De maximum downstreamsnelheid bedroeg sinds de lancering 750 Kbit/s (ADSL GO) en 1Mbit/s (ADSL Plus-Pro-Office-Premium). Door de bijkomende investeringen en netwerkaanpassingen van Belgacom zal de meerderheid van de klanten pieksnelheden kunnen halen tot . Deze werkzaamheden zullen vermoedelijk voltooid zijn in het eerste kwartaal van 2003. Three whoppin’ megabits (not bytes) per second! Can you imagine that? I guess you can given the current average download speeds of… Wait, let me check speedtest.net … or, in other words, 93 times faster than the bleeding-edge 2003 speeds 1 . Try streaming your favourite YouTube video with a few megabits per second. YouTube didn’t exist until two years later (2005). Perspectives change. In that statement they mention they have 400k customers. Given the widespread adoption of internet in Belgium, that number can be safely multiplied by ten nowadays. The Skynet ISP that was bought up by Belgacom and hosted our very first personal homes under provided a monthly limit of . According to Belgacom in that same announcement, only a tiny portion of their users effectively hit that limit. Nowadays, everyone is accustomed to “stream whatever, whenever! YOLO!”. Back then, speeds were “high”, but we still had to be mindful of the stuff we downloaded each month, especially when wading through newsgroups looking for shady new releases Perspectives change. I wonder if my dad kept a list of the routing hardware we burned through in those late nineties/early noughties. All I can recall is that it was a lot . Since he was employed by the national telecom company that only really was (and still is) rivalled by a single other company—Telenet—we never tried the alternative. Nowadays, multiple “shadow” ISPs exist like Orange, Mobile Vikings, and Scarlet that hire the Proximus cable network. Proximus is the rebranding and full privatisation of Belgacom that was the rebranding of the institute RTT ( Regie voor Telegraaf en Telefoon —or, as my dad would call it, Rap Terug Thuis ). Unfortunately, the Web Archive never crawled all homes and I neglected to backup whatever my dad uploaded on there so our stuff is forever gone. I regret taking only a single screenshot of my download speed, so I cannot repeat this enough: archive your stuff ! That’s also the oldest screenshot of my machine/OS I have; the other desktop screenshots are from 2004+. This blog post is just an excuse to get that image under the moniker. According to meter.net historical speed tests results , only five years ago, for Belgium, that average was . Does this mean that in five years it’ll be on average ? That’s more than a CD-ROM in less than a second. Perspectives change. In twenty more years, nobody will remember what a CD-ROM even is.  ↩︎ Related topics: / adsl / screenshots / By Wouter Groeneveld on 11 March 2026.  Reply via email . According to meter.net historical speed tests results , only five years ago, for Belgium, that average was . Does this mean that in five years it’ll be on average ? That’s more than a CD-ROM in less than a second. Perspectives change. In twenty more years, nobody will remember what a CD-ROM even is.  ↩︎

0 views
Brain Baking 6 days ago

A Note On Shelling In Emacs

As you no doubt know by now, we Emacs users have the Teenage Mutant Ninja Power . Expert usage of a Heroes in a Hard Shell is no exception. Pizza Time! All silliness aside, the plethora of options available to the Emacs user when it comes to executing shell commands in “terminals”—real or fake—can be overwhelming. There’s , , , , , and then third party packages further expand this with , , … The most interesting shell by far is the one that’s not a shell but a Lisp REPL that looks like a shell: Eshell . That’s the one I would like to focus one now. But first: why would you want to pull in your work inside Emacs? The more you get used to it, the easier it will be to answer this: because all your favourite text selection, manipulation, … shortcuts will be available to you. Remember how stupendously difficult it is to just shift-select and yank/copy/whatever you want to call it text in your average terminal emulator? That’s why. In Emacs, I can move around the point in that shell buffer however I want. I can search inside that buffer—since everything is just text—however I want. Even the easiest solution, just firing off your vanilla , that in my case runs Zsh, will net you most of these benefits. And then there’s Eshell: the Lisp-powered shell that’s not really a shell but does a really good job in pretending it is. With Eshell you can interact with everything else you’ve got up and running inside Emacs. Want to dump the output to a buffer at point? . Want to see what’s hooked into LSP mode? . Want to create your own commands? and then just . Eshell makes it possible to mix Elisp and your typical Bash-like syntax. The only problem is that Eshell isn’t a true terminal emulator and doesn’t support full-screen terminal programs and fancy TTY stuff. That’s where Eat: Emulate A Terminal comes in. The Eat minor mode is compatible with Eshell: as soon as you execute a command-line program, it takes over. There are four input modes available to you for sending text to the terminal in case your Emacs shortcuts clash with those of the program. It solves all my problems: long-running processes like work; interactive programs like gdu and work, … Yet the default Eshell mode is a bit bare-bones, so obviously I pimped the hell out of it. Here’s a short summary of what my Bakemacs shelling.el config alters: Here’s a short video demonstrating some of these features: The reason for ditching is simple: it’s extremely slow over Tramp. Just pressing TAB while working on a remote machine takes six seconds to load a simple directory structure of a few files, what’s up with that? I’ve been profiling my Tramp connections and connecting to the local NAS over SSH is very slow because apparently can’t do a single and process that info into an autocomplete pop-up. Yet I wanted to keep my Corfu/Cape behaviour that I’m used to working in other buffers so I created my own completion-at-point-function that dispatches smartly to other internals: I’m sure there are holes in this logic but so far it’s been working quite well for me. Cape is very fast as is my own shell command/variable cache. The added bonus is having access to nerd icons. I used to distinguish Elisp vars from external shell vars in case you’re completing as there are only a handful shell variables and a huge number of Elisp ones. I also learned the hard way that you should cache stuff listed in your modeline as this gets continuously redrawn when scrolling through your buffer: The details can be found in —just to be on the safe side, I disabled Git/project specific stuff in case is to avoid more Tramp snailness. The last cool addition: make use of Emacs’s new Completion Preview mode —but only for recent commands. That means I temporarily remap as soon as TAB is pressed. Otherwise, the preview might also show things that I don’t really want. The video showcases this as well. Happy (e)sheling! Related topics: / emacs / By Wouter Groeneveld on 8 March 2026.  Reply via email . Customize at startup Integrate : replaces the default “i-search backward”. This is a gigantic improvement as Consult lets me quickly and visually finetune my search through all previous commands. These are also saved on exit (increase while you’re at it). Improve to immediately kill a process or deactivate the mark. The big one: replace with a custom completion-at-point system (see below). When typing a path like , backspace kills the entire last directory instead of just a single character. This works just like now and speeds up my path commands by a lot. Bind a shortcut to a convenient function that sends input to Eshell & executes it. Change the prompt into a simple to more easily copy-paste things in and out of that buffer. This integrates with meaning I can very easily jump back to a previous command and its output! Move most of the prompt info to the modeline such as the working directory and optional Git information. Make sort by directories first to align it with my Dired change: doesn’t work as is an Elisp function. Bind a shortcut to a convenient pop-to-eshell buffer & new-eshell-tab function that takes the current perspective into account. Make font-lock so it outputs with syntax highlighting. Create a command: does a into the directory of that buffer’s contents. Create a command: stay on the current Tramp host but go to an absolute path. Using will always navigate to your local HDD root so is the same as if you’re used to instead of Emacs’s Tramp. Give Eshell dedicated space on the top as a side window to quickly call and dismiss with . Customise more shortcuts to help with navigation. UP and DOWN (or / ) just move the point, even at the last line, which never works in a conventional terminal. and cycle through command history. Customise more aliases of which the handy ones are: & If the point is at command and … it’s a path: direct to . it’s a local dir cmd: wrap to filter on dirs only. Cape is dumb and by default also returns files. it’s an elisp func starting with : complete that with . else it’s a shell command. These are now cached by expanding all folders from with a fast Perl command. If the point is at the argument and … it’s a variable starting with : create a super CAPF to lisp both Elisp and vars (also cached)! it’s a buffer or process starting with : fine, here , can you handle this? Are you sure? it’s a remote dir cmd (e.g. ): . it’s (still) a local dir cmd: see above. In all other cases, it’s probably a file argument: fall back to just .

0 views
Brain Baking 1 weeks ago

Favourites of February 2026

A sudden burst of Japanese cherry flowers sparkling in the sun brings much-needed lightheartedness into our late February lives. Before we know it, the garden will be littered with these little pink petals, and the very short blossom season will be behind us. Our cherry tree always had the tendency of being early, eager, and then running out of steam. It’s weird to have temperatures reach almost twenty degrees Celsius while a few weeks ago it was still freezing. No wonder the tree is confused. A deep blue sky overlooking the cherry blossom in our garden. In case you were wondering: no, this weather is not normal: it’s yet another noticeable temperature spike. Our local (retired) weatherman Frank explains the spikes and provides proof towards upwards instead of downwards temperature peaks (in Dutch). At this point, I’m just grateful for the much needed sunshine. Previous month: January 2026 . I’m giving up on Ruffy. It’s just unplayable on the Switch which is a damn shame as the N64 throwback collect-a-thon 3D platformer with rough edges looks like the perfect fit for the Switch—and it should be. It’s far from a demanding game so the only conclusion I can make is that it was poorly optimized for my platform of choice. And I bought the Limited Run Games physical version… Instead, I’ve turned to Gobliins 6 , a quirky French adventure game made by just one guy. It has equally frustrating moments and rough edges but I can more easily forgive it for its faults: it’s Gobliins! The fact that after 34 years (!!), there’s an official sequel to Gobliins 2: The Prince Buffoon is just crazy. I have fond memories of that game as I used to play it together with my dad on his brand new 486. I didn’t understand English nor was I able to solve most time-based puzzles but the Gobliins exposure got permanently burned into my brain—so much so that its pixel art became a basis for my retro blog . Even though it’s advertised to be a Windows-only game, ScummVM has got you covered: In the Fox Bar just after Fingus reunites with Winkle. If Gob6 sells well, Pierre might go ahead and make Gob7 a direct sequel to Goblins Quest 3 . Fingus—err, fingers crossed for Blount’s return! Related topics: / metapost / By Wouter Groeneveld on 4 March 2026.  Reply via email . Let’s start with more Gobliins stuff: Michael Klamerus summarized the history of the games to bring you up to speed. Mark self-hosted a book library tool called Booklore that links to your Kobo account. Michał Sapka nuances the “ I hate genAI ” screams of late. Elmine Wijnia writes in De Stadsbron (in Dutch) about OpenStreetMap and wonders whether we can finally get rid of Google Maps. Space Panda continues fighting against bots on their site . It’s fun to see the bot honey pots working but aren’t we now wasting even more resources doing nothing? Arjan van der Gaag shares how he uses snippets in Emacs with Yasnippet . I think I’m going to migrate to Tempel.el instead, but that’s for another story. There’s an interesting thread on ResetERA about old games that have yet to be replicated . Someone mentioned Magic the Gathering: Shandalar ! Jeff Kaufman shared a photo of two chairs placed on a snowy parking space . Apparently, that’s customary to “reserve” your spot. I’ve never seen such a ridiculous selfish act in a while. Is this a typical USA thing? Wolfgang Ziegler continues his Game Boy modding spree, this time with an IPS screen mod . The result looks stunning! Hamilton Greene shares his adventure with programming languages and talks about the “missing language”. I don’t agree with his stance but it’s interesting nonetheless. Scott Nesbitt writes on an old Singer desk ! Greg Newman organized the Emacs writing carnival challenge and shares links of others’ writing experiences with their favourite editor (25 entries). Greg also designed the Org-mode unicorn logo! Speaking of which; James Dyer shows his streamlined Eshell configuration that inspired me to hack together my own. To be continued in a future blog post, whether you’ll like it or not. Markus Dosch shares his journey from Bash to Zsh and now Fish . I’m slowly but surely getting fed up with Zsh and all those semi-required plugins so I might switch to Fish as well. But actually… I switched to Eshell. You didn’t see that coming, did you? Henrique Dias redesigned his website and the result looks very good, congrats! I especially like the fact that the new theme takes advantage of wide screens (note to self). Michael Stapelberg tried out Wayland and concludes that it’s still not ready yet. X11 is not dead yet. I found the Lockfile Explorer documentation on pnpm lockfiles to be very thorough and insightful. Feishin is a modern rewrite of Sonixd, a Subsonic-compatible music desktop client that looks promising. I’ve been a Navidrome user for five years now but am looking for a good client that supports offline playback. It doesn’t (yet) . Related: the Symfonium Android app that does do caching. I’m using Substreamer for that and that works well enough. scrcpy is a tiny Android-based screen sharing tool that I use in classes to project my Android screen. Handy! Another tool for presenting: keycastr helped me teach students how to use shortcuts. I might have already shared this, but you should replace pip with uv : it’s +10x faster and can also manage your project’s . Oh, and in case you haven’t already, replace npm with bun . Discord’s age verification facial recognition tool got bypassed pretty fast —rightfully so.

0 views
Brain Baking 1 weeks ago

An Album For Every Year Of My Life

Inspired by Tom’s One Album for Every Year of Life compilation, Robert created his own list. It’s been a while since I last published a list related to music so here’s my own that should contain 40 items. This was a much more challenging exercise than I initially thought. It took me almost an entire day to compile the list and it still contains holes. In any case, scrolling through the list is another way to reveal the evolution of my musical taste . Each row includes a sample track I picked out for your listening pleasure. Every link redirects to YouTube to keep things as simple as possible. The idea is that these samples make the list a bit more interesting for people who are looking into expanding their musical tastes. Album art: the eighties. Very easy to compile. Genres: metal, pop/rock, new wave/synth. I love eighties music as is apparent by having the GTA Vice City radio stations on repeat for years and years. I kind of cheated by including two compilation albums in this list of which Decade is the first: all the good stuff is from before 1985. There’s so much great new wave/synth pop music out there, but I have yet to discover the full length albums as I usually aim for the more popular individual tracks. When I’m in the mood, I appreciate the odd metal/hard rock track, but as will become clear in the next section, it’s not my main genre. Album art: the nineties. Very easy to compile. Genres: rap overload! My music nineties are heavily dictated by hip-hop super-groups of which Wu-Tang’s Enter The Wu-Tang is the most influential. Since then, I’ve been a devout Wu follower as is apparent from the spin-offs ( Gravediggaz ) and solo albums ( Liquid Swords ) on this list. Beyond a good doze of underground rap, there’s also the king of the G-Funk. I first had the new king listed on 1999 ( Dr Dre: Chronic 2001 ) but Dan The Automator’s weird stuff takes more priority. The few non-rap albums are either compilations ( Middle of the Road ) that my mother brainwashed me with or late pop rock goodies (I love Genesis but hate their slow songs). Album Art: the noughties. Moderately difficult to compile. Genres: alternative/underground rap, electronic. I faced difficulties filling the latter half of the noughties as my musical brain was stuck in either the golden age of rap (the nineties) or the golden age of synth music (the eighties). Still, this decade includes some of the best albums ever made ( Madvilliany ) and great super-group deliverables that I’ll listen to any day ( Jurassic 5 & Hieroglyphics ). Much later, I discovered I also love chiptune music and electronic (rock). The inclusions here are recent aquisitions: in the noughties, my mind was still very much set on rap. Album art: the 2010s. Difficult to compile. Genres: hip-hop, electronic, funk. Mega Ran is probably my biggest discovery from this time: an MC rapping about video games and remixing classic video game soundtracks? Here’s my wallet, where do I sign? More chiptune electronic starts finding its way into my playlist feed, with Cory Wong and his Vulfpeck as the latest funky additions. Album art: the 2020s. Impossible to compile. Genres: Hip-hop, funk, electronic. Most albums I buy nowadays are released in the previous decade(s); I’m a “slow discoverer” when it comes to contemporary music: hence the absence of entries in the years 2024, 2025, 2026. If you have any suggestion based on my taste laid out here please let me know. I’m happy to report that hardcore hip-hop is not dead yet. Czarface proves this—yet another Wu spin-off by original Wu member Inspectah Deck and the duo 7L & Esoteric . They consistently put out great comic book inspired stuff. I just learned about Stress Eater , a spin-off involving Kool Keith . Maybe that album should be on 2024 in a few months. Related topics: / music / By Wouter Groeneveld on 2 March 2026.  Reply via email .

0 views
Brain Baking 2 weeks ago

Managing Multiple Development Ecosystem Installs

In the past year, I occasionally required another Java Development Kit besides the usual one defined in to build certain modules against older versions and certain modules against bleeding edge versions. In the Java world, that’s rather trivial thanks to IntelliJ’s project settings: you can just interactively click through a few panels to install another JDK flavour and get on with your life. The problem starts once you close IntelliJ and want to do some command line work. Luckily, SDKMan , the “The Software Development Kit Manager”, has got you covered. Want to temporarily change the Java compiler for the current session? . Want to change the default? . Easy! will point to , a symlink that gets rewired by SDKMan. A Java project still needs a dependency management system such as Gradle, but you don’t need to install a global specific Gradle version. Instead, just points to the jar living at . Want another one? Change the version number in and it’ll be auto-downloaded. Using Maven instead? Tough luck! Just kidding: don’t use but , the Maven Wrapper that works exactly the same. .NET comes with built-in support to change the toolchain (and specify the runtime target), more or less equal to a typical Gradle project. Actually, the command can both build list its own installed toolchains: . Yet installing a new one is done by hand. You switch toolchains by specifying the SDK version in a global.json file and tell the compiler to target a runtime in the file. In Python , the concept of virtual environments should solve that problem: each project creates its own that points to a specific version of Python. Yet I never really enjoyed working with this system: you’ve got , , , , , … That confusing mess is solved with a relatively new kid in town: uv , “An extremely fast Python package and project manager, written in Rust.” It’s more than as it also manages your multiple development ecosystems. Want to install a new Python distribution? . Want to temporarily change the Python binary for the current session? . Creating a new project with will also create a virtual environment, meaning you don’t run your stuff with but with that auto-selects the correct version. Lovely! What about JS/TS and Node ? Of course there the options are many: there’s nvm —but that’s been semi-abandoned ?—and of course someone built a Rust-alternative called fnm , but you can also manage Node versions with . I personally don’t care and use instead, which is aimed at not managing but replacing the Node JS runtime. But who will manage the bun versions? PHP is more troublesome because it’s tied to a web server. Solutions such as Laravel Nerd combine both PHP and web server dependency management into a sleek looking tool that’s “free”. Of course you can let your OS-system package manager manage your SDK packages: and then . That definitely feels a bit more hacky. For PHP, I’d even consider Mise. Speaking of which… Why use a tool that limits the scope to one specific development environment? If you’re a full-stack developer you’ll still need to know how to manage both your backend and frontend dev environment. That’s not needed with Mise-en-place , a tool that manages all these things . Asdf is another popular one that manages any development environment that doesn’t have its own dedicated tool. I personally think that’s an extraction layer too far. You’ll still need to dissect these tools separately in case things go wrong. Some ecosystems come with built-in multi-toolkit support, such as Go : simply installs into your directory 1 . That means you’ve installed the compiler (!) in exactly the same way as any other (global) dependency, how cool is that? The downside of this is that you’ll have to remember to type instead of so there’s no symlink rewiring involved. or can do that—or the above Mise. But wait, I hear you think, why not just use containers to isolate everything? Spinning up containers to build in an isolated environment: sure, that’s standard practice in continuous integration servers, but locally? Really? Really. Since the inception of Dev Containers by Microsoft, specifically designed for VS Code, working “inside” a container is as easy as opening up the project and “jumping inside the container”. From that moment on, your terminal, IntelliSense, … runs inside that container. That means you won’t have to wrestle Node/PHP versions on your local machine, and you can even use the same container to build your stuff on the CI server. That also means your newly onboarded juniors don’t need to wrestle through a week of “installing stuff”. Microsoft open sourced the Dev Container specification and the JetBrains folks jumped the gun: it has support for but I have yet to try it out. Of course the purpose was to integrate this into GitHub: their cloud-based IDE Codespaces makes heavy use of the idea—and yes, there’s an open-source alternative . Is there Emacs support for Dev Containers? Well, Tramp allows you to remotely open and edit any file, also inside a container . So just install the Dev Container CLI, run it and point Emacs to a source file inside it. From then on, everything Emacs does—including the LSP server, compilation, …—happens inside that container. That means you’ll also have to install your LSP binaries in there. devcontainer.el just wraps complication commands to execute inside the container whilst still letting you edit everything locally in case you prefer a hybrid approach. And then there’s Nix and devenv . Whatever that does, it goes way over my head! You’ll still have to execute after that.  ↩︎ Related topics: / containers / By Wouter Groeneveld on 26 February 2026.  Reply via email . You’ll still have to execute after that.  ↩︎

0 views
Brain Baking 2 weeks ago

Never Blow Up Your Bridges

Ten years ago, I first met my now colleague who then acted as the internship guide for a couple of graduate students that had their first taste of the industry at my previous (previous) employer. We only had brief contact: I was supposed to guide the interns from the industry side, and he was supposed to guide them from the education side. We shook hands and never saw each other again. Until four years later, while I was doing my PhD and ended up in the jury for the Vlaamse Programmeerwedstrijd , a local programming contest organised by multiple higher education institutions to promote (applied) computer science. It turned out that he was also a jury member, still representing the same institution. We attended a few preparation meetings, executed our roles as jury members for a few years, shook hands and never saw each other again. Until a couple of months ago, when I was looking to get back into education and asked him if he didn’t happen to know of any open vacancy spots. He did. I jumped the gun. Now we’re direct colleagues: in fact, this semester, we’re teaching a course together. Isn’t life strange? The only job I landed using zero resources but myself was my first job. Seven years later, more than tired of consultancy, I left and joined a smaller product development company where an engineering manager started just before me. That was no coincidence: that same manager and I worked together on multiple projects and it was largely thanks to him that I got in. Fast forward four more years: I started teaching half-time. It was another colleague who knew I liked transferring knowledge and coaching that sent me the job ad: I wasn’t intentionally looking for something like that. A semester later, I quit my job and started combining 50% teaching with a PhD. Five years later, I started freelancing and found my first client through old contacts in the industry. The recruiter that interviewed me knew me well: she and I actually used to recruit together for another company. The CEO of that company knew me as she managed one of the projects I worked on. A couple of months later, my old research group contacted me, inquiring the development of a specific survey tool. Fast forward another year. I work for a startup because the owner and I worked together on a project we both have nostalgic feelings about. He called me to ask if I was available for another challenge. When I told my current client I accepted his invitation, they immediately responded with “if you’re ever done with that, give us a call”. You know the rest. I transitioned back into teaching . But you never know, it might start itching again… Never blow up your bridges. If you manage to build a couple, you can always cross them—and if needed, retrace your steps. (None of these bridges were built or crossed with the help of LinkedIn . I do not have an account there. Contrary to popular opinion, you don’t need a corporate social media account to connect with people.) Related topics: / work / By Wouter Groeneveld on 23 February 2026.  Reply via email .

0 views
Brain Baking 3 weeks ago

A Note On Presenting Code in Emacs

The other day, I decided it was finally time. It was finally time to open Emacs to demonstrate certain code functionalities in class. The result was predictable: it caused further confusion among already confused students. The root cause wasn’t switching out a familiar WebStorm-like environment for an esoteric IDE but rather the way the code was presented. Most classrooms come equipped with crappy projectors that are experts in washing out colours and blurring otherwise perfectly crisp text. My first instinct after opening up an editor in class is to zoom in. That always worked well enough—either by pinching on the trackpad ( oooh look at that smooth zooming animation in IntelliJ!) or by pressing . That zoom never worked that great in Sublime as the tree view didn’t budge, but it worked well enough for the few lines of code that needed selecting and highlighting. Naturally, in Emacs, I bound to and continued to press as I have been doing so for the past decade. The story wouldn’t end there otherwise there wasn’t enough for me to write here. Same problem existed: the tree view didn’t budge. But the worst problem was that the line numbers in the fringe didn’t zoom either resulting in a very jumpy point every time I navigated to another line. I felt embarrassed. Also naturally, that evening, more Elisp hacking took place. The result is , a switch to make ad-hoc theme and window configuration adjustments that turns the editor into something the projector no longer chokes on. Here’s a before and after screenshot: Left: the default light theme. Right: the same screen with presentation mode enabled. What exactly does this presentation switch do? I wanted to maintain the ability to switch between a light/dark mode on the fly even from within presentation mode, and to further zoom in locally with if needed without further blowing up the project tree and the modeline. As usual, you can find my “bakemacs” Emacs config in the Git repository . At this point, you might be slightly confused: what do you mean a presentation mode? you’re merely zooming in! You are correct. This is not a true presentation mode in the same vein as for instance Ankit Gadiya’s Emacs Presentation Stack . I don’t want to present text in Org mode that look like slides. Instead, I just want to demo some code. I want to be able to split a window, open an Eshell, run some tests, show where the files are relative to the others in a tree view, and highlight specific functions. My use case as a teacher is limited to showcasing how very simple projects should work, from the code to the tools around it. It’s often hard for students to follow what I’m doing if I alt-tab to a terminal, then switch back to an editor, then zoom in, then zoom back out, … So the plan is to try and come across as a little more consistent. I’m not very fluent in Emacs let alone in embedded shells—dummy or otherwise—so we’ll see how this pans out in the future. Since writing this last week and using my new presentation mode a bit more in class, a few more problems popped up. First, although is designed to “work buffer-local only”, it also scales the line numbers. We knew that, but I still want to zoom in further if needed (most of the time). I was showcasing a REPL in split screen and only zoomed in one of the two visible buffers… Ouch. Fix: But then if you open up a new buffer you’re screwed again, so you’ll need another hook into to set the scale there. I kind of hacked the buffer-local one to be global except for UI text. Next problem: zooming in on Markdown files didn’t scale code blocks. Huh? After scratching my head a bit, it turned out to be mixed-pitch ’s fault, or rather a config error on my part. Do not set to . This was in fact another bug as the modeline is very annoying to “flip”. isn’t enough if existing buffers are already initialized and I ended up looping through all open ones to reconfigure each one.  ↩︎ Related topics: / emacs / By Wouter Groeneveld on 17 February 2026.  Reply via email . The obvious text enlargement, but globally this time by styling the font directly. There’s nothing theme-specific in the presentation function. Instead, I set a flag and force a theme reload that triggers my usual theme customisation hooks. This also increases the font of the minibuffer which is handy for following what does. I also slightly increased line spacing. I took some inspiration from the presentation mode in IntelliJ to slightly enlarge and move the modeline to the top (replaced by the LSP breadcrumbs 1 if active as in the screenshot). For brevity, some info in there is removed, such as the perspective name. Increase the contrast. Since I use Doom themes, and are my friends. Based on the current active theme— can be deduced with built-in functionality: . Pay special attention to the face that highlights the current line. Speaking of contrast, move from a “selection mode” to a “highlight mode” by simply changing the background colour of the face. When I want to direct the students’ attention to specific lines or blocks of code, I can simply select it. Apparently, Emacs has support for blinking text but that was a bit too much. Make Treemacs play along. I have a custom treemacs theme customisation hook. Font locks and confusing face inheritance made it difficult to increase this as well. Hide the tabs by temporarily disabling that mode. This was in fact another bug as the modeline is very annoying to “flip”. isn’t enough if existing buffers are already initialized and I ended up looping through all open ones to reconfigure each one.  ↩︎

1 views
Brain Baking 4 weeks ago

Why Parenting Is Similar To JavaScript Development

Here’s a crazy thought: to me, parenting feels very similar to programming in JavaScript. The more I think about it, the more convinced I am. If you’re an old fart that’s been coding stuff in JavaScript since its inception, you’ll undoubtedly be familiar with Douglas Crockford’s bibles , or to be more precise, that one tiny booklet from 2008 JavaScript: The Good Parts . That book covered by a cute O’Reilly butterfly is only 172 pages long. Contrast that with any tome attempting to do a “definitive guide”, like David Flanagan’s, which is 1093 pages thick. Ergo, one starts thinking: only of Javascript is inherently good . And that was 18 years ago. Since then, the EcmaScript standard threw new stuff on top in a steady yearly fashion, giving us weird and wonderful things (Promise chaining! Constants that aren’t constants! Private members with that look weirder than ! Nullish coalescing?? Bigger integers!) that arguably can be called syntactic sugar to try and disguise the bitter taste that is released slowly but surely if you chew on JS code long enough. If that’s not confusing enough, the JS ecosystem has evolved enormously as well: we now have 20+ languages built on top of JS that compile/transpile to it. We have TypeScript that has its own keyword that has nothing to do with , go nuts! We have ClojureScript that lets you write your React Native components in Clojure that compiles to JS that compiles to Java with Expo that compiles your app! We have and and and god-knows-what-else that replaces and possibly also ? At this point, I’m starting to transpile JS into transpiration. Parenting often feels like Javascript: The Good Parts versus JavaScript: The Definitive Guide . With our two very young children, there are many, many (oh so many) moments where we feel like we’re stumbling around in the dark, getting lost in that thick tome that dictates the things that we should be doing. When the eldest has yet another I’ll-just-throw-myself-on-the-floor-here moment and the youngest keeps on puking and yelling because he just discovered rolling on his tummy, I forget The Good Parts . To be perfectly frank, in those moments, I often wonder if Crockford had been lying to us. Are there even any good parts at all? We all know JS was cobbled together overnight because Netscape needed “some” language to make static languages a bit more dynamic. A language for the masses! What a monster it has become—in both positive and negative sense. It often feels like Wouter doesn’t exist anymore. Instead, there’s only daddy. It has been months since I last touched a book, notebook, or fountain pen. It has been months since my wife & I did something together to strengthen our relationship which currently is being reduced to snapping at each other because we’re still not perfectly synced when it comes to educational rules. Perhaps just writing and publishing this is reassurance for myself: proof of existence. Hi! This is not a bot! JavaScript is a big mess. Parenting feels like that as well. The ecosystem around JS rapidly changes and only the keenest frontend developer is able to keep up. I have no idea how to keep up with parenting. During our day-to-day struggles, you barely notice that the kids are growing and changing, but when you look back, you’re suddenly surprised yet another milestone has passed. Is that part of the Good Parts or the Bad Parts ? Maybe Flanagan’s Definitive Guide should be used to smack people on the head that do not obey to the latest EcmaScript standard best practices. I often have the feeling of getting smacked on the head when trying to deal with yet another kid emergency situation. I’m exhausted. Last week I yelled so hard at our eldest that she and I both started crying—she on the outside, me on the inside. I have no idea who I am anymore. I’m not like that. But it seems that I am. Our children successfully managed to bring out the worst in ourselves, even parts that I didn’t even know where there. I’ll let you be the judge of whether that bit belongs in the Good Parts . Yet I love JS. I love its dynamic duck type system (fuck TypeScript), I love its functional , , roots, I love prototypal inheritance. But I often forget about it because it’s buried in all that contemporary mud. Of course I love my children, but right now, I can’t say that I love parenting, because it’s buried in all that attention demanding and shouting that reduces our energy meters to zero in just a few minutes. My wife made a thoughtful remark the other day: We’re no longer living. At this point, we’re merely surviving. Every single day. As I write this, it’s almost 17:30 PM. The kids spent the day at my parents so I don’t even have the right to complain. Every minute now, they can come back and the bomb will explode again. There’s a little voice in my head that says “just get to the cooking, get them to eat and shove them in bed. Only an hour and a half left.” I don’t know if that’s sad or not. I need to get cooking. Only an hour and a half left. Don’t blame me, I no longer live. We’re merely surviving. If someone manages to write Parenting: The Good Parts in only 172 pages, let me know. Related topics: / javascript / parenting / By Wouter Groeneveld on 13 February 2026.  Reply via email .

0 views
Brain Baking 1 months ago

A Note on File History in Emacs

Once you start digging beyond the surface, you discover that an ancient piece of text editing software called Emacs was light years ahead of its time. It already contained a clipboard history ( ) and automatic saves/backups decades before contemporary editors took a half-baked stab at mimicking these features. Granted, I don’t make use of the kill ring because Alfred manages that for me across different applications, but it’s still pretty damn impressive. If you manage to stumble past the initial setup, that is. Many default settings in Emacs are… weird? The first thing to configure to transition to a bit of a sane default system is moving all those and backup and auto-save files to a central location to stop the editor from littering all over the place. That’s pretty easy to do but begs the question why they don’t change these defaults? Nobody wants random backup files popping up in their Git change set! Do you even need those files? The system feels archaic at first, but the more you think about the possibilities, the more brilliant the idea becomes. Let’s ignore the auto-save system for now—that doesn’t auto-save but auto-saves an auto-save backup that’s not a backup. Got all that? On every manual , a backup file is created or replaced, depending on your configuration. These files can act as your local file history in case you’re not rocking a version control system. If you do, Emacs notices this and stops producing backups. I do recommend setting to as you might lose interesting historical data before doing a commit. That is one of the more useful features of IntelliJ-based IDEs: to go back in time a few minutes to half an hour. Why would you need that? Emacs has a built-in undo history system! Very true, and perhaps better, as that doesn’t require a save, but isn’t persistent. I can hear you say it. You’re right: there’s a package for that . It’s called undo-fu-session and it serialises the undo information without changing any inner logic. This is even more brilliant if coupled with that helps you step through this. If you increase the three related settings, you will have a powerful way to go back in time. Perhaps a bit too powerful? What is a good limit? Contrary to IntelliJ, Emacs does not persist timestamps: it only works with bytes and limits those, so you’ll have to write a function that periodically cleans up those persisted backups. But are you going to remove the entire tree or just prune a bit? Because if you don’t, this is how your session will look like: The vundo tree: a visualised undo tree with a lot of nodes to diff... And that’s just a clean tree with no branching reapplied undo paths. Good luck trying to hop between different nodes, selecting the right ones to diff and revert to. Without timestamp info, a big undo tree is useless. So I removed : too much power, too much responsibility. Let’s keep that history local and non-persistent (even with a daemon you’ll end up with more than enough). I started fine-tuning the built-in backup settings: Which translates to: There’s a bit of a catch here: Emacs only saves a backup once per editing session and then assumes you’re safe. To force it to create a backup every time you save you’ll have to add to the . Or, as I learned from Alex , save with . Ridiculous. GNU Emacs already featured this snapshot backup system in 1985, when I was born! Fine, we now have a bunch of backup files. Then what? This is where things can get interesting. Since they’re just files, you can obviously run a diff tool against them. But which backup file to choose, and how to easily select the right file from the UI and go from there? Consult to the rescue. Consult is a completing-read on steroids that plugs seamlessly into Vertico, my minibuffer completion framework. It’s basically a fuzzy search tool you can throw anything at—including a list of backup files to choose from. Which is exactly what I did. You can change the label (parse the timestamps), choose a lovely icon if you’re using nerd-icons et al., and tell Consult what to do when (1) you preview the candidate and (2) when you select it. So the plan is this: The result looks like this: Selecting different backups automatically changes the opened diff on the right. I have no idea if I butchered , I tried a few things until it sort-of worked and had some help with the rest. You can find the source somewhere in the Bakemacs config files , look for . It could very well be that something like that already exists, but I haven’t found it so far. does something else. sounds good but requires you to navigate to the backup file yourself. The added advantage of mode is that you can revert the diff and re-apply specific hunks. The idea that I’ll never lose anything stupid I wrote will make me sleep better later tonight. Sublime Text’s persistent but unsaved changed file system and IntelliJ’s local history saved my ass more than once. The fact that I cobbled together a working thing using Consult makes this even more satisfying. Isn’t fooling around in Emacs the best thing ever? I hope these nerdy posts are not alienating too many faithful Brain Baking readers… Because, you know, the Lisp Alien mascot? No? Took it too far? Related topics: / emacs / By Wouter Groeneveld on 10 February 2026.  Reply via email . Keep multiple backup files : , , … Also backup even if it’s under version control Clean up older files: keep the oldest 2 and the last 10. Copy the file, don’t turn the existing one into a backup and save the buffer as the new file. For the current buffer, find all backup files. Easy: , substitute a few weird chars into !, read them from , done. (This very file has a backup called ) Sort and properly format a timestamp to show in the Consult minibuffer using . When previewed, with the current buffer into a new window on the right. When selected, make that diff window permanent. When cancelled with , cleanup the mess.

0 views
Brain Baking 1 months ago

Creating Buttons To Remember Things

My wife recently bought a device to scratch her creative crafting itch: a button press . At first, I dismissed it as yet another thing requiring space in her increasingly messy atelier. I don’t know how we manage to do it but we seem to be experts in gathering things that gather things themselves: dust. But now that she finally started doing something with it, I was secretly becoming interested in what it could mean for our scrapbook making. The button press in question is a “We R Makers Button Press Bundle All-In-One Kit” that comes with press, a few add-on peripherals that allow you to modify how it cuts and presses, and of course the buttons themselves. The button press in action, about to create a 'little monster'. Since handling the lever requires a bit of pressure to correctly cut and a second time fit the cut circle inside the button, I yelled TSJAKKA every time she would press it, to great joy of our daughter. She now calls it the Tsjakka . “Daddy, can we make another little monster with Tjsakka?” Because my first instinct after thinking about what kind of buttons I wanted was to print a variant of the Alien Lisp Mascot —a green monster with five eyes. Fellow nerds reading this might have covered their entire laptop back with cool looking stickers: a Docker container sticker, an IDEA logo one, the GitHub Octocat, and god knows what else you managed to nab from a conference table. While I always found those laptops to be just cute, I never wanted to soil mine with a sticker of some technology stack that I would grow to hate a few years later. Thanks to a random takeover by Microsoft sharks, for instance. *cough* Give Up Github *cough*. So why not a programming language mascot? Java’s The Duke? No way, I’m not that big of a Java fan. The Gopher perhaps? Better, but no. If I was to wear a badge, smack on a sticker somewhere prominent, it would have to be of something that makes me happy. Go is cool but boring. Java brings in a lot of money but smells like enterprise mud. So far, I haven’t encountered a single programming language that truly makes me happy. But Lisp is coming very close. The Lisp Alien it is, then: The result: three buttons pinned to the inside of my bike bag. One of the other two buttons is self-explanatory: the Brain Baking logo. The first one on the upper left is a part of my late father-in-law’s master’s thesis; an electronic schematic with resistors. The embossed logo on the button press, below the We R name, reads: Memory Keepers. Which is exactly what that button is for. They market it as a way to permanently record precious memories—and wear them on your sleeve . I think it’s brilliant. We don’t have an endless supply of metal clips and plastic caps to press that memory in so we have to be mindful: which one’s do we really want to create? Sure you can buy more and it’s not expensive, but that’s not the point. The point is that there won’t be a Duke on my bag, but there will be a Brain Baking logo. And, apparently, a warning. Most folks pin these buttons onto the obvious visible part of their bag. But I don’t want to come across as a button lunatic (at least not at first sight). A more convincing argument then: the bag I pinned it on is a simple detachable laptop cycle bag . The exterior gets wet now and then. I highly doubt that the button is water resistant. The third but slightly less convincing argument is that the buttons rattle quite a bit as the needle on the back used to pin it onto something sits quite loose in its metal socket. Perhaps that depends from product type to type. As you might have guessed, our daughter now is dead set on pinning a little monster on her bag she uses carry her lunch go to school. We’ll first have to ask Tjsakka to get back to work. Related topics: / crafting / By Wouter Groeneveld on 7 February 2026.  Reply via email .

0 views
Brain Baking 1 months ago

Favourites of January 2026

The end of the start of another year has ended. So now all there is left to do is to look forward to the end of the next month, starting effective immediately, and of course ending after the end of the end we are going to look forward to. Quite the end-eavour. I guess I’ll end these ramblings by ending this paragraph. But not before this message of general interest: children can be very end-earing, but sometimes you also want to end their endless whining! Fin. Previous month: January 2026 . Is Emacs a game? I think it is. I spent every precious free minute of my time tinkering with my configuration, exploring and discovering all the weird and cool stuff the editor and the thousands of community-provided packages offer. You can tell when you’ve joined the cult when you’re exchanging emails with random internet strangers about obscure Elisp functions and even joining the sporadic “let’s share Emacs learnings!” video calls (thanks Seb ). Does receiving pre-ordered games count as played ? I removed the shrink wrap from Ruffy and my calendar tells me I should start ordering UFO 50 very very soon via . Now if only that stupid Emacs config would stabilise; perhaps then I could pick up the Switch again… The intention was to start learning Clojure but I somehow got distracted after learning the Emacs CIDER REPL is the one you want. A zoomed-out top-down view of the project, centered on Brain Baking (left) and Jefklak's Codex (right). Related topics: / metapost / By Wouter Groeneveld on 4 February 2026.  Reply via email . Nathan Rooy created a very cool One million (small web) screnshots project and explains the technicalities behind it. Browsing to find your blog (mine are in there!) is really cool. It’s also funny to discover the GenAI purple-slop-blob. Brain Baking is located just north of a small dark green lake of expired domain name screenshots. Jefklak’s Codex , being much more colourful, is located at the far edge, to the right of a small Spaceship-domain-shark lake: Shom Bandopadhaya helped me regain my sanity with the Emacs undo philosophy. Install vundo. Done. Related: Sacha Chua was writing and thinking about time travel with Emacs, Org mode, and backups . I promise there’ll be non-Emacs related links in here, somewhere! Keep on digging! Michael Klamerus reminded me the BioMenace remaster is already out there. I loved that game as a kid but couldn’t get past level 3 or 4. It’s known to be extremely difficult. Or I am known to be a noob. Lars Ingebrigtsen combats link rot with taking screenshots of external links . I wrote about link rot a while ago and I must say that’s a genius addition. On hover, a small screenshot appears to permanently frame the thing you’re pointing to. I need to think about implementing this myself. Seb pointed me towards Karthinks’ Emacs window management almanac , a wall of text I will have to re-read a couple of times. I did manage to write a few simple window management helper functions that primarily do stuff with only a 2-split, which is good enough. Mikko shared his Board Gaming Year recap of 2025 . Forest Shuffle reaching 500 plays is simply insane, even if you take out the BoardGameArena numbers. Alex Harri spent a lot of time building an image-to-ASCII renderer and explains how the project was approached. This Precondition Guide to Home Row Mods is really cool and with Karabiner Elements in MacOS totally possible. It will get messy once you start fiddling with the timing. Elsa Gonsiorowski wrote about Emacs Delete vs. Kill which again helped me build a proper mental state of what the hell is going on in this Alien editor. Matt Might shared shell scripts to improve your academic writing by simply scanning the text for so-called “weasel words”. Bad: We used various methods to isolate four samples Better: We isolated four samples . I must say, academic prose sure could use this script. Robert Lützner discovered and prefers it over Git . I’m interested in its interoperability with Git. Charles Choi tuned Emacs to write prose by modifying quite a few settings I have yet to dig into. A friend installed PiVPN recently. I hadn’t heard from that one just yet so perhaps it’s worth a mention here. KeepassXC is getting on my nerves. Perhaps I should simply use pass , the standard unix password manager. But it should also be usable by my wife so… Nah. Input is a cool flexible font system designed for code but also offers proportional fonts. I tried it for a while but now prefer… Iosevka for my variable pitch font. Here’s a random Orgdown cheat sheet that might be of use. With RepoSense it’s easy to visualise programmer activities across Git repositories. We’re using it to track student activities and make sure everyone participates. Tired of configuring tab vs space indent stuff for every programming language? Use EditorConfig , something that works across editors and IDEs.

0 views
Brain Baking 1 months ago

Banning Syntax Highlighting Steroids

I’ve always flip-flopped between so-called “light” and “dark” modes when it comes to code editors. A 2004 screenshot of a random C file opened in GVim proves I was an realy adopter of dark mode, although I never really liked the contemporary Dracula themes when they first appeared. Sure, it was cool and modern-looking, but it also felt like plugging in three pairs of Christmas lights for just one tree. At work, I was usually the weird guy who refused to flip IntelliJ to The Dark Side . And now I’m primarily running a dark theme in Emacs . Allow me to explain. After more than a decade of staring at the default dark theme of Sublime Text, I’m swithing over, but you probably already know that. I never did any serious code work in my beloved : that was mostly for Markdown files and the light edit here and there. For bigger projects, any JetBrains IDEA flavour would do it: I know the shortcuts by heart and “it just works”. So you’ll excuse me for never really paying attention to the syntax highlighting mess that comes with the default dark Sublime theme. And then I read Tonsky’s excellent I am sorry, but everyone is getting syntax highlighting wrong post. Being Tonsky, he was of course right—again. A lightbulb went on somewhere deep within the airy caverns of my brain: “Hey, perhaps I’m not the only one thinking of Christmas trees when I see a random dark theme”. There are exceptions to the rule. I love the Nord theme . I only found out now that of course there’s a JetBrains port. Nord is great because it’s very much muted, or as they like to call it, “An arctic, north-bluish clean and elegant theme”. Here’s in my current Emacs config: The Doom Nord theme: a muted palette of blues. Nord radiates calmness. I love it. But sometimes I feel that it’s a bit too calm and muted. Sometimes, I miss a dash of colour and frivolity in my coding life, without the exaggeration of many themes such as Dracula et al. In that case, there’s Palenight that throws in a cheerful dash of purple. The 2007 GVim on WinXP screenshot proves I was already a fan of purple back then! While that’s great for , general UI usage, and even the Markdown links, it’s a garish mess as soon as you open up a code file. Here’s the Palenight Doom Theme in all its Christmas-y glory whilst editing the exact same Go file from the Nord screenshot above: The Doom Palenight theme: syntax highlighting is all over the place. What’s all that about? Orange (WARNING!) for variable declarations, bright red (ERROR!) for constants, purple (YAY!) for types… Needless to say, my first urge was to rapidly switch back to Nord. But I didn’t. Instead, I applied Tonsky’s rules and modified Palenight into a semi-Alabaster-esque theme: The result is this, the same for the third time: A modified Doom Palenight theme taking the Alabaster philosophy into account. In case you’re interested which faces to alter in Emacs, here’s the snippet I use that is designed to work across themes by stealing foreground colours from general things like and : There’s only one slight problem. Sometimes, altering isn’t good enough. Because of , I also had to “erase” and . And then there’s still only one bigger problem and that’s imports—especially the statements in PHP. They’re horrible. I mean, even besides the stupid backslash. By default, Palenight chooses not one but three colours for a single statement like it’s not much better in Java. Luckily, thanks to modern syntax tree analysis of Tree-sitter, we can pretty easily define rules for specific nodes in the tree. Explore the tree with and you’ll find stuff like Tree-sitter even makes the distinction between and , but we’ll want to mute the entire line, not just a part of it. So we can say something along the lines of which means “apply the font to the .” Throw that in a and we’re all set: Editing a PHP file in Palenight. Left: unedited. Right: with muted imports and applied Alabaster logic. I haven’t yet finalised the changes to the syntax highlighting colour palette—it might be an even better idea to completely dim these imports. Flycheck will add squiggly lines to unused/wrong imports anyway, so do we really need that distinction between unused and used import? Anyway, perhaps it’s not worth fiddling with, as you’ll only see the statements for a second just after opening the file but before scrolling down. Two more minor but significant modifications were needed to make Palenight enjoyable: Picking a font for editing deserves its own blog post. Stay tuned! Addendum: I forgot to mention that by stripping pretty much all colours from syntax highlight font faces, your files will look really boring. By default, “constants” ( , )/numbers and punctuation aren’t treated with anything special, so if you want to highlight the former and dim the latter, you’ll need to rely on and throw in some regex: Related topics: / go / php / emacs / syntax / screenshot / By Wouter Groeneveld on 31 January 2026.  Reply via email . Mute (unset) keywords, everyone knows what and does and nobody cares Replace the error eyebrow-raising colours with a muted blue variant. Get rid of that weird italic when invoking methods. If it ends in , you’ll know you’re calling a method/func, right? Highlight comments in the warning colour instead, as per Tonsky’s advice. It’s a brilliant move and forces you to more carefully think about creating and reading comments. Mute (dim) punctuation. Structural editing and/or your editor should catch you if you fall. Darken the default white foreground with 15% to reduce the contrast. That’s another reason why I didn’t like dark themes. Experiment with specific fonts. I landed on Jetbrains Mono for my font, but the light version, not the normal one. The thicker, the more my eyes have to work, but too thin and I can’t make out the symbols either.

0 views
Brain Baking 1 months ago

Apple Ruined My Mechanical Keyboard Experience (A NuPhy Halo75 Review)

My trusty external Apple Magic Keyboard disappeared into a drawer somewhere in the summer of 2024. It has never left that drawer until a few weeks ago, when I was so fed up with my inability to type correctly on the new mechanical keyboard that I decided it was time to go back to the Apple roots. The next minute, it disappeared again into the same drawer. NuPhy wins, even though I’m not a satisfied customer, but as we’ll soon learn, that has nothing to do with the excellent design and make of the keyboard, but everything with the way I interact with my “modern” setup. That’s in quotes just in case someone reminds me that an M1 chip is six years old by now. I know, and the MacBook is still doing more than fine, so I intend to keep it around for at least another year or two. All other PC towers here house AGP (cutting-edge!), PCI (wow!), or even VLB expansion cards. Needless to say, I don’t have any modern computer: my sole work mate is my “old” Apple laptop. Why do I bring this up? Because that’s exactly where all the problems start. My interaction with the laptop isn’t limited to my home office where the new mechanical keyboard, an Apple touchpad, and a DELL work station screen complete the setup. Most of my interaction happens directly on the laptop: in and around classrooms at work, and in lazy mode on the couch. Long story short: 69% of my typing happens on the built-in Apple keyboard. That’s very important because of context switching . I only recently learned that the NuPhy I bought came with an ANSI key layout that’s mostly used in the US, while here in Europe we’re mostly accustomed to ISO key layouts. Whoops… While both are fairly standard QUERTY keyboards, the placement of a few buttons is very irritating when constantly switching between mechanical keyboard and laptop keyboard. Observe: The Apple Magic Keyboard (above) and the NuPhy Halo 75 (below). Quite a hefty difference. Literally. What’s the biggest difference? Let’s reformulate that question: what’s the most annoying difference? Here’s what I came up with: There are a few big advantages to using ANSI though. The arrow keys are obviously much easier to hit, and the huge left is very comfortable to use. Unless I want to hit ` and muscle memory has me move the left pinkie towards that area. And then I learned about Karabiner Elements , a tool to customize the keyboard for macOS. Yes, you can do that at hardware-level on the NuPhy with VIA , but then I’d still be hitting the wrong keys 69% of the time. In a first attempt, I mapped a press of the big key to the backtick, and the right to backslash. I quickly learned that wasn’t a very bright idea as apparently I hit often without even noticing it, when deciding whether to uppercase something. The result was a wall of text sprinkled with the odd backtick here and there. The dual key role Karabiner can offer is very handy for choosing a leader key in Emacs without wanting to rebind the key. For example, on key press, it now sends (left) and (right), a key that’s not used that I can map in Emacs. Why not ? Because I needed that one to get the brightness controls working in VIA. My second attempt now turns the ISO into a bit more of an ANSI keyboard, by mapping the weird useless plus symbol next to to ` and by configuring a sacrificial swap; the right for . The physical switch on the laptop now acts as , since hitting —something you do way too much when using Emacs—is much easier on the NuPhy. Here’s how that looks like in : Again, I’m not sure if I’m completely satisfied with this setup. I basically “lost” quick access to brightness and volume settings with as I’m left-handed and muscle memory for hitting those combinations has been baked in for more than ten years. I think I can also map to send out , but at this point, it feels more like an instable hacky solution than anything else. So I switched back to the Magic Keyboard to see if I could get without the NuPhy. And it turns out that I can’t for a few other important reasons: The build quality of the NuPhy Halo 75 is exceptional. The keyboard is as heavy as it should be, the keys feel very satisfying to press, the key press sound is superb, that spacebar is amazing and very stable, and the RGB lights are completely useless but fun. Problem number two approaches: regularly switching keyboards, especially from full profile to completely flat ones such as the ones from Apple, is a very bad idea . The total travel distance of the built-in and the Magic keyboard is extremely short whilst the total travel distance of the NuPhy Halo75—even though they list 0.5mm on their product page , which is more likely switch tolerance—is much bigger. They’re full height mechanical keys, so that’s not a big surprise. And I have to emphasise that I like typing on these full height keys. My friend—the one responsible for me spending money on yet another keyboard—has the low profile NuPhy variant, which doesn’t come with a very appealing sound profile. Yet precisely because of this difference, I more often hit the wrong key or even completely miss key strokes. When I spend more time with the NuPhy, the problem becomes less apparent, but after another few days at work or on the couch, sliding the NuPhy on is usually paired with cursing. Unfortunately, that’s a problem Karabiner can’t solve. I can only conclude that Apple ruined my mechanical keyboard experience. It’s not my hands, it’s the bloody muscle memory trained by working on Apple laptops for the past fifteen years. So I’m not getting rid of the NuPhy and that Magic keyboard stays in that drawer indefinitely. You didn’t see that coming, did you? I love typing on this thing I’m typing this sentence on right now. It’s just too satisfying. I can put up with some more cursing, and my wife isn’t working from home right now so we’re all good. The green Mojito theme is just lovely. Because of the angle and the height of the keyboard, the wrist rest is not optional, so don’t forget to add another . Jokes aside, I wonder what my options are. Since I’ll likely be working on laptops in the near future, I guess the switch-keyboard-error-rate likely won’t go away. I do think that the next keyboard will be an ISO one, or the next MacBook will be an ANSI one, to at least line up those discrepancies. Perhaps I should go with a split keyboard and a completely different layout? I wonder if the folks hammering on those keys all day do still use their built-in laptop keyboard. Related topics: / keyboards / macos / By Wouter Groeneveld on 28 January 2026.  Reply via email . What the hell is that ` backtick doing all the way above ? Where is my button? Oh, there, on the right. Wait, where’s my right key? Simply gone? What the hell is that \ backslash doing all the way above ? Once you’re used to the Cherry Red “thock” sound of the mechanical keys, you’ll want to cry after hearing the annoying “click” sound of the Magic keys. Fuck those tiny arrow keys. Although they are the same on the built-in keyboard, it somehow feels worse.

0 views
Brain Baking 1 months ago

Keiji Yamagishi's Retro-Active Was Last Year's Most Played Album

Fans of retro games will no doubt recognise the name: the Japanese video game composer and programmer Keiji Yamagishi is famous four his work on Ninja Gaiden and many other great (S)NES soundtracks during from tenure at Tecmo. Yamagishi-san moved on to produce his own chiptune music together with Brave Wave Productions when the gaming industry moved on from composing music in only eight bits. His 2015 solo debut duo album, Retro-Active Pt. 1 and Retro-Active Pt. 2 has been on the daily playlist ever since I bought it. I’m a sucker for 8-bit chiptunes neatfully mixed together with contemporary beats, which is exactly what you’ll be paying for here. The first track on the first part, aptfully called First Contact , is enough to give you a taste of what you’ll be in for: It doesn’t stop there: Yamagishi-san collaborated with multiple other big hitters from the (retro) video game music world, such as Manami Matsumae (Mega Man, Trip World, Derby Stallion, …) and Ryuichi Nitta, his trusty co-composer who also worked on Ninja Gaiden. It’s best to let the music do the talking here. If the first track from Pt. 1 hasn’t convinced you, perhaps the first track from Pt. 2 , Thought Police , will: I also love the album cover art. If you simply can’t get enough, there’s a remixed version Brave Wave also put out that I have yet to discover. As always, both albums are available at Bandcamp. It looks like Keiji Yamagishi released a third related album in 2019 called The Retro-Active Experience which is a compilation of the first two and a few remixes. That’ll be my reward for writing this and searching for the accompanied links. A quote from a random review left behind on Bandcamp: “Yamagishi is a living legend.” – CHIPTUNES WIN, Glenntai Happy Saturday! Related topics: / music / By Wouter Groeneveld on 24 January 2026.  Reply via email .

0 views
Brain Baking 1 months ago

Another Major Bike Service

Last month I handed in my bike for another major repair service. It was sorely needed: a slight push on the pedals caused the chain to drop a gear, the front light wiring was broken since forever, and shifting in general always required two good clicks on the handlebar instead of just one. This year, the bike turns ten. The previous one was stolen on a weekday evening after parking it right across the old courthouse—isn’t that ironic? Of course that was entirely my fault: I kind of might have slightly forgotten to lock it. But still, who does that? The local bicycle repair expert had their hands full: the entire back cassette gear together with the chain was replaced, the seat post was replaced (I didn’t even know it was broken), the front light rewired, and the right shifter on the bar got replaced. Everything together cost me about . The result is a spotless gear system that’s lovely to drive: A closeup of the replaced cassette gear and chain. Yes, there once was a chain guard/fender in front of that chain protecting it from mud but that brittle plastic thing broke down long ago. This does mean the chain is open for attacks from road salt after snowy days like last week. I forgot to clean it and in just three days the entire chain was covered in rust—the new chain! After another trip to the bike shop for more mud remover and chain protector/oil, that problem was luckily solved. My wife laughs at me for regularly cleaning and oiling the gears and chain. I hate a squeaky bike. I shudder when encountering other cyclists with poorly maintained bikes that you can hear weeping (weep-weep-weep) as they push their pedals. I want to hear exactly nothing and feel nothing but smoothness when I exert force on my pedals. For some reason, that’s hugely satisfying for me. So yes, I try to keep the mud and sand out. But somehow, I forgot about the road salt: if you zoom in on the above photo you’ll still spot spots (ha!) of rust here and there. I guess that means I’ll be repeating the cleaning process later today. The reason why the entire cassette was replaced is that apparently, the wear and tear on the gears gradually reduce the short edges of the gear that fit into the chain into very spiky ones. As a result, as you push on the pedals to move the chain, the gear no longer consistently “locks” into it, causing slipping. If you sometimes “fall through” when biking, it’s time to inspect the gears. Did a cogwheel transform into a giant shuriken that would make every ninja jealous? Then perhaps it’s time to visit the bike shop. This wasn’t the first time the chain and gear(s) got replaced—the last time was in 2021. The not cheap price tag does raise the question whether buying a new bike is the better option, but I really like my current bike. Besides, spreading the repair cost out on four-ish years makes it much more bearable. Riding the new bike to and from work on a daily basis would deteriorate the cogwheels just as fast unless I buy a very fancy e-bike with a belt drive. Also, small repairs like chain adjustments I can do myself. At least I think I can. I don’t have any fancy biking stats to share: I don’t keep track of that. For me, my bike symbolises simplicity and freedom. I hope to be able to ride the Trek 1 for at least five more years. I just found out that Trek is an American brand, while here in Belgium and The Netherlands we basically drown in excellent bike manufacturers. I’ll take note of that should I ever decide to replace it.  ↩︎ Related topics: / bike / By Wouter Groeneveld on 20 January 2026.  Reply via email . I just found out that Trek is an American brand, while here in Belgium and The Netherlands we basically drown in excellent bike manufacturers. I’ll take note of that should I ever decide to replace it.  ↩︎

0 views
Brain Baking 1 months ago

Customizing The Emacs Email Experience With Mu4e

You all knew this was coming. After thinking about my email workflow I had to put it to practice. The grand plan was to force myself to learn more about Emacs by doing email in it with the added advantage of freeing up Mac Mail to manage my Exchange work emails there. Anything is better than staring at that dreaded Outlook web interface. There are tons of cool blog posts out there about , , and configuration—this one’s mine. Most focus on how to set up mbsync which is the CLI tool that syncs your IMAP account with a local folder for mu to index. The process is fairly straightforward: the only tricky thing to do is use macOS’s password keyring to store the IMAP password and export a copy of the certificates for the handshake: Instead, I’d like to focus on configuration, as most of my sweat originated from that direction. You can find the full config at my “bakemacs” Codeberg repository . I customized the hell out of it. First and foremost, I hate the default UI of mu4e. Splitting windows horizontally when opening an email just feels like a giant amount of wasted space. Any other sane email client splits vertically, usually in the popular three-column mode. The first column, a quick jump to your folders, isn’t needed thanks to the shortcuts. Changing the split config is very easy: . Fiddle with to get that percentage header/view just right (mine’s at ): But then the first buffer becomes completely useless because mu4e’s header columns are sorted in a weird way. The from and subject columns are last which will be covered by the mail you just opened. Quickly scrolling through mails with (next) and (previous) loses its meaning. But mixing that up isn’t that easy as the last column with a width of is the only one that can take up the remaining room. Additionally, since I use , I want the headers to be consistent. Wait a minute, what’s ? That doesn’t exist! Well, it does now: No wonder the column isn’t used by default. Then, wire the header layout function to both and . The result: mu4e:view with a mu4e:headers buffer to the left. To discourage Emacs from opening the HTML version first in case both MIME parts are there just like in the screenshot, set . If you receive a lot of HTML email with weird CSS colors, this might be handy too: Mu4e feels like a classic eighties text-based terminal app. No wonder conversation mode doesn’t exist—but it makes up for that with the shortcuts (once you’re familiar with them) and the threading view options it provides. Yet my completely screwed up that because the last column isn’t the “flexible” column anymore. Whoops. Most other blog posts seem to prefer horizontal splits as well. Digging into , I discover a way to simply overwrite the logic: There, better. How about we add a quick way to fold and unfold all these conversations? integrates your sent mails into the thread just like a conversation but quickly turns the view into a mess, hence the toggle. I bound these to and . The result: Showcasing the threading and related threading toggles in mu4e:view mode. The decent column colours come from the package . The flags can be souped up with fancy variants by setting and pairing simple with fancy char (e.g. ). I prefer using nerd icons like everywhere else but haven’t yet figured out how to do so. You can simply instruct mu4e to use an external syncing tool by setting to . I used to hack it with the value and then add an Elisp hook to execute the shell command myself in order to jam in as a spam filter but that screws up the async fetch logic. The problems don’t stop with spam filtering: I also want to apply some simple rules that automatically move incoming mails to certain IMAP folders. Mu4e doesn’t work like that, you’re supposed to use labels and leave things as is, but I’d rather not. With some help from my friend Gemini to identify the right functions, I came up with this: That’s hooked into . What does this thing do? Matching for rules is fairly straightforward: The function inserts the first 10k chars of the email file itself into a temp buffer and uses regex to match the rules. A few caveats: occurs more than once in a raw email file, search for the beginning of a line. Also, the first 2k chars wasn’t enough, some headers contain a lot of junk. You could just as well dump everything in there but the limit is there just in case. But what if we move an email to the junk folder ourselves—shouldn’t we train bogofilter to identify future mails like that as spam? Ah yes: I don’t know if the hook hack is the right thing to do but this works. More annoyances? You’d be starting to wonder why use mu4e at all, right? Because we can and because it’s Lisp! When marking mails for actions such as deleting and moving, after pressing to execute all marks you still have to confirm with or . I hate that: I want and that’s it. Another hack to the rescue: The solves another annoyance: updating in main mode is bound to the key but I don’t need that stinkin’ uppercase there. Also, since is my anywhere else because I’m coming from a more traditional editor, I have it pop up here instead. While debugging the spam filter function I occasionally required the full path of the open mail. Here’s a handy function that adds it to your kill ring (that’s Emacs l33t speak for “clipboard history”): We’re almost there. Yesterday I had the luminous idea to integrate Mac Contacts with mu4e. By default, when you enable auto-completion in compose mode, fetches data from mu’s indexes. That means you’ll see email addresses from folks you’ve already exchanged mails with. But I might have contacts saved (wired to our own CardDav server) where that’s not the case. I discovered that this functionality is actually built into Emacs with . Except that that didn’t work. Well, it didn’t at first because I had Emacs running as a daemon using which is very strictly sandboxed and blocks any access to Contacts even though I explicitly approved it in the security settings. Now I run it as a simple login items startup shell script meaning it runs under my account. And then it still didn’t run smoothly : the autocomplete took 4 seconds to load because is ridiculously slow. So I went the other route and tried , a small tool that fetches info from Contacts leveraging Swift’s native Mac-compliant capabilities. And that didn’t work either because I couldn’t get the tool to run. So I rolled my own, or rather, let Gemini do most of the rolling, as I don’t know anything about Swift let alone the Mac-specific interfaces. It came up with a small script that I simply embedded into Elisp as a string: The output of then becomes . Cool! But how do we hook this into the existing mu4e autocomplete that already serves mu’s indexed email addresses? Use Cape’s Super-Capf that merges stuff into a giant completion at point function: There, more annoyances fixed by disabling auto fill mode and telling Corfu to stay put until I press myself. The keen Elisper will notice that we also wrapped the default to be able to inject a lambda. This adds a nice icon to keep things consistent. Yes, you’re right, is a symbol that doesn’t exist in —just define it yourself with . The result: Autocompleting email addresses in the To: field in mu4e:compose mode. Note the two test emails appearing with suffixes: these come from Mac Contacts, while the first email address is a bogus one I emailed to in order to showcase the merge. The first time this triggers it’s still a bit slow because of the Swift interpreter. I guess I can look into compiling that somehow? For now, I hope not to mess too much with the config anymore and to actually, you know, use it? Ah, the Emacs curse… Related topics: / emacs / email / By Wouter Groeneveld on 15 January 2026.  Reply via email . Find all email paths in the inbox folder ( is a custom var I made up) using . I failed to find something working that mu4e provided. For each path, ask bogofilter if this is spam. If yes, move to . If no, check the rules to see where it should end up in. Move with , but strip the mu suffixes that already gave it an ID as this otherwise confuses mbsync/mu because we moved the file ourselves. Re-index if anything happened to keep things in sync.

0 views
Brain Baking 2 months ago

Favourites of December (And a Short 2025 Recap)

A late happy new year to everyone! I almost forgot to publish last month’s favourite (blog) posts, and since last month was the last one of 2025, let’s do a short recap as well. Previous month’s recap: November 2025 . Last year was another eventful year. Browse the full 2025 Brain Baking archive for more juicy details. I selected one post per month that for me stands out: Our son also kicked me out of my cosy home office upstairs. Luckily, our renovations were finished in time, so we moved the living room and I took the old space hostage . One of the advantages of directly staring at a larger window is being able to admire the seasonal view: The window at my desk showcases snowy trees. For 2026, I only wish for one thing: stability . Let’s stop the craziness and try to get things settled down. No more kids, renovations, job changes, broken bicycles, and serious sickness please. Just, you know, breathing. Whoosah . Last month I joined the Advent of Code challenge using Clojure, a language I know absolutely nothing about. Since then I’ve been obsessed with Lisp-based dialects. Forgive me if most of the links below are programming-oriented: it’s been invigorating to learn something new and actually enjoy a programming language for a chance. It’s the reason I’m typing this in Emacs now, although I haven’t even installed CIDER yet. All in due time… Ok that was definitely too much Emacs stuff. The lack of other links shows how much I’ve been obsessed with the editor lately. No other random links for this month! Related topics: / metapost / By Wouter Groeneveld on 10 January 2026.  Reply via email . In January, I had the idea to compile your own philosophy . So far, I have collected lots of notes and summarised too many previous ones, but nothing has been published yet. In February, I shared my stationary drawers . I should really clean out all those fountain pens. In March, I dug up a photo of my first console , the SEGA Genesis/MegaDrive. In April, I learned that my sourdough starter has twins somewhere in Switzerland. In May, more thoughts about writing and publishing popped up. In June, I debunked (or confirmed?) the fact that IT freelancers earn more than their employee counterparts . In July, I got influenced by other board game enthusiasts and admitted to having too many games and too little time . In August, we welcomed our second little one and I turned forty —in that order. Yes, that is important to me. In September, I wrote too many articles about trick taking games and local traditions . In October, I fondly looked back at years of downloading warez software . In November, I recovered my late father-in-law’s 1994 IBM PC invoice . In December, I started shaving Emacs yaks . I haven’t stopped ever since. Nick George reports on building static websites with Clojure . Nathan Marz describes how he invented Specter to fill Clojure’s mutability hole. I don’t understand 90% of the technicalities there, but one day, I will. More Clojure stuff. Sorry… Mikko Koski helped me get started: 8 tips for Advent of Code 2022 in Clojure. A more official one, but just as interesting: the State of Clojure 2024 results . 76% of the people using it build web apps, 40% is on Emacs/CIDER, and Babashka is super popular! This Advent of Code GIF archive is crazy. Victor Dorneanu wrote about his Doom Emacs to Vanilla migration. I tried Doom/Spacemacs for about one whole day and then started back from scratch, but damn, it’s very challenging, even though you can “do what you want”—if you’re an Emacs/Elisp acolyte, that is. I’m planning to get babtized in the Emacs Church very soon. Alice from The Wallflower Digest shares her thoughts about personal curriculums ; a way to get started with deliberate life-long learning. (via Joel , I think?) Karthinks found fifteen ways to use Embark , a wonderful context-aware Emacs package. More “Emacs from scratch” blogs to share: this one’s from Arne and lies out the foundations in case you want to get started. Thanks, Arne. You’re in my RSS feed now. Frank Meeuwsen writes (in Dutch) about AI tooling and how they democratise digital literacy. Or rather, how they should . Gregory J. Stein wrote a guide on email in Emacs using Mu and Mu4e . I have more thoughts on that saved for a separate blog post. If you’d like to know how many Emacs packages you’re currently rocking, Manuel Uberti has an Elisp for you (via Sebastián ) Kristoffer Balintona helped me better understand the Vertico completion-at-point-function stack .

3 views
Brain Baking 2 months ago

Thinking about email workflows

This Emacs thing is getting out of hand and eating away all my free time. Now I know what they mean with the saying “diving into a rabbit hole” (and never seeing the bottom of it). We’re at 1k lines of Elisp code and I still add items to the list that don’t work well enough on a daily basis. For some weird reason, I decided to try my hand at using Emacs as an email client as well. Anyway, we can save those boring technical details for another post you can safely skip then, but for now, let’s stick with the philosophical implications of messing with my email schedule and/or habits. I’ve had some dirty habits that I thought kicked the bucket way back in 2021 when I threw out everything Google-related . Except that I didn’t throw out much—I just started doing something else. My Google & GMail account still lives but now primarily serves as yet another spam address. But I forgot to clean up and process the archive! I had another account lying around ( ) that I stopped using in 2013-ish but I forgot to clean up and process those archives as well! The Google Takeout as backup I saved, but the original ones I didn’t delete, meaning my data was still out there. Whoops. The question is: what to do with a bunch of very old emails? Do you save them all? Locally or centrally? Which ones? I had to think about this because the Emacs package I use—excellent Dutch software called mu4e —works with IMAP. I still rocked POP3 so I moved to IMAP. But in IMAP, you synchronize between client and server, meaning most stuff stays on the server which I don’t like. Why keep an IMAP folder in there just accumulating junk to wire up and down? And should I dump my GMail archive in there as well? Since moving from GMail ( and then Protonmail ), my preferred mail client has been Apple Mail. I want a proper application for working with email, not a webapp, and I don’t want any email near my smartphone (so I don’t really care about syncing that much, which is why I stayed with POP). Nothing is stopping you from creating a folder “On My Mac” and moving stuff in there instead of pressing the Archive button—in that way, the email disappears from the server. But then it ends up in a proprietary database format. Now, it’s all just flat text files syncing with and auto-backed up with various stuff. But perhaps you still want a semi-permanent archive folder to sync just in case? I’m a zero inbox kind of guy: once the mail has been dealt with, it needs to go: That means my folders look like this: Why isn’t inside the folder? Because that’s outside IMAP sync zone. is there in case I need something synced, but it’s rarely used and I plan to delete it in the coming months. will serve as the semi-saved “ongoing thing but don’t need to deal with right now but can’t get rid of just yet” folder. But what about ? That’s simple: I set up rules that automatically move emails to that folder to only occasionally glance at. For example, our daughter’s preschool loves to send at least four days a week titled “NEW MESSAGE IN PARENT PLATFORM!!!!!ONE!!11”. Ah, and yes, that Limited Run Games mailing list? *Cough*. Yeah, that one that I shouldn’t be looking at. In it goes: at least it’s not staring at me in . Now about that (local) archive. Why keep emails around? Several reasons: That being said, I am an opponent of blindfully preserving everything “just in case”. You don’t need that email invoice if you have the invoice stored. You don’t need that project mail if the project was done and buried five years ago. You don’t need those superficial “sure I’ll be there” appointment emails once the event is over. I hate it when people say Just Save Everything, Dude, It’s GMail! . To me, that sounds like I’m Too Lazy To Filter, Dude! Where’s My Stuff? —although that’s also a perfectly valid strategy. But then again, that might just be me. How do you deal with your emails? What’s your grand archival plan? Send me a mail and let me know! If it’s interesting enough I’ll promise to keep it indefinitely. Related topics: / email / emacs / By Wouter Groeneveld on 7 January 2026.  Reply via email . Is it spam? Move to junk & have your filter learn from it. Is it a short thing that you can answer (if needed) and forget about? Delete. Is it informational/an invite/whatever that you can move to a calendar? Do it & delete. Is it an invoice/whatever where you can save the attach into the DEVONThink inbox? Do it & delete. Is it a receipt without attach? Print as PDF and treat as above. Is it an email from family full of photos of last Saturday’s party? Save them all to your NAS where Photoprism can find them & delete. Is it from an ongoing project that you still need to keep as evidence just in case? Move to the “projects” folder. Is it an exciting email from friends, co-bloggers, et al.? Answer & archive to save. I can’t say goodbye to them. Several conversations with my late father-in-law and other deceased where I honestly don’t have the courage to trash them permanently. They were meaningful to me. Same as above, I guess, except for these people are still alive? I like keeping emails from lovely folks around. They might still have a practical use. Since all mails are indexed by , I can quickly whip up a search and find stuff not stored elsewhere. It should, though.

0 views
Brain Baking 2 months ago

2025 In Board Games

This post is the board game counterpart of the previous 2025 In Video Games end of year note. There hasn’t been a Board Game Shelf Analysis post in 2025 for some reason so I can’t point you to recent photos of my collection. Because of two very young kids our board game time has been reduced to almost nothing, but nonetheless, I/we’ve managed to squeeze in about 150 plays. That’s even better than last year! Here’s a collage of all board games I played in 2025 along with the amount of plays on the bottom right of each cover, ranked from most played to least: Board game plays in the last year: 150 plays. A few side notes. For some weird reason, the play count is not accurate. For example, BGG records I’ve played Regicide four times, which is correct. Still, the BG Stats app refuses to print out a nice yearly overview with accurate numbers. Also, note that most games that are heavily played (on the top) are short games . That’s for a very good reason! Mage Knight, a notoriously long-winded one, was played exactly once to see how stuff works. I guess that means there’s a lot of room for more joyful gaming and I don’t need to spend more money to reap those benefits! Since getting together becomes more difficult with a crying toddler and baby, squeezing in quick solo (card) games became the norm: Kingdom Legacy (10 plays), Reforest (9), Conservas (8) are all examples of those that can be played on the coach. Yet I’m still proud that we played some more heavy hitters like SETI (5) and… wait… Great Western Trail (2)? Ok fine, SETI is the only bigger game that appeared once in a while. Compared to 2024 , the “one-off” plays weren’t that dramatic. It still fills one third of the above image but we replayed more games than we did test new ones and that’s a good thing. the H-index for 2025 was 5, which I could have gamed by playing one more round of French Quarter. Here’s the BGG Plays tool graph: Visualizing plays logged on BoardGameGeek including a 10x10 challenge highlight. The tail end isn’t as long as in 2024 and I managed to colour in almost all die in the 10x10 challenge rectangle! If you watch closely you’ll see that most of these die are one-sided meaning a solo play session. Games like Conservas and Kingdom Legacy are very quick and quite casual which plays (ha!) in their favour of returning to the table (or couch) the next evening. There haven’t been any big campaign games like last year’s Gloomhaven: Jaws of the Lion—thank god for that. Dorfromantik Sakura that I picked up in SPIEL Essen this year is strictly speaking campaign-based but very light to the touch and we enjoy it quite a lot. We’re very close to unlocking box 3 and it’s possible to start multiple campaigns for other friend groups. As was the case last year, 6/159 or 3.7% of the plays were three-player or higher sessions. That’s marginally better than last year’s 2%. I’ve come to accept that buying games that are only great with three or more will never end up in our shelf as they’ll barely see the daylight. Hopefully a friend reading this will buy Cosmic Encounter and invite me over. So which of these plays were new plays—or to put it differently: which of the games are my “new” 2025 GOTY games? I’ll once again split this between games I played but don’t own: And the games we enjoyed the most and also own: The jury is still out on Mage Knight (will probably love this), Great Western Trail, Terraforming Mars: Ares Expedition and all the other low play ones. We like Sky Team a lot but if you play it too often or play multiple sessions in rapid succession it can become boring. It’s very clear for me: SETI is my GOTY. It feels weird not to own it but it would be silly to buy it as one of my regular co-players owns it. Games I didn’t care for and will probably be looking to sell: Click A Tree (first play was disappointing), Cascadia: Rolling Hills (a mediocre roll-and-write), Let’s Go! To Japan (not mine but it didn’t click for me even though the art is great), Ora et Labora (an old friend that became a big long slog), and Conservas (it’s very good but once you finish the campaign and know how it works it’s dull). It seems that we did buy quite a few roll and write games : Dinosaur Island is very cool, Rajas of the Ganges is good but not great, and I had high hopes for French Quarter as the designer is the one who invented previous year’s GOTY Three Sisters. For me, I don’t think any other roll and write will ever beat that game. I’m looking forward to receiving the wonderfully weird Dark Venture skirmish game, unwrapping Spirit Island and Earthborne Rangers, and buying The Fate of the Fellowship! Related topics: / boardgames / lists / yearnote / By Wouter Groeneveld on 3 January 2026.  Reply via email . 💖 SETI: Search for Extraterrestrial Intelligence —clearly the Euro game of the year, what a banger. A must play. 💖 The Lord of the Rings: The Fellowship of the Ring Trick Taking Game —what can I say, I love trick taking games . 💖 The Castles of Burgundy: Special Edition —a classic in a gigantic box that plays itself. It was the first time this year I played a proper Burgundy game. 💖 Dorfromantik Sakura —We have yet to discover most of what the game has to offer and already like it a lot. 💖 Reforest —Last year I nominated Forest Shuffle but perhaps I even like this nature-themed card placement game more.

0 views
Brain Baking 2 months ago

2025 In Video Games

It’s that time of the year—the time to publish the yearly notes summarizing playtime statistics and providing a personal opinion on recent and vintage Game Of The Year (GOTY) contestants. In 2023 , Pizza Tower and Tactics Ogre: Reborn were examples of superb recent games that even made it to the Top 100 List , while DUSK and Plants vs. Zombies scored high in the vintage list (both also on the Top 100). In 2024 , Skald and the Paper Mario remake were the great ones, but the most memorable experience was no doubt playing Ultima Underworld for the first time together for the DOS Game Club. For 2025, the amount of games recorded on my retro gaming site remains the same as the previous year—27—but this year I also started occasionally reviewing board games that I replay at least ten times. Here’s this year’s collage of the games I (re)played this year in chronological order: A collage of the 2025 GOTY contestants. I have yet to write a review for Shotgun King so let’s keep that one out. It’s a small indie roguelike that’s fun but doesn’t have a lot to offer. Also, since this post is called 2025 in Video Games , let’s ignore the board games for now and keep that for a future post where I summarise my Board Game Geek statistics. Some more useless stats, based on user input from How Long To Beat (HLTB): Last year, about 50% of my gaming time took place on the Switch. That’s dropped to 40%. Or has it? Remove the six board games and you’ve got 52% so nope, I’m still primarily a Nintendo (handheld) gamer. I have a bunch of cartridges waiting to be played and I believe even a few cases still in shrink wrap (yeah I know), so for the coming year, that’s not likely to change either. I don’t need a Switch 2 just yet. For more details on those divisions by platform, I again reused last year’s script to generate a graph summarizing the platforms and calculates an average score (rated on 5, see about the rating system ) for each platform: A bar chart of (average) scores per platform. Most mediocre plays game from platforms where I was hunting down card games for my feature write-up on card games back in September. Filtering all games that are scored as either great (4/5) or amazing (5/5), we end with the following lists, where I further cherry-picked the best of the best: The Recent GOTY list: Couch “recent” cough . Yeah, again—I know. What can I say, I’m a retro gamer, and the “new games” I play are usually repurposed old ones, go figure. This seems to be especially apparent this year. Those Nightdive Studios boomer shooter remakes are beyond awesome, you’ve got to try them! The Vintage GOTY list: I found 2024 to be a meagre year for me when it comes to “the great ones”—because I don’t play many of those within the year of release. I have the same feeling for this year, looking back at the play log. There are many great games I highly enjoyed such as Wonder Boy with the awesome art and music and ability to switch back and forth between retro and remastered version, or Hoyle Card Games , the PC classic that’s hard to beat when it comes to trumping the trump. I love Celeste and Castlevania Dominus Collection but those were replays of games I know by heart, so I’m ruling them out. We’ve got to draw the line somewhere. And then there’s Inscryption . What a game. No, what an experience that was! I was on the edge of my seat almost every single in-game minute. I played it in January (read my thoughts but beware of the spoilers) and didn’t encounter a game that challenged my expectations that much ever since. There’s no need for a debate or a voting round: Inscryption is my “Game of the Other Year”. It’s in the Top100 . As for the GOTY of 2025-ish; that’s got to be one of the Nightdive remakes. Both Blood: Refreshed Supply and the Outlaws remaster have been released recently and I haven’t yet had the change to touch either of them. If I had, I think Blood might have been the winner as that’s the only Build Engine game I never truly played back in the nineties. Screw it. DOOM + DOOM II is my GOTY. Just the music alone: And that’s from the new Legacy of Rust expansion. I’ll leave the discovery of Andrew Hulshult’s DOOM riffs up to you. Obviously, DOOM + DOOM II (2024) kicked out and replaced DOOM (1993) in the Top100. Cheers to 2026. My hopes are high for opening that shrink wrap. Related topics: / games / goty / lists / yearnote / By Wouter Groeneveld on 30 December 2025.  Reply via email . total #games: 27 total hours: 175.8 average hours: 6.51 average a day: 0.5 longest game: 28.0 hours; ‘Castlevania Dominus Collection’ shortest game: 0.0 hours; Hoyle Card Games 2002 Divison by platform: Platform: pc (5/27) Platform: ds (3/27) Platform: boardgames (6/27) Platform: gameboycolor (1/27) Platform: switch (11/27) Platform: snes (1/27) 💖 Guncho (pc; 2024) 💖 Shogun Showdown (switch; 2023) 💖 Rise Of The Triad: Ludicrous Edition (switch; 2023) 💖 Prince of Persia: The Lost Crown (switch; 2024) 💖 DOOM + DOOM II (pc; 2024) 💖 Castlevania Dominus Collection (switch; 2024) 💖 Hoyle Card Games 2002 (pc; 2002) 💖 Wonder Boy: The Dragon’s Trap (switch; 2017) 💖 Tangle Tower (switch; 2019) 💖 Celeste (switch; 2018) 💖 Inscryption (switch; 2021)

0 views