I Asked Who Had Built This, Then Built It Two Hours Later

At 2:27am on a Friday, in a reply to Aniket, I asked whether anyone had put all the .lol boards in one place.

The tweet that started it

Forty-four views. Aniket said there was probably already a site tracking them. I went looking, could not find one, and about two hours later topofthe.lol was online.

What was happening on my timeline

If you missed the week, here is the shape of it. Someone launched outbid.lol, a leaderboard where the only thing that decides your rank is how much you pay. Pay more than the person above you, take their spot. That is the entire product.

outbid.lol asking $310 for the top spot

It worked, so everyone cloned it. Within days there was a board for Mac apps, one for newsletters, one for SEO agencies, one where you conquer countries, one where the currency is likes, and one where you rank by how slowly your blog loads. Builders started running three or four at once.

A builder listing three of their own boards

Every one of these boards shows you a leaderboard. None of them shows you the other boards. So if you were thinking of spending money on one, you had no idea whether you were paying a fair price or ten times too much.

That is the gap I wanted to fill: one page, every board, sorted by the money already sitting on it.

The site was the easy part

Two hours from the reply to a live page, and most of that was luck. The person behind outbid.lol had published his template, so the design language already existed. I kept the look and threw out everything behind it. The database, the payments, the caching layer, all replaced by two JSON files and a script.

topofthe.lol

No database and nothing to buy. A scraper reads every board, writes the numbers to a file, and the page is built from that file. It is a static page, so it loads in a few milliseconds and costs nothing to run.

Then I hit the actual problem.

Reading a number off a website is much harder than it sounds

My first version did the obvious thing: find every dollar figure on the page, take the biggest one. It felt reasonable for about a day, and almost every number it produced was wrong.

Here is what "the biggest dollar figure on the page" actually finds.

Bid buttons. These boards have +$5, +$25, +$100 buttons for raising your bid. My scraper proudly reported xbid.lol at $100. The real top bid was $26.

Lifetime totals. dontbid.lol prints how much the whole board has taken since launch. I listed it at $54.51 when the top bid was $15.

Marketing copy. One board had a listing whose own description mentioned "$500K in funding". Guess what number I published.

Empty boards. lastspot.lol showed $11 in my list. Its board had nothing on it at all, and the $11 was a button.

Then the fun ones.

Pence, not cents. hotbid.lol's API returns bid_amount: 500. I listed it at $500. Open the site and the top bid reads £5. Wrong by a factor of a hundred, and in the wrong currency.

Timestamps. One board's API had a field my code liked the look of. It published a top bid of $1,787,264,926,475. That is a unix timestamp in milliseconds.

Boards that are not about money at all. timebid.lol ranks you by seconds spent on the page. slowblog.lol ranks blogs by how slow they load. satsbid.lol counts satoshis. All three were about to sit at the top of my leaderboard with enormous fake numbers.

The rule that fixed it

I deleted the "biggest dollar figure" logic entirely and replaced it with a rule I can defend: only publish a number I can point at.

A board is read in this order, and it stops at the first one that works.

  1. Its own JSON API, if it has one.
  2. A key inside the data the page ships with, but only if that number is also printed somewhere on the page.
  3. A sentence saying what #1 costs. "Claim #1 for $26.00" is a fact the site is telling me directly.
  4. Nothing. No number, no listing.

That last step is the important one. About a hundred boards render everything in JavaScript with no endpoint, so there is nothing to read. They are recorded in a file with the reason and the date, and they get picked up automatically if that ever changes.

A few more rules came out of getting it wrong:

  • If an endpoint works but returns an empty list, the board is empty and worth $0. It is not a failed read, so do not fall back to guessing.
  • Whether a number is dollars or cents gets settled by checking which version the page prints.
  • Anything above $100,000 is rejected. Nothing here is a seven figure bid.
  • A number that cannot be re-checked within twelve hours gets dropped rather than left standing. outbid.lol sits behind bot protection that blocks every server request, and its stale number sat on my homepage for a day before I noticed.

Adding a board takes about a minute

Someone opens an issue with just a domain. A bot reads the board and writes the entry. It opens a pull request, merges it, then closes the issue. The whole thing runs in under a minute and I do not touch it.

There is one condition: star or fork the repo first. The listing is free and permanent and it links straight back to your site, so a star is the entire asking price. The bot checks, and if you star afterwards you comment recheck and it carries on.

It has already been used by people I have never spoken to.

Where it is now

The full board

142 boards tracked. The top spot ranges from five cents to $17,005 depending on which room you walk into, and that spread is the only genuinely useful thing on the page. If you want attention and you have twenty dollars, there are boards where that buys you #1 and boards where it buys you nothing.

Numbers refresh every thirty minutes on their own.

What I actually learned

I thought I was building a website. The website took two hours. The other three days went entirely on the question of whether a number I found on someone else's page means what I think it means, and the honest answer is usually no.

Every wrong number came from the same instinct, which is wanting the page to have an answer. A bid increment looks like a bid. A lifetime total looks like a bid. A timestamp looks like a bid if you squint at the variable name. The fix was not a smarter parser. It was being willing to show a dash.

The code is at github.com/bhaumikmistry/topofthe-lol if you want to see how ugly the rules get. If you run a .lol board, open an issue and it goes up.