Ship your AI SaaS in days.
FastAPI + Next.js with token billing built in.
Native Python (LangChain/DSPy), pgvector RAG with RLS, SSE streaming, and Stripe metered billing.
The Production Dashboard
Experience the live dual-stack interface: test real-time token streaming, semantic pgvector search, and automated Stripe metered billing.
Code preview
Clean, modular, and strictly typed code. See how data flows from Next.js 15, is authorized in FastAPI, and streamed back with Stripe metering.
import logging
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
import jwt
from jwt import PyJWKClient, PyJWTError
from api.core.config import settings
logger = logging.getLogger(__name__)
security = HTTPBearer()
# Supabase asymmetric keys (ES256 / RS256) are validated via the JWKS endpoint;
# symmetric keys (shared secret) are strictly restricted to HS256.
jwks_client = PyJWKClient(f"{settings.SUPABASE_URL}/auth/v1/.well-known/jwks.json")
async def get_current_user(
credentials: HTTPAuthorizationCredentials = Depends(security)
) -> dict:
"""
Zero-Trust JWT verification dependency using PyJWT.
Validates cryptographic Supabase signature with strict algorithm allowlists.
Never trusts client-supplied identity; logs errors server-side and returns generic 401.
"""
token = credentials.credentials
try:
unverified_header = jwt.get_unverified_header(token)
algorithm = unverified_header.get("alg")
if algorithm == "HS256":
# Shared secret symmetric verification strictly restricted to HS256
payload = jwt.decode(
token,
settings.SUPABASE_JWT_SECRET,
algorithms=["HS256"],
audience="authenticated"
)
elif algorithm in ["ES256", "RS256"]:
# Asymmetric key verification strictly restricted to ES256 / RS256 via JWKS
signing_key = jwks_client.get_signing_key_from_jwt(token)
payload = jwt.decode(
token,
signing_key.key,
algorithms=["ES256", "RS256"],
audience="authenticated"
)
else:
logger.warning(f"Rejected unsupported JWT algorithm: {algorithm}")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid or expired token"
)
user_id: str = payload.get("sub")
if not user_id:
logger.warning("JWT payload missing 'sub' claim")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid or expired token"
)
return {
"id": user_id,
"email": payload.get("email"),
"role": payload.get("role", "authenticated")
}
except PyJWTError as e:
logger.warning(f"JWT verification failed: {e}")
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid or expired token"
)Current Build Progress
I'm building this in public. Follow along on X and LinkedIn.
Foundation + auth
FastAPI architecture, Supabase Auth JWT verification bridge, and environment setup
Streaming chat + history
Server-Sent Events (SSE) token generator and chat session persistence
RAG + document ingestion
pgvector HNSW cosine index migrations with native tenant RLS policies
Billing, usage limits, rate limiting
Stripe metered usage billing sync, rate limits, and token counters
Docs, Docker + uv setup, launch checks
Complete developer documentation, multi-stage Dockerfiles, and pre-launch checks
Why Other Approaches Fall Short for ML Engineers
Node.js boilerplates force you into weak JavaScript AI libraries. Streamlit apps don't look like real B2B software. AgentLaunch gives you the best of both worlds.
AI / ML Library Ecosystem
Frontend UI & User Experience
Billing Model for AI Tokens
Streaming Protocol
Multi-Tenant Vector Isolation
Zero-Trust Auth Bridge
| Architecture Feature | Node.js Boilerplates | Streamlit / Reflex | AgentLaunchRecommended |
|---|---|---|---|
| AI / ML Library Ecosystem | JavaScript AI libraries (LangChain.js, Vercel AI SDK); external Python services required for native PyTorch or DSPy | Native Python ecosystem, designed primarily for dashboards and interactive prototypes | Full native Python 3.12 (LangChain, DSPy, PyTorch, Hugging Face) |
| Frontend UI & User Experience | Modern Next.js/React frontend with Node.js backend routes | Standard component library with limited CSS flexibility | Linear-style Next.js 15 App Router + Tailwind & Framer Motion |
| Billing Model for AI Tokens | Typically configured for fixed subscription plans; token-metered events require custom sync logic | Requires third-party integrations or custom payment middleware | Automated Stripe Metered / Usage-Based Billing per token |
| Streaming Protocol | Server-Sent Events or WebSockets handled through Node.js/Edge runtimes | WebSocket connection with script re-execution on user interaction | Low-latency Server-Sent Events (SSE) with token live-counter |
| Multi-Tenant Vector Isolation | Multi-tenant isolation managed at application layer or external vector database | Local embedded vector stores (Chroma, FAISS) commonly run single-process | Postgres pgvector with native Row-Level Security (RLS) |
| Zero-Trust Auth Bridge | Authentication handled in Node.js runtime (Auth.js / NextAuth) | Community auth components or reverse proxy access control | Supabase JWT validated cryptographically in FastAPI Depends |
Comparison as of October 2026
Engineered for Separation of Concerns
No messy monolithic compromises. Keep your frontend fast and SEO-ready on Vercel while running your heavy AI workloads on high-throughput Python backends.
Next.js 15 Frontend
App Router & React Server Components. Manages sessions, handles SSR, renders the UI, and opens an SSE stream listener.
SSE & JWT Protocol
Zero-Trust authorization. Supabase JWT passed via Bearer header. Server-Sent Events stream tokens smoothly with low-latency TTFT.
FastAPI Python Runtime
Native Python 3.12 ecosystem. Executes LangChain, LlamaIndex, DSPy, or custom PyTorch models with Pydantic v2 validation.
Supabase + pgvector
PostgreSQL 16 with HNSW cosine distance indexing for ultra-fast vector similarity search, enforced by native Postgres RLS policies.
Planned for v1
Every core capability engineered for machine learning engineers to ship production AI SaaS products.
SSE Streaming Chat
Native FastAPI Server-Sent Events yielding token chunks dynamically without blocking the main event loop.
Supabase JWT Bridge
Zero-Trust cryptographic token verification in FastAPI Depends. Never trusts client user parameters.
pgvector RAG with RLS
PostgreSQL 16 vector storage with HNSW cosine distance search, isolated per-tenant via Row-Level Security.
Document Ingestion
Clean pipelines for parsing, chunking, and embedding PDF, Markdown, and text files into pgvector tables.
Auth UI
Pre-built Next.js 15 authentication screens for email/password, magic links, and OAuth powered by Supabase.
Chat History
Persistent conversation threads and message logs with tenant isolation and fast retrieval.
Usage Limits
Configurable per-user and per-workspace token quotas preventing accidental API overages.
Rate Limiting
High-performance token bucket and IP rate limiters on AI generation and vector search endpoints.
Stripe Metered Billing
Automated token calculation and Stripe Meter Event logging before SSE stream closure.
Docker + uv Setup
Fast, deterministic Python dependency management via uv and multi-stage production Dockerfiles.
Complete Documentation
Step-by-step setup guides, architecture blueprints, environment reference, and deployment checklists.
Early-Bird Pricing for Waitlist Members.
Joining the waitlist is 100% free ($0 due today). Early-bird price offered to the first 100 waitlist members at launch ($99 Solo / $199 Team) before prices increase to $149 / $299.
Solo Builder License
1 DeveloperFull production boilerplate for solo developers and ML engineers shipping commercial AI SaaS.
Free reservation • No card required today
Team License
Up to 5 DevsFor development shops, startups, and engineering teams building commercial client platforms.
Free reservation • No card required today
Everything You Need to Know
Honest answers about architecture, licensing, build timeline, and requirements.
Get Early Access Before Public Launch
Joining requires zero payment today ($0 due now). Early-bird price offered to the first 100 waitlist members at launch ($99 Solo / $199 Team) with private repo invites.