It hasn’t quite been one year since I wrote the first post on Elm, but it’s not that far off and the title was clearer that way. In this time I have written three programs in Elm, each one more complex than the last:

  1. Client for the catalogs generated by cataloger. My RPG resources catalog is an example of the result.
  2. Prexxer, a “Dress-up” application to combine sprites and create characters. You can see the code on GitHub.
  3. NARROWS, a storytelling system halfway between online role-playing games and improvised Choose Your Own Adventure books.

The first one was useful to get to know (and love) Elm, and of course to get my RPG resources catalog online. With the second I learned about Elm ports (the interface to interact with JavaScript) and got a bit more comfortable with Elm. With the last one, the only one that has a back-end (written in ES6, though; Elm is only for front-end), I learned how to structure big applications in Elm, how to use the excellent ProseMirror, and how to use much more complex Elm ports.

What I like about Elm

  • It’s a simple language with few concepts, easy to learn and understand. After my initial (small) struggles, I have mostly loved it since.
  • The Elm Architecture is really nice and simple, and it’s nice that it’s integrated into the environment. It’s like having a framework for free with the language.
  • Everything immutable: the easy way is the right way.
  • Nice, clear, useful compiler error messages.
  • Generally nice toolchain.
  • Static types help you a lot, mostly without being annoying.
  • Newer major versions of the language simplify things further and make things clearer and less error prone (I’ve been through two major updates).

What I don’t like about Elm

  • The compiler seems slow and often seems to compile older versions of the code. This might be my own fault, as I have a custom Brunch configuration with an Elm plugin and I don’t even understand Brunch all that well. In comparison, the TypeScript compiler was amazing.
  • Some complex types and interfaces, notably the modules for HTTP requests and JSON parsing. The former improved a lot in the new version, Elm 0.18.
  • Newer major versions of the language break compatibility and you have to rewrite parts of your application, which is really annoying… but also worth it.
  • I’m not that fond of currying. Sometimes I feel like it makes some compilation error messages harder to understand.


I’m really happy I gave Elm a try almost a year ago. Although I’m looking forward to going back to ClojureScript for some project, I really, really enjoy Elm, and it has almost become my defacto front-end language/framework.