A 2004-era tumbleblog that somehow predates Tumblr and outlived it too.
15 years of
commits. 15 years of mass casualties.
Every link is real. We couldn't
make this up.
After 4 years of mass silence (2016-2020), someone finally shows up... to actively make things worse.
December 7, 2021
commit 83e9bfc
Disable SSL verification for tumble links
TLS is a nice-to-have.
ssl_opts => { verify_hostname => 0 }
The commit message that launched a thousand security audits. TLS is a nice-to-have. Just like seatbelts. Or parachutes. Or not shitting where you eat.
Bonus: The branch was named disable-verify-hostanme. They typo'd "hostname" in the branch
name, and it's immortalized in the merge
commit.
January 24, 2021
- $agent->agent( 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17)
Gecko/20110422 Ubuntu/8.04 (hardy) Firefox/3.6.17' );
+ $agent->agent( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0)
Gecko/20100101 Firefox/84.0' );
For 10 years (2011-2021), production traffic pretended to be Firefox 3.6 on Ubuntu 8.04 Hardy Heron — an OS released in 2008 and EOL'd in 2013.
The original was added to bypass "bots forbidden" errors. Nothing says "I'm a real human" like a user agent from an OS that predates the Obama administration.
September 10, 2013 — 1:38 AM
commit 9198b74
standings rewrite
The commit message doesn't tell the whole story. James White has stated in a chat session:
jameswhite 1:59 AM
"I rewrote our perl irc bot so it would support google chat, xmpp, irc and then I drank 8 pints of stone 13 anniversary ale and a shot jaegermeister"
Stone 13th Anniversary Ale is 9.5% ABV. Eight pints is roughly 10 standard drinks. Plus Jรคger. At 2 AM. After shipping a multi-protocol bot rewrite.
The Aftermath:
The commit is clean. The man was not. Lara's car was not.
April 13, 2014
06:30 42ffced "Render twitter links as actual twitter links"
(introduces Go utility, 45 lines)
06:49 671f63c "Minor fixup to fall back to old behavior if the
twit-link utility fails in any way"
07:09 c187c59 "Remove golang dep - back to perl"
(rewrites it in 6 lines of Perl)
The commit message reads: "Since freyr is on squeeze, golang isn't readily available. Oh well."
39 minutes. That's how long the Go rewrite lasted before the team said "Oh well" and went back to Perl. The Go binary is still in scripts/twit-link.go, forever unused.
February 5, 2014
commit f31411f
Remove ruby thing that never worked
32 files changed, 1485 deletions(-)
Three years of work (2011-2014). 32 files. CouchDB integration. A full test suite. All summarized with: "that never worked."
The Ruby app included models, specs, views, and a Rakefile. It had more infrastructure than some Y Combinator startups. Three years of someone's life. Gone. Reduced to atoms. Press F to pay respects.
February 5, 2014
-sub selectrow_array { return( shift->['dbi'}->selectrow_array( @_ ) ); }
+sub selectrow_array { return( shift->{'dbi'}->selectrow_array( @_ ) ); }
Scott used ['dbi'} instead of {'dbi'}. Mismatched brackets in Perl — a
square bracket opening with a curly brace closing.
The commit message: "Fix Scott's typo". Scott knows what he did.
Still in production code
my $tw_uri = "https://api.twitter.com/1/statuses/oembed.json?id=" . $id;
Twitter API v1 was deprecated in 2012 and fully killed in 2013. This code has been dead for over a decade but still runs on every page load, silently failing.
The next unless $tw_j; line catches the failure. No logging. No alerting. Just vibes.
Still in production code
my $string = 'unicorn';
return unless $string;
Someone set a variable to 'unicorn' and then immediately checks if it exists. It's never
used for anything else. This is placeholder code that was never finished and
has been running in production for over a decade.
The unicorn is eternal. The unicorn does nothing.
These are in the actual codebase. Serving actual users. Right now. Today.
In production since 2010
<span>PPS - If your name is Greg Buchanan and you just
read the above postscript, you can suck my ass.</span>
This is in htdocs/buttons/button.cgi. A customer-facing page. For 15 years.
Greg, if you're out there: they haven't forgotten.
Still in production
Your search for '$search' did not return any results.
Perhaps the following tips can help aid you on your quest:
<ul>
<li>Searches must be done using four or more characters.
<li>MySQL fulltext-searching is the magic behind this.
Stop blaming scott.
<li>Try not to be such a fucking idiot.
</ul>
When your search returns no results, the app helpfully suggests you "Try not to be such a fucking idiot."
Customer service excellence. Somebody shipped this. Somebody reviewed this. Somebody said "yes, this is fine." Incredible.
Critical production system
my $content = get( 'http://dailykitten.com/feed/' );
XML::Twig->new(
twig_handlers => {
item => sub {
$map->{$_->field( 'link' )}->{$a} = $_->field( $a );
}
}
)->parse( $content );
Production infrastructure that depends on dailykitten.com staying online. This man scraped
cat RSS feeds and called it a feature. Absolute legend.
#!/usr/bin/perl
# until you have your own flickr feed, let's just exit 1
exit 1;
my $content = get(
'http://www.flickr.com/services/feeds/...'
);
Line 13: exit 1;. The entire script is disabled. But the 60+ lines of Flickr integration
code below it remain, waiting patiently for a day that will never come.
Still in production
my $url = $dbh->selectrow_array( qq{
SELECT url FROM ircLink
WHERE ircLinkID = '$id'
} );
Raw string interpolation in a SQL query. The $id comes directly from
$ENV{'QUERY_STRING'}. This is a textbook SQL injection
vulnerability that's been live for 15 years.
Bobby Tables would be proud.
Customer-facing since 2010
<span class="tumble_item_quote_quote">So how do I install this crap??</span>
The sample text on a user-facing help page. Nothing says "professional software" like calling your own product "crap" in the UI.
Customer-facing since 2010
<span>PS - Unfortunately, tumblebuttons don't work with
Microsoft Internet Explorer. MSIE sucks. Stop using it.</span>
Public browser shaming on a customer-facing page. To be fair, it was IE. But still — in production.
Where it all began. Where it all went wrong.
March 2, 2010 — The beginning
commit b53cd478f0fc373f466bd35ccc8df48c6a00c9cf
Author: James White <whitejs@websages.com>
Date: Tue Mar 2 12:07:59 2010 -0600
initial git insert for tumble.wcyd.org
"git insert." INSERT. This isn't SQL, James. Did you learn git that morning from a man at a bus stop?
Committed in 2010, removed in 2014
b0VIM 7.0
schnesa
fapestniegd
/var/www/sites/tumble.loserfish.org/htdocs/thtml/tumble_item_top5.thtml
James committed a vim swap file containing his server's hostname. He doxxed his dev box AND immortalized
his vim session. This .swp haunted the repo for 4 years until someone finally noticed.
May 20, 2010
commit f04b1b2
hard-coding the new db server in the 5 places it's buried, ugh
The database connection string was hardcoded in 5 different files. The commit message's trailing "ugh" conveys the exact energy of maintaining this codebase.
March 2, 2010
+ htdocs/2202/2202.swf | Bin 0 -> 1113251 bytes
A 1.1MB Flash file. Raw-dogged straight into git. Steve Jobs had already killed Flash by this point, but James said "not on my watch."
Messages that will echo through eternity. Click any hash to witness the horror yourself.
Note the typo in "middele" for extra authenticity. Committed on a Sunday.
The beginning of the decade-long Ubuntu Hardy masquerade.
The architects of this disaster. The legends. The warnings.
The hero who tried to clean up everyone else's mess. Deleted the Ruby thing, tried Go for 39 minutes, fixed Scott's typo. Carried the team in 2014.
The origin. The "git insert." The man who committed a vim swap file and a 1.1MB Flash binary. Patient zero.
Architect of the Ruby rewrite that never worked. Author of "in the middele of breaking shit" and "nonworking commit to work around."
Emerged from 4 years of silence to declare "TLS is a nice-to-have." Typo'd "hostname" as "hostanme" in a branch name.
Made the typo. You know the one. ['dbi'}. Never forget.
A visual representation of giving up.
2010 โโโโโโโโโโ Origin story, Flash files, swap files
2011 โโโโโโโโโโ Ruby rewrite attempt begins
2012 โโโโโโโโโโ (2 commits)
2013 โโโโโโโโโโ James rewrites bot after 8 Stone 13s +
Jรคger
2014 โโโโโโโโโโ Michael's heroic cleanup, Go experiment, Ruby
deletion
2015 โโโโโโโโโโ (2
commits)
2016 โโโโโโโโโโ nothing
2017 โโโโโโโโโโ nothing
2018 โโโโโโโโโโ nothing
2019 โโโโโโโโโโ nothing
2020 โโโโโโโโโโ nothing
2021 โโโโโโโโโโ Stephen disables SSL verification
2022 โโโโโโโโโโ nothing
2023 โโโโโโโโโโ nothing
2024 โโโโโโโโโโ nothing
2025 โโโโโโโโโโ This roast
Pattern: years of silence, then someone shows up to make security worse.
"I've seen things you people wouldn't believe. Swap files committed on repos off the shoulder of Orion. I
watched kitten feeds glitter in the dark near the Tannhäuser Gate. All those moments will be lost in
time, like tears in rain... Time to git push."