HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
edicl
hunchentoot
Common Lisp2012–2025
edicl / hunchentoot

hunchentoot

Web server written in Common Lisp

6Distinct people
7Mentions
0Explicit recommenders
756GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Web server written in Common Lisp

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 5:04:57 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year7 dated mentions

Observed mentions: 2012-11-15 12:02:39 UTC to 2025-12-11 03:18:31 UTC.

01232012-01-01 00:00:00 UTC to 2013-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments20122013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments20182019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2025

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20122012-01-01 00:00:00 UTC2013-01-01 00:00:00 UTC202
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC000
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC000
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC000
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC101
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC000
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC000
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC000
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC000
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC000
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC303
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC000
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC000
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC101

What Hacker News says

7 sources
Thank you for your comment. This is a great point! I had not considered this earlier but after looking at https://github.com/edicl/hunchentoot/blob/master/request.lis... it is clear that this could potentially lead to denial of service. I have now updated the Nginx configuration to block arbitrary headers coming from the remote client and explicitly pass only a limited set of headers to Hunchentoot. So now I have something like this in the Nginx reverse proxy configuration: proxy_pass_request_headers off; proxy_set_header Accept $http_accept; proxy_set_header Content-Length $http_content_length; proxy_set_header Content-Type $http_content_type; proxy_set_header If-Modified-Since $http_if_modified_since; proxy_set_header Referer $http_referer; proxy_set_header User-Agent $http_user_agent; proxy_set_header X-Forwarded-For $r
Read the rest
emote_addr; I will push this configuration to the GitHub repository too sometime this weekend.
In Show HN: MathB.in – Mathematics pastebin written in Common Lisp
> Error handling is not visual noise. You clearly did not actually read my previous comment before replying to it. Let me quote it: "I never said that error-handling code is noise - it isn't. What is noise is forcing every single function call between the appropriate error-handling point and the error location to have extra useless junk. When there's an error, you should see exactly two things in your codebase: some stuff at the point where the error is thrown, and some stuff at the point where the error is handled - and, given that the place where the error should be handled is rarely the direct caller, you should see nothing in between." Please read this carefully and respond to it. > The direct caller is _absolutely_ responsible for error handling. This is objectively false, both on an empirical level, and on a theoretical one. On the
Read the rest
empirical level, it's trivial to find dozens of instances of code on the internet where it's crystal clear that the direct caller of an erroring function is not responsible for error-handling. Here's one: on line 1471 of emacsclient.c[1], a call to connect() may fail - yet the caller, set_local_socket(), is clearly not responsible for e.g. quitting the application, because only its caller, set_socket()[2], has the contextual information necessary to know that quitting should not happen unless the attempts to open local UNIX domain and network sockets to the Emacs server also fail. That's it - counter-evidence to your claim. It's straight-up false. But, let's go and find a few more examples. Here[3] is a random screenshot of a Python error trace that I found on the internet. You see that bottom frame, listen()? It's calling the erroring function sock.bind(addr). Yet, it's pretty clear that listen() isn't the right place to handle the error - it's in the user's application, "ryu", because again, only that code has the contextual information necessary to determine the correct way to handle the error. Here[4] is another Python error trace - again, it's pretty clear that the place to handle the erroring getattr() call is not in its direct caller bind() in socket.py, but in the user application in siriServer.py. Finally, here's some Lisp code. The Hunchentoot web server has a ENSURE-PARSE-INTEGER function[5], which can fail if it receives a non-integer to parse. But, it simply doesn't have the contextual information necessary to handle the error, because it's called by URL-DECODE[6], which is called by FORM-URL-ENCODED-LIST-TO-ALIST[7], which is called by MAYBE-READ-POST-PARAMETERS[8], and that is where the error handling can, should, and must occur. It's crystal clear - errors are not required to be (or always capable of being) handled at the call site of the erroring function, and the reason for this is simply because context gets lost as you travel down the call stack, so that the point at which an error occurs often simply doesn't have the necessary context to recover from it correctly. > Falliable operations must be managed by the thing which calls them. Also false. Look at every one of the code examples I've linked. Go and look at code in general, actually. > Anything else is shadow control flow, which subverts understanding and negatively impacts reliability. It sounds like you don't understand exceptions very well. Go and read some code with exceptions - you'll see that the idea is extremely straightforward. Exceptions are very simple - they bubble up through the stack until handled, and that's it. They're far easier to understand than first-class functions, coroutines, monads, or any of another dozen different software engineering concepts that are also being put to extremely good use. [1] https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734... [2] https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734... [3] https://i.ytimg.com/vi/CryQPaz8UO0/maxresdefault.jpg [4] https://serverfault.com/questions/476715/python-socket-error... [5] https://github.com/edicl/hunchentoot/blob/0023dd3927e5840f1f... [6] https://github.com/edicl/hunchentoot/blob/0023dd3927e5840f1f... [7] https://github.com/edicl/hunchentoot/blob/0023dd3927e5840f1f... [8] https://github.com/edicl/hunchentoot/blob/18d76801150330a579...
In I want off Mr. Golang’s Wild Ride (2020)
Neat idea, although I'm not sold on the style of the URLs themselves. It'd be cool to introduce a new URL scheme: code://github.com/edicl/hunchentoot/master/log.lisp?macro=with-log-stream That would handle multiple definition namespaces. One could use code://github.com/edicl/hunchentoot/master/log.lisp?macro=with-log-stream&commit=0951a0df8fe93d99e6f2aa3f9612a2d6e581e84f to refer to a particular commit. No idea what the equivalent would look like for other VCSes though.
In Toward a URL for every function
"The most popular web server for CL, Hunchentoot hasn't been touched (based on the darcs repo anyway) since Tue, 24 Aug 2010." That statement is just untrue, take a look yourself. https://github.com/edicl/hunchentoot/commits/master Also there is an active community in Japan from what I can gather from github.com They done cl-annot[1], which is a way to annotate functions with the @ syntax from python. Clack[2], the WSGI-equivalent for cl. And the Caveman[3] and Ningle[4] webframeworks. [1]: https://github.com/arielnetworks/cl-annot [2]: https://github.com/fukamachi/clack [3]: https://github.com/fukamachi/caveman [4]: https://github.com/fukamachi/ningle
In Mocl: Common Lisp for iPhone/iOS, Android, and other mobile platforms
There is also a lib called 'HTML-TEMPLATE' ( http://weitz.de/html-template/ ) which is IMO a bit easier to use than CL-WHO. Hunchentoot has been updated, it is just maintained by somebody else now AFAIK ( https://github.com/edicl/hunchentoot/downloads ). I do remember that there was a version (1.2?) that had some backward compatibility problems and that was last year. Try quicklisp ( http://www.quicklisp.org/ ) for all your lib needs, it is a nice lib repository and it is very up to date (though still beta).
In Mocl: Common Lisp for iPhone/iOS, Android, and other mobile platforms

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.