Writing · 2 min read
Show & Tell: Tugboat
I wanted to understand a geopolitical conflict better than my usual news sources were letting me. So I built Tugboat.

I wanted to understand a geopolitical conflict better than my usual news sources were letting me, and I wanted to see what I could draw across economics and government contracting. So I built Tugboat.
Tugboat is a self-hosted intelligence platform that tracks active conflicts (currently only 1) and publishes a daily briefing with an audio / podcast component. Throughout the day, a pipeline pulls from scraped news feeds and various open APIs (USASpending.gov, and SAM.gov), runs it through Qwen3.6:27b on my local hardware, generates consumable summaries, and then overnight creates four reporter-style segments, synthesizes them to audio via Qwen3-TTS, stitches the episode with intro, stingers, and a music bed, and publishes to Castopod. I'm not using cloud APIs or external subscription services. The inference runs on two GPUs in my HomeLab.
The MVP took a few hours to get online; that's not saying this was easy by any stretch. I sketched it out first: a product vision, then a PRD. I wanted the full picture before anything got built. I also had the benefit of having the infrastructure already in place. I've been scraping feeds, building RAG systems, self-hosting podcasts, building tools that turn submitted content into audio and video training materials, and experimenting with TTS and audio pipelines for the better part of a year. Tugboat was mostly assembly.
A few things I learned that didn't show up until it was running:
After about a week, it was obvious to me that the scripts were starting to sound too identical. Not wrong, just... very alike. Qwen had settled into a handful of descriptors and wasn't leaving them. The fix was prompt-level discipline around vocabulary tiers, making the intensity of language match the actual intensity of the event. Obvious in retrospect. Only visible in production. Catastrophically visible after a few briefings (the joke is in the word catastrophic because it showed up a lot).
Editorial control in automated content doesn't always mean reviewing before you publish. It means building constraints into generation until you have real confidence in what comes out. I built in attribution discipline, avoided data dumps, specified opening lines that could only come from each day's data. Those aren't suggestions in the prompt; they're hard rules that we follow during creation.
The difference between a briefing and a summary is almost entirely in how you structure what the model isn't allowed to do.
Adding a new conflict is forking what exists and flipping a switch. That was deliberate from the start. The infrastructure was designed to scale, not just to work.
I'm a recovering UX designer. I did this because I was curious and had the tools to act on it.
Tugboat is live and free: tugboathq.com.
