frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Open in hackernews

Clojuring the web application stack: Meditation One

https://www.evalapply.org/posts/clojure-web-app-from-scratch/index.html
165•adityaathalye•11mo ago

Comments

adityaathalye•11mo ago
The ongoing discussion for Biff [1] prompted me to re-share my post because I'd like more people to understand this "other way". Outside Clojureville, it is not obvious most of these Clojure "frameworks" are not monoliths.

The consummate Clojurist's default (and very normal-feeling way) to build a web application (or any application for that matter) is to roll their own web stack from production-grade libraries.

Of course, this state of affairs is a double-edged sword, just like is true for traditional web frameworks. In my post, I try to go into the whys and the wherefores, building upward from first principles.

[1] Biff – a batteries-included web framework for Clojure https://news.ycombinator.com/item?id=44037426

andersmurphy•11mo ago
A fantastic post! Enjoyed re-reading it.

I'd say the nice thing with the Clojure way of building your own stack is it becomes quite easy to swap parts out. On a previous project we swapped out our web server three different times with minimal changes (jetty -> aleph -> httpkit) as for the most part they all shared the same interface.

After a while you get good at seeing where you want things to be configurable and where you don't. It also gives you the confidence to roll your own micro stack/framework which means you are not dependent on third party aggregates to adopt new features.

adityaathalye•11mo ago
Thank you for the kind appreciation. Made my day :)

Yes; next to the sheer stability of parts, their fungibility is a business-critical feature of the Clojure ecosystem. Of course said fungibility does not magically manifest. However the effort to get there is "not much", I'd say. The use of "system" libraries, with some well-reasoned module design brings it pretty close to magic.

As in the post, a fungible, production-grade part can be just a multimethod (e.g. the router in the post). Why? Because "production" comes in all sizes. A small SaaS with a few hundred customers may chug along happily with a bunch of functions.

yakshaving_jgt•11mo ago
This suggests to me that “production grade” isn’t much of a qualifier at all then.

You could just as well say that PHP has “production grade” functions.

adityaathalye•11mo ago
Hm, I'm saying a given function can be production grade. I'm not saying all functions are production-grade. Also, I'm saying production comes in all sizes. If your micro-SaaS app gives you a livelihood, that's hella production --- real skin in game, real stakes in ground.

To analogise further...

- HackerNews is a "production" system, you would agree. Back in 2015, it was still true. Are flat files a "production grade" primary data storage choice? [1]

- Suppose your production service transacts a million requests an hour (say it is a short-link maker). Further, let's say it has only a handful of API endpoints. Do you really need a whole routing library for that, if a single multimethod does exactly what you need, correctly?

etc...

[1] https://news.ycombinator.com/item?id=9990630

(edit: add reference for flat file storage)

yakshaving_jgt•11mo ago
Right. And what I’m saying is that if “production grade” means all of these things, then it’s not a very meaningful qualifier.

My personal site is statically generated — it’s just a bunch of HTML files and some CSS. Do you not think it would be a bit pretentious of me to describe that as “production grade”?

If “production grade” simply means fit for purpose, then given the GP commenter’s reason for their initial web server swap, wouldn’t you say by definition that jetty is not production grade, since it doesn’t (didn’t?) support SSE?

adityaathalye•11mo ago
I agree with you... "production grade" is in fact a meaningless term without saying what grade one's production needs to be.

A static site that serves is most definitely a production system. Perhaps one that could scale in traffic almost without end.

evalapply.org gets (to my continued amazement) 20K+ unique visitors a month when it's business as usual. On a busy HN day, it's easily that much in hours. I don't have to think about "scaling problems". I don't have one.

I'm being the realest real with you.

yakshaving_jgt•11mo ago
> On a previous project we swapped out our web server three different times

Why is this desirable?

On all my projects over the past 10 years, I’ve swapped out the web server exactly zero times because the one I have works just fine. The parent comment describes these components as “production grade”, but then if that’s the case, what could be the reason for swapping them out other than self-indulgence?

andersmurphy•11mo ago
It's not. But, the fact that we could and it was straight forward still amazes me.

