Ask HN: What would be your stack if you are building an MVP today?

459 points by nvln ↗ HN
Specifically the backend. I'd love to hear your reasons. Do you keep one eye on what the stack would be post MVP?

1. Old schoolish (VPS - Maybe DO, Django/Flask/Rails/Remix/Next with postgres)

2. Supabase etc with JS/TS on either side of the network

3. Lambda/Cloud functions with Firebase/Dyanamo DB/Cosmos DB etc

4..n. What else and why?

735 comments

[ 3.4 ms ] story [ 418 ms ] thread
I mean for me it comes down to what I am most familiar with. I am old so that means things like Digital Ocean and Express.js with plain old JavaScript. I guess I should not admit that publicly. Or privately.

But also if I was slightly less old I think I would be heavily into Python at this point especially as far as the ability to easily leverage data and AI tools and libraries.

But again, my suggestion is go with what you are familiar with. And if you are less old and are excited about a new language or framework, that seems perfectly valid to me. The hard part about programming is staying motivated. So if new stuff helps with that then great. I

One more take is that you should start by defining the problem in detail before you make up your mind on the architecture and technologies that you will employ. If there is a particular technology that is well suited or has a ready-made solution, you should consider that.

For a for-profit mvp my goto answer is always "the one you know", fast release matters, fast iteration, fast sales. Optimize once you got sensible sales and sensible metrics.

For personal projects, reactjs or vuejs or solidjs, tailwindcss, nodejs. Depends though, sometimes there are projects that demand the strengths of golang or rust.

For the backend I would go with Hasura and some Python or typescript depending on who works with me.
Are you building the MVP to make a product or to learn a new technology? If the former, then the stack you are most comfortable with. Let the challenges come from the product-side. If the latter, then take your pick based on the reasoning for learning something new. Be it job-opportunities, curiosity, whatever.
I'm building the MVP to make a product and get some market feedback / validation.
Then build what you know… always the fastest choice.
I agree with this. .NET isn't sexy, but I can do it in my sleep. Throw in a reasonable front end framework, and I can spend my time getting feedback and iterating. Once I need to grow and scale, I'll put more thought into the right tech for that job.
I used NextJS and Firebase and while I disliked some of it: I would use it again because if the benefits of speed in building.

With this setup you can permanently host for next to nothing until you get users, do zero devops or ops, and have something that will scale up (wont be the fastest thing but it will be OK and will scale)

You could switch out NextJS for a static site generator too, but NextJS is pretty convenient and is a superset of a static site generator with everything wired up nicely using React.

Thank you, 'the next to nothing' bit is very helpful. I'd like to have a decent runway and a decent protection for my wallet just in case the MVP takes off in terms of user growth but not in terms of revenue growth.
I would not switch out NextJS for a SSG. NextJS can do SSG. But most SSG frameworks can't do SSR nor CSR.
Build with what you know, that way you'll be focusing on just building what your customers are asking for, and not also having to learn the technology as you build.
Exactly. If one were to look at my top-level reply here and ask "why?" for any item I listed, in basically every case the answer would be "It works, and I know it." I could get more done faster using that stack than a stack I'd have to learn from scratch.

That said, there's a time and place for experimenting and learning new stuff. And I am interested in trying Elixir at some point. But to "get stuff done" in the near term? Yeah, it's going to be mostly Java/Groovy, Grails, and some Javascript. Hell, I might even break out jQuery just out of sheer familiarity, if I got stuck doing something using vanilla JS.

Supabase is very resource intensive. Django+drf+ spectacular+filters+jwt gives you all the perks of supabase with - much easier syntax - much lighter weight - alot higher productivity - UI auto generation
I am curious to know more, can you point me in the direction of any blog posts outlining this stack? I have been using supabase for a few months and for local dev it is pretty heavy
> for local dev it is pretty heavy

We were discussing this in our CLI catchup this morning. It seems the Dashboard/Studio is the main culprit here. We'll fix it

