A personal journey: travel, technology, reviews, projects & diary — since 1995.
How the search for one shout-out became a Small Town Murder atlas

How the search for one shout-out became a Small Town Murder atlas

I wanted to find the one episode of Small Town Murder where James and Jimmie read my name out. I ended up transcribing all 748 episodes across three computers, and then building a map of every town the show has been to.

Small Town Murder is a comedy true-crime podcast. James Pietragallo and Jimmie Whisman pick a small town, spend a good part of the episode on what makes it tick (the history, the crime rate, the house prices, the reviews of local businesses), and then tell the story of a murder that happened there. They have been doing it since 2017. A regular episode runs about three hours, and near the end of each one they read out the names of the people who support the show on Patreon.

At some point they had read out mine. I didn’t know which episode.

This is how I found it, and how finding it turned into stm.apj.co.uk, an unofficial fan site that maps every episode of the show.

The obvious way to find it was to listen to the end of every regular episode until I heard my name. With a back catalogue of over 700 episodes, that was never going to happen. I was too lazy to sit through the shout-outs of 700 episodes, but apparently not too lazy to build a transcription farm across three computers. So that is what I did.

Transcribing 1,607 hours of podcast

As a Patreon supporter I get the ad-free feed, which is a private RSS link. I wrote a small Python tool that reads the feed, downloads each episode, transcribes it, works out who is speaking and writes one JSON file per episode with every word and its timestamp. The audio is deleted as soon as the transcript exists; a sources file records how to fetch each episode again if I ever need it.

The main feed has 748 episodes, full episodes and the shorter Express ones together. That is 1,607 hours of audio, and it came out at a little over 18 million words.

No single machine was going to get through that in a sensible time, so the work goes to a farm. There is one queue on my laptop, newest episodes first, and each machine takes the next episode whenever it is free:

  • The laptop transcribes with Parakeet, NVIDIA’s speech recognition model, on the CPU.
  • The Mac mini downloads its own episodes and transcribes them with whisper.cpp (the large-v3-turbo model) on its GPU.
  • The MacBook Air runs its own Parakeet server and takes two episodes at once, so one is being transcribed on the CPU while the other’s speakers are being worked out on the GPU.

The faster machine simply does more of them. Speaker identification uses pyannote, and each voice it finds is matched against reference recordings of James and Jimmie. Anyone else becomes a guest. One rule came over from an earlier project: never run two GPU jobs on the same Mac at once. Two of them together have kernel panicked my laptop before, so every machine has a lock and the farm respects it.

It ran for the best part of a week, the laptop and the Mini mostly overnight while I wasn’t using them.

Finding the name

A plain text search for “Seamus Waldron” wasn’t going to be enough. Speech recognition handles ordinary English well and unfamiliar names badly, and the shout-outs are nothing but unfamiliar names, read out fast, one after another. Seamus isn’t a name a transcription model sees often, and there was no telling what it would write instead.

So the search became a name hunt. It finds the shout-out section of each episode (it starts with phrases like “this week’s executive producers” or “other producers this week”, somewhere in the last 40% of the show), then scores every word and every pair of neighbouring words in it against the name. Each candidate gets two scores: how close the spelling is, and how close it sounds, using a rough sound key that drops the vowels and folds together the English spellings of the same sound (“sh”, “sch”, “sea” and so on). Anything above a threshold is listed with its timestamp, best first, for me to check by ear.

The best match was episode 527, “Killing The Princess”, set in Aspen, Colorado, released on 12 September 2024. Nearly three hours in, the transcript reads: “Shameus Waldron, Waldron.” Then a riff on “Waldron” for a while.

Shameus. I’ll take it.

From one episode to all of them

That should have been the end of it. The trouble was that I now had every episode of the show as searchable text, with timestamps and speakers, and that’s a dataset nobody has. Small Town Murder has a very fixed structure, which makes it an easy show to take apart. Every episode has a town, a set of statistics read off whatever website James used that week, a history segment, reviews of local businesses, a case with victims and perpetrators, a timeline, a trial and an outcome.

So the next step was to pull all of that out of every transcript. Each episode’s transcript goes to an AI agent with a fixed set of instructions, and the agent writes back a structured file: the location, the sections of the episode with their times, the history, the reviews, the figures, each case with its victims, perpetrators, sentences and timeline, any last meals, every place named in the story, and an overview of 800 to 1,500 words. Every item cites the transcript segment it came from, so the site can say where in the episode something was said, and a checker rejects any file that fails its rules.

