Tradeoffs across the ends
This blog is some casual comments to Convex after the Tanstack Start Hackathon.
The convex
Convex is a BaaS (Backend as a Service) product, which encompasses an RPC-style frontend SDK, a Document DB abstraction on top of RDB, and a bit of IaC configuration, all combined to create a better fullstack developer experience on top of a serverless database.
I knew Convex through Theo and got hands-on with it during the Tanstack Start Hackathon. Theo had a fairly long journey with the data solution for his T3 chat app, and he ultimately decided to stay with Convex. Theo must have his specific context to take this platform as efficient, I thought. This was proven to be right when I actually tried it out at the hackathon; I still admire the thoughts from Convex.
Honest feeling
As a junior developer with limited experience using database transactions and RPCs, I may not fully appreciate every theoretical benefit of Convex's abstraction layer. However, I aim to be objective and pragmatic in this review, focusing on how the tool feels to use in practice.
Local dev should be local
This was my first complaint during the hackathon. I was on a trip when my team began setting up the backend. However, when I opened my laptop at the airport, I discovered that the Convex running in my local environment still needed to access their cloud dashboard to sync environment variables. The "local environment" has become a misleading expression in this context. It's common sense that "Local" should be available offline. Or it should be renamed to "self-host dev environment".
Counter-intuitive dashboard
The Convex dashboard design feels somewhat counterintuitive in the billing menu. The usage and billing section is nested within the team settings, which can be quite frustrating for cloud users. What's more, the Convex dashboard takes a long time to load, even though it's just a static settings menu. The team needs to spend a bit more time on the optimisation of their dashboard, as many essential operations are tied to their dashboard.
Overly wrapped runtime
Convex leverages a TypeScript API to abstract database operations. It utilises tsc to generate robust type definitions that ensure end-to-end type safety. This is a necessary tradeoff for ACID database operations; however, the abstracted data access layer is strictly server-side, and the range of available actions is constrained compared to a traditional Node.js environment. This can be challenging during development; specifically, the lack of standard debugging tools like console.log() makes complex operations feel like an undebuggable black box.
Wrap-up
Ultimately, my takeaway from the TanStack Start Hackathon is that Convex isn't the right tool for me just yet. It offers incredible power, but my current capabilities prevented me from fully leveraging—or understanding—its complex operations. It will likely be a long time before I return to it; for now, I’m going to focus on mastering the fundamentals where I have full control over the execution.