Announcing dwayne/elm-conduit: A replacement for rtfeldman/elm-spa-example

I’m happy to share dwayne/elm-conduit (demo), an Elm SPA for RealWorld’s Medium dot com clone.

Best view in 1080p at 2x speed.

Why?

Since 2018, Richard set clear expectations on the effort he would be able to devote to rtfeldman/elm-spa-example. And, nearing the end of 2023 it became clear that his focus shifted towards Roc and raising a family.

I’d really like to go back and update elm-spa-example. … After a while, it’s like, yeah this is never happening. ~ Richard Feldman at 3:23

Fast-forward to now, circa April 2024, and unsurprisingly, the repository has been unmaintained for 5 years and the demo is broken in a few places. So, I took it upon myself to rebuild RealWorld.

About

dwayne/elm-conduit is built from scratch using the full power of Elm, no holds barred. This is how I would architect and build a reliable, maintainable, and scalable production-ready Elm web application.

It uses devbox, Elm 0.19.1, the latest Elm packages (in particular elm/http 2.0.0), elm-review, Caddy, Dart Sass, and a handful of Bash scripts (one of them being a deployment script). It uses elm test and features tests for key data structures.

In short, if you were asking:

Where can I find an open-source example of an Elm Single Page Application that is well-maintained, uses the latest Elm libraries and tooling, and has a build and deployment story?

Then, dwayne/elm-conduit is your answer.

Enjoy!

P.S. Thank you @rtfeldman. You’ve done a lot for Elm already. Don’t worry about elm-spa-example. Keep focusing on Roc and your family. That’s higher priority.

28 Likes

Well done!

I signed up with username simon/favourites. I don’t seem to be able to access my profile page, instead I see the favourites of the user simon. Also tried simon?cool but that was problematic too. Dang it, both my favourite user names! :sweat_smile:

6 Likes

I was playing with my own variant of the Conduit app the other day and was wondering how many versions there are in Elm now. The ones I know of are

I’m not aware of any using a GQL backend, for demoing elm-gql or elm-graphql. Nor of any using elm-ui or other approaches to styling.

7 Likes

This is awesome for someone like me who is just learning Elm now after all these years.

Thank you for creating it!

3 Likes

@wolfadex Here’s a few more that can be found on GitHub, RealWorld language:Elm. Though most are incomplete.

This one takes some liberty with the real world spec, but it uses elm-graphql and elm-ui.

2 Likes

I made an elm-pages implementation as well: GitHub - dillonkearns/elm-pages-realworld: Realworld implementation with elm-pages v3..

Demo at https://elm-pages-realworld.netlify.app/.

2 Likes

Let me start by saying that I’m happy that there are multiple implementations of RealWorld using all the various frameworks that Elm has to offer. This helps developers get up to speed with those frameworks and I’m all for it. Keep them coming.

Now, before I decided to work on this project I surveyed the landscape to see if my solution was needed. Every other solution you all are sharing I already personally code reviewed and tested by using the application. What I learned throughout is that NO EXISTING implementation is production ready, 100% complete (in terms of meeting the spec), or has useful tests.

N.B. I’m not picking on @dillonkearns implementation in the video below but I’m just using his implementation to make the case about not being production ready and missing features. I could have used any of the previously existing solutions (even rtfeldman/elm-spa-example) to make the point.

Where’s the link to the user profile in the navigation?

The tag input feature, which broke the application in the video above, is interesting and subtle to implement in Elm. Maybe that’s why all previously existing implementations ignore it. And, when they do implement it, a comma-separated list is used instead of the pills as specified by the spec. In a weird way, this makes Elm look somewhat inferior to other solutions, for e.g. in React, since those frameworks all get that part of the spec right and it’s a non-issue.

Why I built dwayne/elm-conduit?

Because,

  • I wanted a pure Elm solution, no frameworks.
  • I wanted it to be production ready.
  • I wanted 100% coverage of the RealWorld spec. Tag input MUST be implemented.
  • I wanted examples of useful tests used in a web application context.
  • I wanted someone coming from React/Vue or whatever other JS framework to see that Elm is fully capable of building the types of UIs that they are accustomed to. Even though this goal was out of my control.

No other implementation that I reviewed ticked those boxes.

10 Likes

Sorry if my earlier comment came off as negative, I’m very happy for all of these too exist! I think it’s more useful than just a single example, and I hope that it can help people to understand the variety of ways to build with Elm.

3 Likes

Yes, my version tries to be a port that is faithful to rtfeldman/elm-spa-example, not the realworld spec itself, so things like pill UI are out of scope because it would diverge from that example. I think for many of these framework demos that is the goal since many people are familiar with rtfeldman/elm-spa-example so it’s a useful reference point for comparison.

I think it’s a great idea to have a repo that aims to address any missing parts of the realworld spec :+1:

2 Likes

@dillonkearns and @wolfadex It’s all good. :smile: I just thought I needed to be clearer about my intentions with building yet another RealWorld. I know it’s easy to get the wrong idea with tone etc, via a textual medium.

8 Likes

Great work! Sounds like a useful implementation indeed. Just FYI after signing up I had a glitch with the signup form staying visible (screenshot below). Switching to another page and back fixed it.

@sylbru That’s interesting. However, I’m not able to reproduce it. If you’re able to reliably reproduce it then it would be helpful if you can file an issue with the steps. Thanks!

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.