Mike San Román's homepage

Choosing a technical stack for Carpeta: a deliberate approach

September 30, 2023

While we're in the process of collecting leads and validating the concept behind Carpeta, I don't want to sit idle in terms of development and I want to define a bit the technical stack for Carpeta.

Learning from Otter

When building Otter, the development was somewhat ad-hoc, forcing me to revamp key components of the stack later. This time, I aim for a more intentional approach this time, guided by the principle of ensuring that the development process remains enjoyable.

Otter's stack right now is mostly:

  • NextJS, with TypeScript, React, and TailwindCSS
  • GraphQL with Apollo
  • PostgreSQL and Prisma
  • Sanity.io for the CMS
  • Vercel

But there's been moments where I had a separate backend API in Heroku, which was messy to work with (deploying full-stack changes required careful synchronizing of the backend and frontend deployments).

There were also things that I did early on that I'd love to avoid this time, like building on top of new/unstable technologies (I used a backend-as-a-service for the Otter MVP, but then it was painful to move away from it later on), or standards that I was not familiar with (I used GraphQL for the first time with Otter, and so I learned best practices the hard way).

Choosing boring tech

I want to go back to basics, using boring pieces of tech that I'm familiar with, and that I know will work well together. I don't need to worry about scalability, but developer experience and productivity are key.

I'm looking into frameworks such as Ruby on Rails, Laravel, and BlitzJS. These all offer several things that I want:

  • Built on top of an established ecosystem.
  • Batteries included.
  • Code generation/scaffolding.
  • Strong conventions.
  • Testing as a key part of the development process.

The process to choose, right now, is to scaffold the same app (I always default towards a to-do system, since I'm a bit of a productivity nerd and I can think about a database system, and several features that involve heavy UI and backend) with several of these frameworks and libraries, and see which one I can flow with the most.

So far, I'm leaning towards BlitzJS, because it's built on top of NextJS, which I'm already familiar with, and it's a full-stack framework, so I don't need to worry about the backend/frontend separation. It also means I remain close to NodeJS and TypeScript, which is pretty much the ecosystem I know best nowadays, while it's been years since I've done a project from scratch in either Ruby or PHP.

Also, this is an excellent way to satisfy any craving for novelty, by trying out new frameworks and libraries, without having to commit to them for the long term. No matter what I choose, I won't carry any of these experiments as the foundation for the MVP, so I can just play around and see what I like.