As always, it depends! I'm a big fan of "the right tool for the job" and I work in many languages/platforms as the need arises.
But for my "default" where I'm building up the largest codebase, I've gone for the following:
- TypeScript
- Strongly-typed (ish) which makes for a nice developer experience
- Makes refactoring much easier/less error-prone.
- Runs on back-end (node) and front-end, so only one language, tooling, codebase, etc. for both.
- SvelteKit
- Svelte as a front-end reactive framework is so nice and intuative to use, definite the best there is around atm.
- It's hybrid SSR/CSR is amazing, so nice to use.
- As the back-end it's "OK", needs a lot more work IMO, but I do like it for a lot of things - and can not use it where necessary.
- Socket.IO
- For any real-time/stream based communication I use this over plain web sockets as it adds so much and is so easy to use.
- PostgreSQL
- Really solid database that I love more and more the more I use it (and I've used it a lot, for a very long time now!)
- Docker
- Easy to use container management system.
- Everything is reproducible, which is great for development/testing/bug-fixing/and disasters.
- Single method to manage all services on all servers, regardless of how they're implemented.
- Traefik
- Reverse proxy that can be set to auto-configure based on configuration data in my docker compose files.
- Automatically configuring takes a pain point out of deploying (and allows me to fully automate deployment).
- Really fast, nice dashboard, lots of useful middleware.
- Ubuntu
- LTS releases keep things reliable.
- Commercial support available if required.
- Enough name recognition that when asked by clients, this reassures them.