* Node.js on backend, using a thin db layer (not an orm) like sequelize. My newer projects also use TypeScript on back end and share models with front end with a lerna setup
* React.js with TypeScript (default create-react-app setup) on frontend; multiple smaller apps for each business unit/functional area; some limited sharing of UI components between these apps (turns out not that much needs to be shared really)
* Everything in a mono repo and edited in VS.Code
* Deploy by building apps, gzipping backend and frontend into one tarball, then either:
- Ask my "release person" to copy it into the Windows server drive for test or production
- Run my own "release script" that scp's it to my Digital Ocean droplet and tells pm2 to restart the production application
My projects email me when something crashes in the back end and I run sentry.io to see what's gone wrong in the front end.
Why I find this to be a great developer experience:
* Simplicity. One language, easy to share things like e.g. validation between FE and BE, minimal cognitive burden when context switching; small apps = simple code; simple release system means I can get new features or bug fixes to users extremely fast with minimal fuss
* No CI pipelines or DevOps time sinks: this is effective because I'm a single developer; I also work on projects where a solid CI pipeline and infra as code adds value, but these things can also slow you down too
=====
In other words, what I feel makes me effective is using a modern language and ecosystem, but deploy it with methods from 10-15 years ago. :)