DEV Community

vindarel
vindarel

Posted on

Is Elixir or Common Lisp the best language for building a bootstrapped B2B SaaS in 2024?

There was this article and discussion on Lobster last month.

I'll give you the key takeaway right now:

the best language/tooling to start a SaaS with is the one you already know.

Now let's discuss some more.

I want to be convinced and find the Graal, but I’m still torn between Python, and now Common Lisp. When I take a look to maybe rewrite my Python/Django app to Elixir, I miss stuff: no admin dashboard (unless you pay 300USD), no automatic DB migrations unlike Django and CL’s Mito (yet I don’t have Ecto experience so maybe it’s a non issue) (I've been point to Ecto migrations, that's a valid point), a lot of code generation (they rot, don’t they?)…

LiveView? I can use HTMX, its websockets extension, Unpoly, and they are cross-stack. No compile-time type checks, like Python, unlike CL; a deployment story in-between Python (dangerous) and CL (build and send a binary) and, because I am now spoiled with CL’s richness of image-based interactive features, I see much less of them in Elixir (no “compile this function ad get warnings”). And oh, there’s some syntax to pay attention to again, those { % => etc. Elixir’s Emacs modes don’t look good when Slime or Sly offer a ton of features. With Elixir I’m back at the terminal which feels like a regression.

I’m spoiled.

So, is Elixir really the best language for building a bootstrapped SaaS? Python/Django, I admit, despite their flaws, have arguments. For a solo developer, Common Lisp is hyper productive. Its web offering is minimal but if you know the web, plug in a DB, HTMX, a login system and you’re on tracks. CL won’t have shiny dashboards (wait, does it? Grafana dashboard for SBCL and Hunchentoot: memory, threads, requests per second, GC state…) and a supervision tree (only ruricolist/moira to monitor and restart background threads), but you can get a GenServer-inspired actor library (mdbergmann/sento), and I believe they share runtime features: efficiency, live reload is doable. Last but not last, CL is maybe easier to use for other tasks: ingest data efficiently (SBCL is fast), small-ish binaries, scripts (now easier with my CIEL helper).

Elixir is absolutely more shiny and enterprise ready and I don’t know what I miss, but there’s nothing ideal for a rewrite…

Now, after this comment of mine I've been pointed to Torch and Ecto's Gen.Migration, the two looking super useful. Good points. I also started to write my CRUD admin dashboard for Common Lisp, let's see how this goes…

Top comments (0)