1. FastAPI (Python) or Axum (Rust) for back-end, deployed on Fly.io.

2. Supabase for Postgres and Authentication.

3. Astro as a framework for front-end, deployed on Vercel, running in Hybrid mode.

With all of these in-place, I can extend my existing components to accommodate any needs. It scales very well in the beginning as I move very fast, and anecdotally scales very well regardless of size.

The only missing parts here is support for timed jobs, but that can probably be done with Fly.io machines in the future.

Depends a bit on the system, but for a fairly simple webapp: hasura, sveltekit, firebase auth and some lambdas
Django, in my previous role we did MVP websites for academics and the speed of getting a site up and running and deployed was just so fast. I’ve never worked with anything else that is as fast, anything like FastAPI or Flask or Express or similar either requires additional libraries to add really basic and common functionality or you have to roll it yourself.

I personally don’t think that if you’re building an MVP you should be worrying that much about how to store users in the database and add RBAC and building a way to add middleware and a storage layer and all of that crap. It’s not worth it, your application is not a special snowflake.

Edit: Should say that with that I mean serving HTML via Django. Usually I would use Bootstrap for layout. Very occasionally I’d add an API for some interactivity but I think for most MVPs interactivity is likely to be a secondary concern until later.

Nowadays, Django has an amazing library which is a lot like FastAPI but in the Django ecosystem.

https://django-ninja.rest-framework.com/

It's absolutely wonderful. I would use that in a MVP, and do the F/E in NextJS + Typescript.

I’m familiar with it, and I don’t love DRF but the downside with Ninja is that you end up writing a lot more boilerplate IMO. Unless you’re strongly optimising for performance (and usually latency and the database are the biggest issues there), you can get away with ModelSerializer and DRF ViewSets a lot of the time for APIs and write very little code.
Came here to say this. I have a side project that I need to spin up quickly and after lots of framework shopping, I settled for Django.

Django and it's batteries included philosophy is perfect for creating full stack applications. The best thing about Django is that almost every problem you face has been answered by the community.

The community tools like DRF/Django-Ninja/Crispy-forms/Django-environ etc are top notch and it's very easy to extend your application.

7/5 would use Django again.

>The best thing about Django is that almost every problem you face has been answered by the community.

This is something I realized pretty quickly when toying with migrating my side project from Flask to Django last year. Everything I wanted to know how to do, I could google with “Django” as the first term, and figure out how to accomplish. Anything that took longer than 2 mins to figure out how to do was generally a matter of not knowing how to phrase the question.

It’s made me a huge Django advocate.

The Django community is amazing - very friendly, welcoming and a very rich 3rd party app ecosystem.
I‘m trying to learn Django just for this kind of MVP purposes. I also did a small mini project in RoR by following their documentation. Is there anything that is significantly easier to do in RoR vs. Django? Alternatively, is there anything, say, on a larger scale that I can do with RoR that I cannot do in Django if the project grows? These are the questions I‘ve been wrestling with quite a bit now. After learning Vue and React.js and having used and being cognizant of Next, Nuxt, Supabase, Firebase and all that other stuff, I‘m looking to become a bit of a better developer by understanding the intricacies of traditional monoliths and how problems are solved on the backend. I‘d also like to be able to serve predictions and host ML models in production. Likewise, if my MVPs catch on, I’d like to retain majority of my ”IP” by the means of Django or RoR. Any intuition perhaps on my above questions? Thx!
My view on this is that there is little between them so in that case it’s better to look at availability of skills you’d need to take it forwards in the operating region. For e.g. if it’s easier to hire Ruby developers then choose Rails.

I see a lot of people talking about Elixir, etc. on this thread, but I’m based in the U.K. and I’ve never seen a company locally using Elixir so even if it’s really cool, it’d be a bad idea for me to choose it absent a very very good reason. If I choose Django then even if I can’t find a Django developer, I can likely find people who know Python and the barrier to entry is pretty easy.

