AARON SPINDLERAn engineer, father, husband, and a proud 🇨🇦 |
Resume | /resume | |
---|---|---|---|
GitHub | /aaronspindler | ||
X | /aaron_spindler | ||
0007 The Results Of Cutting Out The Bloat | |
Times Read | 13 |
---|---|
Change Log | View on Github |
A while back, I wrote about cutting out the bloat in web development. The core idea: stop reaching for React/Vue/Next.js for everything and use server-side rendering where it makes sense. Now that this blog has been running for a while, I wanted to share the actual results of that philosophy - including what complexity I kept and what I avoided. Spoiler alert: the results are excellent.
Before diving into metrics, let me be clear about what "cutting the bloat" actually means for this site. I'm not running some minimalist setup with zero tooling. In fact, the infrastructure is fairly sophisticated:
So what did I actually cut out? The frontend framework bloat. No React. No Vue. No 3MB JavaScript bundle. No client-side routing. No hydration. Just server-rendered HTML with targeted JavaScript where needed.
This is an important distinction: sophisticated backend infrastructure for optimization and reliability is good. Shipping megabytes of JavaScript to render blog posts is not.
With automated nightly Lighthouse audits tracking performance over time, this site consistently scores in the high 90s across all four metrics:
For context, the average website scores around 50-70 on performance. Many popular blogging platforms struggle to break 80. This Django site with server-side rendering and smart optimization regularly hits perfect or near-perfect scores.
You can view the complete Lighthouse audit history to see these metrics tracked over the past 30 days, including graphs showing consistency and trends.
But scores are just numbers. What do they actually mean in the real world?
The performance metrics translate to real benefits:
Compare this to the typical blog built with modern frameworks: 2-3MB of JavaScript, 3-5 second load times, and a spinning loader while the framework bootstraps. Is that really necessary to display text and images?
Here's the interesting part: building without frontend framework bloat doesn't mean avoiding all complexity. It means putting complexity where it provides value.
My CSS build process uses PostCSS, PurgeCSS for removing unused styles, automatic minification, and generates both Gzip and Brotli compressed versions. The result? CSS that's heavily optimized with features like automatic prefixing and color optimization.
The difference from a typical Next.js build? This takes seconds, not minutes. There's no webpack configuration hell, no fighting with module resolution, no cache invalidation mysteries. Just run make static
and it works.
My CI/CD pipeline is actually quite complex:
This runs on every push. Tests complete in minutes, not the 10-20 minutes I've seen in typical React projects.
The key difference? I'm testing Python code and database interactions, not waiting for TypeScript to compile and Jest to instrument thousands of JavaScript files.
The production environment runs four separate Docker containers:
Plus PostgreSQL, Redis, and S3 for storage. This is not a "simple" architecture. But it's reliable, scalable, and maintainable because each service has a clear purpose and the deployment is automated.
Compare this to managing serverless functions, edge middleware, API routes, and client components in a Next.js app. More moving parts, more vendor lock-in, more debugging hell.
When something breaks (and it will), debugging is straightforward. Django gives me clear stack traces pointing directly to the problem. No transpiled code, no framework magic, no "this error occurred during server-side rendering but actually happened on the client after hydration."
The CI/CD logs are equally clear. When a test fails, I see exactly which test and why, not cryptic webpack errors about module resolution.
Let's be honest - there are trade-offs. Here's what I gave up by avoiding the modern framework ecosystem:
But here's the thing: I don't actually need any of that for a blog. Users don't care if I'm using the latest framework. They care if the site loads fast, looks good, and the content is easy to read.
I'm not anti-tooling. I use build tools where they provide clear value:
These tools solve real problems and don't add framework complexity. The entire build pipeline is defined in a Makefile and a few management commands. No package.json
with 200 dependencies.
This is where the benefits really compound over time. Every dependency you add is technical debt. Every framework version is a ticking time bomb of breaking changes.
With this approach:
I spend my time writing content and adding features, not fighting with ESLint configurations and webpack optimization plugins.
There's something incredibly liberating about working without framework bloat. I don't have decision fatigue about which state management library to use. I don't worry about client/server boundary issues. I don't spend hours troubleshooting "works on my machine" build problems.
When I want to add a feature, I:
No webpack configuration. No "use client" directives. No hydration errors. Just code that runs on the server and sends HTML to the browser.
This mental bandwidth goes into writing better content, designing better features, and actually shipping things.
Let me be absolutely clear: frameworks aren't evil. They solve real problems for real applications. If you're building:
Then yes, use React or Vue or whatever. The frameworks exist for good reasons.
But if you're building a blog, a documentation site, a portfolio, or any primarily content-focused site? You probably don't need them. And you'll be better off without them.
After months of running this stack in production, here are my key takeaways:
This isn't just about my blog. It's about a broader shift happening in web development. More developers are realizing that the "everything in JavaScript" approach has costs that often outweigh the benefits.
Projects like HTMX and Alpine.js show that you can have interactivity without framework overhead. The resurgence of server-side rendering (even in Next.js!) proves that rendering on the server was a good idea all along. DHH's writings on modern web development are resonating because people are tired of the complexity treadmill.
We built great websites before React existed. We can still build great websites without needing a framework for everything - especially when we have sophisticated build tools, testing, and deployment automation in place.
Cutting out frontend framework bloat delivered real, measurable benefits. The site is faster for users, easier to maintain, simpler to debug, and more enjoyable to work on.
But I didn't sacrifice professional engineering practices. I have a robust CI/CD pipeline, comprehensive testing, automated deployments, and sophisticated build optimization. The difference is that this complexity serves users and developers, not frameworks.
Could I have achieved similar results with Next.js or Remix? Maybe. But it would have required more expertise, more tooling, more debugging, and more ongoing maintenance. The server-side rendering approach just works, and it keeps working without constant attention.
As I mentioned in this blog framework ain't perfect, there are still rough edges and things I want to improve. But the foundation is solid because it's built on boring, proven technology with smart optimization where it counts.
So if you're starting a new project, ask yourself: do you really need that frontend framework? Or are you reaching for complexity out of habit? Sometimes the best solution is server-side rendering with great infrastructure, not client-side rendering with minimal tooling.
And if you don't believe me, just look at the Lighthouse scores. The numbers speak for themselves.
Comments (0)
Leave a Comment
You can comment anonymously or login to use your account.
No comments yet. Be the first to share your thoughts!