← Writing

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.

Russ Unger · March 17, 2026

The Tugboat operations overview, a live conflict map with an event feed

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 Tugboat daily brief
Daily Brief

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 Tugboat economic intelligence dashboard
Economic Intelligence

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.

The Tugboat government-contracting intelligence dashboard
GovCon Intelligence

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.