MinIO Was Easy, SeaweedFS Made Me Think
A practical SeaweedFS vs MinIO guide for FastAPI apps using boto3, S3-compatible storage, internal and public endpoints, pre-signed URLs, SigV4, Redis caching, and self-hosted media storage.
I founded and built a production consumer AI platform — a stealth generative AI product that grew from 0 to 25K+ users. It's a discreet venture, so I'm keeping the product name and public identity private here, but the engineering problem is one I can talk about in detail: building LLM-powered conversational experiences, generative media (image and video), voice, personalization, and multi-agent systems as production infrastructure, not a demo.
As Founder & CTO, I worked across the full stack — product, backend, infrastructure, and the AI systems underneath. That meant designing the API and data layer, building the asynchronous generation pipelines, standing up GPU inference infrastructure, and owning reliability and delivery as the user base grew.
The platform grew from 0 to 25K+ users. Rather than quote unverifiable internal metrics beyond that, this case study focuses on the architecture and engineering decisions that made that growth possible — the systems, not the spreadsheet.
At a high level, the platform is a fairly conventional web-and-worker architecture, made interesting by how much of the request path is asynchronous, GPU-bound, or both:
The product spans several distinct generative AI workloads, each with different latency and cost characteristics: LLM-powered conversational experiences and AI characters, image generation, video generation, and voice/audio. Multi-agent orchestration and personalization sit on top of these to shape the experience per user. Treating these as separate, independently scalable workload classes — rather than one monolithic "AI service" — was a deliberate architectural choice.
The backend is built on FastAPI, with PostgreSQL as the system of record and Redis for caching, rate limiting, and queueing. Next.jsserves the frontend and handles server-rendered, SEO- and performance-sensitive surfaces. The API layer is deliberately thin — most of the real work happens in async workers, so request-response paths stay fast even when generation doesn't.
Generation jobs — image, video, voice — are dispatched through Celeryonto dedicated worker pools rather than handled inline. That keeps the API responsive under load and lets each workload class scale independently: a spike in image generation demand doesn't starve conversational LLM traffic, and vice versa. Job state, retries, and progress are tracked through PostgreSQL and Redis, with the frontend polling or subscribing for updates instead of holding a request open.
Model serving and GPU inference sit behind an internal routing layer that separates "what the product needs" from "which model or provider serves it." That abstraction — model adaptation and fine-tuning on one side, inference optimization and throughput on the other — turned out to be one of the most reusable pieces of the whole system, and it's part of what motivated my second product, an AI infrastructure platform built around the same idea at a broader scale.
Async, GPU-backed workloads fail differently than typical CRUD APIs — a stuck job or a slow provider matters more than a single failed request. Reliability work here centered on observability into the async pipeline itself: queue depth, worker health, job latency, and failure/retry behavior, so degraded performance was visible before it became an outage.
Generated media (images, video, audio) is written to object storage and served through a CDN, keeping the API and application servers out of the data path for large binary payloads. Some of what I learned building and operating self-hosted object storage for other projects fed directly into these decisions —see the MinIO migration writeup and the SeaweedFS follow-up for the deeper storage-layer notes.
The recurring theme across this build was that generative AI workloads break the assumptions most backend architecture is built on: requests aren't fast, work isn't cheap, and compute is a scarce, unevenly-shaped resource (GPU vs. CPU, burst vs. steady demand). Most of the interesting engineering work — async job orchestration, provider/model routing, storage and delivery for generated media, and observability into non-request-shaped systems — exists because of that mismatch, not in spite of it.
Building this end-to-end — as founder, not just engineer — meant every infrastructure decision was also a product and cost decision. The biggest lesson was that production generative AI is mostly a systems problem: getting async processing, GPU inference, and storage/delivery right matters more than any individual model choice. That's the lens I now bring to backend and AI infrastructure work generally, including at ValueLabs and my second product.
A practical SeaweedFS vs MinIO guide for FastAPI apps using boto3, S3-compatible storage, internal and public endpoints, pre-signed URLs, SigV4, Redis caching, and self-hosted media storage.
A practical on-prem Linux deployment guide for FastAPI and Vite apps using Docker Compose, nginx, Postgres, Redis, PM2, no-sudo deployment, health checks, logs, and production runbooks.
How I migrated a FastAPI app from AWS S3 to MinIO using boto3, S3-compatible object storage, pre-signed URLs, SigV4, HTTPS proxying, and a small storage abstraction.