This partially might be more of a what's old is new again, but here's what I use:
- 100% server side rendered
- Progressively enhanced (fully works without JS, but having JS enabled makes it nicer)
- In select places where I need SPA-like snappiness I use a ~100 line long DOM diffing algorithm (I request full HTML through AJAX and diff it into the current page; if the user has no JS enabled then the page just refreshes normally)
- Running on a single, cheap VPS; no Docker, no Kubernetes, no serverless
- No SQL database; I just keep everything in memory in native data structures and flush to disk periodically; I have a big swap file set up so that I can keep a working set bigger than the RAM
- Written in Rust, so it's fast; I can support tens of thousands of connections per second and thousands concurrent users on my cheap VPS
- 100% server side rendered
- Progressively enhanced (fully works without JS, but having JS enabled makes it nicer)
- In select places where I need SPA-like snappiness I use a ~100 line long DOM diffing algorithm (I request full HTML through AJAX and diff it into the current page; if the user has no JS enabled then the page just refreshes normally)
- Running on a single, cheap VPS; no Docker, no Kubernetes, no serverless
- No SQL database; I just keep everything in memory in native data structures and flush to disk periodically; I have a big swap file set up so that I can keep a working set bigger than the RAM
- Written in Rust, so it's fast; I can support tens of thousands of connections per second and thousands concurrent users on my cheap VPS