Why I Don't Like Remix and Where It Often Falls Short for Modern Web Dev

Why I Don't Like Remix and Where It Often Falls Short for Modern Web Dev

Web development moves fast. Really fast. One day everyone is obsessed with Next.js, and the next, a new challenger like Remix pops up, promising to return us to the "glory days" of the web. It talks a big game about web standards, the power of the platform, and making the browser do the heavy lifting. But honestly? After spending significant time in the trenches with it, I’ve realized something. I don’t like Remix for a lot of the projects where it's currently being pushed as the "obvious" choice.

It isn't that the tech is broken. Michael Jackson and Ryan Florence are brilliant engineers. They’ve done more for the React ecosystem through React Router than almost anyone else. But there is a massive gap between "this is theoretically more correct" and "this is better for my team’s daily productivity."

✨ Don't miss: Can You Use GoPro as Webcam? The Honest Truth About Setup and Quality

Remix tries to force a specific mental model on you. It wants you to think in terms of loaders, actions, and HTML forms. While that sounds noble and "pure," it often creates friction that just doesn't exist in other frameworks. You end up fighting the abstractions rather than building features.

The Mental Overhead of Form-Based State Management

The core pitch of Remix is that you don't need useEffect or complex state management libraries like React Query or SWR. You just use <Form>. It's back to the basics! But here's the thing: modern web apps aren't just documents. They are highly interactive, state-heavy experiences.

When you use Remix, you are essentially buying into a server-centric philosophy. Every interaction that changes data has to go through a "route action." This sounds fine on paper. In practice, it’s a headache. If you have a complex UI where multiple disparate parts of the page need to update based on a single action—without a full page revalidation—Remix makes you jump through hoops.

Sure, you have useFetcher. But at that point, you’re just manually recreating the client-side state management you were told you wouldn't need.

I've seen developers struggle with this. They want to build a "snappy" interface, but they find themselves tethered to the network latency of a server round-trip for every single toggle or checkbox. The "optimistic UI" APIs in Remix are touted as a solution, but they require a ton of boilerplate. You have to manually write code to "guess" what the server will say, render that, and then handle the rollback if the server fails. It's error-prone. It's tedious. It's why many people find themselves saying, "I don't like Remix for high-interactivity dashboards."

The Deployment Complexity Nobody Mentions

Remix prides itself on being "edge-ready." It can run on Cloudflare Workers, Fly.io, Vercel, or a traditional Node.js server. This flexibility is a double-edged sword. Unlike Next.js, which has a very refined, "it just works" deployment story on Vercel, Remix often feels like a "choose your own adventure" book where every choice has a hidden cost.

If you choose a serverless or edge environment, you are suddenly restricted by the limitations of those environments. No long-running processes. Limited memory. Cold starts.

Furthermore, the way Remix handles assets can be frustrating. Because it doesn't do static site generation (SSG) in the traditional sense, every single request must hit a server. Even if your content rarely changes. You are forced into a world of complex caching headers and CDN strategies just to get the performance that a simple npm run build would give you in a static framework.

For a small blog or a marketing site? This is overkill. For a massive enterprise app? It’s a layer of infrastructure management that smaller teams simply aren't equipped to handle.

What About the "Standards" Argument?

You’ll hear the Remix team talk about MDN documentation more than their own docs. They want you to learn how Request, Response, and FormData work.

I love web standards. They are the bedrock of the internet. But most of us aren't building "the internet." We are building specific products for specific users on specific deadlines.

Sometimes, an abstraction exists because the standard is clunky. FormData is powerful, but it's also a pain to work with when you have deeply nested objects or complex validation requirements. Libraries like Zod help, but you’re still stitching together pieces that other frameworks have already integrated more smoothly. There’s a certain elitism in the "just learn the platform" mantra that ignores the reality of developer fatigue.

The Documentation and Ecosystem Gap

Let's talk about the community. Remix is growing, but it's still small compared to the giants. When you hit a weird edge case in Next.js or even Vite-based setups, there are ten Stack Overflow threads and three YouTube videos explaining how to fix it.

