TypeScript is awesome. I love it. I use it for everything that fits since the beginning of 2014. The tooling, the ecosystem, the community and the philosophy is what I like the most. I mostly combine it with jest, eslint, prettier and zod.

The good old Node.js. It has it's flaws and quirks, but it's still the best right now IMHO. It's stable, fast and has a great ecosystem. If you know how to use it, it's a great tool to get things done on the web. Combine it with dotenv, nvm and other awesome tools and you got yourself a comfy environment.

React.js is my go-to frontend libary. I just like that it is not a framework which makes it very flexible. The community and the tooling around it are also big pluses. I gathered some experience around Vue and Svelte and am currently checking out solid.js to find a successor to react. For static page generation I really like astro. Static pages are still cool ;) Next.js is also my preferred extension to react in many cases.

I will never go back to a world without Docker and containers. I can only imagine a future without Docker where it was replaced by something even better. If it runs in Docker it runs everywhere. I love it. Pair it with Docker compose and automate your whole dev environment with a single command. On production Docker is the foundation for simple and complex apps. Use it standalone, with compose, swarm, kubernetes... You are spoiled for choice.

Git. I've never used anything else. So i guess it's the best :P. GitHub, GitLab, etc... Irreplacable for a good gitOps workflow. Combined with a CI/CD like GitHub Actions or GitLabCI, sprinkle in some ansible or similar, setup sane rules for your repo and get rid of most human tasks which could result in mistakes. Because, you know, we are still humans.

PostgresQL is my go-to database if there are no special requirements. It's fast, stable, has a great community and is open source. I've used it for years and never had any problems. I also have great experience with automatic migration generation on postgres. IMHO it's a great database for small and big projects. MongoDB is almost always a no-go for me.

Frontend

I'm not a specialised frontend developer or designer. But I have my fair share of experience in WebApp frontend development and really enjoy it. I started with AngularJS 1 and then switched to React.js which mostly use to this day. I also layed hands on Vue.js and Svelte.js which go into a similar direction. I'm ok working on those but still prefer the library approach of React.js. That's why I recently found interest in solid.js which is a library which feels like the successor to React.js to me.

In my free time I like to play around with new technologies and tried out Astro to replace the aging website of my mothers business cgosewisch.de. It was a great experience and I'm looking forward to use it more in the future. This website is also built with Astro inspired by my previous experiences with it.

For CSS I used many preprocessors like SASS, LESS, PostCSS and styledComponents but now settled onto TailwindCSS which completes my frontend stack. Community, tooling and philosophy are what made me switch.

Backend

Ahh yes. The backend. The thing that connects to databases, does awesome calculations, verifies everything, handles all the traffic, should be rock solid, scalable and maintainable. Or as other people call it: boring! Each to their own. I actually really enjoy thinking about all this stuff and how it interconnects etc.

It's always a challenge I really enjoy to find and keep a great balance between optimization, readability and velocity of the backend code. If you do it right it will be fun to work on it AND run it.

Talking about fun. It does not need to be fun, but it should not be hell to talk to your backend. A good documentation WITH EXAMPLES should be provided and kept up to date. Autogenerate where you can to eliminate human processes once again. The error messages should be helpful and not just some cryptic text to you or the user.

It is important to balance the level of abstraction in your backend code to be able to move fast but also have a minimum amount of stability. I mostly achieve this with verification libraries like Zod and unit tests. If your code is smelly somewhere it will be hard or awkward to test. Great opportunity to refactor. But beware, premature optimization is always behind the next corner.

TypeScript with Node.js is my foundation which I always use because I believe it is a good combination to achieve what I just described.

Git, CI, CD, Ops

Git, never used something else. Did I miss anything? I don't think so, yet.

In my workflow, the Git repo is the single source of truth. For the code, for the infrastructure, etc. The pipeline always begins with an event in Git. If the developers don't use GitHub or GitLab issues there should be a system connected to your Git repo to keep the tickets in sync with the pull/merge request states. This way you can always see what is going on in a ticket even though developers mostly work in Git.

The CI/CD pipeline should be as automated as possible. If you have to manually trigger a pipeline, you are doing it wrong. The pipeline should be triggered by a push to a branch or a pull/merge request. This way you can automate the whole process of development, testing, deployment and closing the ticket. It is also great for piece of mind. You can always see if all of your code and tests are working. Testers and stakeholders can chime in and play around in the pull/merge request environment which is automatically created and dropped. Now you just need a review from another developer and you can be pretty shure that your code is good to go. Releasing should not create fear. It should be a simple process which is automated and can be done anytime. So even if a bug got into production just deploy the fix 5mins later.