Thank you for such a great and senseful answer!
Several companies in the UK use Elixir including the BBC, USWitch and the NHS! The London Elixir Meetup https://www.meetup.com/elixir-london/ has 1,467 members and is great place to meet fellow alchemists and learn interesting things!
I’m not in London ;)
Noted. but responding to the “UK” comment; London is often a good guide/proxy for the UK tech scene. But for reference: there are quite a few universities in the UK where students are learning & using Elixir for distributed/embedded computing projects so these people will gradually filter through into the workforce.

Also there are plenty of Ruby/Rails Devs who have embraced Elixir/Phoenix.

But it’s a classic network effect problem; adoption drives jobs which drives learning and further adoption. Without a big corporate sponsor like a FAANG co, Elixir/Phoenix doesn’t have the mindshare of other languages/platforms.

In my city, if I restrict it to the “Greater X” area that includes some outlying towns on LinkedIn, I get 7 people that mention Elixir, and 3400 with Python. If I do the same in London, I get 751 people listing Elixir and 113k listing Python.

The scale is just not there to make it worthwhile in evaluating for any company to adopt other than a FAANG or really major employer IMO

If you thinking of anything closely related to ML then python/django is the way to go.
My 2c.

Django shines at creating a nice project scaffold with all the things you need to do rapid development. It has first class support for DB, unit testing, schema migrations, good enough templating system, performant ORM and can be easily debugged. The documentation is top notch and the best thing is the community. Due to its longevity I found that almost all the issues I had were resolved by a simple Google query or visiting the docs.

It’s very easy to add functionality like social auth with few lines of code.

I’ve also not found anything like Django admin in any other framework. I would highly recommended Django for an MVP.

(comment deleted)
This is where I came out a couple of years ago. I love Django and it has worked out perfectly. But I'm far from an expert.
The biggest benefit to Django, in my opinion, is the orm and admin tooling. Being able to fix things in your app without having to open a repl or open a database tool is absolutely killer.
I honestly cannot believe that Rails doesn't have this built in. This was something that was in Django for as long as I can remember; I was looking at it in I think 2006 and it existed at that point in a very similar state to what I've seen lately.

Not a dig on Rails, like "Oh, Rails is so bad they don't even have..."; rather, Rails is extremely capable, and so are Rails devs, so I legitimately don't understand why this isn't there already, 15+ years after Django.

To be fair, Django only caught up with Rails in the past 5 years. When I started with Django it didn't have basic stuff that Rails had, such like auto database migrations and the Rails asset pipeline. The database migration stuff really helps when building/iterating. The Django middleware was very finky at the time.
FWIW, Django has built in migrations since 1.7 which was released in Sep/2014.
Rails has Active Admin which is equivalent to what you get with Django. It's just not a core Rails gem but it's one line in your Gemfile to add it.
Whoah I never knew that - or maybe did but never seriously considered it. It's been my biggest surface-level gripe with Rails compared to Django so thank you very much for bringing it up

Edit: and it' still maintained !

There's a handful of very capable and mature admin solutions (activeadmin, rails_admin, administrate, and still people coming up with new ideas, see avo and madmin as newer examples), they just haven't had one become bundled mainline.

Similar situation with authentication, where devise has been a mainstay for over a decade, but it's not always the best fit for everybody so core rails still just has the basic plumbing to build it yourself (with the low-level has_secure_password).

elixir/phoenix is the best platform for knocking out an MVP today. Its batteries included and has a frontend system called liveview that lets you write most of your frontend using elixir too. You get built in pubsub and websockets which are important for any new kind of software product. Users demand more interactivity and phoenix lets you do it and scale from day 1. Ecto is easily the best sql database library I've ever worked with. Its comparable to linq only it is uses elixir macros so its just a library.

1. you get a lot of out of the box rails like glue jsut like rails or django but the runtime perf is way faster. you can get away without even using caching in prod for awhile

2. supabase is written in elixir

3. lambda could functiosn have their place but loc you in to a cloud provider. I can move my elixir mvps accross providers with no issue and I won't get any surprise bills.

