Kris Jenkins discusses How I Structure Elm Apps. He wrote this hoping to help ease people's transition from play projects to larger apps, by providing a pattern that's worked for him. NOTE: This is from the 0.16 days, so I'm not sure how much of this is directly applicable. The higher level concepts certainly are.
Worst Practices Should Be Hard attempts to persuade you that Haskell helps people write better software by aligning short-term incentives with long-term incentives. I actually love the argument, and someone on the Mailing List mentioned that Elm seems to keep all of the pros of Haskell that this article discusses, while also fixing a few of the cons. NOTE: I think that since 0.17, Elm's gotten better in this regard, but there are still a lot of instances of people using Cmd to trigger updates from within an existing update, when they could just call the update function and not rely on side effects for that behaviour. This is a place that I think newcomers (and even some experienced Elm developers) still suffer, and it's a place I wish people would get more rigorous about their solutions.