John Voorhees

5379 posts on MacStories since November 2015

John is MacStories' Managing Editor, has been writing about Apple and apps since joining the team in 2015, and today, runs the site alongside Federico. John also co-hosts four MacStories podcasts: AppStories, which covers the world of apps, MacStories Unwind, which explores the fun differences between American and Italian culture and recommends media to listeners, Ruminate, a show about the weird web and unusual snacks, and NPC: Next Portable Console, a show about the games we take with us.

Terminal Tips and Claude Code Workflows

This week, Federico and John share their workflows and tips on how they use Claud Code and Codex to build automations.

On AppStories+, John and Federico explore the Apple and Google Gemini deal and the end of Shortcuts as we know it.


We deliver AppStories+ to subscribers with bonus content, ad-free, and at a high bitrate early every week.

To learn more about an AppStories+ subscription, visit our Plans page, or read the AppStories+ FAQ.


AppStories+ Deeper into the world of apps

AppStories Episode 469 - Terminal Tips and Claude Code Workflows

0:00
43:26

AppStories+ Deeper into the world of apps

This episode is sponsored by:

  • HTTPBot: A powerful API client and debugger for Apple platforms. Get a 7-day trial and 25% off your subscription.

Read more


Unexpected Lessons from Claude Code Experiments

For the past six weeks, I’ve been continuously building tools with Claude Code. I started small with things like PopClip extensions, which I covered last week, and moved on to tools like a loudness leveling script that adheres to podcasting industry standards and allowed me to dump my underutilized Creative Cloud subscription when Adobe raised...


App Debuts

Drafts Drafts, my favorite text capture app that has won multiple MacStories Selects awards over the years, was updated to version 50 with what developer Agile Tortoise describes as “massive updates to Shortcuts integrations.” Thanks to a collaboration with Shortcuts expert Matthew Cassinelli, Drafts’ Shortcuts integration has received an extensive makeover with brand new...


Interesting Links

The Switch 2 is great, but it’s a bit of an ergonomic disaster, which is why this review of the Nyxi Hyperion 3 replacement Joy-Con has been on my mind ever since Brendon sent me the link despite the steep asking price. (Link) Wikipedia created a list of AI writing “tells.” A developer used...


The Iconfactory Launches Kickstarter to Expand Ollie’s Arcade with Frenzic

Ollie’s Arcade was launched in 2023 by The Iconfactory with three mini-games reminiscent of beloved classic videogames. Today, the company launched a Kickstarter campaign with the goal of raising $20,000. If reached, The Iconfactory will make Ollie’s Arcade free and bring its game Frenzic to the bundle. Frenzic was one of the earliest iOS game and a fan favorite that was later adapted for Apple Arcade, but has since left Apple’s subscription gaming service.

The Ollie’s Arcade campaign is about more than just its games though. As The Iconfactory explains:

From a bigger perspective the Kickstarter is yet another way we’re trying to sustain ourselves and keep the Iconfactory up and running. We all know times are tough, especially for small, non-investor driven businesses like ours. We’ve struggled to pay our salaries, keep up with the rising cost of health care and to compete against the onslaught of AI driven design solutions. The new KS won’t be enough to solve all our revenue problems, but it will help give us runway to keep the lights on while we find new ways to stick around and serve you. The more we raise now, the longer and safer that runway gets.

The Iconfactory has a long and stories history since it was founding in 1996. Since then they’ve produced some of the most thoughtfully designed apps and icons around. The Iconfactory isn’t the only company whose business has been hurt by generative AI, but I sincerely hope it isn’t one of the fatalities too. Check out the Kickstarter campaign and chip in to help them and make some great games free for everyone. And while you’re at it, don’t miss all the other great apps they have on the App Store like Tapestry, Tot, Triode, xScope, and many other.

Access Extra Content and Perks

Founded in 2015, Club MacStories has delivered exclusive content every week for nearly a decade.

