# Make a web or webapp in 2024 with Clojure and Clojurescript

**URL:** https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529
**Category:** How to?
**Tags:** beginner, webapps
**Created:** [January 16, 2024, 10:45pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529 "2024-01-16T22:45:09Z")
**Posts on this page:** 16
**Page:** 1

<div class="post-metadata">

### Author: ![maxxcan](https://clojureverse.org/user_avatar/clojureverse.org/maxxcan/32/3864_2.png) [@maxxcan](https://clojureverse.org/u/maxxcan)
#### Post date: [January 16, 2024, 10:45pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/1 "2024-01-16T22:45:09Z")

</div>

Hello everyone and thanks for your time. I have had a lot of time without using Clojure. But, my company is asking me to make a small web or webapp that uses to a sqlite database. I want to make it using Clojure or Clojurescript but I don’t know which is the best tecnologies now. I don’t know if the best is to use reframe, maybe reagent too, I was thinking in luminus or similar framework, but I really don’t know. Could someone guide me on how to do this? Thanks for the answers.

---

<div class="post-metadata">

### Author: ![p-himik](https://clojureverse.org/user_avatar/clojureverse.org/p-himik/32/4137_2.png) [@p-himik](https://clojureverse.org/u/p-himik)
#### Post date: [January 17, 2024, 9:48am UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/2 "2024-01-17T09:48:12Z")

</div>

As if often the case, the answer is “it depends”.

