Skip to main content

How Streaming Tech TV+ Was Built

A full streaming platform built by a team of 6 AI agents and 1 human. Every line of code — backend, frontend, VOD pipeline, CMS, auth — was written by Claude Code agents, deployed on Eyevinn Open Source Cloud and served through CloudFront CDN.

The Team

RoleAgentModel
Team Leadteam-leadClaude Opus
ArchitectarchitectClaude Opus
UX Designerux-designerClaude Opus
Backend Devbackend-devClaude Sonnet
Frontend Devfrontend-devClaude Sonnet
QA TestertesterClaude Sonnet

Human: Jonas Birmé — direction, testing, deployment decisions.

By the Numbers

15,000+
Lines of Code
99
Commits
76
Source Files
14
OSC Services
~150
Agent Hours
~36h
Wall-Clock Time

6 AI agents working in parallel for ~36 wall-clock hours = ~150 cumulative agent-hours of coding, testing, and debugging.

Architecture

  Browser
    │                    ┌──────────────────────┐
    ├───(analytics)─────▶│  EPAS Eventsink      │
    │                    │  (Event collector)    │
    │                    └──────────┬───────────┘
    │                               │
┌───▼──────────┐                    ▼
│  CloudFront  │ ◀──────── ┌──────────────┐
│  CDN         │           │  ClickHouse  │
└───┬──────────┘           │  (Analytics) │
    │                      └──────────────┘
┌───▼──────────┐  /api/*   ┌──────────────┐     ┌──────────┐
│  Next.js     │──(proxy)──▶│  Express API │────▶│ PostgreSQL│
│  Frontend    │            │  Backend     │     └──────────┘
│  (Web Runner)│            │  (Web Runner)│
└──────────────┘            └──────┬───────┘
                                   │
                            ┌──────▼───────┐
                            │    MinIO     │ ◀── Upload (S3)
                            │  (S3 storage)│
                            └──────┬───────┘
                                   │
                  ┌────────────────▼────────────────┐
                  │  SVT Encore  →  Packager        │
                  │  (Transcode)    (HLS fMP4)      │
                  └────────────────┬────────────────┘
                                   │
                  ┌────────────────▼────────────────┐
                  │       Auto-Subtitles            │
                  │    (Whisper speech-to-text)      │
                  └─────────────────────────────────┘

Infrastructure (OSC Services)

Service
CloudFront CDN
Web Runner (x2)
PostgreSQL
Valkey (x2)
App Config Service
MinIO
SVT Encore
Encore Callback Listener
Encore Packager
Auto Subtitles
Continue Watching API
EPAS Eventsink
ClickHouse
EPAS Worker

Features Delivered

HLS video streaming with ABR
Full VOD pipeline (upload → transcode → package)
Auto-subtitles via Whisper speech-to-text
Subtitle editor with visual timeline
CMS admin panel with talk management
Multi-speaker support per talk
User authentication with JWT cookies
Watchlist & continue watching
CloudFront CDN with custom domain
API proxy for first-party cookies
Dark theme design system
Social sharing with timestamps
Embeddable video player (oEmbed)
SEO with JSON-LD structured data
Responsive design (mobile to 4K)
WCAG 2.1 AA accessibility
Analytics dashboard (views, QoE, retention)
Per-talk drill-down with audience insights
Email verification & password reset
YouTube import with yt-dlp

Key Debugging Moments

Presigned URLs don't work in OSC

MinIO presigned URLs require direct network access. Switched to proxying uploads through the backend.

Encore needs OSC auth

API calls to SVT Encore require an OSC Service Access Token (SAT). Had to implement PAT → SAT token exchange.

Separate Valkey instances

Config service and VOD pipeline queue MUST use separate Valkey instances. Sharing causes WRONGTYPE errors.

ZADD vs LPUSH

The Encore Packager expects jobs in a sorted set (ZADD), not a list (LPUSH). Subtle but critical.

MinIO proxy dropping connections

Encore's ffmpeg reads via HTTP over minutes. The proxy dropped the connection at 32MB. Fixed by using S3 protocol directly.

OSC reverse proxy body limit

125MB video upload failed with 413. Fixed with presigned URL multipart upload — 20MB chunks go directly to MinIO.

CDN caching stale 404s

Next.js ISR cached a 404 for the homepage when the API wasn't reachable during startup. CloudFront served the stale response.

Third-party cookie blocking

CDN on plus.streamingtech.se couldn't auth with API on a different domain. Fixed with Next.js API proxy for same-origin cookies.

Built with AI + Open Source

This project demonstrates what's possible when AI agents collaborate with humans on real-world software using open source infrastructure.