HUGINNTranscription

For people who follow too many channels

Read your subscriptions.

Huginn transcribes every new upload from the channels you follow and distills it into something you can read. Forty-seven minutes of someone talking becomes a summary you finish in two.

See what they said

Every video is transcribed and summarised once, however many accounts subscribe to the same channel.

Example outputExample
Source audio
47:120 words
Transcribing
Distilled

Why we moved off Postgres LISTEN/NOTIFY

Infra Weekly · 47:12 source · 4 min read

  1. 09:03NOTIFY payloads are capped at 8 KB, undocumented in their tooling.
  2. 09:19Each listener pins a connection, so worker count fights the pool.
  3. 09:34Broke down at roughly 400 events/sec — his estimate, not measured.
  4. 09:48Migrated to Redis Streams over six weeks.
postgresqueueingmigrations

The problem

A channel’s back catalogue is hours of audio nobody has time to watch.

YouTube’s own captions are patchy, unpunctuated and impossible to query. So the archive you nominally follow stays unread, and the one thing you needed stays buried in it.

How it works

Five stages, one row, no broker

A video moves through a twelve-state pipeline. There is no Redis and no message broker: the state lives in a single Postgres row, so the row is the work. A crash leaves a stale lease to reap, not a message to redeliver. Each stage scales on its own concurrency cap.

  1. Resolve

    A channel URL becomes one canonical channel record, keyed on platform and external id through the YouTube Data API.

  2. Download

    The video is fetched at the smallest fidelity that still carries the speech.

  3. Extract

    ffmpeg strips the audio track and normalises it for the transcriber.

  4. Transcribe

    ElevenLabs Scribe v2 returns punctuated, timestamped text — queryable, unlike auto-captions.

  5. Summarise

    OpenRouter produces the summary, key points and topics against a fixed output contract.

Retries happen on their own

Transient failures come back with backoff, and say roughly when.

Failures say which kind they are

Permanent, transient, or waiting on quota — never a bare error.

Stages scale apart

Transcription can run wide while downloads stay polite.

Processed once, shared globally

However many accounts follow a channel, each video is processed exactly once

Channels and videos are global, deduplicated records — there are no per-account copies. What your library shows is derived at read time from your subscriptions plus the account videos you added yourself.

acct_7f2aacct_1c9dacct_be04

youtube · dQw4w9WgXcQ

One video record

One transcript. One summary.

Built for agents

The reading can be delegated

An MCP integration exposes the library over streamable HTTP, with fourteen tools. Mint, rotate and revoke it from the app — only the hash is stored, never the token itself. The same credential authenticates the REST API.

MCP tools

subscribe_channelunsubscribe_channelbackfill_channeladd_videoremove_videolist_library_channelslist_library_videoslist_channel_videosget_library_videoget_video_transcriptget_video_intelligencelist_new_summarieslibrary_statsget_usage
The output contract
GET /v1/videos/:id/intelligence

{
  "summary": "The talk argues that retrieval…",
  "topics": [
    { "name": "retrieval",  "relevance": 0.94 },
    { "name": "chunking",   "relevance": 0.81 },
    { "name": "evaluation", "relevance": 0.67 }
  ]
}

Additive only, and versioned: give it a video, get back this exact shape — forever. Transcripts come as JSON, WebVTT, SRT or Markdown artifacts; summaries as JSON or Markdown.

JSONWebVTTSRTMarkdown

The app

Add a hundred videos by typing

Paste a list of channels and videos and Huginn parses it, tells you what it skipped, and backfills the archive in the background. The progress screen fills in as the pipeline moves — you can leave and come back.

⌘Kopens the same actions from anywhere
Type a commandesc
  • Add a channel
  • Start a backfill
  • Retry the videos that failed
  • Mint an MCP integration
  • Check this month’s meters

Under the hood

Postgres, and nothing else

No broker, no cache tier to keep in sync. One row holds the state of one video.

An API you can generate against

OpenAPI 3.1, with RFC 9457 problem responses on every error path.

Boundaries enforced in CI

Clean-architecture import rules are checked by the build, not just written down.

Start reading your subscriptions.

Subscribe to a channel and every new upload arrives as a summary you can read in a couple of minutes. Nothing plays — Huginn tells you what was said.