Armchair Podcasting

A great podcast depends on the natural rapport of the hosts.

Social chemistry comes from mutual trust, respect, friendship, and experience. It also comes from your environment.

More often than not, my podcasts are recorded over video chat, or even asynchronously. But the Pirate School podcast has a different kind of magic.

Talia and I record it on the couch. There's something about sitting on a lounge, arms spread, feet curled up, cushions, that makes for a much more conversational tone. It's fun, it's very easy (when would we ever find time to sit together in a podcasting studio?), and we're close at hand if the baby wakes up while we're recording.

I wanted to share our tech setup, because it works so well for this in-person, on-site kind of format.

Mics

We use a pair of DJI Mic 2s. They come in a great charging case, which includes the two mics, and a receiver which makes the whole setup wireless (except for the monitor – more on that in a minute). No tricky bluetooth connections or dropouts. The receiver is USB-C, so it plugs right into my Mac – OR – my iPhone. I can record the whole thing in Voice Memos.

The receiver has a setting which allows us to record each speaker on a separate audio channel. My voice goes on the left, Talia's on right. Ultimately, we will mix this down to mono, but having separate tracks helps a lot with the noise cancellation we do in post (more on that in a minute, too).

Getting a Handle on Things

The DJI Mic 2s are lavalier mics, but we found that the audio quality was much better if you speak directly into them, rather than have them on our shirtfronts. For a few episodes we just held the mics in our fingers, but they're a bit too small for that, and it gets a bit awkward.

These Handheld Wireless Microphone Sticks from AliExpress were a game changer. The Mic 2s clip neatly onto the end of what's essentially just a plastic stick handle, and you pop the windshield foam on top. Tada! You've got a traditional interview mic. It feels a lot more natural to speak into these.

Monitor

It's super important to be able to hear yourself while you're recording. It's one of those "this one simple trick" things that actually does work to significantly improve the quality of your podcasting – so long as there's no latency. Thankfully, the DJI Mic 2's receiver has a direct headphone-out audio monitor (with very minimal latency) that passes both microphones straight through to a pair of headphones.

But there's two of us! We need to plug two sets of headphones in! So, we use a 3.5mm audio splitter similar to this one (you can find these cheap just about anywhere). Plug the male end into the receiver, and now we can both plug our own headphones into the splitter.

This has the added benefit of combining both audio channels into a single mono channel. If I plug my headphones directly into the receiver, I hear myself in one ear and Talia in the other. But with a cheap audio splitter, we both hear both microphones in both ears.

Headphones

We don't need anything hi-fidelity when it comes to recording voices for podcasts. The requirements for podcasting headphones are simple:

  1. The must be wired.
  2. They must have little-to-no audio bleed (sounds played through the headphones that "leak" into the microphones).
  3. They must be comfortable.

I've found the Behringer DH100 Drummer Headphones to be perfect for this. Drummers headphones are designed to block out the loud noises coming from a drum kit while you're playing, so they have very little audio bleed. They're comfortable for wearing for longer recording sessions. Plus, they're really cheap. We have a pair of these, which we use for monitoring our audio.

Post Processing

The DJI Mic 2s do a great job on their own, but I also run the resulting Voice Memos file through Auphonic. I've created a preset in Auphonic that adds our artwork to each episode, adds an intro and outro to each episode, removes background noise, normalises volumes, and removes long silences.


It looks something like this:

        📱
     📟─╯
🎧──━┻━──🎧
👨‍💼       👩‍💼
🎤       🎤

The whole setup costs about AU $580 (US $380). It can be packed up into a pretty small case. It's perfect for recording two people on the couch, at events, street interviews, or just out and about.

It should be possible to double the setup to get four people, but you'll need to use a Mac to record, with multiple USB-C ports. You could either record over multiple channels in GarageBand or Logic, or use the built in Audio MIDI Setup app to create an Aggregate Device which combines the two separate Receiver inputs.

Ugo Fabri

This is a deeply personal post. I'm actually not sure how to end it. I'm still processing, to be honest. So it doesn't read particularly smoothly. Please read part one and part two first.

By now, you know about my strange experience at the Mauthausen concentration camp in Austria. You've also met my grandfather, Ron Fabri, and heard about my Italian-Egyptian ancestry. Here's how it comes together.

In April I visited a relative from the Fabri side of my family. Edwin's daughter, Marianne. She had recently obtained Italian citizenship, and in the process, revisited the Fabri family tree. She recalled a conversation with her father, before his death, where he'd written down some of the cousins he remembered from his youth. He called them the "Genoan Fabris", living in Genoa, Italy.

Having been born and raised in Alexandria, Ron and Edwin had little to do with their Italian cousins. But they knew of them well enough. One of the names Edwin wrote down was Ugo Fabri.

Naturally, we looked Ugo up, hoping he might still be alive, or that we might be able to get in touch with his children.

Ugo Fabri was born in Genoa on January 26, 1915.

By profession, he was a teacher.

In 1943, he was arrested by the Nazis during their occupation of Italy.

On September 22, 1943, he arrived in Dachau concentration camp.

On December 6, he was put on a train. He travelled for three days in an unheated cattle car in temperatures as low as -5°C.

On December 9, he arrived at Mauthausen.

He endured months of forced labour under brutal conditions

He died at 4:00am on April 26, 1944.

Ugo Fabri's death report from Mauthausen concentration camp.

Ugo Fabri's death report from Mauthausen concentration camp.

Ugo Fabri's transfer slip from Dachau.

Ugo Fabri's transfer slip from Dachau.

Dachau records showing Ugo Fabri's arrival and transfer dates.