I love elixir/phoenix and wish I could use them in prod for my job, but...

> pubsub and websockets which are important for any new kind of software product

... not really. By far most people (probably by a huge margin) are doing fine building 1000s of new products per week without either those things.

Further I think you are right.

Holy smokes! I had no idea this project existed, and it just solves so many issues out of the box.

I'm a backend/infra developer, and I had been dreading having to learn a new front end framework because the work flows just look hideous. This looks like I can sidestep most of that problem entirely.

phoenix has been the inspiration for a lot of stuff comming out of the other frameworks.

phoneix channels -> django channels and actvecable but phoenix's version is much more powerful

liveview -> livewire, hotwire. both are copies of liveview but neither of them are as powerful since only liveview can spinup a persistent thread PER user allowing active stateful sessions that can push and recieve events from the client.

Not claiming LiveView is not most powerful (probably is because erlang is most suited to this). But saying that Livewire or Hotwire are copies is not fair at all. I am not sure why they are named in so similar way but they are all green field projects.

Livewire has started at pretty much same time as LiveView and AFAIK both projects influenced each other over the years. Both authors are in contact and the frameworks are quite a bit different because Livewire (in PHP) does everything over http so it has to employ different tactics than LiveView that can run over websockets.

Hotwire on the other hand is from Basecamp who have been using this approach forever. They just packaged their experience into a framework they released. Theoretically hotwire is the oldest of the three.

I am saying this because i don't think you need to use LiveView. All of them are super productive and are used for many real projects. They are just a bit different and better at different things.

Phoenix is super pleasant to work with, very few surprises.
I'd probably go with NextJS and Pocketbase[0]. I like to start with everything on a single instance/machine, cheaper and less overhead, allows me to focus more on building things rather than ops.

[0] https://pocketbase.io/

AWS Lambda + C# or Golang with S3/Redis/DynamoDB backend. Maybe Aurora Postgres if you need complicated queries.

It's boring but it works. It also scales as far as your wallet can handle.

Trying to make Solid/ChiselStrike stack work. It has its rough edges but I am trying to iron them out so its reusable for all my projects going forward.

https://github.com/learn-anything/learn-anything

Reasoning behind the stack is that I feel productive in Solid and it's plenty fast on first load and as SPA when fully loaded. I love the component model and JSX.

ChiselStrike is new to me but I was looking for something that lets me declaratively manage my schema. I checked https://entgo.io (it produced too many Go files to my liking), also Prisma (https://www.prisma.io), found it bit complex to get started with.

I also checked https://www.edgedb.com and it's nice but with ChiselStrike I can deploy it with LibSQL (fork of SQLite) and replicate it so responses should be plenty fast and I can build on top more easily.

For native apps will use SwiftUI composable architecture when it comes to it. React Native code sharing seems nice but Solid doesn't have a React Native alternative yet sadly.

If it is a SaaS 100% Ruby on Rails

Why:

- has almost everything that I need usually in mature gems - battle tested in production

- speed of development

I did so last year, and I cannot be happier. My only regret is that I wasn't aware of htmx/hotwire at the time. I went with Vue, and I regret it immensely.

Rails is the fastest development platform I've tried so far, it is predictable, well crafted, structured yet flexible. You can't go wrong with it.

Every now and then I try something new on a side project or I have to work on some other codebase for my customers, and nothing so far has tempted me to move out of rails for my serious projects

I'm vaguely aware of htmx, but have never used it. Had not heard of hotwire until just now, but that looks really interesting. Thanks for the pointer!

Would you care to say any more about your experience with Vue? I've heard a lot of good things about Vue and had it on my mental "things to learn one day" list for a while. Would be really interested in hearing any counter-points from somebody who hasn't enjoyed working with it.

First I heard of HOTWIRE. I have been using PJAX for a decade now, which is a similar concept.

I use .net mvc with a razor templating engine. But this can be used with any backend.

It makes it super easy for me to maintain all my UX in server-rendered HTML templates. I get a clean SPA with super high development efficiency with MINIMAL javascript.

