justin․searls․co

I see that the React team has sunset Create React App, a position I’ve been advocating for since the day they launched Create React App!

Generating and committing a bunch of files people don’t understand that will be woefully out-of-date in 3 months was never a great idea.

Turning your audio podcast into a video-first production

I was chatting with Adam Stacoviak over at Changelog a couple weeks back, and he mentioned that this year they've taken their podcast "video-first" via their YouTube channel.

I hadn't heard the phrase "video-first" before, but I could imagine he meant, "you record the show for video—which is more complex than recording audio alone—and then the audio is a downstream artifact from that video production." Of course, key to my personal brand is failing to demonstrate curiosity in the moment by simply asking Adam what he does, and instead going on an individual two-week-long spirit quest to invent all the wheels myself based on the possibly incorrect assumption of what he meant in the first place.

Anyway, as of v31 of Breaking Change, my podcast is now, apparently, a video-first production. I figured I'd share my notes on the initial changes to the workflow, along with links to the products I'm using.

Here's the video:

And here's the extremely simple and easy 10 step process that got me there (with affiliate links throughout):

  1. Record audio and video in OBS
    • Video is recorded in 4k@60fps in 8-bit HEVC as an MKV file (because MKV files, unlike MOV, can be interrupted by a crash without losing the entire recording)
    • I use a Sony a7 mark IV over HDMI with Elgato Camlink 4K mounted via the Elgato Master Mount system and flanked by either side with Elgato Key Lights Air. I also have an Elgato Prompter in front of the lens that displays two windows, side-by-side: OBS on the left and my Things project with my show topics on the right
    • I record audio tracks from an SSL 2+ USB interface
      • Track 1 is reserved for the first XLR input, which has a bog-standard SM7b microphone plugged into it
      • Track 2 is L&R of the loopback interface for music and stingers (here's my guide on setting up SSL2+ for loopback that allowed me to avoid software like Audio Hijack)
    • Music and stingers are played manually from shortcuts on my Stream Deck XL
    • While recording, if I need a break, I only hit PAUSE/UNPAUSE instead of STOP/START to ensure only one file is created
    • When finished, leave it recording and then LEAVE THE ROOM for a minute to create some dead air I can later use to sample the room noise with iZotope's RX Spectral Denoise plugin

And then what happened?…

Breaking Change artwork

v31 - Full Searls Driving

Breaking Change

Update: This is the first version of Breaking Change available in 4K video. Check it out on YouTube.

The one where Justin picks the perfect time to buy his first Tesla vehicle.

Sometimes the things I say and do make people feel things. Share those feelings with me at this e-mail address: podcast@searls.co. Whatever you're feeling, I'll read it and do my best to acknowledge it. I also may read it on air. Unless you ask me not to, in which case I won't.

Okay, so anyway, there are links to be lunked:

Show those show notes…

A script to validate videos for the Instagram API

If you are publishing videos via the Instagram API (as I do for my feed2gram gem and for Beckygram), one of the first things you notice is that it is a lot less forgiving than their app is.

From their docs that spell this out:

The following are the specifications for Reels:

  • Container: MOV or MP4 (MPEG-4 Part 14), no edit lists, moov atom at the front of the file.
  • Audio codec: AAC, 48khz sample rate maximum, 1 or 2 channels (mono or stereo).
  • Video codec: HEVC or H264, progressive scan, closed GOP, 4:2:0 chroma subsampling.
  • Frame rate: 23-60 FPS.
  • Picture size:
  • Maximum columns (horizontal pixels): 1920
  • Required aspect ratio is between 0.01:1 and 10:1 but we recommend 9:16 to avoid cropping or blank space.
  • Video bitrate: VBR, 25Mbps maximum
  • Audio bitrate: 128kbps
  • Duration: 15 mins maximum, 3 seconds minimum
  • File size: 300MB maximum

If you get this wrong, you'll receive a mostly-unhelpful-but-better-than-nothing-error message that looks like this:

{
  "message": "The video file you selected is in a format that we don't support.",
  "type": "OAuthException",
  "code": 352,
  "error_subcode": 2207026,
  "is_transient": false,
  "error_user_title": "Unsupported format",
  "error_user_msg": "The video format is not supported. Please check spec for supported CodedException format",
  "fbtrace_id": "AvU9fEFKlA8Z7RLRlZ1j9w_"
}

I was sick of hobbling together the same half dozen ffprobe commands and then eyeballing the results (which are typically inscrutable if you don't know what you're looking for), so I wrote a script to test this for me.

For example, a recent clip failed to syndicate to Instagram and I wondered why that was, so I ran this little script, which I put on my PATH and named validate_video_for_instagram. It output:

Validating video: /Users/justin/Documents/podcast/clips/v30-the-startup-shell-game.mp4

✅ container
✅ audio_codec
✅ max_audio_sample_rate
✅ video_codecs
✅ color_space
✅ min_frame_rate
✅ max_frame_rate
❌ max_horizontal_pixels - Maximum columns (horizontal pixels): 1920 required; got: 2160
✅ min_aspect_ratio
✅ max_aspect_ratio
✅ max_video_bitrate_mbps
❌ max_audio_bitrate_kbps - Audio bitrate: 128kbps maximum required; got: 256.073
✅ min_duration_seconds
✅ max_duration_seconds
✅ max_size_megabytes

❌ Video had 2 error(s) preventing API upload to Instagram.
Docs: https://developers.facebook.com/docs/instagram-platform/instagram-graph-api/reference/ig-user/media

Is it surprising that the Instagram API won't accept 4K video? Yes. Especially since the videos weighs in at less than 100MB.

Want this for yourself?

To run this, you'll need a modern Ruby installed and ffprobe installed (on a Mac with homebrew, brew install ffprobe should do).

Okay, I'm interested…

After 15 years of sugar-coating it, I'm upgrading from kid gloves to… regular gloves, I guess?

The truth is and has always been:

  1. That the best way to get better at programming computers is to spend time programming computers
  2. That a lot of people don't do this, but expect the same salaries as those that do
  3. That one highly-competent developer can often run laps around entire software teams at the typical company

I'm done pretending this isn't true.

The Wrong Programmers

I'm as big a fan of searching for environmental and systemic explanations when expectations are missed, but that doesn't mean that sometimes the blame lies with the skill of the people doing the job. Decided I'm going to stop pretending as if that's never the case.

Ever hear of Eternal September? It’s about how frustrated Bluesky users are by the mass migration of bad-faith trolls from X and sanctimonious scolds from Mastodon.

2020s parody of Tales from the Crypt but it's called Tales From The Crypto with a vtuber waifu as Elvira and the stories are all about finance bros getting rolled send tweet

Every time a new model hits, I ask it to write a Searls of Wisdom newsletter based on writing samples and an outline.

Every model has been SO bad at emulating my writing that it makes me literally angry. Just here to report that OpenAI’s o3-mini-high is no different. D-

Ultra Narrow View

Vertical monitors for folks working on documents have been a thing for decades — now that Apple Vision Pro supports an 8K-ish ultra wide screen orientation for Mac Virtual Display, I’d love to see custom aspect ratios that allow you to create only as big of a Mac window as you need.

This is the first of what I hope will become a habit of long-form video excerpts from the podcast. This one comes from a section in v30 about DeepSeek and the ramifications it may have for OpenAI and the extent to which it condemns Sam Altman's ideology on how to run a startup.

20%? Sign me up!

Why freak out about tariffs and the economy when random signs on the side of the highways in Florida are able to offer such amazing investment returns?

Imagine the entrepreneur who started a UPS franchise 15 years ago with earnest hopes of connecting with the local community by offering services like private mailboxes and consultative shipping options.

Now imagine that person's life as a subcontractor of a subcontractor of Fulfillment by Amazon bound by an ironclad franchising agreement.

The Baby Store

Why I didn't have kids, despite the fact a lot of men seem weirdly OK with pretending they have zero regrets.

This clip is from v30 of Breaking Change.

I appreciate the tinfoil hat set, but what's with all these RFID-blocking wallets? Car's fob won't unlock the doors because my wallet is close enough to block it.

Where can I get an RFID-boosting wallet?

TIL (the hard way) that in Florida, joint vehicle titles with "AND" between the names require both parties for every significant transaction. "OR" titles are also available and allow either party to be a self-actualized adult.