Founder of Windmill here, and d-k-p answer is spot-on. If you want to manage your entire workflows as a typescript code, then trigger.dev would be preferable.
Windmill supports typescript, python, go and bash, and handle all the advanced features such as retries, approval steps, pre-made integrations to hundreds of API at the workflow level in a UI-based editor. Then for the steps, themselves. you would use either your IDE and sync to Windmill, or use our web IDE.
In Trigger.dev workflows are created completely in your code rather than in a node-based UI (which to be fair does allow you to write code sometimes). We found developers could actually put together workflows faster if the whole thing was code rather than a hybrid of UI / code (because you get to use your own IDE + Copilot).