Coding Wonderland: Remix, NextJS, and the Magic of Programming
I gave a talk called "Do You Believe in Magic? Time to Move to Remix" at the MelbJS and React Melbourne meetup on December 13th, 2023. The core question: ...
16 Dec 2023

I gave a talk called "Do You Believe in Magic? Time to Move to Remix" at the MelbJS and React Melbourne meetup on December 13th, 2023. The core question: how much "magic" should a framework hide from you?
What I Mean by Magic
In programming, "magic" is code that works but nobody fully understands how. You use a library. It does what you want. You don't know the internals. You trust it.
That's fine — until it breaks. Then you're debugging something you never understood in the first place.
Every framework has magic. The question is how much, and whether you can peel back the layers when you need to.
NextJS and the Growing Magic

NextJS has page.js and layout.js that compose together automatically. You put files in the right folders and the framework wires them up. Powerful — but also opaque.

Parallel routes let you render two pages side-by-side in a single view. It looks simple. How it actually works under the hood? That's where the magic thickens.

Then there's the (..) syntax in folder names for intercepting routes. If you've worked with it, you know the confusion. It's powerful once you learn it, but the learning curve is steep and the mental model is fragile.

Server Components are genuinely excellent. But the boundary between server and client code — use client, Server Actions accessing databases, server functions called from client components — adds complexity that isn't always intuitive.

And the file conventions keep growing: error.js, loading.js, template.js, default.js. Template is "like layout but different." At some point, the convention system becomes its own domain language you have to memorize.

The Case for Less Magic
Remix takes a different approach. It leans on web standards — HTML forms, HTTP responses, standard request/response patterns. The mental model is smaller. When something breaks, you can reason about it because the underlying primitives are things you already know.
That doesn't mean Remix has no magic. It does. But the magic-to-understanding ratio is lower.
The Trade-off
More magic: Faster to start, harder to debug, steeper cliff when the abstraction leaks.
Less magic: More upfront learning of fundamentals, easier to debug, smoother scaling of complexity.
Neither approach is wrong. But as someone who teaches and mentors other developers, I've seen the "it's magic, just trust it" approach create fragile understanding. Remix gave me more confidence that the developers on my team actually understood what their code was doing.