People hated books when they first came out. They hated horseless carriages. So any new disruptive technology will take a little while for society to digest it, also to evolve.
Matt Mullenweg, 2026
I’ve seen people hating a lot of things when they came out. Like credit cards, crypto, JavaScript private elements syntax, or even a dish in their favorite restaurant that slightly diverges from the one they have eaten for years.
Even I hated things, don’t get me wrong. Even futile things, like the menu arrangement in the new iteration of my favorite OS.
New technologies, and their misuse12, bring both positive and negative effects. But in this case, the positive ones are a couple of magnitudes more than the negative ones.
The world evolves, or better, needs to evolve. Don’t you like how it evolves? So react, and build something better for you and for the rest of the world.
I found that BibLaTeX nowadays supports URLs, Unicode characters, and all the modern stuff. I’ve always been a great LaTeX fan, since my university days. My book had a very complex millimeter-precise pagination such as:
So, why not create a WordPress plugin that generates a BibLaTeX entry of the current post? But, even more funny, why not have something do it for me?
Introducing Telex
I work for Automattic, but it doesn’t take away the fact that I can be happy to use one of our products.
Telex is a “AI-Assisted Authoring Environment for WordPress Blocks”. Today it will help me as a not so popular request.
The prompt:
I want a block that output a biblatex entry of the current page. It should have this identifier "zaerl{YEAR}-{POST SLUG WITHOUT YEAR, MONTH, DAY}.
As author "Francesco Bigiarini"
As title "The title of the post"
As date "The date of the post"
As url "The url of the post"
as urldate "The date of the post"
For example, for this post: https://zaerl.com/2025/08/23/unicode-buffering-and-printf/
The output should be:
@article{zaerl2025-unicode-buffering-and-printf,
author = {Francesco Bigiarini},
title = {Unicode Buffering and printf},
date = {2025-08-23},
url = {https://zaerl.com/2025/08/23/unicode-buffering-and-printf/},
urldate = {2025-08-23}
}
The block should be output in fixed width font.
Isn’t this cool? I downloaded the .zip and tried it on a blank Playground site and it was working. Just needed a second little request. To be sure the style will blend well with the site.
Use the "code" block as the base of the block and not custom CSS or HTML
Plugin installation
Downloaded the .zip
Uploaded the plugin and activated
Added the block to the single post template
And it was done. You can find the Telex project here. And the result after this paragraph. It took more time to write this post than to have this new plugin.
Some years ago, I was at one of those shops where you can buy useless, but funny, objects that you can forget in one of your desk drawers. There was one hand-made of wood, that kind of pretty, creepy one, you can move parts, and that 99% of the time has been positioned to flip you.
Could it have been a good tool for someone who works with drawings? But then I thought that you already have that. It’s your own hand.
When creating something creative like a painting or that handy JS tool, the truth lies somewhere in the middle. Software engineering has a long history, and when creating something new, someone has probably already done it.
Create
Evolve
Adapt
Stop
I am using FreeBSD on my personal computers these days, and it has jails since 2000, 13 years before Docker. Every day it’s a wow moment. And you know why? Because they are at the looping points 2 and 3.
Creating great software means concentrating on that dream and never reaching point 4, because once you get there, it’s challenging to do. There’s no need to add that many new things to a project to evolve it, because you must know when to stop. And once too many are added, stopping is impossible.
One day, during a weekend, I was writing some code for my Mojibake library when I saw a strange output in my CLI for the U+10C0 codepoint chosen by random.
Uh? The Unicode Georgian block (MJB_BLOCK_GEORGIAN) has ID 36, and not 0. Even stranger the name of the block was correct. Just the ID was wrong. I made a quick database query and the data was ok:
select id from blocks where name = 'Georgian';
36
Mojibake is in the alpha status. I probably overwritten the memory or something in the mjb_character_block function?
block->id = (mjb_block)raw_id;
No data truncation or similar here. An enum is an integer in C and sqlite3_column_int return an integer. Did I overwrite something with the strncpy? Nothing. So I added an innocent printf.
printf("ID: %d, block.id)
ID: 0
Nothing changed. Or at least I tought that nothing changed. I output the data inside the CLI code:
🙂. The first time I called a printf the value was zero, the second one it was the right one.
Welcome to the Unicode world
How is it ever possible that printf print something and the same printf one row below something else? The printf function must not change the values it receives. But, what is the printf function?
The printf, like other functions of the stdio.h family outputs a string to a FILE*, in this case stdout. It has a buffer that is flushed when you output a newline. Should this buffer be the problem? Well… yes? By forcing a fflush I solved the problem.
I checked the macOS open source internals but after a while, I gave up. I began working on my library to see if I can solve some of those Latin-1 screwed up èéò characters family.
I like parts of developing that are not very trendy nowadays. Whatever LLVM I use makes a lot of very basic mistakes, produces slow code, and generally makes code that makes me smile.
I had time for myself for the last two days, and I asked Cursor to count the commas in a string, in C. I know how to do it. That’s one of the code snippets in a “Learn how to program in C in ten lessons”.
And it… looped the string, created another with just commas, and ran strlen. Strange? Python style? And I tried again to ask, and it made a code that incremented a variable, like everybody would do.
Does it not have a billion tokens for talking with me? For giving me hints in the context of my not-trendy projects? Was it I who was not gentle enough to explain my needs well?
I took a Campari with the sound of the Arno river in the background, thinking about the servers on the other side of the ocean that worked for me, producing a bit of heat and noise to suggest that strlen.
You have to enjoy the little things in life. And that drink was just at the right temperature.
Why? Yes, literally “WHY”. That’s because “WHY” in italian is written “PERCHÉ?”
But there’s a problem.
Dov’è la lettera grande con l’accento al contrario? (Where is the big letter with the reversed accent?)
Everybody writing something using a Windows/macOS keyboard
Let’s type it on macOS
Is it easy to write É on a macOS keyboard? Of course not. You must hold shift+option (AKA alt) and press V. Or shift+e+wait-one-second+2.
The macOS keyboard shown when you press ⎇ and ⇧
What about Windows?
Well, you must type Alt+1 -> 4 -> 4 or Alt+0 -> 2 -> 0 -> 1. One after another.
Why it’s a curse?
People don’t want to waste time searching for something that can potentially break that system written in Latin-1 that then encodes in UTF-8, maybe later in ASCII, and who knows what. So they write something similar:
PERCHE’
PERCHè
PERCHé
What do we learn about this? When there is a solution to a problem widely accepted by everybody, but not the real solution, then often there is no effort to find a real solution upstream.
I remember when I was in high school (I am from the 80s) and had no money to buy a Sega Saturn. It was the best! And I didn’t like Sony; I’m not sure why. Today, I have my first PlayStation, the first after 30 years. But this is another story.
I started working as a waiter at 16 years old just to buy all the stuff I needed. I worked on Saturday nights, then went to a club, and returned to work on Sundays and school on Mondays.
After I started working, I began to understand the meaning of money and that excessive attachment to things is the source of all evil. So, I gave up the idea of spending my money on consoles, electric guitars, or whatever popped up in my mind.
Fast-forward to when I was 18 years old. My father bought me a computer. It was a Celeron 300A, easily overclocked to 450Mhz. It was my start as a programmer. One day (I was 28 years old), I found that Wipeout 2097, the second installment of the Wipeout series, was ported onto Windows. Wow!
My computer was too performant
Yes, it was. The problem was that my hover car was undrivable. It was too fast and impossible to turn corners without hitting the sides. So, I needed to limit the frame rate to 30 fps.
For obvious reasons, I didn’t want to patch the .exe and redistribute the file, so I discovered that I could inject a DLL on Windows.
I’ve lost my old code, but if I remember well, I disassembled it, found the main rendering loop, and tried a couple of solutions. Both working:
Trick the parent code by changing the return value of GetTickCount()
I was thrilled! It was working well, and the techno soundtrack was great. The game wasn’t that funny, but disassembling was by far the most amusing thing I had ever done.
Why not look forward and help the community?
I then started working on adding the network mode on Guilty Gear X. Why not create a tool to start games and patch them on the fly? There were plenty of poor ports on Windows. People could have a simple tool to start the game executable and have it patched on the fly.
I created a small C program called Gear using the Win32 List View control, a Wipeout 2097 launcher, and the promise for the Guilty Gear X one. You can see the game, click on the executable icon, and enjoy your game. It had as an icon the frame that appears on screen before Justice uses the Overdrive Attack.
I went to WipEoutZone forum and wrote about it. I got this response:
No matter how old these games are, they are still owned and copyrighted by Sony, who are still actively selling them for different consoles than they were originally produced for. IIRC, the copyrights specifically forbid any modification of the games without permission from the copyright holder.
I also received a cease and desist letter promise by email, so I was done playing around with copyrighted materials.
Matt published this post in his blog on 2024-09-17, and these are my ideas.
But first, some context. I’m Francesco. I worked at Automattic for three years and have been an avid user of WordPress since 2.0 Duke and bbPress. I can write whatever I want despite working for Automattic. This is my blog, and I don’t want to appear as a good employee in everyone’s eyes.
Back in the days
Why do I work at Automattic? Back in the day, our system administrator switched the webserver from IIS to Apache, so we started building our first simple sites with WordPress for our customers. We chose something ready and did not move all our ASP code to PHP. I was the only one knowing a little bit of PHP, so we speeded up our work by making small plugins, custom themes, and some core patches here and there. No more strange server objects, no more ADO. It was good!
Back to our days
There have been a lot of discussions about the WPEngine / Automattic / WordPress foundations situation these hours, and it is interesting to read all the comments, whether they mean or not. This is the most interesting to me despite not having the classic +200 comments HN-style: https://news.ycombinator.com/item?id=41652760. Hacker News is the only place nowadays where I am sure that every comment without a text-color similar to the main table #f6f6ef is a good one to read.
Nourish is the trickiest, and most important part: it’s where we water the garden. If you’ve done the previous three steps, you’ve been very successful; now your responsibility is to spread the fruits of your labors around the ecosystem so that everyone can succeed together. This is the philosophy behind Five For the Future, which you’re going to see us emphasize a lot more now.
Matt
This is true, and it is the base of OSS. Many people who are not developers, engineers, or related to the IT world know about it. When you use something for free and can do something to help who provide what you are using, you should do it. I try to do it for all the small things I do every day. Not that you are terrible if you don’t donate money to Nginx, a server you use all day!
A small story from today
I was talking with a new friend and told him that my two favorite books are Roadside Picnic and Catch-22. My library caught fire some years ago and destroyed my 200-book collection. He was very kind. He thought I had only the e-book, so he gave me the physical copy, so I had two copies.
So what about now? Can I do something for somebody or not? Should I hide my old copy inside a drawer and keep the new one given to me with a smile? Yes, I can do something. So today, after my usual espresso at the bar with my friend, we went to our road public library.
It’s a small box where you can leave one of your books, pick another, return it after you read it, or maybe take it from you forever.
What if most people get the significant part of the book and don’t leave anything? Or maybe grab all the books and sell them? You can do it! No problem. But this tiny box is made to share experiences, books that you love, poems, and stories you’ve written. I hope whoever reads Comma-22 will like it as much as I do and leave another book of them. We are about to open another one in the city next to mine. People who know about this they give us what they can.
About WP Engine and that tiny box
Compare the Five For the Future pages from Automattic and WP Engine, two companies that are roughly the same size with revenue in the ballpark of half a billion. These pledges are just a proxy and aren’t perfectly accurate, but as I write this, Automattic has 3,786 hours per week (not even counting me!), and WP Engine has 47 hours. WP Engine has good people, some of whom are listed on that page, but the company is controlled by Silver Lake, a private equity firm with $102 billion in assets under management. Silver Lake doesn’t give a dang about your Open Source ideals. It just wants a return on capital.
Matt
WP Engine is not a charitable organization; they (Silver Lake) want to make money and do a lot. It would be best to give back something when you use software to earn millions of dollars. You can not do it, obviously, but you should.
WP Engine has always had a strong approach to giving back to our community, giving back to our employees, and giving back to our industry. This commitment is woven throughout our core values from Do the right thing to Committed to giving back.
One of the WP Engine core values
And:
WP Engine believes in the power of open source and the power of the WordPress community. Open Future is devoted to increasing open source visibility and capability in the world of WordPress and beyond.
Open Future | Engine for Good at WP Engine
WP Engine gets from the WordPress ecosystem without giving much back. The Open Source community is built by people for people. Everybody should add what they can, like a book in a tiny box.
I have a few AFK days, so I created a mobile game for my son. It is only a prototype now, but it is already playable.
When I can, I always start what I call a power-of-2 project. In these projects, I do take 16 hours to:
Think at: what to do?
I want to learn something new that will help me do that.
Create something with what I have learned.
If I like it, I will allocate another 16 hours, then another 32, up to 64, and so on, as a power of 2.
What to do?
Like I wrote, I wanted to do a game. But what game? I have multiple games on my iPhone. I tested from one step away what he liked. He is four years old. I saw him choosing fast-action and simple games, like “Basic Hiking,” “Time to React!”, “Geometry,” and similar.
I thought about creating a game with a simple physics world and a set of squares you can tap and throw away. Once you clean up the screen, you move to the next level. It is simple and quick.
The name? Tap and Catch!
Learn something new
Sixteen hours is too short to create a new game engine, so I used a preexisting one. I already know something about Swift, Obj-C, C, etc., so I searched for a game engine that is:
Small
It has a physics engine
Is programmable in Lua
Multiple cross-platform engines allow you to use Lua, but I decided on LÖVE (AKA Love2D) ❤️ because it has everything I need.
In the prototype, I just created a Box2D world with the following:
love.physics.setMeter(30)
World = love.physics.newWorld(0, 9.81 * 30, true)
The “30” number means “one meter in the Box2D world is 30 pixels in the monitor”. See official documentation on why 30 is a good one.
“9.81” is the earth’s gravity.
I created a single rectangle attached to the background at the center of the screen with a weld joint in the middle. When the rectangle is clicked, the weld is removed, and a new one is created where the user has clicked.
Create a weld joint where you click.
It is working on macOS. It’s time to move to iOS.
Load the project on iOS
LÖVE does not work well on the iOS simulator, and I didn’t investigate why because I was short on time.
It’s bad memory access on glDrawElements
You can technically enable developer mode on your device, set yourself as a trusted developer, and load the app. But I paid Apple for a developer account, and I had an old one from 2007. Deploying is simple:
Get the iOS source
Compress all your Lua files zip -9 -r TAC.love *.lua
Add the .love file to the “Copy Bundle Resources” build phase of the love-ios target
Run it
But the red rectangle wasn’t centered anymore on the screen.
The aspect ratio
LÖVE default window is 800×600 pixels. See https://iosref.com/res. But modern phones have a 9:19.5 aspect ratio.
I added this aspect ratio for desktop and mobile to ensure enough room to work on. In the meantime, also set “high DPI” true for retina displays.
function love.conf(t)
local aspectRatioW = 19.5
local aspectRatioH = 9
local width = 932
t.window.width = width
t.window.height = math.floor((width * aspectRatioH) / aspectRatioW)
t.window.highdpi = true
end
Relative positioning is then calculated from the center of the screen.
local w, h = love.graphics.getDimensions()
-- Center is w / 2, h / 2
The following image shows a 24×12 grid with four blue rectangles of the last four iPhone models.
Multiple aspect ratio.
I then choose a height/12 as the base dimension. Everything on the screen will be a multiple of this base, positioning, dimensions, everything. I will not have problems with larger devices and others.
I manually created six rectangles to see if it was working. I changed the weld joint to a mouse joint so you can grab and throw them.
Nine squares are aligned in the center.
Add a simple menu
I was at ~8 hours and decided to polish things before moving on. I added a simple menu. I drew two lines to ensure that everything was aligned in the center. I had a first misstep.
Ops!
Quick recalculation:
Now is centered.
iOS default fonts are boring, so I decided to use FFF Forward.
New font.
FFF Forward is a variable-width font. So, the “S” and the “p” are not aligned. I used love.graphics.print with Font:getWidth to fill the background. It should fill all the background, but a font has:
A baseline
A descent
An height
A line height
It’s fascinating, but there is not enough time to create a pixel-perfect background. So I decided it was good this way.
The editor
I needed an editor now to create the levels, as I couldn’t do it manually. Time was running short, so I made a quick JS one. Nothing is interesting here, so a video is enough. The editor saves the results as a JSON.
Create, move, rotate, delete rectangles.
I created a Javascript to Lua tables library to transform the JSON file into a levels.lua file. You can find it here: https://github.com/zaerl/js-to-lua.
{
name = "Level 1",
rects = { {
x = 24,
y = 12,
r = 0
} }
}
Time has finished
The 16 hours have passed. I created a small working prototype with four levels, and my son is playing it. I think it is promising, so I will extend it, polish the product, and publish it on the App Store for free.