In our case the first time we needed to, we needed SSE and at the time there was no ring-jetty async interface (it's a long time ago so I'm forgetting the details) so we moved to aleph. Much later, we wanted to try out http-kit (self-indulgence) as we were operating behind a proxy anyway for performance reasons and it made a significant difference.

If we'd just started with http-kit that would have been fine. I guess it comes down to what features you need.

Also I 100% agree it's something ideally you would want to avoid a in the case of databases for example so much performance is left on the table because for some reason we want to be able to swap between SQLite, postgres and mySQL. Which in practice you never want to do.

KingMob•11mo ago
As the former maintainer of Aleph, I'm very surprised you ran into a situation where http-kit was faster. Or do you mean it was just preferable to develop for?
adityaathalye•11mo ago
> Why is this desirable?

Generally, yes one would not want to swap out their web server willy-nilly...

Yet, this is one of those "YAGNI in 99% of your use cases", but when that 1% use case arises, a server swap would be far more desirable than a whole framework shift.

So while self-indulgence can certainly be a motive (and why not? as long as everyone's having a good time), may I offer a few more charitable reasons for this:

- programming API ergonomics

- performance

- application runtime model (servlets -> embedded server)

- security model

- application server features (websockets, comet?)

- binary size

- server configuration niceties

etc...

That said, a developer only has flexibility if it is built in from the get go.

A counterfactual would be to consider the set of developers who have had to put in ugly hacks because they can't just rip the web server out of the framework of choice they are locked into.

(edit: bullet list formatting)

yakshaving_jgt•11mo ago
> and why not?

Because I pay the people who work for me.

adityaathalye•11mo ago
Well, if you're paying, you certainly get to set the rules. No self-indulgence, then. The other reasons I enumerated may still hold.
0x1ceb00da•11mo ago
> Why is this desirable?

Because Brawndo's got electrolytes.

gehrman•11mo ago
Your comment reminded me of this talk https://www.youtube.com/watch?v=MZy-SNswH2E.

The part about building just the functionality you need, using the bare minimum libraries etc stuck out.

elchief•11mo ago
Metabase is written in clojure, if you want to see the source code of a large web app

https://github.com/metabase/metabase

adityaathalye•11mo ago
+1

NASA's Common Metadata Repository is worth exploring too https://github.com/nasa/Common-Metadata-Repository

It is a neat example of how an org can structure and manage multiple projects and services in a single git repository. They've use Leiningen to achieve their objective.

> The Common Metadata Repository (CMR) is an earth science metadata repository for NASA EOSDIS data. The CMR Search API provides access to this metadata.

> Building and Running the CMR

> The CMR is a system consisting of many services. The services can run individually or in a single process. Running in a single process makes local development easier because it avoids having to start many different processes. The sections below contain instructions for running the CMR as a single process or as many processes.

(edit: add relevant context for quick reference)

geokon•11mo ago
wow I had no idea Nasa used Clojure. I do remmeber them using quite a bit of Java so it's not terribly surprising
trenchgun•11mo ago
Also: NASA used to use Common Lisp before
adityaathalye•11mo ago
"Lisping at the JPL" is one of my favourite stories (all-time favourite, not just computery favourite).

https://flownet.com/gat/jpl-lisp.html

> Debugging a program running on a $100M piece of hardware that is 100 million miles away is an interesting experience. Having a read-eval-print loop running on the spacecraft proved invaluable in finding and fixing the problem. The story of the Remote Agent bug is an interesting one in and of itself.

fud101•11mo ago
If you haven't heard it before, i'd recommend checking out this podcast episode - it's fantastic. https://corecursive.com/lisp-in-space-with-ron-garret/
adityaathalye•11mo ago
I've heard it and I agree! Thanks for the re-up. Might give it a listen again :)
90s_dev•11mo ago
Sorry, what? Did you just say NASA uses Clojure?? That must be a pretty big honor for Rich.
adityaathalye•11mo ago
Clojure(Script) apps and systems exist at a bunch of household name places.

- Clojure: https://clojure.org/community/companies

- ClojureScript: https://clojurescript.org/community/companies

Also, a few case studies may interest you: https://clojure.org/community/success_stories and community stories: https://clojure.org/community/community_stories

ramirond•11mo ago
Thanks for the shout! I recommend this video about our Clojure journey: https://www.youtube.com/watch?v=vUe3slLHk20

We are also hiring Clojure devs: https://www.metabase.com/jobs

lelag•11mo ago
The metabase "backend" is written in clojure.

The web frontend is written in TypeScript/React.

librasteve•11mo ago
a very lyrical post, i will reread at my leisure and try to apply the lessons to https://harcstack.org

that’s HTMX, Air, Red & Cro btw

that said … I am a true believer in HTMX for the right amount of UX dynamism and I don’t initially get solves that piece

andersmurphy•11mo ago
If you need the next level of UX dynamism and or realtime updates and or multiplayer. I've handled a billion checkboxes[1] with clojure, sqlite and datastar (realtime hypermedia) just fine.

[1] https://checkboxes.andersmurphy.com

librasteve•11mo ago
yeah the datastar guys are often on the HTMX discord - guess that's an option for that - tx!
adityaathalye•11mo ago
Goes both ways... We are all moles in each others' organisations.
adityaathalye•11mo ago
Thank you for the kind appreciation.

Following writing advice or post structuring guidelines is not in my job description at evalapply.org Luckily, Michael Hamburger offered a legitimate excuse in his classic (so I'm told) essay, "An Essay About Essays": https://substack.com/@bombaylitmag/p-162583447

wink•11mo ago
The problem with this approach is that (esp. for hobby projects) updating stuff is a bit tedious. Let's say you have a relatively bare bones project in Rails or a PHP framework you have a couple of dependencies that people usually use together, so upgrading can be quick and painless.

I've now had it several times in the years-long lifespan of small clojure web projects that people have moved on and the thing (framework-ish) basically doesn't exist anymore and going by the issues it only had like 10 users in the first place.

It's not the end of the world, and fortunately there's not a lot of needless churn, but I guess I would prefer to have this "I am trusting project x and I only have to care about their releases (pre-testing all the moving parts) and then my 5 dependencies" and instead I have 20 dependencies/moving parts for my web app.

Yes, I'm lazy and I don't think it's a problem in an env where you have a proper dev workflow anyway.

wild_egg•11mo ago
> updating stuff is a bit tedious

How often do you have to do that though? I was under the impression that Clojure was a bit like CL in that old code will keep working basically forever. Unless there are new features you need, you just leave most libs alone to do their job.

epgui•11mo ago
This can be a culture shock for people coming from places like ruby, python, javascript... But a lot of clojure libraries are actually just "finished", they're not abandoned.

The Bromine Chokepoint: How Strife Could Halt Production of World’s Memory Chips

https://warontherocks.com/cogs-of-war/the-bromine-chokepoint-how-strife-in-the-middle-east-could-...
99•crescit_eundo•4h ago•45 comments

Vercel April 2026 security incident

https://www.bleepingcomputer.com/news/security/vercel-confirms-breach-as-hackers-claim-to-be-sell...
379•colesantiago•7h ago•253 comments

A. J. Ayer – ‘What I Saw When I Was Dead’ (1988)

https://www.philosopher.eu/others-writings/a-j-ayer-what-i-saw-when-i-was-dead/
36•isomorphy•1h ago•30 comments

Swiss authorities want to reduce dependency on Microsoft

https://www.swissinfo.ch/eng/swiss-ai/swiss-authorities-want-to-reduce-dependency-on-microsoft/91...
89•doener•1h ago•22 comments

Show HN: Faceoff – A terminal UI for following NHL games

https://www.vincentgregoire.com/faceoff/
64•vcf•4h ago•23 comments

I wrote a CHIP-8 emulator in my own programming language

https://github.com/navid-m/chip8emu
27•pizza_man•2h ago•4 comments

I learned Unity the wrong way

https://darkounity.com/blog/how-i-learned-unity-the-wrong-way
59•lelanthran•3d ago•25 comments

Changes in the system prompt between Claude Opus 4.6 and 4.7

https://simonwillison.net/2026/Apr/18/opus-system-prompt/
116•pretext•11h ago•64 comments

Archive of BYTE magazine, starting with issue #1 in 1975

https://archive.org/details/byte-magazine-1975-09
496•DamnInteresting•2d ago•125 comments

Game devs explain the tricks involved with letting you pause a game

https://kotaku.com/video-game-devs-explain-how-pausing-works-and-sometimes-it-gets-weird-2000686339
382•speckx•3d ago•211 comments

The seven programming ur-languages (2022)

https://madhadron.com/programming/seven_ur_languages.html
243•helloplanets•14h ago•94 comments

Notion leaks email addresses of all editors of any public page

https://twitter.com/weezerOSINT/status/2045849358462222720
273•Tiberium•6h ago•90 comments

Nanopass Framework: Clean Compiler Creation Language

https://nanopass.org/
103•NordStreamYacht•4d ago•24 comments

The RAM shortage could last years

https://www.theverge.com/ai-artificial-intelligence/914672/the-ram-shortage-could-last-years
112•omer_k•14h ago•106 comments

SPEAKE(a)R: Turn Speakers to Microphones for Fun and Profit [pdf] (2017)

https://www.usenix.org/system/files/conference/woot17/woot17-paper-guri.pdf
146•Eridanus2•13h ago•64 comments

KTaO3-Based Supercurrent Diode

https://pubs.acs.org/doi/10.1021/acs.nanolett.5c05590
23•PaulHoule•3d ago•1 comments

Reverse Engineering ME2's USB with a Heat Gun and a Knife

https://github.com/coremaze/ME2-Writeup
41•Bawoosette•1d ago•6 comments

College instructor turns to typewriters to curb AI-written work

https://sentinelcolorado.com/uncategorized/a-college-instructor-turns-to-typewriters-to-curb-ai-w...
447•gnabgib•1d ago•406 comments

What are skiplists good for?

https://antithesis.com/blog/2026/skiptrees/
241•mfiguiere•2d ago•57 comments

Show HN: Shader Lab, like Photoshop but for shaders

https://eng.basement.studio/tools/shader-lab
125•ragojose•3d ago•35 comments

NIST scientists create 'any wavelength' lasers

https://www.nist.gov/news-events/news/2026/04/any-color-you-nist-scientists-create-any-wavelength...
402•rbanffy•1d ago•185 comments

Prove You Are a Robot: CAPTCHAs for Agents

https://browser-use.com/posts/prove-you-are-a-robot
4•lukasec•4d ago•1 comments

Eliza a Play by Tom Holloway

https://www.mtc.com.au/plays-and-tickets/whats-on/season-2026/eliza
8•abrax3141•2d ago•6 comments

Show HN: Prompt-to-Excalidraw demo with Gemma 4 E2B in the browser (3.1GB)

https://teamchong.github.io/turboquant-wasm/draw.html
77•teamchong•10h ago•38 comments

Anonymous request-token comparisons from Opus 4.6 and Opus 4.7

https://tokens.billchambers.me/leaderboard
598•anabranch•1d ago•561 comments

Blue Origin's rocket reuse achievement marred by upper stage failure

https://arstechnica.com/space/2026/04/errant-upper-stage-spoils-blue-origins-success-in-reusing-n...
25•rbanffy•2h ago•1 comments

The electromechanical angle computer inside the B-52 bomber's star tracker

https://www.righto.com/2026/04/B-52-star-tracker-angle-computer.html
411•NelsonMinar•1d ago•106 comments

4-bit floating point FP4

https://www.johndcook.com/blog/2026/04/17/fp4/
62•chmaynard•1d ago•44 comments

Reading Input from an USB RFID Card Reader

https://kevwe.com/blog/usb-rfid-reader
24•kevwedotse•2d ago•4 comments

The world in which IPv6 was a good design (2017)

https://apenwarr.ca/log/20170810
189•signa11•18h ago•93 comments