A simple Perl script for syncing Pocket (heypocket.com) transcriptions with Bear (bear.app).
-
No, vibe coding is not killing B2B SaaS
AI coding tools are transformative. As someone who’s been building software for 20 years, I’m amazed at how fun Claude Code makes programming feel again. AI lets developers focus on higher-level problems like framework design, repeatable patterns, and abstraction, while software handles yet another CRUD wrapper around yet another database table.
The market is clearly a bit spooked by this. As of this writing, Oracle is trading 42.73% lower than it was 6 months ago, and Salesforce took a 20.56% hit over the same time period.
But here’s what AI won’t do: replace off-the-shelf business applications. And not for the reason most people think.
The real problem was never technical complexity.
Most business software has never been technically complex. Building an ERP system or vertical SaaS product isn’t hard because the code is sophisticated and filled with advanced algorithms. It’s hard because requirements management is brutal. Understanding every scenario users will encounter is extremely difficult. Capturing the edge cases, the exceptions, the “but what about when…” questions that arise after a few months in production. all while tackling the delicate dance between simplicity and complexity.
We’ve been in this hype cycle before. Over and over again.
Technical solutions to people problems
In the 1990s, prosumer tools like FoxPro, Microsoft Access, and FileMaker Pro democratized database development. Companies built critical systems over weekends – and then spent years trying to migrate away from them.
In the 2010s, no-code and low-code frameworks promised to eliminate the bottleneck of developers. Instead, they created a new kind of tech debt – business logic locked into proprietary platforms with limited escape hatches.
Each of these solved the technical problem. Each made it easier to write code or build applications. None solved the fundamental challenge of understanding what you’re actually trying to build, and maintaining it as business rules and requirements evolved.
What I learned from 10 years building ERP software
In 2013, I cofounded and spent a decade at a B2B SaaS company serving the manufacturing and distribution mid-market. We’d see this pattern constantly. Companies with dozens of home-grown systems – Access databases, Excel macros with thousands of lines of VBA, custom AS/400 applications still running critical processes. The original creators were long gone. The systems worked, mostly, but nobody dared touch them.
Over the years, these businesses would often describe a shift from the systems aligning with how the company operated, to the company aligning with how the systems operated. Think a custom CRM designed by a long-gone sales manager who spent too much time reading Selling to VITO in 1995, but with little correlation to the actual sales process in 2025. An inventory management system that was beloved by the warehouse manager, but required monthly gymnastics to make the inventory accounting even close to GAAP/IFRS standards. A design configurator at a window-and-door company that needed to operate under the assumption that a door is really just a different kind of window.
The problem was never “could we build this?” The problem was “do we actually understand what this needs to do, and can we maintain that understanding over time, as the business evolves and changes?”
Why AI coding doesn’t change this
AI coding tools are spectacular at translating clear requirements into working code, especially if an experienced developer is crafting strong system prompts to enforce standards. Given a well-defined spec, they can dramatically reduce the time required for a coding project. But they can’t:
- Interview stakeholders and surface unstated assumptions
- Handle conflicting understanding of business rules across different departments
- Identify edge cases that happen twice a year but break everything when they do
- Navigate organizational politics about priorities
- Maintain institutional knowledge about why decisions were made
- Navigate the tradeoff between custom code for each scenario and overly abstract, hard-to-maintain patterns
These are people problems. And they’re why companies have paid for ERP systems and vertical SaaS solutions instead of building everything themselves, even when the technical barrier has been low since the 90s.
What this means for B2B SaaS
If you’re building B2B SaaS right now, AI coding will help you ship faster and cut engineering costs. But it won’t eliminate the need for your product. Your customers could build what you built. They always could have. They choose not to because they don’t want to become experts in your domain. They don’t want to manage requirements. And they don’t want to have to rewrite the system as their business evolves.
But AI coding does change the game in a few ways that B2B vendors need to understand:
First, integration becomes table stakes. AI coding tools make it simple for semi-technical users to build middleware and perform data analysis. Comprehensive and well-documented APIs, ODBC, and eventually MCP will be critical for companies using AI to enhance workflows.
Second, B2B sellers can’t continue to rely on customizability to sell software. There was a time when showing off your system’s ability to handle that “one weird but critical business process” could close a deal, but that’s less compelling when it can also be wireframed and demoed in a day by a 16-year-old with a Claude license.
Third, soft skills will become the differentiator. This has always been critical in ERP, where understanding a customer’s operations end-to-end will make or break an implementation, but this will become the key differentiator over the next 10 years. Vendors will need to demonstrably excel at discovery, implementation, training, and ongoing support to make the cut.
AI tools make it easier than ever to write code. But they’re not making it easier to understand what software actually needs to be written. That’s why off-the-shelf business applications aren’t going anywhere—and why the vendors who win will be the ones who excel at the human side of the equation.
-
Evidence-based cocktail recipes
I always enjoy reading the ongoing profile Claude maintains as part of its memory feature. As with anything generated by a LLM, it tends to be a mixture of surprisingly great synthesis of my AI use and total whimsical nonsense.
By far the most important part of my personal profile:

