I believe strongly in functional core, <less-functional-paradigm> shell as a default architecture.
But I don’t agree with the article’s assessment about the shell being ugly as a weakness. The shell is ugly by definition! It has to deal with nasty edge cases like the database being down, the user providing garbage input, or the quirks of UI libraries. Remember, the shell contains all the interactions with the Real World! You can clean up parts of it by aggressively encapsulating your side effects into modules, but it’s still there.
What is truly ugly is when Real World Ugliness is unevenly dispersed through the codebase with no rhyme or reason. Mixing state, side effects, and logic creates huge amounts of incidental complexity.
The shell’s ugliness is the strength of this approach. It is much easier to deal with there.