HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
camping
camping
Ruby2010–2024
camping / camping

camping

the 5k pocket full-of-gags web microframework

7Distinct people
10Mentions
0Explicit recommenders
992GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

the 5k pocket full-of-gags web microframework

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, 1:49:46 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 year10 dated mentions

Observed mentions: 2010-07-20 15:30:40 UTC to 2024-06-14 23:49:04 UTC.

01232010-01-01 00:00:00 UTC to 2011-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments20102011-01-01 00:00:00 UTC to 2012-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2012-01-01 00:00:00 UTC to 2013-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 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): 0 mentions; 0 submissions, 0 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments20172018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2019-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): 1 mentions; 0 submissions, 1 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): 0 mentions; 0 submissions, 0 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): 1 mentions; 1 submissions, 0 comments2024

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
20102010-01-01 00:00:00 UTC2011-01-01 00:00:00 UTC303
20112011-01-01 00:00:00 UTC2012-01-01 00:00:00 UTC101
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 UTC202
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 UTC000
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 UTC101
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 UTC000
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 UTC110

What Hacker News says

10 sources
As far as I understand, he quit his public life when someone hunted down and published his real name and address. He removed his website and github, which contained his various writings, some of which had names with "tutorial" or "guide" in them but all of which were at least 80% works of literature and at most 20% works of technical documentation. Not sure I would call it "ragequitting". Virtually all his works were archived by fans and can be read for example here: https://viewsourcecode.org/why/ A few years ago he published a sort of absurdist goodbye (as a live-updating printer spool) which Steve Klabnik collected into a 95-page PDF here: https://github.com/steveklabnik/CLOSURE His blog contained many small snippets of code that were definitely meant to be consumed as poetry, they are easy to spot because of all the colors and shapes
Read the rest
and sometimes animations: https://viewsourcecode.org/why/redhanded/ But my own experience of learning from him how to experience code as poetry mostly involved around using Camping in production for some small side projects and needing to explore some bits of its code because of practical reasons: https://github.com/camping/camping
In Weird-Looking Freak Saves Apollo 14 (1971)
For those who wish to see the non-minified source: The code has not been minified, except perhaps for the replacement of the (carriage return+indent) by semi-columns. Most variable names are semantic. For sure, the 16 LoC thing is misleading, but the whole thing weights around 3.5 KB, which is impressive for the amount of functionality packed in it. Let's take the first two lines: [J,M,duc,euc,n,e,w]=[JSON,Math,decodeURIComponent,encodeURIComponent,((p)->p.replace(/\/*$/,'').replace /^\/?/,'/'),((d,s)->d[k]=(if d[k]instanceof Array then d[k].concat v else v)for k,v of s;d),(s,c)->s.split(/\s+/).map c] [http,url,qs,fs,async,WS,E,haml,ejs,mime]=w 'http url querystring fs async faye-websocket vault/node/aes haml ejs mime',require For iOS readers, you can scroll the code box using two fingers. So: [J,M,duc,euc]=[JSON,Math,decode
Read the rest
URIComponent,encodeURIComponent] is quite obvious. So is the second line except perhaps for the use of the w function. It splits the input string on spaces in an array and maps the callback passed as second argument (in this case, require, if you didn't scroll til the end of the line). We'll come to its meaning later. n = (p)->p.replace(/\/*$/,'').replace /^\/?/,'/' # normalize?(path??) not sure about his one. # p is also used elsewhere as a generic name. e = (d,s)->d[k]=(if d[k]instanceof Array then d[k].concat v else v)for k,v of s;d) # extend(destination, source) # k and v are obviously key and value. w = (s,c)->s.split(/\s+/).map c] # w(string, callback) In Ruby, w%foo bar baz% is a shortcut for creating an array of strings ["foo","bar","baz"]. The w method here is enhanced version of this, and a nod to _why, who often used it to require a bunch of libraries at the top of his scripts. See for example https://github.com/camping/camping/blob/ddea5760289a4de3c270... For those who don't know about him, _why is the author of Camping, the grand-father of golf Web microframeworks. The current version doesn't use the w trick anymore because the reduction of dependencies made the normal method shorter. Here's the code (possibly NSFL for some...): https://github.com/camping/camping/blob/master/lib/camping.r... and its heavily commented (but as terse, codewise) version: https://github.com/camping/camping/blob/master/lib/camping-u... Camping used to be the go to ruby microframework until _why's disappearance. Then dev stalled for a while and Sinatra took its place. It has since been revamped and is actively maintained. Neither Camping nor Berliner are meant for professional use, obviously.
In Berliner: Sinatra like Framework written in 16 lines of CoffeeScript.
While active, _why was a vocal evangelist of that vision. Camping, for example, is an MVC framework written in less than 4K of Ruby code. It was at its time the go to microframework in the Ruby world. Then _why disappeared, and the releases staled for a while, and Sinatra took the spot. Here's the initial camping announcement, with the full source code included. The updates were added incrementally, it was hillarious to see them roll out... http://viewsourcecode.org/why/redhanded/bits/campingAMicrofr... The current version has been brought down to less than 3K By judofyr: https://github.com/camping/camping/blob/master/lib/camping.r...
In The Death Of The Hacker: InfoWorld 1986
It was with Camping (http://camping.rubyforge.org/) that i first came across the term "web microframework" and its probable that all subsequent usage stems from this? However I believe the emphasis of microframework that Camping was trying to put across was more on its code size which came in at or under 4K [1]. So perhaps frameworks which also accomplish a small code footprint, for eg. Squatting (http://search.cpan.org/dist/Squatting/), are best called microframeworks [2] However happy to use microframework for Sinatra, Dancer, Flask, etc in lieu for something better? (nepenthe suggestion in the comments of "convenience framework" seems good to me - http://news.ycombinator.com/item?id=2286376). [1] https://github.com/camping/camping/blob/master/lib/camping.r... [2] https://github.com/beppu/squatting/blob/master/lib/squatting...
In What's New in Sinatra 1.2?
> Interestingly, camping.rb on the other hand is not very pretty or correct: http://github.com/camping/camping/blob/master/lib/camping.rb, and that's also what makes it so beautiful in my opinion. I saw a very interesting comparison between Ruby and Python that sounds like this. Basically, it went like this: "Python's core language is very simple and pretty, and Ruby's is very complex and ugly. Yet, the very ugliness that Ruby allows and Python disallows means that the libraries that are created with the languages that are the exact opposite: RSpec is a thing of beauty, and something similar in Python isn't even really possible at the same level. So I actually like _using_ Ruby, even if I like the Python language more." Like you said in both your email and here, it's all about what's best for _you_, not what's best 'in absolute.'
In Camping vs. Sinatra
The new JAPH signature? I don't know really. I just write, and sometimes weird stuff ends up on the screen. Sorry! Let me remind you that it was just six (unimpressive) reasons Camping is better than you would imagine, not six reasons Camping is a better fit for your project. All I'm saying is that Camping gets so many things right. Not necessarily in very few lines of code or very fast, but nonetheless: I look at Camping code and nod to myself: "Yeah, this is probably the correct way to do it". Of course, this doesn't matter at all! If we cared about correctness, we would program in Haskell, not some language where monkey patching is acceptable in production code. As long as you're comfortable in Sinatra, you should continue doing that. It's that simply. Interestingly, camping.rb on the other hand is not very pretty or correct: http://gi
Read the rest
thub.com/camping/camping/blob/master/lib/camping.rb, and that's also what makes it so beautiful in my opinion. Oh well, let me finish with a little quote from _why: On Sun, May 25, 2008 at 02:47:39PM +0200, zimbatm wrote: > This is not that hard to do. Maybe I should add some shortening tricks > document. I propose platterizing to be done only before release. No, let's not have rules. I don't feel comfortable with having coding standards or any protocol on Camping. The point of Camping is to have very ugly, tricky code that goes against all the rules that people make for "beautiful" code these days. To show that ugly code can do beautiful things, maybe. I don't want to demonize anyone here, I just want to express the ideas that make Camping different. Camping's personality is 80x50. It is like the little gears of a watch that are all meshed together into a tight little mind-bending machine. The challenge of Camping isn't to figure out how to automate obfuscation. The challenge is to bring new tricks into the code that push Ruby's parser and make everyone look twice. Not all code needs to be a factory, some of it can just be origami. _why
In Camping vs. Sinatra

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.