With Remix? You might find a GitHub Discussion from 2022 that says "we're looking into this."

🔗 Read more: AirPods Max Ear Cups: Why Your Expensive Headphones Might Be Growing Mold

The documentation, while stylish, often focuses on the "happy path." It shows you how to build a basic blog or a simple todo list. But what happens when you need to integrate a legacy CMS that doesn't play nice with fetch? What about complex WebSockets integration? What about heavy client-side libraries like Three.js or D3 that don't care about your server-side loaders?

In these scenarios, the Remix "magic" starts to fade. You find yourself fighting against the framework's desire to own the entire request-response lifecycle. It's a "my way or the highway" approach that can be incredibly stifling.

When Remix Actually Makes Sense (And Why I Still Avoid It)

I want to be fair. Remix isn't "bad." It's opinionated.

It excels in scenarios where you have a data-heavy application that relies heavily on a database and doesn't require complex client-side state. If you’re building a CRUD app where users just fill out forms and view lists, Remix is actually quite fast to develop in. The way it handles nested routing is genuinely better than almost anything else out there. Being able to load data for different parts of the page in parallel is a huge win for performance.

But for the vast majority of "modern" web apps—the ones that feel like apps, not documents—the overhead of the Remix way is a net negative.

Real-World Friction Points

  1. Nested Routes Overload: While nested routes are cool, they lead to a massive explosion of files. Finding where a specific piece of logic lives can become a scavenger hunt in a large project.
  2. The "No CSS-in-JS" Philosophy: Remix has had a rocky relationship with how it handles styles. For a long time, it pushed a very specific "link tag" approach that made using popular libraries like Styled Components or Emotion a nightmare. They’ve improved this, but it still feels like a second-class citizen.
  3. Error Boundaries: Remix handles errors at the route level. This is great for preventing the whole app from crashing. However, it can also lead to a disjointed user experience where half the page is an error message and the other half is working fine, and the developer has to put in extra work to make that look intentional.

Making the Choice: Do You Actually Need Remix?

Before you jump on the bandwagon because of a persuasive tweet thread, ask yourself:

  • Does my app benefit from being 100% server-rendered?
  • Am I okay with every user interaction requiring a network request?
  • Does my team have the expertise to manage edge deployments and complex caching?
  • Is "standard compliance" more important to us than developer velocity?

If the answer to any of these is "no," then you might find yourself in the same boat as me. You might find that you just don't like Remix for your specific use case.

There's a reason why Vite has become the industry standard for tooling. It’s flexible. It doesn't care how you handle your data. It just gets out of your way and lets you build. Remix, by contrast, wants to be the conductor of your entire orchestra. And sometimes, you just want to play the guitar.

Practical Alternatives and Next Steps

If you’ve tried Remix and felt that same "this is harder than it should be" vibe, you aren't alone. You don't have to follow the trend.

💡 You might also like: Why Download YouTube Playlist MP3 Files is Still the Smartest Move for Offline Listening

If you want the benefits of server-side logic without the rigid structure of Remix, look at Next.js with the App Router. It has its own issues, but it offers a bit more flexibility in how you mix static and dynamic content.

If you want total control and maximum speed, stick with a Vite-based SPA (Single Page Application) using TanStack Query for data fetching. This setup gives you a much more responsive UI for complex applications because you aren't waiting on the server for every single state change.

For those who are forced to use Remix or want to give it one last shot, I recommend focusing on mastering useFetcher and looking into Zod for schema validation. It makes the FormData headache significantly more bearable. Also, invest time in learning the nuances of HTTP caching (Cache-Control). Since Remix relies so heavily on the server, your performance will live or die by your caching strategy.

Don't feel pressured to love a tool just because it’s the "intellectual" choice of the month. The best framework is the one that lets you ship high-quality software to your users without making you want to pull your hair out. For me, that usually means choosing something else.

Take a look at your current project's requirements. If interactivity is high and the "document" model is low, steer clear of the Remix hype. Focus on libraries that simplify your specific bottlenecks rather than frameworks that try to redefine how the entire web works.