I’ve always said, never mix a drink that isn’t evidence-based!
-
Calendar-Based Presence Detection for Kids in Home Assistant
Lately, I’ve been working on some fun Home Assistant automations based on whether my kids are in the house. The challenge? My kids don’t have cell phones, so traditional presence detection won’t work. So instead, I hacked together a solution using Google Calendar events and day-of-week logic.
With this setup, I can do things like:
- Get a notification if the TV turns on when it shouldn’t be
- Turn off the lights in the kids’ rooms automatically when they’re at school
But since my kids don’t have cell phones, presence detection is trickier than normal, so I’ve had to mimic it using Google Calendar events and simple logic surrounding the days of the week.
This is pretty easy to do by creating an input_boolean helper entity (Settings → Devices & Services → Helpers → Create Helper → Toggle) and a corresponding automation to update it:
alias: Update Kids In House Status description: Updates kids' presence in house based on criteria triggers: - minutes: /5 trigger: time_pattern - entity_id: calendar.google_calendar_personal trigger: state - event: start trigger: homeassistant conditions: [] actions: - target: entity_id: calendar.google_calendar_personal data: start_date_time: "{{ today_at('00:00') }}" end_date_time: "{{ today_at('23:59') }}" response_variable: todays_events action: calendar.get_events - variables: event_summaries: >- {{ todays_events['calendar.google_calendar_personal'].events | map(attribute='summary') | list }} has_grandma: "{{ 'Kids with Grandma' in event_summaries }}" has_no_school: "{{ 'No School' in event_summaries }}" current_hour: "{{ now().hour }}" is_saturday: "{{ now().weekday() == 5 }}" is_sunday: "{{ now().weekday() == 6 }}" school_day: >- {{ (not is_saturday and not is_sunday) and current_hour >= 8 and current_hour < 15 }} kids_away: "{{ has_grandma or (school_day and not has_no_school) }}" - if: - condition: template value_template: "{{ kids_away }}" then: - target: entity_id: input_boolean.kids_in_house action: input_boolean.turn_off else: - target: entity_id: input_boolean.kids_in_house action: input_boolean.turn_on mode: singleThe automation checks every 5 minutes whether specific calendar events exist (“Kids with Grandma” or “No School”), combines that with school hours (8am-3pm on weekdays), and flips the input_boolean accordingly. When the kids are away—either at school during normal hours or with grandma per the calendar—the boolean turns off. Otherwise, it stays on.
-
Transcribing and collating Uniden radio recordings with Whisper AI

One of my favorite features of Uniden BCDx36- and SDS- series radios is the ability to enable a favorites list and let the radio record continuously for days or weeks.
This feature is very effective for discovering activity on new systems, digging through frequencies found in the FCC database to determine what’s being used, or quickly getting a read on which ham radio repeaters are active in a given area – all without being in front of the radio all day.
It also pairs very well with the “negative delay” feature, which lets you make sure that a dead carrier or trunked system control channel won’t tie up your radio and storage space for more than 10 seconds before it moves on.
The downside is that it’s easy to just let the radio sit recording for weeks on end, leading to a large pile of recordings that can be time-consuming to sift through, even with tools like Universal Scanner Audio Player.
To that end, I built a proof-of-concept tool in Perl that can dig through a folder full of WAV files, collate them by frequency/tone, attempt to transcribe them using a local instance of OpenAI Whisper, and provide an easy-to-read HTML page showing the transcriptions, timestamps, and easy access to the recording audio.
I’ve posted the example code on Github and will probably continue to add features to it.
This project depends on the excellent work from Bearcatter, whose wavparse Go library makes it possible to extract Uniden-specific metadata from WAV files.