The best part was I could hire any developer and they know how to work in basic HTML/JS/CSS.

Edit: Reading more, I might need to spend time looking into HTMX/Hotwire as a replacement for PJAX at some point.

I love Hotwire and it's reinvigorated my love of Rails.
Worth looking into Hotwire. It works well with .NET MVC.
Check out also Unpoly. It’s probably the most “batteries included” of this kind of tools, although not as popular.
Can you expand further?

What has you bother to introduce unpoly when Hotwire is included by default? Aka, what are the main things missing/better that drive you to use unpoly.

I was replying to @moxplod because it seems they didn't know about these alternatives to pjax. They're mentioning HTMX, etc so I've added Unpoly to the list of similar things.

I'm not saying you should replace Hotwire with anything else - I wouldn't do it given it's the default or defacto solution.

But all of these tools (pjax, htmx, unpoly and hotwire) work perfectly well outside of Rails too. So if you're not using Rails and you're, for example, using Django which doesn't have a default solution then you can pick one of them, and I think Unpoly is a very nice one.

I'm not sure what their particular beef with Vue is but I've been using it for several years now with Rails and its mostly been great.

They had a similar issue as Python, albeit not nearly as bad, with their upgrade from version 2 to 3. It required some rewriting. They also introduced a new core concept with the "composition" API, which completely changes the way Vue apps are written. Luckily once you made a few required changes you could continue writing apps like you used to, ignoring the new composition API. I'm assuming at some point we'll be forced to change, which will suck.

One thing we do, which I don't think is as common when using Rails with a heavy frontend like Vue or React, is that Rails is not in API mode. That is Rails still handles routing, pages are still rendered in ERB, and then each page is its own little Vue app. So we can use Rails, Ruby, etc to initially hydrate the pages and inject stuff by calling to_json on it. This also means we can let Rails and Devise handle login and session, which I absolutely hate doing with a pure JS frontend.

Routing and session management are something I think Rails is extremely good with. This also means that if a section or sections of the site are pretty simple (password reset for instance) we can just render the page in ERB, no JS required.

Regardless, I still like Vue and it has a pretty decent ecosystem. If I had to go back and start again I'd probably just go with React. It clearly has the most support (and most jobs) on the front end.

IMHO, part of this is that people have accepted the poor experience of non-realtime applications. But there's a huge UX improvement if the application responds faster than users can input actions. Doesn't matter for all applications but if your users are going to spend significant time inputting data it makes a huge difference.

Also IMHO, a flexible type system like Typescript makes development faster than without it. You can refactor faster, it catches silly mistakes, and you don't have to write as many tests.

Rails does a lot of great things for you, but IMHO ultimately it's stuff you don't really need. If there's any chance that the application will grow beyond a few developers I think it hurts more than it helps.

>If there's any chance that the application will grow beyond a few developers I think it hurts more than it helps.

Simply not true.

I've consulted on multiple teams across products built with Rails. Products that supported hundreds of millions of requests and generated a similar levels of revenue.

Rails scales - programmer productivity, traffic. It scales.

>Simply not true.

It's not true that I think it hurts more than it helps?

One thing I've taken to pointing out, and it seems like you have way more experience with which to back it up - is that it's not just about scaling to millions, it's also about scaling from zero.

Thoughts? :)

> part of this is that people have accepted the poor experience of non-realtime applications

my experience has taught me the exact opposite: people have accepted the poor experience of real time applications (client side crashes that bring down the entire page, half-baked routing that is essentially just rebuilding the browser navigator, inconsistent client vs server rendering processes). developers tend to completely stick their head in the sand when these issues are occurring. there's complete classes of problems that simply go away when you're not building an SPA.

> Also IMHO, a flexible type system like Typescript makes development faster than without it. You can refactor faster

in the long run, yes, but in the short term you're probably not going to get your mvp out faster because you chose TS

