Latest Posts (20 found)
Brain Baking 3 days 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 6 days 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 1 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 2 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 2 weeks 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 3 weeks 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 3 weeks 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 4 weeks 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 1 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 1 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 1 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
Brain Baking 2 months ago

I Changed Jobs (Again)

After two years of being back in the (enterprise) software engineering industry, I’m back out. In January 2024, I wrote a long post about leaving academia ; why I couldn’t get a foot in the door; why I probably didn’t try hard enough; and my fears of losing touch with practice. Well guess what. I’m back into education. I wouldn’t dare to call it academia though: I’m now a lecturer at a local university college, where I teach applied computer science. While the institution is quite active in conducting (applied) research, I’m not a part of it. Contrary to my last job in education, where I divided my time between 50% teaching and 50% research, this time, my job is 100% teaching. It feels weird to write about my professional journey the last two years. In September 2023, I received my PhD in Engineering Technology and was in constant dubio state whether to try and stick around or return to my roots—the software engineering industry. My long practical experience turned out to be a blessing for the students but a curse for any tenure track: not enough papers published, not enough cool looking venues to stick on the CV. So I left. I wanted a bit more freedom and I started freelancing under my own company. At my first client, I was a tech lead and Go programmer. Go was fun until got the better of me, but the problem wasn’t Go, it was enterprise IT, mismanagement, over-ambitiousness, and of course, Kubernetes. I forgot why I turned to education in the first place. I regretted leaving academia and felt I made the wrong choice. About a year later, an ex-colleague called and asked if I was in need of a new job. I wasn’t, and yet I was. I joined their startup and the lack of meetings and ability to write code for a change felt like a breath of fresh air. Eight months later, we had a second kid. Everything changed—again. While we hoped for the best, the baby turned out to be as troublesome as the first: 24/7 crying (ourselves included), excessively puking sour milk, forgoing sleeping, … We’re this close ( gestures wildly ) to a mental breakdown. Then the eldest got ill and had to go to the hospital. Then my wife got ill and had to go to the hospital. I’m still waiting on my turn, I guess it’s only a matter of time. Needless to say, my professional aspirations took a deep dive. I tried to do my best to keep up with everything, both at home and at work, but had the feeling that I was failing at both. Something had to give. Even though my client was still satisfied with my work, I quit. The kids were the tipping point, but that wasn’t the only reason: the startup environment didn’t exactly provide ample opportunities to coach/teach others, which was something that I sorely missed even though I didn’t realise this in the beginning. Finding another client with more concrete coaching/teaching opportunities would have been an option but it wouldn’t suddenly provide breathing room. I’m currently replacing someone who went the other way and he had a 70% teaching assignment. In the coming semester, There’s 30% more waiting for me. Meanwhile, I can assist my wife in helping with the baby. There are of course other benefits from working in education, such as having all school holidays off, which is both a blessing (we’re screwed otherwise) and a curse (yay more kids-time instead of me-time). That also means I’m in the process of closing down my own business. Most people will no doubt declare me crazy: from freelancing in IT to a government contract with fixed pay scales in (IT) education—that’s quite a hefty downgrade, financially speaking. Or is it? I tried examining these differences before . We of course did our calculations to see if it would be a possibility. Still, it feels a bit like a failure, having to close the books on Brain Baking BV 1 . Higher education institutions don’t like working with freelance teachers and this time I hope I’m in there for the long(er) run. I could of course still do something officially “on the side” but who am I kidding? This article should have been published days ago but didn’t because of pees in pants, screams at night and over-tiredness of both parents. The things I’m teaching now are not very familiar to me: Laravel & Filament, Vue, React Native. They’re notably front-end oriented and much more practical than I’m used to but meanwhile I’m learning and I’m helping others to learn. I’ve already been able to enthuse a few students by showing them some debugging tools, shortcuts, and other things on the side, but I’m not fooling myself: like in every schooling environment, there are plenty of students less than willing to swallow what you have to say. That’s another major thing I have to learn: to be content. To do enough. To convince myself I don’t need to do more. I’ve stopped racing along with colleagues that are willing to fight to climb some kind of invisible ladder long ago. At least, I think I did: sometimes I still feel a sudden stab of jealousy when I hear they got tenured as a professor or managed to do x or y. At this very moment, managing to crawl in and out of bed will do. BV is the Belgian equivalent to LLC.  ↩︎ Related topics: / jobs / By Wouter Groeneveld on 25 December 2025.  Reply via email . BV is the Belgian equivalent to LLC.  ↩︎

