Convex: The Backend TypeScript Deserves

Why I stopped configuring databases and started building product

4 min

“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:

  1. Proprietary code → Bad
  2. 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.