Dachau records showing Ugo Fabri's arrival and transfer dates.

Deprofessionalisation

I was in a very demotivating university tutorial yesterday.

We're learning about Education Standards. ATAR scores.1 How most schools reconfigure their entire senior syllabus to optimise for university entrance exams.

Teachers are expected to teach specifically for a good ATAR result. Test performance becomes competitive – not only for students, but for schools, and the broader community. ATAR results affect real-estate prices!

I stayed after class and spoke to a lecturer about it. He agreed. More and more teachers are becoming "standards" experts, while content knowledge experts are being driven out of the field. There's less creativity, less inquiry, less intuition, less spontaneity, less nuance, less fun.

Australian teachers are expected to be "Classroom Managers" and "Content Delivery Agents". Data Entry Clerks with an interactive whiteboard.

My lecturer described this as the "Deprofessionalisation" of teachers.2

Reflecting on this, deprofessionalisation is the reason I'm becoming more and more disillusioned software engineering.

A friend of mine shared a screencast in a group chat today that demonstrated the use of AI chatbots and agents to build a piece of software without writing any code. Compared to programming, the process involved less creativity, less inquiry, less intuition, less spontaneity, less nuance, and far less fun.3

Vibe coding is exciting4, empowering, and useful. but man, if it doesn't suck the joy out of software engineering.


  1. Australian Tertiary Admission Rank ↩︎

  2. Challenging the Deprofessionalisation of Teaching and Teachers – great read! ↩︎

  3. Also, more bugs, more vulnerabilities, more opaque failures, more regressions, more dependencies, more resources… ↩︎

  4. It's exciting the first time. Maybe the second, too. But once the novelty wears thin, vibe coding quickly becomes an exercise in frustration. ↩︎

It might have to be you

When something doesn’t work the way you’d like, what’s your first inclination?

Scrap it and look for a better one?

Or, are you the kind of person who would rather build it again from scratch? You’re a founder. A maker. A hacker. A smith.

We are founders. We learn lessons the hard way. We don’t easily take advice, but we often to surround ourselves with subject matter experts and develop deep relational trust. You can recognise us by our wake of failed-to-launch projects, and inability to keep to a schedule.

We are hackers. You’ll often find us in startup, open-source, and home education communities. We love to contribute. We imagine a better way, then we build it. Maybe it’s an accessibility feature, or maybe it’s a personalised syllabus. We embrace do-ocracy.

We are makers. We can’t help but build and build and build. We embrace self-publishing, because we can’t stand editorial gatekeeping. Our works and talents have an indelible urge to exist in the public domain. We publish prolifically, blog posts, podcasts, resources, methodologies, code pushed to production.

So, if something doesn’t work the way you’d like, what are you going to do about it? Who’s going to change, build, invent it?

It might have to be you.

Dia

I tried Dia. It's a new browser from the Browser Company that's all about AI-assisted browsing.

Verdict: Hard no.

First up, this was the first time I've ever experienced a sign-up form that refused to accept an iCloud address. Rude.

Second, I just can't switch to a browser that misses all the native integrations which Safari enjoys. I can't touch my fingerprint to my keyboard to sign-in, or handoff to my phone, or auto-fill from Apple Passwords, use Apple Pay, that sort of thing.

Last, it's not clear what this browser adds on top of the ChatGPT for Mac app. I've already got Option+Space ready to invoke ChatGPT everywhere on my computer. If I need a YouTube video summarised, or a web search, or some code… ChatGPT is already available to me when and where I need it. I don't need a specialised web browser for this.

There must be a type of person who uses the browser for everything, from word processing to entertainment to email. I don't. I use apps like Pages, Apple TV (or the excellent Play by Marcos Tanaka), or Mail. I read my favourite websites through an RSS reader app. Going through my App Defaults, the only thing I use the browser for is Search, and Auphonic.

You know, while writing that previous sentence, I just wondered to myself: does Auphonic have a Mac app?1 My first inclination is to invoke ChatGPT right here in my Nova editor (where I'm writing this post) and ask. Opening a browser, navigating to the Auphonic website, and asking the Dia browser AI… it's just so many extra steps.


  1. No. ↩︎

Crossword x Daring Fireball

I've been reading John Gruber's work since I was in high school. I've listened to every Dithering episode to date. I once started a blog about inspired by Daring Fireball (it petered out, as blogs sometimes do).

And for the past five years, I've been recording Crossword with Jonathan Wold. It's a podcast about WordPress and the Open Web, with 15-minute (Dithering inspired) episodes.

We recently talked with John in a guest episode of Crossword, and he was kind enough to link to our show from his blog.

It's been a bit of a viral moment for us! My mind is a little blown that I am – right now – writing about my conversation with the creator of Markdown in Markdown.

That's one of the topics we cover in the episode, along with Substack, RSS, browsers, the open web, and where WordPress missed a trick.

Gruber joins the list of Open Web A-Listers we've spoken to on Crossword, including Aaron Gustafson, Peter Saint-Andre, and Ryan Singer.

I'm marking this one down as a career highlight. Huge thanks to Jonathan for his hard work editing the audio and transcript.

Discoverability vs. Monetisation

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.

Pretty Good

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.

Friend of the Show has only one episode. Async has just published episode 100! Crossword has recorded 9 seasons over 5 years.

You can hear me on Crossword, Async, and Pirate School. If you already subscribe to one Pretty Good podcast, you might enjoy some of the others too.

On-Device AI Game Dialogue

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.

A screen capture of an AI game dialog on iOS.

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.

Family Apocrypha

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.

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.


  1. 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. ↩︎