Convex: The Backend TypeScript Deserves
Why I stopped configuring databases and started building product
“I don’t want to configure a database. I want to build my product.”
That was my moment of clarity after 20+ years configuring backends.
The Problem
Every new project means:
- Choosing an ORM (Prisma? Drizzle? TypeORM?)
- Setting up migrations
- Redis setup for caching
- WebSockets for real-time
- Writing the “glue” between everything
At Viago Travel I lost 2 weeks just on infrastructure before writing a single line of business logic.
That doesn’t scale for an indie hacker.
My Discovery with Convex
Theo (t3.gg) migrated T3 Chat to Convex. I ignored it for months—it sounded like “Firebase on steroids” and vendor lock-in.
I was wrong.
What I understood after trying it: Convex is React for the backend.
It doesn’t “abstract” your database. It gives you better primitives to build:
// convex/tasks.ts
import { query, mutation } from "./_generated/server";
import { v } from "convex/values";
// Reactive query - UI updates automatically
export const list = query({
args: {},
handler: async (ctx) => {
return await ctx.db.query("tasks").collect();
},
});
// Mutation with automatic types
export const create = mutation({
args: { text: v.string() },
handler: async (ctx, args) => {
await ctx.db.insert("tasks", {
text: args.text,
completed: false
});
},
});
On the frontend:
// React component
import { useQuery, useMutation } from "convex/react";
import { api } from "../convex/_generated/api";
export function Tasks() {
const tasks = useQuery(api.tasks.list);
const createTask = useMutation(api.tasks.create);
// tasks updates AUTOMATICALLY when DB changes
// No polling. No manual WebSockets. No configuration.
}
End-to-end type-safety. No duplicating types. No generating schemas.
What Changed
Before (typical stack)
- Initial setup: 2-3 days
- Real-time: Configure Redis + WebSockets
- Cache: Implement manually
- Migrations: Manage with scripts
After (Convex)
- Initial setup: 30 minutes
- Real-time: By default
- Cache: Automatic (98% hit rate according to Theo)
- Schema: Pure TypeScript
Vendor Lock-in?
My biggest objection. But there are two types of lock-in:
- Proprietary code → Bad
- Managed services → You’re paying to not write code you could do yourself
Convex is mostly #2. Want to configure your own cache invalidation system with Redis? You can. Is it worth your time? Probably not.
And if you really need to leave: Convex is open source. Self-host whenever you want.
Who It’s For (and who it isn’t)
Use it if:
- Your stack is 100% TypeScript (frontend + backend)
- You’re an indie hacker/solopreneur who values speed
- You’re building products that need real-time
- You hate configuring infrastructure
Don’t use it if:
- Your Data Science team needs direct SQL for analytics
- Your backend is in Go, Rust, Python
- You need absolute control over every query
My Current Stack
For new projects:
Frontend: Next.js + TypeScript
Backend: Convex
Auth: Kinde
Payments: Stripe
Deploy: Railway
Time from setup to production: ~2 hours.
It’s not perfect. But it leaves me time for what matters: building the product, not the infrastructure.
Conclusion
Convex isn’t for everyone. But if you’re a TypeScript developer building products—especially as an indie hacker—it deserves your attention.
The question isn’t “can I build this with Postgres + Prisma + Redis?”
It’s: “do I want to spend my weekends configuring infrastructure or building features?”
I chose features.
Trying something similar? Tell me: jlopezlira@gmail.com
If this saved you research time, share it. Someone else is evaluating their stack right now.