A web app that relies only on UI components that you can build yourself, doesn’t have extra pages, and uses only JSON HTTP API, uses simple static SQL queries, can be comfortably built with just Clojure, ClojureScript, next-jdbc for SQLite, and some web server (maybe Ring on top of Jetty, maybe http-kit, maybe something else). With no other dependencies. This is a good post on the topic when it comes to the CLJS part: [Applying the Art of CLJS Frontend](https://code.thheller.com/blog/shadow-cljs/2023/07/16/applying-the-art-of-cljs-frontend.html)

A web app that relies on existing React components, has multiple pages, uses WebSockets/GraphQL/Protobuf/whatever else you can throw here, requires dynamic or intricate SQL queries, will require:

- React itself that you’ll use via one of the existing wrappers (Reagent, maybe with re-frame or without, UIx, Helix, maybe something else)
- A way to build the CLJS code with all the dependencies from NPM (shadow-cljs is best here IMO)
- A router on both ends (I prefer reitit)
- Some way to build SQL queries at run time (my preference here is HoneySQL)
- Whatever you might need for the transport layer
- And also next-jdbc and some web server

Making good informed choices requires learning about all potential problems, the existing solutions, and what dictates every particular choice. If you feel like it - awesome, you have your reading and experimenting cut out for you. 🙂 If you don’t feel like it - Pedestal and Luminus are both fine choices. Going this route doesn’t mean you won’t have to learn, but some of the choices will have bene made for you (and those might not be the ones that you’d yourself make). Of course there are other frameworks, but I either know very little about them or can’t recommend them to a beginner.

Some additional reading: [What Web Framework Should I Use in Clojure?](https://ericnormand.me/mini-guide/what-web-framework-should-i-use-in-clojure)

---

<div class="post-metadata">

### Author: ![maxxcan](https://clojureverse.org/user_avatar/clojureverse.org/maxxcan/32/3864_2.png) [@maxxcan](https://clojureverse.org/u/maxxcan)
#### Post date: [January 17, 2024, 10:56am UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/3 "2024-01-17T10:56:10Z")

</div>

Your answer seem to me perfect. Thank you very much.

---

<div class="post-metadata">

### Author: ![maxweber](https://clojureverse.org/user_avatar/clojureverse.org/maxweber/32/2271_2.png) [@maxweber](https://clojureverse.org/u/maxweber)
#### Post date: [January 17, 2024, 12:57pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/4 "2024-01-17T12:57:25Z")

</div>

Awesome, that you have the chance to use Clojure again 🥳

If you don’t need to build any super interactive UI (a visual editor or similar), then I would go with htmx, Hiccup, next-jdbc for SQLite, Ring, httpkit and TailwindCSS. This video should provide a good overview regarding htmx + Hiccup:

[![](https://img.youtube.com/vi/fyA1gImNpLI/maxresdefault.jpg "HTMX with Clojure, is it any good? First impressions and thoughts!") ](https://www.youtube.com/watch?v=fyA1gImNpLI)

Htmx will help to avoid a lot of API churn and security issues down the road:

[![](https://img.youtube.com/vi/f2wYvIVWR6M/maxresdefault.jpg "The Most Important Lesson From HTMX") ](https://www.youtube.com/watch?v=f2wYvIVWR6M)

---

<div class="post-metadata">

### Author: ![maxxcan](https://clojureverse.org/user_avatar/clojureverse.org/maxxcan/32/3864_2.png) [@maxxcan](https://clojureverse.org/u/maxxcan)
#### Post date: [January 17, 2024, 1:13pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/5 "2024-01-17T13:13:01Z")

</div>

Thanks for the answer. I still love Clojure, but I have started a new job in a new company, and with that company I use Elisp.  
But now I have a new project and I want to use Clojure for it.

---

<div class="post-metadata">

### Author: ![seancorfield](https://clojureverse.org/user_avatar/clojureverse.org/seancorfield/32/195_2.png) [@seancorfield](https://clojureverse.org/u/seancorfield)
#### Post date: [January 18, 2024, 7:24am UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/6 "2024-01-18T07:24:25Z")

</div>

[seancorfield/usermanager-example: A little demo web app in Clojure, using Component, Ring, Compojure, Selmer (and a database) (github.com)](https://github.com/seancorfield/usermanager-example) is a small Clojure web app that uses SQLite that might be a useful template for you. The README also links to versions built with Integrant/reitit (instead of Component/Compojure), as well as a Polylith-structured version, and one that uses XTDB for the database.

---

<div class="post-metadata">

### Author: ![greinseth](https://clojureverse.org/user_avatar/clojureverse.org/greinseth/32/1815_2.png) [@greinseth](https://clojureverse.org/u/greinseth)
#### Post date: [January 18, 2024, 9:20am UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/7 "2024-01-18T09:20:58Z")

</div>

Maybe give [Electric Clojure](https://github.com/hyperfiddle/electric) a try as well? There’s a tutorial repo meant for playing with it and get to know it:

> **[GitHub - hyperfiddle/electric-fiddle: Easiest way to get started with...](https://github.com/hyperfiddle/electric-fiddle)**
>
> Easiest way to get started with Electric Clojure. Contribute to hyperfiddle/electric-fiddle development by creating an account on GitHub.

---

<div class="post-metadata">

### Author: ![CTW](https://clojureverse.org/letter_avatar_proxy/v4/letter/c/c0e974/32.png) [@CTW](https://clojureverse.org/u/CTW)
#### Post date: [January 18, 2024, 5:44pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/8 "2024-01-18T17:44:05Z")

</div>

If you’re considering luminus then I would look at [kit-clj](https://kit-clj.github.io/) instead. This is the ‘new and improved’ version from the same authors. I’m far from a professional software dev., so take my words with a generous amount of salt, but I’ve found it very helpful to generate a template from that and to gradually add (inject) the extensions to see something of the ‘best practises’ of a modern clojure web app. The very ability to do this was also new to me.

Eric Normand described Luminus (forgive his spelling 🙂 ) as such:

> Think of Luminous as the set of libraries and configurations you would build yourself over ten years of work on an application. You might not need them at first, but eventually, you will want security, logging, and internationalization, among other concerns. Luminus gives that to you with one command.

Kit-clj is the next version and so I’m guessing it will give you a good (but opinionated) answer to your question.

---

<div class="post-metadata">

### Author: ![publicimageltd](https://clojureverse.org/user_avatar/clojureverse.org/publicimageltd/32/5332_2.png) [@publicimageltd](https://clojureverse.org/u/publicimageltd)
#### Post date: [February 1, 2024, 8:25am UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/9 "2024-02-01T08:25:09Z")

</div>

In addition to the other answers, I would recommend using [unpoly](https://unpoly.com/) on the browser side. It’s comparable to htmx and makes writing a multi page application a breeze. No need to do any Clojurescript. And still you can put all your rendering logic etc. on the backend site, using Clojure. I found it easy to use, intuitive, and hazzle-free.

---

<div class="post-metadata">

### Author: ![Webdev\_Tory](https://clojureverse.org/user_avatar/clojureverse.org/webdev_tory/32/3781_2.png) [@Webdev\_Tory](https://clojureverse.org/u/Webdev_Tory)
#### Post date: [February 1, 2024, 5:22pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/10 "2024-02-01T17:22:50Z")

</div>

“new company” and “elisp” – something I never expected to see in the same sentence!

---

<div class="post-metadata">

### Author: ![publicimageltd](https://clojureverse.org/user_avatar/clojureverse.org/publicimageltd/32/5332_2.png) [@publicimageltd](https://clojureverse.org/u/publicimageltd)
#### Post date: [February 4, 2024, 2:41pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/11 "2024-02-04T14:41:56Z")

</div>

See [this story](https://news.ycombinator.com/item?id=26202517) on a whole air controlling system running on Emacs…

---

<div class="post-metadata">

### Author: ![Webdev\_Tory](https://clojureverse.org/user_avatar/clojureverse.org/webdev_tory/32/3781_2.png) [@Webdev\_Tory](https://clojureverse.org/u/Webdev_Tory)
#### Post date: [February 7, 2024, 7:19pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/12 "2024-02-07T19:19:58Z")

</div>

That is fascinating! Thanks for the link. The comments were gold: “emacs makes a great air-traffic controller, but could use a good text editor”

---

<div class="post-metadata">

### Author: ![emmawilson](https://clojureverse.org/user_avatar/clojureverse.org/emmawilson/32/5464_2.png) [@emmawilson](https://clojureverse.org/u/emmawilson)
#### Post date: [June 19, 2024, 11:10am UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/13 "2024-06-19T11:10:52Z")

</div>

Which company? I want to know more about this. could you please explain this.

---

<div class="post-metadata">

### Author: ![maxxcan](https://clojureverse.org/user_avatar/clojureverse.org/maxxcan/32/3864_2.png) [@maxxcan](https://clojureverse.org/u/maxxcan)
#### Post date: [July 22, 2024, 10:30pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/15 "2024-07-22T22:30:33Z")

</div>

I love that history

---

<div class="post-metadata">

### Author: ![maxxcan](https://clojureverse.org/user_avatar/clojureverse.org/maxxcan/32/3864_2.png) [@maxxcan](https://clojureverse.org/u/maxxcan)
#### Post date: [July 22, 2024, 10:32pm UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/16 "2024-07-22T22:32:41Z")

</div>

Don’t get too excited. Officially my company only uses java and javascript. It’s something I do at my own risk. But you have to try it

---

<div class="post-metadata">

### Author: ![system](https://clojureverse.org/uploads/default/original/2X/5/51079bf9e4b7d9466242c06cf1e43b9f8bd6da14.png) [@system](https://clojureverse.org/u/system)
#### Post date: [January 21, 2025, 10:33am UTC](https://clojureverse.org/t/make-a-web-or-webapp-in-2024-with-clojure-and-clojurescript/10529/17 "2025-01-21T10:33:02Z")

</div>

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