VOD Docs

Tech stack

Every major technology in VOD, the version in use, and why it was chosen.

Versions are the ones pinned in backend/requirements.txt, app/package.json and infra/docker-compose.yml.

Architecture diagram · placeholder
Tech stack layered by tier: client, edge, application, async processing, data

Stacked-layer diagram with each technology logo placed in its tier.

Backend

TechnologyVersionRoleWhy
Python3.12 (python:3.12-slim image)Language for API and workerOne language and one Docker image for both the web tier and the processing tier
FastAPI0.139.2HTTP APIType-driven request validation with Pydantic, automatic OpenAPI docs, dependency injection for auth
Uvicorn0.34.2ASGI serverStandard server for FastAPI
Pydantic / pydantic-settings2.13.4 / 2.14.2Schemas and configurationRequest/response validation; typed settings loaded from environment variables
SQLAlchemy2.0.51ORMMature ORM; used synchronously with the psycopg2 driver
Alembic1.15.2Database migrationsVersioned schema changes for SQLAlchemy models
Celery5.6.3Background task queueWorkflow primitives (chain, group, chord) that fit a multi-stage, partly parallel pipeline; retries; Flower dashboard
python-jose3.4.0JWT encode/decodeAccess and refresh tokens
passlib + bcrypt1.7.4 / 4.3.0Password hashingAdaptive, salted hashing
minio (Python SDK)7.2.20Object storage clientTalks to MinIO over the S3 API
redis-py8.0.1Redis clientProcessing lock, upload admission slots
Resend2.34.0Transactional emailVerification links and password-reset codes
FFmpeg / ffprobeDebian package in the imageMedia processingIndustry-standard transcoder; probing, scaling, H.264/AAC encoding, HLS segmentation, sprite sheets

Data and infrastructure

TechnologyVersionRole
PostgreSQL16 (postgres:16-alpine)System of record: users, videos, tokens, upload sessions
Redis7 (redis:7-alpine)Celery broker and result backend; the processing lock; tus admission slots
MinIOminio/minio:latestS3-compatible object storage for originals, thumbnails, HLS output
tusdv2.9.2tus protocol server that streams uploads into MinIO
Caddy2 (caddy:2-alpine)Reverse proxy, automatic HTTPS, the single public entry point
Docker Compose—Runs every backend service, locally and in production

Frontend

TechnologyVersionRole
Next.js (App Router)16.1.0Framework and routing; deployed on Vercel
React19.2.3UI
TypeScript5Types
Tailwind CSS4Styling, with shadcn/ui components (Radix primitives)
TanStack Query5Server-state fetching and caching
Zustand5Client auth state
Axios1.13HTTP client with auth interceptors
@videojs/react10.0.0-beta.25Player, using its hls.js-backed HlsJsVideo element for adaptive streaming
Uppy + @uppy/tus5Resumable upload client
React Hook Form + Zod7 / 4Forms and validation
GSAP3Motion

Key choices in one line each

  • HLS over progressive MP4: lets the player switch quality mid-stream as bandwidth changes, and segments cache well.
  • Object storage served by the proxy: video bytes go MinIO → Caddy → browser and never pass through Python.
  • tus for uploads: large files survive network drops and resume from the last chunk.
  • One processing pipeline at a time: predictable CPU and memory use on a small server.
  • Separate frontend hosting: the frontend scales on Vercel's edge independently of the backend VPS.

Each of these is explained in depth in Architecture and Decisions & Incidents.

On this page