> people have accepted the poor experience of real time applications (client side crashes that bring down the entire page, half-baked routing that is essentially just rebuilding the browser navigator, inconsistent client vs server rendering processes).

People complain about that stuff all the time.

>stick their head in the sand when these issues are occurring. there's complete classes of problems that simply go away when you're not building an SPA.

Well, yes. If you don't actually build a real time application you won't get the benefits of a real time application.

>in the long run, yes, but in the short term you're probably not going to get your mvp out faster because you chose TS

Once there's even a moderate level of complexity (i.e. 2-5 devs for 1+ months) the type system helps you catch issues. Even if it only saves you one 4 hour debugging session you come out ahead.

That assumes you sit down and write out your MVP without any significant refactoring. If you do have to make changes then TS will save you significant time there.

It also assumes that you're not writing tests that duplicate what a type system does. If you do write those tests then again I think you're slower.

Rails does have the advantage of there generally being one "Rails way" of doing things. That can short circuit a lot of design discussions and other sorts of bikeshedding. But you can also just not do that and, IMHO, come out better.

> Well, yes. If you don't actually build a real time application you won't get the benefits of a real time application

A rails application can be just as "real time" as any SPA, I don't think that definition really means anything. You get a distinct set of problems that come with SPA's that don't exist in a traditional server side rendered app that have nothing to do with how "real time" the app feels.

with hotwire you get the benefit of having that SPA with quick responsiveness but with the much, much reduced complexity in stack with all the jankiness that that brings with it.
I used svelte and it's been super simple and efficient.
I'm using Laravel with Hotwire and it's fantastic. Now I want to cry every time I see the mess of overengineering I have to deal with in other projects when they're built with Redux, React, etc, etc.
Why Hotwire instead of Livewire if i may ask?
Mostly due to Turbo transitions between pages and being able to persist elements across pages. I know Livewire V3 will solve this but at the time we took the decision it wasn't available.

Also something brought up was a conversation regarding Alpine vs Stimulus. At first sight Alpine looked a lot easier, but Stimulus seemed it would scale better and be easier to maintain at the end, plus we expected it to have less problems with Turbo than Alpine given those were made to work together.

