This is the index for a series I’m writing (and filming) about building Gatify, a self-hosted LLM gateway that sits in front of my Azure AI Foundry model deployments. If you just want to read the code, it’s all in the repo. If you want the reasoning behind the code, the wrong turns, and the bugs I hit along the way, that’s what this series is for.
Each part below maps to roughly one chunk of real work in the git history. I’m not reordering things to make a nicer story. The order here is the order it actually happened, typos in early commit messages included.
- Why I Built My Own LLM Gateway Instead of Paying for One - the actual motivation: free Azure AI access through my Microsoft MVP membership, and wanting one gateway that every side project can share through scoped virtual keys.
- Project Setup: An Nx Monorepo for NestJS and Angular - scaffolding the workspace, picking Nx over two separate repos, and the local Postgres/Redis stack.
- Modeling the Database with Prisma 7 - the schema for deployments, virtual keys, and usage logs, and the Prisma 7 config changes that broke my assumptions.
- Admin Authentication, the Boring Way on Purpose - JWT auth for the dashboard, a global guard, and why there’s no public sign-up route.
- Virtual Keys and Why I Hash Them Differently From Passwords - AES-256-GCM for Azure credentials, HMAC for virtual keys, and the one-time reveal flow.
- The Gateway: Making Azure AI Foundry Look Like OpenAI - the proxy layer, streaming, and automatic fallback when a deployment throws a 429.
- Usage, Budgets, Rate Limits, and a Real Postgres Bug - Redis-backed rate limiting, Postgres as the source of truth for spend, and a
text = uuidbug that took down a whole page. - Frontend Foundations: Angular 22, Zoneless, and a Missing Provider - standalone components, signals, and the zoneless flag that didn’t actually do anything until I wired it up myself.
- Dashboard, Key Management, and Splitting Into Shared Libraries - building the CRUD screens, then noticing I was duplicating types between frontend and backend and doing something about it.
- Test Chat, Streaming, and a Login Bug That Wasn’t About Login - a live SSE chat panel, and a scary bug where correct passwords still failed to log in.
- The UI Overhaul: Adopting My Own Component Library - swapping hand-rolled Tailwind markup for ng-oat, and the Signal Forms edge cases that came with it.
- Deploying to Coolify: A Docker Debugging Diary - the real, unedited sequence of build failures I hit shipping this to a VPS, and how each one got fixed.
- What I’d Do Differently - honest retrospective on the architecture, the tools, and the decisions I’d make again versus the ones I wouldn’t.
If you’re watching the video version, this index also works as the episode list. I’ll be linking back to specific commits and files where it’s useful instead of pasting entire modules into the post.