0 views
Brain Baking 2 months ago

Getting Emacs And MacOS To Play Nice

What a nightmare. Yet another reason (previously the never-ending flow of bloat ) to switch back from MacOS to a proper *Nix environment. I thought installing an old editor would be as simple as issuing a single “fetch me that package, will you” command. But I was so very wrong. Expect more of these “Emacs Journey” posts in-between the regular ones. Apologies if they’re completely useless to you: I need to have this on record. First: there are multiple Emacs-es out there, which one do you want? There’s Aquamacs , the vanilla Emacs ( ) which you should avoid if you want Doom or Spacemacs, and a few more that are listed in the Doom Emacs Getting Started Guide . refused to compile and the official package is not on v30 yet. Others do not provide —confusingly, there’s two binaries: the you run inside a terminal as a non-GUI editor, and the GUI one. Ultimately, this worked (and natively compiled): But then you’re stuck with a symlink as an app which Alfred refuses to recognize. On top of that, the Pro Way (TM) to start Emacs is to spawn clients and have a daemon running in the background. Since I want to experiment and make use of the feature that enables me to load different configs, I created a custom launch agent for this called (my Emacs config collection is to be called bakemacs ): that baby and off we go. The second part, starting a client, is a shell script that Automator wrapped into a “native MacOS Application” to fool Alfred et al.: I learned the hard way that you can make use of in case the client can’t find the daemon in case something killed it. Or someone. Yes, you. Me? Stop pressing ! This sends a terminate command from the client to the daemon who owns it and kills that one as well. Just delete the frame instead. Since I can’t remember all that and the Q pressing is an old habit that Dies Hard (TM), just rewire the key: And then your spell checker breaks: : Searching for program: No such file or directory, . Of course a path issue. There are several options here, I went with Yet Another Package that spawns a shell and steals its so I can mange it externally: Are we there yet? No. The application icon is butt-ugly and slightly bigger than the others. Go to https://macosicons.com/ , search for “emacs”, get yourself a nice one, press “Get Info” on your Automator-generated app, replace that icon, replace the one from the Homebrew Cellar as well, and finally kill more MacOS stuff with fire: Some Emacs builds feature the icon with Homebrew build flags but this doesn’t fix our requirement to use , not . Are we there yet? No. Throw in a bunch of smooth sailing scroll commands that make Emacs a bit more trackpad-friendly: Are we there yet? That depends. Would you like to keep the icon in the dock? In that case, we’re still screwed as Mac thinks the client is another app and convincing it otherwise or using tricks like setting doesn’t seem to work. At this point, I got tired of fighting and gave up. For me, (Alfred) + (finding “Bakemacs”) and jamming enter is good enough. I guess I’ll also create an alias called to quickly whip up a client from a terminal, although I’ve heard you should be running terminals and browsers and Emacs inside Emacs. Scrolling still is a bit annoying because the point keeps on chugging along, making it for a less than optimally smooth experience. At least I managed to get image zooming via pinch zoom on a trackpad working—take that, Sublime! Related topics: / emacs / macos / By Wouter Groeneveld on 20 December 2025.  Reply via email .

0 views
Brain Baking 2 months ago

Properly Preparing Tea While Shaving An Emacs Yak

