Working with Elm code is satisfying to me. It's generally easy to revisit code I last worked with months ago and get immediately fluent with it again. The "Elm Architecture" (model / update / view) with all external interaction done over "ports" is so clean (albeit with boilerplate). Integrating with JS libraries has to be done over ports (async one-way messaging) but it works well enough in practice. Vite provides a decent dev/build toolchain with hot-reloading of all Elm, JS, and CSS code. The Elm framework is very opinionated and has stopped evolving, but it's mostly a joy to work with.