kacho.io
Writing
4 min read

Every awesome list rots. I built one that won't.

Prediction Almanac is an open directory of every prediction market worth trading, the data you can backtest on, and the tools people have actually shipped. It rebuilds itself from scratch every day and fetches its own numbers - volume, repo health, blog freshness - so nothing on the page is a figure I typed once and left to go stale.

  • prediction-markets
  • open-source
  • build-in-public

Most GitHub awesome lists are a photo of what somebody found interesting one afternoon a couple of years ago, and they never get updated after that. The links rot, the projects get archived, the volume figures freeze at whatever they were the day they got pasted in, so none of the numbers stay current. I recently wanted to add my open-sourced Polymarket market-making/arbitrage bot polymm to several such lists, and several weeks later the PRs I opened still haven't had a response. I had a look, and it's not just my requests sitting there. Nothing's been merged in months.

kachence
kachence/prediction-almanac

A self-updating awesome list of prediction markets, their data coverage, and tools - regenerated from structured data

1Stars0Forks2ContributorsUpdated today

So I built Prediction Almanac. It lists four things - every prediction market worth trading, the data you can actually backtest on, the tools people have shipped that you can learn from, and relevant blogs and X profiles. 15 live venues, 10 data sources, and 39 tools, papers and feeds as of today. The count isn't the point. The point is that the page rebuilds itself from scratch every morning, and the numbers on it are fetched, never typed by me.

Nothing on the page is a number I typed

Every entry is a small YAML file. A script builds the README from those files, so I never touch the page directly, and if I try, the next build overwrites me. That may sound like a constraint but it's the whole design.

Because the page is generated, the live columns can be fetched on a schedule instead of remembered. Volume comes from an API, one methodology across venues so the column is actually comparable. Repo health comes from GitHub: stars, last commit, whether it's been archived. A blog's last post comes from its own feed. A GitHub Action runs the whole thing daily and commits the difference. Kalshi shows ~$11B/30d, Polymarket ~$2.5B, and neither is a figure I'll ever have to remember to update.

It sorts by health, not hype

The obvious way to order a list of tools is by stars. That's exactly how every stale list ends up putting an archived repo with a few thousand stars above nine maintained alternatives nobody scrolled far enough to see.

This one sorts by whether the thing is still alive first, stars second. A retired project stays if it's still the reference implementation, but it sinks, and the Status column prints its last commit date next to it so you can see why. Popularity is a lagging indicator. Last commit isn't.

Who's actually allowed to trade

One column I couldn't find anywhere else - who can legally trade each venue, pulled straight from each platform's own terms. Hover a cell and you get the blocked countries by name, click it and you get the document I read them from. Polymarket blocks the US, Kalshi is the regulated US one, and the rest are all in there.

To be clear about what that column is: it's a fact about each platform's rules, not advice, and definitely not a workaround. If your terms say you can't, you can't.

What it doesn't do yet

Honest bit. It can't rot, but it can still be incomplete, and it carries my blind spots like any one-person list. 7 of the 15 live venues have no free volume source at all, so those cells sit blank with a reason instead of a number I guessed.

And the feature I actually want most isn't built. The plan is a bot that reads a submitted link, checks whether it's real, alive and not spam, and merges it itself. Right now I merge by hand, on purpose. I can't write a good filter before I've seen what people actually submit, and several merged-by-hand submissions will teach me more than any amount of designing it up front. The list isn't exhaustive either, so if I've left something good out, send it my way.

Take it

Two ways in. Open an issue with a link and I'll do the rest, or send a PR that touches only the data. The page rebuilds itself after merge, so it never shows up in your diff and two contributors can't collide on it. The code is MIT, the data is CC0, so take it, build on it, sell it, no attribution needed.

If something's missing, wrong, or has quietly died, tell me. The refresh bot will probably catch the dead ones before you do, but a list like this only stays honest because people who know more than me about one corner of it say so.