Hey wow I’m typing this from Emacs! For the first time in more than a decade I decided to see if my beloved Sublime Text could be superseded with software that’s more than twice as old. It’s day four so far, and I’ve been nothing but confused in trying to get it up and running to my tastes, but the journey has kept me on my toes. I’ve disabled Evil mode for now, I don’t think I’m ready for that yet. But I digress. Tea. Right. Wait, the compilation window is acting weird, but I think I just killed that buffer and replaced its contents with this one so now I see two Markdown files in two separate windows while I should have ed instead. I have no idea what I’m doing! Wait, press —no, —and make it serve files instead. But I digress. Tea. Right. It’s actually not that difficult to properly prepare a cup, except that it is. Most people I know are coffee drinkers, and most coffee drinkers I know—which is most people I know, mostly—completely hate drinking green tea. That’s because of two things: one; its caffeine kick does nothing compared to the brown beans, and two; it’s bitter! To make matters worse, most of the teas I order in cafe—caf, wait what? Oh. Evaluate . é. é. Ok, let’s continue—cafés are atrocious. Not just because of the cheap tea bags sold for a ridiculous amount of money, but because cooking water is poured on it, regardless of the kind of tea. Why are these words so weirdly wrapped? Give me a minute, that’s not right. Nothing can’t fix, right? But that completely breaks my treemacs package so I’ll have to resort to visual line mode but not in that package… Won’t be a minute, stay with me! Okay, that’s better. Where was I? How many words we’re at? Unknown? What kind of a powerline are you supposed to be if you don’t show me that? Won’t be a minute, stay with me! Is that ? Looks like it? But I digress. Tea. Right. I listed lots of green teas in my —wait, wouldn’t it be cool if I could get an auto-completed list of potential links within this Hugo blog post project, only while in Markdown mode? I think I’ll need Corfu for that, and possibly also Cape.el ? After hours of fruitlessly shaving that yak, my friend Gemini spewed out something that I understood but was in no position to replicate given my pitiful knowledge of Elisp: But boy that’s handy after binding it to ! Look at this: my previous tea reviews . Ka-boom and it’s there! The hardcore tinkering is already paying off, this already proves to be a more productive writing environment than Sublime. Don’t tell HQ. Looks like I do have to re-type the Projectile run/compile command every time I close Emacs though. Is adding a the Emacs way to store these settings? I guess? But why does it take at least three seconds to load the Brain Baking project? Because it’s using Lisp to find all files instead of using something like or , of course. There, , fixed. Where were we? Tea? Green? I don’t remember. Don’t pour boiling hot water on top of these leaves! Instead, use eighty degrees Celsius at most, preferably even a bit cooler. Another tip: don’t steep for too long. Count a few Mississippi’s, but don’t do it the Ross way. Hang on a minute, I think I’m confused again: isn’t the projectile command map shortcut, it’s the built-in project one! That means that local file isn’t needed anyway. won’t be enough across restarts though, so I guess we’ll be bringing in yet another package: . Two hours later, my humble idea of saving compile command history still doesn’t work: projectile saves it as a hashset, not list, that savehist can’t serialize. Adding custom hooks to convert data types fails as the trigger order of events gets me confused even more. This yak suddenly got much, much bigger. At least I managed to implement pinch zooming on images. Which, now that I try it again, is broken? Oh. I think I need another cup of tea. Related topics: / tea / emacs / By Wouter Groeneveld on 17 December 2025.  Reply via email .

0 views
Brain Baking 2 months ago

Mariage Frères Tea Reviews

