The Epic Stack
epicweb.dev
epicweb.dev
The advice is, at this point, almost meme worthy. There's an infamous post from 2021 (that he may have been roasted for here):
https://kentcdodds.com/blog/how-i-built-a-modern-website-in-...
Almost every single piece of advice is wildly overcomplicated and ridiculous.
I do like some of the technologies proposed, but you can host this stuff on a single VM without any of the fancy frameworks, tools, or hosting options.
Kent is the only blogger that I've felt compelled to tell all my less experienced colleagues to completely ignore, and I feel entirely justified doing so whenever they bring him up.
The proliferation of his perspective has, quite literally, been a pain in my ass daily trying to re-teach misguided fundamentals. I really don't understand who the intended audience is. The expert beginner, maybe?
I'm sure he's probably a wonderful human being, however.
The article reads like satire. I can’t tell if he’s making fun of the hoops you have to jump through to make a “modern web app”.
You are just saying it's not good, that you would not advise to follow him, etc...
> The proliferation of his perspective has, quite literally, been a pain in my ass daily trying to re-teach misguided fundamentals
Again can you give an example?
I feel like he gives sound advice, but I just recently discovered him.
Even a C# developer building with aspnet has to reach out to many of these tools: grafana, some hosting service, some log/error monitoring tool.
But at the same time, I think a lot of comments here are pointing at the glaring reminder of how obscenely complex development for the web can be in the JS ecosystem (for new or non-js devs). Why point new engs to remix, prisma, mailgun, insert 3rd party tool when it’s so much better to give them the Ruby on Rails approach? Aspnet, Ruby on Rails, and similar frameworks in all languages including JS frameworks incorporate nearly all the tools mentioned but without requiring someone to wire it up themselves (or to understand the wiring).
Absolutely agree, this has nothing to do with Kent.
> but without requiring someone to wire it up themselves
That's the whole point of the stack - that you don't need to wire all of that tech yourself.
His preferences are always bleeding edge, hip things. And that's not the kind of stuff you build on when you want to buck up and ship an idea.
It might be good stuff, but using what you know and what is stable is the only choice when you're trying to get things done. SQLite, yes. LiteFS on fly.io? Why? Just run bloody SQLite on a server and get it over with.
He historically caters to a beginner crowd, but totally skips fundamentals - then we all get know-it-alls that we have to bring back down to reality.
It's not so much the technology he likes, but the way he pitches it is extremely problematic. He pitches niche, complicated stuff and tries to pass it off as basics.
No thank you.
I see, thanks for explaining.
> LiteFS on fly.io? Why?
He talks about this in his conference talk - to improve the UX. If you deploy to fly.io "edge" or whatever is that, you will get local reads no matter where you are.
Having worked for several years at a startup on rails, I can really confidently say the DX experience with Remix is no match..
I don't understand people in this thread complaining about niche complicated stuff when at the end of the day.. it's all just javascript, there's no magic..
The amount of abstractions, opinions, and siloed "you kinda just have to know that's the way it works" sort of knowledge that come with working with Rails is far beyond that of working with Remix. Would be curious to know how much time folks here have actually spent building with Remix. It's just good, give it a try.
Personally, I've learned a lot from Kent. I think his content is mostly quite good, I also don't find him to be someone who's sole mission is to make money and sell his product like a lot of folks in this thread have claimed. He gives a lot, for free, and contributes a lot.
Remix might be good if you want to use React, but it's ages away from what the Rails or Laravel ecosystem will provide you. Things such as official (or de facto) solutions for ORM, validation, sending (or receiving!) emails, authentication, writing custom utility commands, translations, i18n, background jobs, queues, admin dashboards, etc have a clear and either an official or de fact solution. That makes part of the "development experience" because developer experience is not just saving a script and seeing it refreshing in the browser. There's a lot more to it, like not having to reinvent the wheel at each step or tying together 10k third party libraries.
Remix, Next.js, blitz, whatever... those are all great solutions if all you have to build is a landing page with a form, or if you already have a proper backend in place, or if you have a team of several dozens/hundreds engineers and a ton of money to reinvent the wheel.
For solo or small teams or constrained budgets, nothing beats Rails or Laravel. There's a reason many of those frameworks wanna be called "Rails for JavaScript"... because none of them are anything close on their own name. Closest one is Adonis, and it's still a thousand miles behind regarding features, community, third party packages, being future proof and being battle proven.
- Some serverless hosting - Some database provider - Some auth provider - Some other service, etc
In the past you just rented a simple VPS or shared hosting, setup all by yourself and have just one provider for everything, nowadays I read that auth it's very hard and you should not do it and instead use some auth provider (Auth0, etc).
I remember the good old days with php, just upload your file and it worked, now they try to replicate that experience but with dozens of providers.
I also think that the advice around Authentication is often misguided. For simple cases it's not that hard to add authentication without a separate service. There is too much scaring the newbies around that topic, when they are probably about as likely to mess up authentication when they try to configure an excessively complex library compared to implementing basic session authentication with the tools their framework provides.
The great big irony here is just that "serverless hosting" is just an extremely silly new name for "shared hosting". The basic economics are the same: instead of paying for a whole server, pay for what you use, then share the remaining resources with other sites.
The new serverless hosts aren't just trying to replicate the "good old days" experience, in some cases they've inherited it. They've also just had the bad luck of hindsight from past shared hosting model problems: insecure FTP is dead (so there's much less of a feeling of "just copy the files over"), allowing direct crontab editing is known to be dangerous in shared hosts so serverless options need their own (often extremely custom) timed kickoff DSLs, hosting static files and application files in the same place is known to cause accidents so there's a greater separation in static hosting and serverless applications, and so forth. A lot of those same complications happened to a lot of the "classic" shared hosts, too. (Which is why many of those entrenched to specialize in known applications over time, cPanel anything you want as long as it is Wordpress or Drupal or one of the other six blog apps the host vetted. The disappearance of "shared hosting" wasn't just that modern development got complicated but that modern shared machine security got harder.)
Someone stripped off that nuance in trying to come up with a concise buzzphrase for code that expects ephemeral access to an arbitrary server.
The only reason we don’t do it anymore in the cases where that would be enough and instead overengineer everything is because others will look us down.
They do have a lot of good advice, and I don't want to throw the baby with the bathwater. But they do get it wrong pretty often, and it does waste hundreds or thousands of hours having to go internally in an engineering org telling people "No, it's not because you read it on the internet that it's true".
A much older equivalent example was how back in the days in the Microsoft world everyone would say you HAD to use stored procedures for performance and security, ignoring prepared statements, so a lot of big companies had internal onboarding classes that always started with debunking it. Kent added a ton of confusion and did a lot of disservice to the unit testing space (the library is good, the philosophy lacks a lot of nuance), some other folks are creating a lot of chaos around SPAs/client vs SSR (they started adding nuance to that more recently), and so on and so forth.
It's part of why the JS ecosystem keeps restarting from scratch over and over instead of building on top and creating vertical innovation. We get there eventually, but it's so much slower than it needs to be.
Also, had the displeasure of using Prisma a while back. Extremely slow type generation, and complex to work with its client-server architecture. When your library requires a separate process you know you messed up.
If you want to just ship, pick up Next.js, or whatever you already know and add dependencies when you need them. Let thought leaders thought lead.
Prisma is generating the Kysely type definitions automatically so it is still pretty hands off without the production overhead of prisma server/client.
I'm searching for SQL typescript tooling for my next project.
I use prisma, and then when it becomes too complex, or is annoying, switch to sql.
Sometimes I don’t want to have to manually deserialize rows into my objects (and yes, orms do this for us, and some non-orms do too).
And that’s how you end with the 10 tools you started your comment with.
You can’t “just” start with next if you need authentication, translations, database acces, validations, csrf and other security protections, background jobs, permissions and a lot of other things that anything more complicated than a hello world will need.
If you want to just ship (anything more complicated than a landing page), start with Rails or Laravel.
Experienced developers are not setting up brand new projects like this because it's massive overkill at the jump, but newbie devs who don't know better might try to.
Obviously there is going to be a huge amount of bike-shedding about what to use for X or if it’s useful; it’s basically impossible to avoid in this community. So I don’t know if that really detracts from the concept of having a stack with some solid defaults out of the box.
Personally, I might avoid the database/auth/payments related stuff at first, since that feels more subjective. However, tools like typescript, eslint, and prettier are practically industry standards.
It is still a pain in the ass to get a lot of the basics set up for different projects, so it’s nice to see some opinionated approaches to automating this. Compare to other languages like Rust, and the test runner, formatter, linter, dependency manager, and type safety are all built into the language tool chain. It’s so pleasant to not have to do any work to set that up, and I wish JS was more like that.
There’s almost nothing about the Epic stack from what I can see that wouldn’t feel roughly the same if replaced. Swap Tailwind for a different CSS framework and… it’s basically the same. Use a different validation library and it’s still the same. There are pairings within the list that complement each other relatively well, but none that are make or break in the same way as LAMP/MEAN/etc.
These stacks were useful in understanding values in an acronym, but here that requires a full blog post to lay out principles making it less memorable and, I suspect, less impactful as a result.
With “just shipping” as the stated goal, I am a big believer in using the tools you know, even if they’re not absolutely perfect or new or sexy enough to blog about.
Using things you know like the back of your hand will smooth over innumerable little snags that you’d run into if everything were new to you, and let you focus on the actual problem your software is supposed to solve. I can get a toy app live in an hour with the tools I know best, but I’m confident there’s at least one thing in this stack that I’d get stuck on for half a day, just because it’s unfamiliar.
Working with a team? Everyone throws their best-known tools in the pot and one person is directly responsible for selecting among them.
…then looking a bit closer to discover that once again, I’m running in to a React dev who assumes that everyone assumes that everyone uses React, thus you don’t even need to mention that a boilerplate built on React is built on React.
> LiteFS is currently in beta and is not recommended for production use yet.
Kind of JS dev in a nutshell, always bleeding edge.
Or just install Visual Studio and create a C# web application using the recommendations in the IDE and a 20 minute video on YouTube.
This article might be some kind of parody, though. I really cannot tell.
If you're not a designer, it takes a non-trivial amount of time to add the utility classes you need to get something that looks passable. Quite simply, it gives you too much control over something that just doesn't matter for an MVP.
There are great component libraries out there (I'm a fan of Chakra) that give you sane defaults so that you can get something off the ground, while not focusing on something that doesn't matter at the MVP stage.
Maybe Tailwind + Radix makes more sense after you raise funding...?
I love using it and despite being crap at design, I’ve managed to put some stuff together that I think is not half bad. (And I remain mighty impressed with their business plan, too!)
Their opposition to abstracted utility classes means that anything you want to do has incredibly long, unreadable classes. Its quite a bit of work to abstract away the bits that you want.
https://daisyui.com is my absolute sweet spot for abstraction. Its a bit limited, especially compared to TwUI and flowbite but its developer experience is a joy.
And to say that design "just doesn't matter" while you're in fundraising mode, i think is also incorrect. You don't need perfect design, but it has to look pretty decent. It's in people's nature to be turned off by ugly/obsolete looking web pages.
this ^^ was you, right? pardon me if I don't hold your opinion in high regard
But, at the end of day, the best option will be the one you're most comfortable with.
Anecdotally, I've sometimes seen better quality websites for a lot of the little "polish" things like accessibility (which isn't really "polish", is it?) from the laziest "just use Bootstrap" developers than from the most hardworking Tailwind developer+designer combos.
This year I was moved to work on a Ruby On Rails project, given I had experience with Django (and some Laravel on the side) I was the best my company had at hand for that project.
I was reticent at first and even considered looking for a new job, but I wanted to give it a try first. HOLLY SHIT. I’m fascinated by the amount of stuff I’ve been able to do, and how simple things are. And that I can search for other Rails projects in GitHub and learn from them because they’re all using the same tools and structure. I do think we’re wasting a lot of our companies money when using this kind of hipster bullshit edge stuff which is not necessary at all like in 98% of what we usually do.
Hell, even LAMP is a better “just ship” than this monstrosity.
The ability to just define a function on the backend, and it be callable in my frontend, with responses automatically typed is a game changer for building fast.
For me that means https://create.t3.gg/ is the current go-to for starting a new project, but it's definitely missing some pieces this stack has.
const data = useLoaderData<typeof loader>()
Of course, I'm building a web app on top of it, so I want a lot of features that "the platform" doesn't necessarily support very well without client-side js to facilitate everything. And I did make an honest go of it. To me, the biggest pain point is still forms and form validation, which is notoriously painful in React land. I'm ultimately using react-hook-form and running the same schema validator client-side and server-side, which means I'm not really "using the platform" in that respect. I'd love to see an official react-hook-form type solution added to Remix.
Still, the framework has some really great, sticky conventions and it feels like they thought of almost everything. For example, the "action" and "loader" convention is awesome, nested layouts are the bomb, they encourage filenames like .server.ts to differentiate between things that can't be run client-side, heavily encourage the use of a bunch of goodies from react-router (which most people probably don't know exist) because Remix's routing is built on top of react-router... And so on.
Having used both Next.js and Remix a few times, it's difficult for me to recommend one definitively over the other; if you aren't experienced with them either one will be a learning curve. In general, I think Remix is the better framework but some shortcomings in the documentation (e.g. I found out about some new routing conventions because the old ones weren't working for me and it was confusing because the tutorial and docs seemed to use the old ones) and the relative dearth of resources online can lead to frustration. This should pretty much be a non-issue if you start a new project with one of the "stacks" that someone has developed, the blessed ones of which give you a base project that already has database, authentication, tailwinds etc configured with example routes and components.
Next is already taking some of the good ideas from Remix (nested layouts still in beta I think), and has a pretty extensive and mature ecosystem with lots of answers on SO and blogs at this point. For example, if you want free social auth you're pretty much just going to install next-auth. Still don't know exactly what I'd do in Remix for that.
I'm all for pragmatism and not reinventing wheels, but this stack looks like a juggernaut of eventual misery.
It starts 30min into this stream: https://www.youtube.com/watch?v=qVkRyjSrhXs
There are 18 components listed. This stack is thick.
You can go with "express.js" only and then figure out 10 other missing pieces yourself.
At what point do you become a user?