← The setup

Private site

Podcast

A podcast I record, edit and host myself: three microphones into a mixer, a pipeline that joins studio audio to camera video without an editor, and a private site built to hold the episodes.

The sign-in page. The rest of the site is behind it.
Private site login required
The sign-in page. The rest of the site is behind it.

From microphone to site

Four steps, one automated.

  1. Capture

    Microphones

    3× Fifine AM8

  2. Record

    Mixer

    RØDECaster Pro

  3. Sync

    Pipeline

    Python · ffmpeg

    cron, every 15 minutes

  4. Host

    Private site

    Next.js 14 · Postgres

    Docker, behind Cloudflare

A problem worth solving

Lining up two recordings that never started together.

The camera and the mixer each record on their own clock, so every episode comes out as a video and a better-sounding audio file that are off by some number of seconds. Fixing that by hand means scrubbing a timeline for every episode.

The pipeline watches an inbox folder. Once the files stop changing, it compares the camera's own microphone with the mixer's recording to find how far apart they started, shifts the audio by that amount, and writes one MP4 with the mixer's sound. Compatible video is copied, not re-encoded, so there is no quality loss and a 200-second clip takes about six seconds.

When it can't be confident, say the camera mic was off or the wrong files were paired, it still writes the file but names it CHECK-SYNC so a bad guess never ships quietly. Against test media with a known offset it landed within about ten milliseconds.

The site

Private by default.

There is no sign-up page: accounts are issued by hand. Behind the login is a Next.js app with a per-request nonce Content-Security-Policy, CSRF protection, rate limiting keyed to the client address Cloudflare reports rather than one a caller can spoof, and an audit log of who did what.

A written security audit found sixteen issues; fifteen are fixed. Playing episodes back to viewers is the part still being built.

Tech specs

Recording

Mixer
RØDECaster Pro
Microphones
3× Fifine AM8

Automation

Language
Python standard library
Media
ffmpeg, static build
Schedule
cron, every 15 minutes
Audio out
AAC 256k, 48 kHz

Site

App
Next.js 14, TypeScript
Data
Prisma, PostgreSQL
Styling
Tailwind CSS, Three.js sign-in scene
Infrastructure
Docker Compose, nginx, Cloudflare

Scope

Role
Sole developer and operator
Access
Private, login only; accounts issued by hand
Status
Pipeline running; viewer playback in progress