I don't speak much about WordPress on this blog, but it's a very important part of my life. I've been working in WordPress for nearly 20 years! I've contributed to core, run releases, spoken at WordCamps, built and sold businesses on WordPress.
I recently spoke about the WordPress Plugin repo at WordCamp Brisbane 2025. The session was recorded and is now available to watch on YouTube.
The WordPress ecosystem is very unique. In a world hyper-optimised to micro-transact, greedily extracting every last dollar, WordPress stands apart. It's version of an "app store", the plugin repo, is strictly open-source, and 100% free. You couldn't buy a plugin from WordPress.org if you tried.
That poses some interesting challenges for plugin authors who want to build a sustainable business. That's what my talk is about.
I’m excited to announce Pretty Good Podcasts, a podcast network I’ve founded alongside Joshua and Jonathan Wold.
The network right now is no more than a website which lists our podcasts. Our goal is to grow the list, grow an audience, and cross promote our shows.
The website is pretty good, too. I hand coded it in HTML and CSS. No dependencies. No build. No AI. Took about 3 hours. Had a lot of fun doing it too!
The range of shows is somehow both diverse and also… of a kind. I don’t know quite how to describe that. They seem to fit a theme, but I’m not sure which one.
Just a few quick thoughts on my first real experimentation with on-device Apple Intelligence.
My project started out as a game where you are imprisoned, and you need to convince the jail guard to free you! The guard's dialogue would be AI generated on the fly, as well as set of possible responses for the player to select from.
I felt that giving the player options to respond with, instead of freeform text, would make it more interesting and easier to play. I was right! It's way more fun. My guess is that it has something to do with cognitive overhead. You don't want to think too hard while playing a game.
In terms of Apple Intelligence, type specification is a killer feature. I don't think I'll ever be able to programatically communicate with an AI's API without it. I could do things like this:
@Generable
struct Reply: Hashable, Equatable {
@Guide(description: "A short description of the disposition with which the reply is given.")
let mood: Mood
@Guide(description: "The spoken reply.")
let dialog: String
@Guide(description: "The person replying.")
var speaker: Speaker
}
And the response would be in exactly that format. Note that Mood and Speaker are enums with a predefined set of possible values.
In terms of speed, it was a little slower than I had hoped. But then, I was only running it in the simulator, so I can't be sure. Also I'm doing a lot of work, and I'm sure some of it can be optimised, or even pre-loaded. The time it takes it about on par with a network request to ChatGPT though.
I frequently hit a "sensitive content" error. SensitiveContentSettings: Sanitizer model found unsafe content in value. The error doesn't really give me a lot to go on, and in the end I figured that it must be related to the player being in prison or something. So I changed it to a generic fantasy setting, and prompted the dialogue to be in "ye olde English".
And that gave me another sporadic error response. Unsupported language pl detected. (sometimes other languages). If I removed the silly old English, this resolved itself.
The "game" part didn't really work because the AI wasn't able to drive the conversation to a natural conclusion. If I wanted to spend more time on it, I'd have multiple different prompts, or prompt variations. The prompt would change depending on mood, and conversation length, to help find a natural ending. One prompt for whatever success looks like: receiving the quest or learning the information. If the NPC becomes angry, or the conversation has lasted too long, a prompt for wrapping the conversation up saying goodbye.
If you'd like to see the project code, let me know, I'm happy to share.
I've been working on some family genealogy, tracing back my maternal grandfather's line. There's quite a mystery there!1
Ronald Fabri's Baptism record from Alexandria, Egypt.
The best part of family research is talking to family about all the old family stories. They're unlikely, maybe even impossible tales, but surely some parts must be true!
Here are two of my favourites.
Budelli
A Fabri of old went gambling one night in Alexandria, and he won big! He on his way back home when he was mugged by some Arabs. They stabbed him many times, took his money, and left him for dead on the street.
But this Fabri was strong. He got up, and discovered that he'd been stabbed him so many times that his budelli (guts) were falling out! He held his budelli in his hands and walked to the hospital. They attempted to operate on him, but it wasn't looking good. The hospital staff found him dead the next day, with his cot's cast iron rails twisted around himself. The pain was so bad he had bent the rails.
La Pipa
This story comes from Edwin. The Bonnicis (my Nonno's mother's family) were ship-makers in Malta. At some point, they decided to leave Malta. They built their own ship and sailed to Alexandria. Their captain was Giuseppe Bonnici, who apparently had a tail.
One night, Giuseppe docked the boat, and went out all night to a party. It was raucous and loud, and in the chaos he left his pipe on the mantlepiece. The next day he went to retrieve it, and the whole place was boarded up. Cobwebs! He broke in, and found the pipe precisely where he had left it.
We're Italians. We speak Italian, we eat Italian, my grandfather and his brother both married Italian wives. My Nonno's DNA is 71% Italian! The Fabris came to Australia from Venice, via Alexandria. Or so always thought. As it turns out, baptism records, marriage certificates, and burial records, always list our nationality as Maltese, and while we were in Egypt, we married Maltese wives. What! And how!? Further to that, we were in Alexandria for at least seven generations! And in every generation, our family is listed as "Fabri (Maltese)". Now we're trying to figure out how far back it goes (we're currently stuck at 1823), and whether there truly is, at some point in history, a migration from Venice to Alexandria. ↩︎
Bloom's Taxonomy is a mainstay in education circles. It provides a structure for thinking about cognition, and how we learn. Basically, we structure knowledge by refining information through a process. This starts with lower-order thinking, and moves through to higher-order thinking skills.
Wait! Forget Bloom for a moment. Those two concepts, let's focus there:
Lower Order Thinking Skills (LOTS)
Higher Order Thinking Skills (HOTS)
Understanding what these are is absolutely essential in an world where LLMs are at our fingertips.
Especially since MIT has noticed that LLMs have been turning people into sheep:
The LLM undeniably reduced the friction involved in answering participants' questions compared to the Search Engine. However, this convenience came at a cognitive cost, diminishing users' inclination to critically evaluate the LLM's output or ”opinions” (probabilistic answers based on the training datasets). This highlights a concerning evolution of the 'echo chamber' effect: rather than disappearing, it has adapted to shape user exposure through algorithmically curated content.
—
Kosmyna et al., Your Brain on ChatGPT: Accumulation of Cognitive Debt when Using an AI Assistant for Essay Writing Task
(Based on my subjective experience with ChatGPT, the echo chamber effect is further amplified by the "memory" feature.)
So what is lower order and higher order thinking? Let's return to Bloom's Taxonomy. This is typically presented as a pyramid, to represent the fact that each level of thinking skills is built upon the one below it.
It's a simple framework. We build knowledge by remembering information, then understanding it. In order to master that knowledge, we must apply it, analyse it, evaluate it, and ultimately, create something new with it.
Those higher order thinking skills are absolutely essential to critical thinking, problem solving, and innovating. Cognitive fitness requires regular training. If we get in the habit of using LLMs to do the hard thinking for us, we'll naturally fall out of practice! It's a terrifying, but very real, possibility!
LLMs are helpful for practicing our lower order thinking. Using ChatGPT to practice a language, recall key facts, or explain a new idea can be incredibly effective. However, we should be very mindful and careful to structure our prompts to target lower order thinking.
Get excited! Higher order thinking isn't a chore that you want to farm off to the machines! it's what makes us human. And if we can use LLMs to help reduce cognitive load for lower order thinking tasks, we'll have more in the tank for higher order thinking.
There's a lot of us out there. Those strange, backward people who refuse to use Facebook or Instagram. Ads? algorithms? influencers!? ick!
Unfortunately, those of us who prefer to stay signed-out of such social media platforms often find ourselves attempting to access a business Facebook page, or some Instagram post that a well-intentioned friend found amusing. In such cases, we're bombarded by nagging login prompts, blocking the content and barring our way.
As it says in the scriptures:
Better to dwell in the wilderness than with a quarrelsome and nagging website.
—
Broverbs 21:19
A nagging app is like the dripping of a leaky roof in a rainstorm.
—
Broverbs 27:15
So, I built a free Safari extension to help Facebook and Instagram find some chill.
Tonic hides all login popups and nags from Facebook and Instagram. It let's you see the content, without the pestering attempts to produce a new account sign-up.
Tonic is MacOS only for now. It's mostly working on iOS too (there's some lingering difficulty with getting Instagram to play nicely), so let me know if that would be useful to you.
If you find Tonic helpful, please share it on, and leave an App Store review.
If you are already very competent at producing the work on your own, you can leverage AI to increase the speed of your work while maintaining a high standard of quality. It won't make you any better at what you do, but it will reduce the time you spend doing it.
Speed + Competency
You can use AI to quickly spin up a prototype version of the work. The results will be messy, but if you pay attention you might just pick up a thing or two about how the work gets done.
Quality + Competency
You can add AI steps to your workflow that will increase the quality of your work. You can learn from what the AI produces so that, in time, you'll get better at producing the work yourself.
Your choice will be reflected in your prompt.
For Speed + Quality use "for me" language. Command an action, usually a starting point request. This sounds like:
Scaffold a [work].
Suggest an outline for [work].
Setup a boilerplate [work].
For Speed + Competency use "together" language. Ask for a complete solution, along with the explanation. This sounds like:
Let's create a [work] together, step by step.
How can we fix [work]?
What's the best way for us to create a [work]?
For Quality + Competency use "my" language. Ask for suggested edits or changes, explicitly requesting them as dot points. This sounds like:
Does my [work] match the requirements?
Suggest changes to my [work].
How could I improve my [work]?
Consider carefully the kind of work you're creating, and why you're creating it. Are you trying to become a better writer? coder? thinker? Maybe you're just trying to quickly prove an idea, or hoping to get the work done faster. Once you know, choose an approach, and prompt accordingly.
Pursuant to my previous post regarding the en dash (wherein I beseech readers to consider British style selections for the dash parenthetical), I further propose the adoption of a little non-standard grammar to more plainly distinguish human writing from that which was contrived by large language models.
I'm not suggesting we simply make up new rules! However, we might consider leaning a little on historical precedent.
I've been reading Sense and Sensibility, where I've become smitten by Austen's use of run-on sentences which employ a lowercase letter after a terminal punctuation mark. You'll often find this follows a mid-sentence interrogative. "Would it be distracting? or merely a charming affectation?" Sometimes, after a mid-sentence exclamation. "Distracting? certainly not! if anything, it's more conversational."
Please don't mistake this as a step in the direction of sam altman's all-lowercase tweet style. Nor need we go so far as Laurence Sterne's exhausting run-on sentences ; full of spaced semicolons ; like an ADHD child with a sugar high talking about dinosaurs ; have you ever heard of a Megalodon?
This 19th century callback might just serve as a quiet reminder that there are still pockets of the internet which are written by real people. Who doesn't love a little "non-standard" literary disobedience, anyway? nothing wrong with bending a few rules.
I've been using the em dash wrong. On this blog, ranges will now be correctly represented by an en dash. 0–9, 1987–2025, א–ת.
Additionally, I'd like to invite readers to join me in adopting the Guardian / Economist style of using spaced en dashes for asides – just like this.
Of course, I'm predisposed to a more British format. But the reason you should consider switching styles is because the un-spaced em dash aside has become a classic telltale marker of AI generated writing.
Standout from the crowd! Make a political statement! Support human creativity! Use an en dash!
While we're on the topic of punctuation, I'm very excited about 2026 being the year of the ellipsis! The unicode character "U+2026" is the Horizontal Ellipsis, and it's one of my favourite characters. This will replace the pitiful U+2025 incumbent – the so-called "two dot leader" (‥).
Did you know that you can type an ellipsis using the Option+; shortcut? Try it out! No more three-character "dot dot dot". Just think of the storage efficiency!
I've been trying to reconcile the way I feel about AI. (It's been a hot topic on Async recently.)
On the one hand, I see so much shitty code submitted to the WordPress plugin repo. It's easy to see how AI is making things way worse for the web – in terms of security, homogenisation, and long-term maintainability. There are legitimate concerns about loss of craft, content scraping, and enshittification.
On the other hand, I use AI for help every time I write code! It's a far cry from vIbE cOdInG, but it's unlocked possibilities in ways I never thought possible. ChatGPT has, undoubtedly, made me a better developer! Writers like Joshua Wold use AI to line-edit finished pieces, and learn a lot about writing better prose in the process. I even use AI writing this blog for things like "what's that word…?" and rubber ducking.
I've got the ChatGPT shortcut under my fingers, and I often find myself instinctively invoking it. I worry about the long-term effects that might have on my brain, as I reflexively hand off hard thinking. I worry about the long-term effects that might have on all our brains.
My current mental model is that AI is a sliding scale multiplier. The slider shifts based on the operator's effort.
Operator Effort
<------ low ------ mid ------ high ------>
<------ 0.5x ------ 0.9x ------ 3.0x ------>
AI Impact
AI will impact the quality of our work, our working knowledge, and our skill. If I allow AI to complete tasks without any struggle or oversight, the result will be worse, and over time, my skill will degrade.
But if I employ AI as a true "copilot" – an assistant who can step in to help when I really need it – I unlock opportunities to improve, and to try new things I wouldn't otherwise have the confidence to attempt.
Teachers talk endlessly about "Digital Literacy" and "21st Century" competencies. That was important 20 years ago, but is no longer relevant. Today's school students have been "native digital citizens" since before their fifth birthday. It's time for a change. We're in dire need of understanding how AI influences thinking and learning, so that we can embed AI Literacy in our curricula.