It’s been almost five years since I wrote about tea. We just Refreshed our Supplies ( get it? ) and feel the need to store my thoughts on the various Mariage Frères (MF) teas we’ve bought over the years. I’ve been a faithful fan ever since drinking a Mariage Frères teabag on a team building session somewhere in 2012. Call me a snob, and while Palais des Thés and Whittard are generally a great choice as well, most MF teas are simply better. I even went to Paris and London just to get a new batch of MF tea. Their webshop was non-existent—it still is crappy now but functional. As they ship from France, shipping to Belgium usually is . No worries though, add a couple of hundred grams and you’ll hit the free shipping quota in no-time. Ouch. This post was inspired by Seb’s tea reviews post . Seb employs Day of the Tentacle Hoagies to score the teas. Since my retro gaming codex uses Goblins 3 Blounts , it seemed appropriate to apply here as well. Consider this my personal Steepster database . The following list is a reconstruction of purchase histories from my notebooks: Bloomfield Darjeeling A spring first flush tea labelled SFTGFOP1 : Super Fine Tippy Golden Flowery Orange Pekoe. Don’t worry if your initial reaction to that is Huh? : it’s a tea grading term denoting this is one of the highest qualities Dajeerling tea you can get, with the worst being labelled as D : Dust. That’s what inside a regular tea bag. Schol . I love this Bloomfield. It’s the best Darjeeling I ever gulped down. It’s also one of the most expensive coming in at around per (in 2022, that was !). It’s subtle, not bitter if you steep it too long, has a lovely golden colour, can be re-steeped, and does not hit as hard as longer fermented black teas. 5 out of 5 Blounts—Amazing. Namring Royal Upper I’m a big fan of Darjeeling tea: here’s another high quality variant from one of the oldest and largest tea estates in the Indian city. I love to think it looks as picturesque as this Wikipedia plantation photo , but in reality, it will no doubt be a lot of hard work to carefully pluck the best Orange Pekoe leaves each season. We bought Namring to see if Bloomfield could be beaten. It couldn’t—the difference is negligible and this one is even more expensive. Still great, though. 4 out of 5 Blounts—Great. Earl Grey Provence This must have been the first typical black Mariage Frères canister I’ve ever bought. I chanced upon it whilst Christmas shopping in a new cooking shop in my home town that’s unfortunately long gone now. Earl Grey Provence is what it says it is: it’s Earl Grey tea with a dose of Provence: lavender. My wife thinks it smells like bath water when I prepare a cup, but I don’t care. The combination is perfect, and the smell is more intense than the taste. It’s not the highest quality/biggest leaves black tea they selected for this mix but it’s not expensive either. If you like your Grey Earl -y (ha!) in the morning, try adding some lavender. Ingenious. 5 out of 5 Blounts—Amazing. Roi Des Earl Grey We must have bought kilos of Early Grey Provence , so to spice things up, last year I bought another Earl Grey variant: the king of the Earl Greys. Well… not so much. It’s good, but the typical citrus-y flavour comes on a bit too strong in this one, since there’s nothing else in it. I’ll consider buying it again once in a while but it won’t beat Provence. 3 out of 5 Blounts—Good. Chaï Chandernagor Like I told you, I’m a sucker for Indian tea when it comes to black ones, and “chaï” is not an exception. The term is usually used in the west (or at least here?) to describe spiced black tea where adding a dollop of milk is maybe perhaps a little bit allowed. This mix doesn’t just have cloves but some ginger and other stuff as well. Unfortunately, the black tea as a base is of relatively low quality and quite fine-grained. I’ll admit: I prefer Palais des Thés’ simpler but more robust Chaï— not the Imperial one with the red pepper but the one with just cloves. 3 out of 5 Blounts—Good. Chaï Parisien Another variant of spiced black tea with mellow fruity notes that come across as too mellow to me. If I want to drink a spiced black tea, I want to feel the kicker, not try to get the tongue tingled with “mellow fruity notes”. This one wasn’t what I expect of a “chaï”. 2 out of 5 Blounts—Mediocre. A selection of the typical black Mariage Frères tea canisters from our cupboard. The first MF tea I ever tasted and the one that got me hooked. It’s a pure Japanese sencha tea grown near the foot of the Fuji-Yama mountain with that typical grassy flavour. The dried leaves even are long and small, reminiscent of dried grass. It’s easy to screw up a batch by using too hot water or letting it steep for too long. It’s been a while since we bought it because we’re venturing into other flavours right now, but you can’t go wrong with this if you’re looking for a clean well-rounded tea to drink all day. Sencha is the most popular tea in Japan. If prepared well, the result is an appealingly looking greenish liquid. If overdone or prepared with too hot water, it’ll yellow. 4 out of 5 Blounts—Great. Tamaryokucha A grassy variant of the above that edges to the too grassy side for me. Weird, as tamaryokucha is usually considered milder than typical sencha tea. I cleaned out the tin today: we bought it over six years ago and I threw out almost half of it. Not because it’s bad, but because you’ve got to be in the right mood to drink this and there are others that somehow find their way into the tea strainer before it. Maybe try out Fuji-Yama first? The term Ryokucha literally translates to “green tea” and is the parent category of sencha (steamed) and other pan-fried green teas. It’s again unoxidized hence its bright green hue. Mental note: I should explore more Japanese teas. 3 out of 5 Blounts—Good. Thai Mountain (rebranded to Royal Thai Tea) According to MF, “A gourmet tea that whisks us away to the heart of Asia”. The tea leaves are hand-rolled into tiny balls that slowly open as it steeps, unleashing round milky flavours. It’s hard to describe and not very cheap but you only need a few “balls” and it can be re-steeped multiple times. It’s unique enough to warrant a spot in your tea cabinet, although I’m unsure about its staying qualities. It was gifted to me and I have yet to buy a new batch, but I welcomed the occasional Thai Mountain cup during the day. 4 out of 5 Blounts—Great. Not necessarily to be categorized as “pure”. Another typical Japanese green tea mixed with roasted rice. I have yet to drink this one but bought it because the last genmai cha I got from the Portland Japanese Garden was amazing, although that one also contained a bit of matcha. To be rated soon! Marco Polo Vert This is MF’s flagship tea that’s available as black, green, blue (yeah don’t ask), and white teas. It’s got a balanced flowery and fruity taste that leans towards vanilla—literally and figuratively. The tea is a good entry point towards more flowery/sweet-ish green teas—it’s their flagship for a reason—if that is what you’re after. After we finished our supply, I don’t think I’m inclined to buy more. 3 out of 5 Blounts—Good. A beautiful limited edition canister served for a beautiful price (at this point of writing a dazzling per ) but worth it if you’re a true tea believer. The green tea selected for this delicate infusion of plum blossoms is great and the fruity tones are not overwhelming. It’s simply a superb fruity green tea. Too bad that stupid canister and the limited availability drives up the price. 5 out of 5 Blounts—Amazing. Sakura 2000 One of the first fruity MF green teas that we tried and we keep reaching for. Personally, I’d prefer Ume, but given the big price difference and the fact that my wife prefers cherry blossom over plum blossom, we always buy a package of Sakura when ordering online. The flavour is perhaps a bit too much and after years of drinking it, it can get a bit repetitive, but if you don’t know what fruity tea to get and your budget is limited, make it this one. 4 out of 5 Blounts—Great. Sweet Shanghaï A rather heavily perfumed tea with hints and notes of a bit of everything, from rose leaves to exotic fruits. I liked it a lot at first, but the more I drank it, the less enthusiastic I became. I’d rather have a single dominating flavour than a sweet Shanghaï explosion. Still, I wouldn’t say no to it. It’s on par with Marco Polo, I guess. 3 out of 5 Blounts—Good. Vert Amande I used to be very into almonds. I still like a good chunk of marzipan during the local Sinterklaas festivities, but it should stay outside my tea, thank you very much. Almond scented tea tends to become almond water with traces of tea, and this one is no exception. 1 out of 5 Blounts—Bad. Jasmin Imperial “‘The King of Jasmine Teas’ is made with very rare green tea.”, as stated by MF. As jasmine green tea fans, We tried three different jasmine flavours, and this one hits the sweet spot, although the differences are perhaps too small. The added difficulty is that we stocked these three teas at different times so couldn’t do a direct comparison. Feel free to pick whatever you desire, but a jasmine green tea should always be part of your default tea attire. 4 out of 5 Blounts—Great. Grand Jasmin Beauty Brown-silver dried green tea buds/leaves that result in a golden liquid which can be easily confused by Darjeeling tea. It’s still jasmine, only at per , a bit too expensive to notice the biggest difference in flavour. I’m sure objectively speaking it’s got a slight edge over Jasmin Imperial. 4 out of 5 Blounts—Great. Jasmin Monkey King Green tea from Hunan scented with jasmine flowers. More gray-greenish than the jasmine teas above. We found this one to be the least impressive jasmine tea—I think? It’s been a while, this year we only stocked Jasmin Imperial. As far as I can remember, it was still good. 3 out of 5 Blounts—Good. I was curious about pure white tea but now I’m not any more. It’s just not for me: it tastes like… nothing? White tea is very delicate, and perhaps my Earl Grey Provence and spiced Chaï got my taste buds confused. The leaves are beautiful, and however I try to prepare it, I just don’t like it. I’d rather not drink it. 1 out of 5 Blounts—Bad. Pavillon De Laque Same problem as Paï Mu Tan but slightly less so due to the added fragrances of mild spices. The blue flowers lend it a nice and colourful touch but for us it’s not a saving grace. I guess we’re just not white tea people. The fact that this tea is the most expensive in this entire list— per —doesn’t make it better. I kind of feel cheated. 2 out of 5 Blounts—Mediocre. White Rhapsody Just when I thought “okay let’s skip all white teas from now on”, my mother-in-law gifts me a canister of White Rhapsody. I read the label—scented white tea—and moan. Still, I politely accept the gift, put on the kettle, and take a sip. Holy shit! This tea is amazing! I don’t know what MF did to make this work, or perhaps it’s because we drink a lot of flowery green tea, but I love the combination of what they call “summery nuances evoking peach, apricot and fig”. Highly recommended. I was distraught when I learned it was out of stock when I placed a new order last week. 5 out of 5 Blounts—Amazing. Rouge Pleine Lune This one’s a rooibos tea mostly flavoured with almonds. And despite my last remark about almonds in teas, this time, the combination seems to mostly work. I’m not a huge rooibos expert and only occasionally drink it plain. We’ve had this one in a back shelf for years and I recently decided to give it another go. It’s not half bad but I wouldn’t be inclined to order more. 3 out of 5 Blounts—Good. Pu-erh Suprême Curious to fermented pu-erh teas, I ordered my first one last week. I just had a cup and must have done something wrong: it was surprisingly bland. Perhaps it needs more heat, I treated it like green tea. I’ll give it a few more goes before putting up a rating. To be rated soon! Related topics: / tea / By Wouter Groeneveld on 11 December 2025.  Reply via email .

0 views