SvelteKit Made Me Believe in Web Development Again (Then Reality Hit)
SvelteKit bundles are like 25kb for a whole app. The first time I saw that I thought the build was broken. It wasn't. The catch? Try finding a decent auth library. There's like three options and they're all maintained by one guy named Dave who hasn't committed in 6 months.
The performance is actually insane though. My app loads instantly on shit phones while my old React app was still parsing JavaScript. Memory usage is stupid low - like 15MB for a whole dashboard. But then I needed to connect to Salesforce and had to build my own API wrapper because the React ones don't work with Svelte.
Version Hell I'm Still Living With:
SvelteKit 2.0 broke my imports overnight in January 2024. $app/stores
didn't move but how you import route parameters changed - params
became a reactive store instead of a plain object. The migration guide says "just update your imports" but doesn't mention the 47 TypeScript errors when $page.params.id
becomes $page.params.get('id')
. I'm still using 1.30.x on one project because upgrading breaks the Vercel adapter with cryptic ENOENT: no such file or directory
errors.
Also the adapter system is confusing as fuck. adapter-node, adapter-vercel, adapter-static - pick the wrong one and your app just... doesn't work. No helpful error, just silence. Took me two days to figure out adapter-static doesn't do SSR because apparently that's obvious to everyone except me.
Remix: Finally, Forms That Don't Suck (Until the Corporate Takeover)
Remix was perfect. HTML forms just worked. Data loading happened server-side like it should. No client-side state management hell. Then React Router absorbed it in May 2024 and broke every single one of my deployment pipelines overnight.
The whole @remix-run/node
thing just disappeared one day. My CI/CD scripts started failing with "Module not found: Can't resolve '@remix-run/node'" errors and I thought I was going insane. Turns out the entire project got merged into React Router v7 with about 3 months warning that nobody read. Spent two weeks changing every @remix-run/*
import to the unified react-router
package.
But when it works? Holy shit, forms are beautiful. You write HTML:
<form method="post">
<input name="email" />
<button>Subscribe</button>
</form>
And it just works. Server handles the POST, validates the data, returns errors. No useState, no useEffect, no loading states. None of that client-side circus that makes you want to quit programming.
The Pain Points That Remain Unfixed:
My Docker containers randomly serve dev bundles in production if I forget NODE_ENV=production
. The error message is just "app not working" which is super helpful. Session cookies fail silently - your auth just stops working and Remix doesn't tell you why.
CloudFlare breaks streaming responses for no reason I can figure out. Docs say "configure caching correctly" but don't explain what that means. Still haven't solved this one.
Next.js: Feature Overload Nightmare
Next.js has every feature and that's the problem. App Router, Pages Router, Server Components, Client Components, ISR, SSG, SSR - just fucking pick one and stick with it. The decision paralysis is real.
Bundle analyzer shows my "simple" dashboard hitting 180kb in production and 60% of that is Next.js runtime. I can't optimize away the framework overhead without breaking functionality. Turbopack made dev builds 5x faster in Next.js 15 but production bundles are still bloated because the runtime doesn't tree-shake properly.
Server Components break hot reload in creative ways. That ReferenceError: Cannot access 'MyComponent' before initialization
error shows up in completely unrelated files when you import a Client Component inside a Server Component. The stack trace points to Next.js internals instead of your actual mistake. I've learned to just restart the dev server when things get weird, which is daily.
Shit That Still Doesn't Work Right:generateStaticParams()
fails silently if your TypeScript types are slightly off. The error message is useless and you waste hours debugging build outputs instead of obvious type errors.
Server Components crash if you accidentally use useState
but the error shows up 3 components away from where you actually fucked up. The stack traces point to Next.js internals, not your code.
Image optimization randomly stops working when you need custom loaders. Works fine in development, breaks in production for reasons I still don't understand. The documentation for custom image loaders is either outdated or written by someone who never actually used the feature.
Vercel deployment is one click but costs $400/month for anything real. Self-hosting Next.js is possible but you'll spend weeks setting up PM2, reverse proxies, and memory management because Next.js assumes you're using Vercel.
What I Actually Use (And Why I Hate Myself For It)
SvelteKit when I need shit to actually load fast. Bundle sizes that don't make you weep, but you'll spend three weeks building a dropdown that works on mobile. Currently fighting with a custom auth flow because all the Svelte auth libraries got abandoned after their maintainers got real jobs.
Remix when forms matter more than my sanity. HTML that works like fucking HTML is apparently revolutionary in 2025. It's the boring choice that doesn't actively try to murder your deployment pipeline every Tuesday.
Next.js when the client specifically asks for it or when HR can't find Svelte developers in this century. Everyone tolerates React, Stack Overflow has 50 answers for every stupid question, but the bundle analyzer results will make you question your career choices.
And don't get me started on npm audit fix - it'll randomly break your build by upgrading some transitive dependency that half your project depends on. Docker Desktop decides to stop working every time there's a system update, which is perfect timing for when you need to demo something.
The Shit That Breaks at 3AM
My SvelteKit app crashed trying to serve a 40MB CSV export. No error message, just silent death. Still don't know why adapter-node chokes on large responses.
Remix randomly gets stuck in infinite loading loops when nested routes share data dependencies. Haven't figured out the pattern yet but restarting the server fixes it.
Next.js hydration mismatches took down production for 3 hours last month. The source maps were completely useless - error traces pointed to minified Next.js internals instead of my actual components. Still don't know what caused it, just reverted and moved on.
Memory usage under load is all over the place. SvelteKit stays light, Remix is reasonable, Next.js just eats RAM until the server dies. These numbers change depending on moon phases and what Node version you're running.
Oh and Jenkins can eat shit and die. Why does CI randomly fail on the exact same code that worked yesterday? Because Jenkins decided to use a different npm cache or something equally stupid. TeamCity isn't better - it just fails in more expensive ways.
Speaking of expensive failures, why does AWS CloudWatch cost more than my rent? I just want to see error logs, not fund Jeff Bezos's rocket hobby. And CloudFlare's "5 second rule" for DDoS protection means your users think your site is broken when it's actually just CloudFlare being dramatic about traffic spikes.
Docker containers work perfectly on my MacBook but explode in production because apparently ARM and x86 are different architectures. Who fucking knew? Spent two days debugging a memory leak that only happened on Linux containers because some Node.js native module compiled differently.
I still don't know why the first deployment attempt always fails but attempt #4 works with identical configuration. Infrastructure is black magic and I'm tired of pretending it makes sense.