What started with weekly and monthly email newsletters has blossomed into a family of memberships designed for every MacStories fan.

Learn more here and from our Club FAQs.

Club MacStories: Weekly and monthly newsletters via email and the web that are brimming with apps, tips, automation workflows, longform writing, early access to the MacStories Unwind podcast, periodic giveaways, and more;

Club MacStories+: Everything that Club MacStories offers, plus an active Discord community, advanced search and custom RSS features for exploring the Club’s entire back catalog, bonus columns, and dozens of app discounts;

Club Premier: All of the above and AppStories+, an extended version of our flagship podcast that’s delivered early, ad-free, and in high-bitrate audio.

Learn more here and from our Club FAQs.


A Very ‘Just Build It’ Holiday

This week, Federico and John complete their tour of holiday projects with a look at the tools both of them built with the help of Claude Code, Codex, and other tools.

On AppStories+, John pushes Claude Code by building a Safari web extension that integrates with Notion.


We deliver AppStories+ to subscribers with bonus content, ad-free, and at a high bitrate early every week.

To learn more about an AppStories+ subscription, visit our Plans page, or read the AppStories+ FAQ.


AppStories+ Deeper into the world of apps

AppStories Episode 468 - A Very ‘Just Build It’ Holiday

0:00
42:35

AppStories+ Deeper into the world of apps

Read more


Using PopClip Extensions to Get Started with Claude Code

On the next episode of AppStories, Federico and I will wrap up our discussion of what we built over the holidays. With the “what” out of the way, we’re planning on talking about the “how” and the implications tools like Codex and Claude Code have for app development in general. However, I’m impatient, so I...


App Debuts

Bullseye Adam Foot, the maker of popular TV remote control app TV Remote, is back with a developer-focused app for tracking your Apple Ads campaigns. I had a chance to play with Bullseye during the beta period using test data, and it’s very well done. The app takes the data provided by Apple and...


How I Used Claude to Build a Transcription Bot that Learns From Its Mistakes

Step 1: Transcribe with parakeet-mlx.

Step 1: Transcribe with parakeet-mlx.

[Update: Due to the way parakeet-mlx handles transcript timeline synchronization, which can result in caption timing issues, this workflow has been reverted to use the Apple Speech framework. Otherwise, the workflow remains the same as described below.]

When I started transcribing AppStories and MacStories Unwind three years ago, I had wanted to do so for years, but the tools at the time were either too inaccurate or too expensive. That turned a corner with OpenAI’s Whisper, an open-source speech-to-text model that blew away other readily available options.

Still, the results weren’t good enough to publish those transcripts anywhere. Instead, I kept them as text-searchable archives to make it easier to find and link to old episodes.

Since then, a cottage industry of apps has arisen around Whisper transcription. Some of those tools do a very good job with what is now an aging model, but I have never been satisfied with their accuracy or speed. However, when we began publishing our podcasts as videos, I knew it was finally time to start generating transcripts because as inaccurate as Whisper is, YouTube’s automatically generated transcripts are far worse.

VidCap in action.

VidCap in action.

My first stab at video transcription was to use apps like VidCap and MacWhisper. After a transcript was generated, I’d run it through MassReplaceIt, a Mac app that lets you create and apply a huge dictionary of spelling corrections using a bulk find-and-replace operation. As I found errors in AI transcriptions by manually skimming them, I’d add those corrections to my dictionary. As a result, the transcriptions improved over time, but it was a cumbersome process that relied on me spotting errors, and I didn’t have time to do more than scan through each transcript quickly.

That’s why I was so enthusiastic about the speech APIs that Apple introduced last year at WWDC. The accuracy wasn’t any better than Whisper, and in some circumstances it was worse, but it was fast, which I appreciate given the many steps needed to get a YouTube video published.

The process was sped up considerably when Claude Skills were released. A skill can combine a script with instructions to create a hybrid automation with both the deterministic outcome of scripting and the fuzzy analysis of LLMs.

