Seriously? It was the night before interviewing for a head of engineering position, so I did some research and saw remix and prisma. WHY?! I told them I have to drop out right then and there, but I wish them the best of luck with their idealistic engineering approach, but I believe in being objective.

He was big mad.

He said: I bEliEve In NoT bUilDing ThiNGs tO sCaLe aT ThIs sTage. Yeah, me too, bro. It doesn’t mean I mad stupid decisions that cripple the company from a tech and financial standpoint to save 10 minutes.

I’ve launched dozens of products in 0-3 months using maintainable practices and tech, WITH custom UIs, with teams of 0-3. Want to know the secret? Do what works, what’s understood, and work hard. Create a framework, reuse and adapt it. It’s not difficult if you are a strong engineer. I literally just launched a new MVP a few weeks ago in less than 2 weeks (minus a custom UI, but including hosting, a domain, SSL, load balancing, anti-DDoS, emails, a CI/CD pipeline, etc).

Let’s start with basics:

Prisma doesn’t let you pass transactions as an argument and doesn’t support many features of Postgres. Pass.

Now on to Remix:

Type safety is annoying because they use esbuild, which throws it all away (the build don’t break). So you basically have to “build” it twice, again using TSC, more than negating the performance implications of using esbuild.

Page titles can’t be dynamic, because the function to set them doesn’t have access to your loader data. EVERY SSR platform runs into this issue when they are new. Their inexperience in real world dev is showing.

Type safety for forms is poor because i uses the formData which is an interable.

Using an error boundary at your root causes everything in head to be lost, breaking your app.

Components can’t have loaders, which means they have to fetch and save data differently than the rest of your app.

You can’t co-locate components and your pages, because they’d become routes.

It’s by the react router guys who are famous for making huge breaking changes and they don’t care (hello angular).

Their form system has so many hooks that when you save data it causes 3 re-renders, so if it’s in a modal or something that you want to close after you save (creating s 4th state change) it blows up the app. They know and don’t care because “native forms are best”.

They encourage you to write all of your business logic in page loaders and actions. This VERY poor advice. It encourages not having separations of concerns and not being able to share business logic. The concept of not having a “backend” is a joke.

It’s SUPER easy to end up including server code in your UI if you use your own private packages. This adds bloat, but worse you can end up with strange errors that make zero sense. And you can accidentally expose sensitive info (like your DB schema for the world to see).

There are basically no UI libraries that work with it in an optimal fashion because they rely on streaming.

They are trying to target edge computing. It might be the future, I don’t know. But it’s complicated and expensive and hard.

When you have an error in your code you have no idea. The hot loader is happy to make it look like everything is fine, but you won’t see your changes. Super confusing.

And I want to reiterate the routing issues. I was just debugging some tonight. File structure based routing is awful in my opinion, it’s rarely done right and “magic” is bad.

That’s just off the top of my head. I’ve only been (forced) to use it for a month and there’s a lot more… in just a freaking month. Half my job has basically been making work-arounds to make the thing usable, while trying to keep developers sane by creating a single way to perform a task like fetch data.

TL;DR: immature-trash-tech. Stop fucking using it.