An important difference we found, is that Stimulus can "react" to value changes (https://stimulus.hotwired.dev/reference/values) while with Alpine it was not clear how a component, or some external code would trigger an update by changing a "prop" or an "attribute" of the element. We know we could use stores and events, etc but that's what I meant with stimulus being easier to scale long term.

Interesting. I had the feeling that framework like that has to be so tied to the backend framework that Hotwire has to have lots of troubles outside Rails. I would have never even thought of trying Hotwire with Laravel. Will try. Thanks
Yes, that was my initial impression years ago too.

But it's very progressive. For example, you can just use Turbo to get the "SPA like" navigation between pages (no full page reloads) and that's for free, just including it will bring in that behaviour, plus caching when navigating back, link preloading (so when you click the content it's already there), etc. All of this very easy to control/configure via html data attributes.

Integrating the "Turbo frames" feature is also pretty easy, just wrap content in <turbo-frame> custom tags and the library will do the replacement without page reloads when you submit a form. Similar situation with "Turbo stream", etc.

This is an excerpt from the main documentation site at https://turbo.hotwired.dev/handbook/introduction :

"...You don’t need any backend framework to use Turbo. All the features are built to be used directly, without further abstractions. But if you have the opportunity to use a backend framework that’s integrated with Turbo, you’ll find life a lot simpler. We’ve created a reference implementation for such an integration for Ruby on Rails...."

Same story with Stimulus. You can add it to any framework, it's just a frontend library.

Having said that, there are some "helpers" that you can have in the backend that will make things more idiomatic and avoid some boilerplate, etc. And Laravel being such an amazing framework with such a great community, has a great integration library here: https://github.com/tonysm/turbo-laravel

I couldn't be happier with this stack. With Laravel + Hotwire + Tailwind + Laracasts I feel I'm unstoppable.

Which gems do you most commonly use?
I would pick whichever stack that I would be most productive in.

A Laravel app hosted with Laravel Vapor (AWS Lambda) with a MariaDB database. Would allow me to get up and running quickly, at low cost and without having to worry about scaling for a long time.

Using Tailwind and VueJS or AlpineJS for the frontend.

This. Your fastest stack is not my fastest stack. If you want to learn the ‘fastest’ frameworks, that is a totally different decision than getting an MVP out the door. That is an educational one… which is totally valid just not in an MVP sense.

The goal of the MVP is ascertaining product market fit, everything else is waste. Use what you know and optimize later. If your MVP can handle 1m calls a second, you have failed (unless it was natively supported by the framework)

I think it's a very reductive view. One cannot try every stack to find its fastest stack. This is why people ask about other people's experiences. Someone might have a better solution, and a convincing argument, so you could try it and become more productive.
I have a relatively terrible answer that I would recommend to no one but it works for me. That's the fastest stack for me.

The question wasn't "what is the fastest stack" or "of all stacks which is the fastest for you" but rather akin to "what is the fastest stack for you". Which is often the one that you are productive in.

It's almost always not worth learning a new stack to prototype something unless the goal is to learn the new stack.

you should check out https://wasp-lang.dev then. It's probably one of the fastest stacks out there for React + ExpressJS at the moment
That’s usually my take, but I still worry about a few things:

* which stack will still be around in 1/2/5years?

* which stack Will other teammates or future devs be productive in.

I’m still searching for a very light, productive open source stack that is well accepted and if not future proof at least we’ll backed.

For an MVP, none of those things matter. Just rewrite it in a different stack later if you realize that the one you picked doesn't fit your requirements long-term. Worrying about that stuff before you have users/customers is just a waste of time and energy.
But does that really happen? It seems that we have a lot of bloated, buggy, inefficient code out there because it was initially built using something that was 'quick and dirty' for the MVP and was never rewritten properly once it caught on.

I have clients that still use Excel spreadsheets for their database instead of using a real one just because their data was initially stored there and they never changed. New features were added incrementally over time and it became costly to break everything for a complete rewrite. So they limp along forever because management won't let them do it right until it absolutely breaks.

Yeah, it's definitely a cultural shift from the way most software is built today, but it's a better way to do it in most cases. I was also assuming a startup environment in my comment; established companies can generally afford to do more work up front to make the foundation more robust, and they are (slightly) more likely to have a better idea of what their customers want ahead of time.

But to answer your question more directly, it does happen, it's just uncommon. Where I've seen it done successfully, the rewrites have been piecemeal, not all at once, so that definitely helps with the buy-in factor.

My current go-to are: 1. Go (echo/gin) or Rust(actix/axum) (old-fashioned server-side rendered HTML) 2. alpine.js 3. htmx.org 4. tailwind

I've found that combination to give me amazing DX and appropriate speed of development.

Laravel. I don’t have time to fuck around with whatever the latest hotness is.
Directus connected to a Postgres database

Comes with a built-in low-config UI/API for CRUD on the database, and easily extendable with Vue.js and Express endpoints.

Additionally, should the need arise for something more custom later on, all your data is in Postgres rather than a backend as a service

https://directus.io/

I've used it on a project a year ago and I've found it very effective for prototyping. But I eventually had to move out of it, and I don't see good you can make it work in the long run, as access management and data migrations are a PITA.
- VPS like DO

- Server-side rendered app with Golang

- If interactivity is required: maybe Vue.js or jQuery

That's it.

I've had an unparalleled experience in getting an MVP live with shuttle[0] - nothing is as fast for deploying a web app with a database to the cloud. For the database I’ve used shuttle’s dedicated SQL DB instance[1] and for the front-end I’ve used shuttle’s static file server[2].

If you are not scared of diving a bit into Rust, I'd a 100% recommend it.

[0] https://github.com/shuttle-hq/shuttle [1] https://docs.shuttle.rs/resources/shuttle-shared-db [2] https://docs.shuttle.rs/resources/shuttle-static-folder