Transcribing with yap.

Transcribing with yap.

I’d run yap, a command line tool that I used to transcribe videos with Apple’s speech-to-text framework. Next, I’d open the Claude app, attach the resulting transcript, and run a skill that would run the script, replacing known spelling errors. Then, Claude would analyze the text against its knowledge base, looking for other likely misspellings. When it found one, Claude would reply with some textual context, asking if the proposed change should be made. After I responded, Claude would further improve my transcript, and I’d tell Claude which of its suggestions to add to the script’s dictionary, helping improve the results a little each time I used the skill.

Over the holidays, I refined my skill further and moved it from the Claude app to the Terminal. The first change was to move to parakeet-mlx, an Apple silicon-optimized version of NVIDIA’s Parakeet model that was released last summer. Parakeet isn’t as fast as Apple’s speech APIs, but it’s more accurate, and crucially, its mistakes are closer to the right answers phonetically than the ones made by Apple’s tools. Consequently, Claude is more likely to find mistakes that aren’t in my dictionary of misspellings in its final review.

Managing the built-in corrections dictionary.

Managing the built-in corrections dictionary.

With Claude Opus 4.5’s assistance, I rebuilt the Python script at the heart of my Claude skill to run videos through parakeet-mlx, saving the results as either a .srt or .txt file (or both) in the same location as the original file but prepended with “CLEANED TRANSCRIPT.” Because Claude Code can run scripts and access local files from Terminal, the transition to the final fuzzy pass for errors is seamless. Claude asks permission to access the cleaned transcript file that the script creates and then generates a report with suggested changes.

A list of obscure words Claude suggested changing. Every one was correct.

A list of obscure words Claude suggested changing. Every one was correct.

The last step is for me to confirm which suggested changes should be made and which should be added to the dictionary of corrections. The whole process takes just a couple of minutes, and it’s worth the effort. For the last episode of AppStories, the script found and corrected 27 errors, many of which were misspellings of our names, our podcasts, and MacStories. The final pass by Claude managed to catch seven more issues, including everything from a misspelling of the band name Deftones to Susvara, a model of headphones, and Bazzite, an open-source SteamOS project. Those are far from everyday words, but now, their misspellings are not only fixed in the latest episode of AppStories, they’re in the dictionary where those words will always be corrected whether Claude’s analysis catches them or not.

Claude even figured out "goti" was a reference to GOTY (Game of the Year).

Claude even figured out “goti” was a reference to GOTY (Game of the Year).

I’ve used this same pattern over and over again. I have Claude build me a reliable, deterministic script that helps me work more efficiently; then, I layer in a bit of generative analysis to improve the script in ways that would be impossible or incredibly complex to code deterministically. Here, that generative “extra” looks for spelling errors. Elsewhere, I use it to do things like rank items in a database based on a natural language prompt. It’s an additional pass that elevates the performance of the workflow beyond what was possible when I was using a find-and-replace app and later a simple dictionary check that I manually added items to. The idea behind my transcription cleanup workflow has been the same since the beginning, but boy, have the tools improved the results since I first used Whisper three years ago.

Access Extra Content and Perks

Founded in 2015, Club MacStories has delivered exclusive content every week for nearly a decade.

What started with weekly and monthly email newsletters has blossomed into a family of memberships designed for every MacStories fan.

Learn more here and from our Club FAQs.

Club MacStories: Weekly and monthly newsletters via email and the web that are brimming with apps, tips, automation workflows, longform writing, early access to the MacStories Unwind podcast, periodic giveaways, and more;

Club MacStories+: Everything that Club MacStories offers, plus an active Discord community, advanced search and custom RSS features for exploring the Club’s entire back catalog, bonus columns, and dozens of app discounts;

Club Premier: All of the above and AppStories+, an extended version of our flagship podcast that’s delivered early, ad-free, and in high-bitrate audio.

Learn more here and from our Club FAQs.