I piloted it on four episodes first and checked them by hand. The location was right four times out of four, and the case was right three times out of three against news reports and court records. The fourth episode, an early one, correctly came back with no reviews, because the reviews segment came later in the show’s life.

Across the back catalogue that gives 1,038 cases and 12,118 places. Claude Code with Sonnet did 38 episodes, including the sample I read through by hand; DeepSeek’s flash model did the other 709, running in opencode. It’s far cheaper, and good enough when the instructions are tight and a checker sits behind it. Each file records which model made it, so anything can be redone later.

The agent never decides where a place is on the map. It records the town, county and state as James said them, and a separate step looks them up: town centres from the US Census Gazetteer, street addresses from the Census geocoder, named places from OpenStreetMap. Anything that lands more than 40 km from the town is refused. Seven towns stayed off the map until I taught the lookup to retry without a misheard county.

The figures needed more care than I expected. The show reads out numbers in the year each episode was made, and a 2017 house price always looks cheap next to a 2026 one. So money is never ranked in raw dollars across years. Each figure is compared with the national figure for the same year, so a town reads as, say, 2.4 times the US median in 2019, with the dollars as said beside it.

The next addition is the latest official figures for each town, shown beside the ones read on the show, so you can see then and now. I tested the idea on Aspen: the FBI’s Crime Data Explorer gives Aspen 93 violent crimes per 100,000 people in 2025, against 440 for Colorado and 330 for the US. In the episode James said it was about a third of the national average. Close enough.

Building the website

With all of that in hand, a website was the obvious next step. It’s an unofficial fan site, and it lives at stm.apj.co.uk.

The home page of stm.apj.co.uk: every town the show has been to, with the filters along the top.

The home page is a map of every town the show has been to: 740 towns across 747 episodes at the time of writing. You can filter it by the years an episode aired, the state or country, the outcome of the case, the kind of case, whether a last meal was told, and full or Express. A “Take me somewhere awful” button flies you to a random town with above-average crime, and “Nearest STM town to me” does what it says. Each episode has a page laid out in the show’s own order: the town first, as a dashboard of figures, reviews and history, then the story, then the case, with the people as cards and the events on a timeline, then the places on a map.

Episode 527, the one with my name in it. The town tab: the figures as told, with links to the moment in the episode, the history and the reviews.

There are league tables of the towns, and a phrasebook of the show’s catchphrases, from “Shut up and give me murder” downwards, with the episode where each one first turns up.

The site is built with Astro as a static site and served from Cloudflare as a Worker, with maps from OpenFreeMap. The front end was written by OpenAI’s Codex from design briefs and mockups, and Claude did the Cloudflare work and checked every round in a real browser, because Codex works blind. The first design was a tidy, list-based almanac. I hated it. I couldn’t find anything, which is a poor showing for a site whose whole job is helping you find things. The one that went live is called Case Notes: paper, ink, evidence-tag yellow, a typewriter face, and the map first.

What it doesn’t show

Some of the rules are there to protect the show, and some are there to protect the listener.

There are no transcripts and no audio on the site. The ad-free audio is paid Patreon content and the transcripts are James and Jimmie’s work, so the site carries summaries, facts and short quotes, and links back to the episodes. Nothing from the Patreon bonus feed appears at all, even though I transcribed that too. It’s paid for, and it’s the one area I won’t take liberties with.

Listeners’ names never appear either. The shout-out lists stay in the private files, and the site build fails outright if any listener’s name, any private URL or any home address finds its way into the data. So the website that exists because I went looking for my own name doesn’t show my name anywhere.

Then there are spoilers. If you’re working through the back catalogue, a site that tells you who did it is no use to you, so endings are inked out with marker-pen strokes. By default that applies to the last week’s episodes, and you can switch it on everywhere. The build also hides any sentence in an overview that names a perpetrator, whatever the agent marked, because one of the cheaper models I tried left the killer’s name in a sentence that still called them a suspect.

It isn’t finished. It doesn’t work well on a phone yet, which is the next thing I’m fixing. The plan is for a new episode to be picked up, transcribed, read and published automatically on the Mac mini within a day of release, so the map grows on its own every week.

Why bother

I started out wanting to hear about three seconds of a three-hour episode. To get there I built a pipeline that turns a podcast into data, and that pipeline doesn’t care which podcast it’s pointed at. The same tools are already translating a German true-crime series into English for me, voiced, on a private feed.

None of it was planned. Each step was just the obvious next thing to do with what the last step had left lying around.

If you listen to Small Town Murder, have a look round the map and find your own town, or the nearest one they’ve been to. If you’re a supporter, they’ve probably read your name out too. I can’t tell you which episode, but I know how to find out.

Filed under: Projects