← All projects

Web app

AskTNT

Ask the full archive of Training und Therapie (TNT), the Wolfgang Unsöld podcast. Every answer is backed by the matching passages from the episodes.

View
Status
Live, new episodes are added automatically every week
First commit
15 August 2026
extract AskTNT into its own repo
Stack
Rails 8, SQLite, sqlite-vec, Solid Queue, RubyLLM, OpenRouter, Kamal

Why I built it

The TWUP podcast has over 300 episodes on training, therapy, sleep and nutrition. The knowledge is buried in hours of audio. If you want to know what the two hosts say about periodization or protein, you have to remember which episode it was. Or listen to everything again.

I’ve been training for years, I’m a YPSI coach with an A license, and I’ve listened to the podcast for a long time. I wanted to ask a question and find the spot where they talk about it. With a timestamp, not a made-up summary. AskTNT is currently my own project.

What it does

  • You ask a question, AskTNT searches the transcripts of every episode and backs the answer with the matching passages.
  • Every episode has its own page with topics, key points, audio and a transcript that follows along while it plays.
  • Topic pages connect statements from the podcast with selected studies. New studies get summarized and linked to matching episodes.
  • New episodes are added automatically every week. If you want, you get an email when something new comes out on your topic.
  • Since September 2026 there’s a public MCP connector. It lets you search the archive straight from Claude or other assistants, with your own model.

Technical decisions

One Rails app, one SQLite file. Search, vectors (sqlite-vec), jobs, cache, all in SQLite. No separate vector store, no queue as its own service. For an archive this size that’s plenty, and it’s easy to run.

Transcripts that survive a crash. Long episodes are split into five-minute chunks with a short overlap. Each chunk is its own job, and progress lives in the database. If a deploy happens mid-run, the job picks up at the next chunk instead of starting over. Speaker transcripts only get published once a human has named every speaker.

Models by benchmark, not gut feeling. For speaker diarization I ran several providers against hand-checked reference passages: fast turn-taking, long monologues, transitions between chunks. All models run through OpenRouter and RubyLLM and are interchangeable.

I pulled two parts out as standalone building blocks: a Rails engine for long transcriptions and a gem that maps RSS, Taddy and Podcast Index onto one episode format.

From the sessions

In early September the one weekly job that processes new episodes simply didn’t finish. My message to the agent: “thats stupid and it should work cant you properly test this its one weekly job”. The diagnosis ran read-only on the server: the scheduler had fired, and the job failed on a duplicate entry in the feed, where an older episode showed up twice. Fix, deploy, job triggered once by hand.

The MCP connector came out of a question in late September: is there a pattern where people use the knowledge base but bring their own AI? The user pays for the model, and what stays with me is basically embedding the search query. The connector was live the same day.