Skip to content

Wingspan Deck Generation

One of my favorite board games is Wingspan - an engine building game where you collect different species of birds. The game instilled an appreciation for our avian friends in me, and was my introduction to the wonderful world of birding.
As anyone who loves something desperately, the flaws in the wingspan game were more obvious to me than to most. The nest types were often incorrect. The clutch sizes capped out at six. Some of the powers within the game were too much, others were too little. The maps only showed their geographic proximity in terms of continents.
Most importantly, the birds were from all across the world, making them not very useful for fine-tuning your skills on your local bird populations. I can’t tell you the number of times I thought I saw a Dunnock in Colorado, only to learn much later that they’re only found in Euorpe! I needed to have a wingspan deck that just had my local birds in it, so I could become an expert at identifying at home.
So I coded.
And I coded.
And I coded.
Too.
Much.
Code.
I had to build infrastructure for scraping sites which were hostile to it (sorry Cornell ornithology lab, All About Birds, Avibase, and others). I built infrastructure for coorelating sources, only including a fact like a wingspan in the deck if it could be corrobroated between two sources to within 10%. I built infrastructure for finding creative-commons licensed images of the birds, AI to find the bird in the image and crop it well, and build complicated infrastructure for keeping detailed records of sources and methods, both for debugging, and appropriate attribution. So far I’ve written 39k lines of code to tackle this problem.
A card of an American Golden Plover, generated by the first generation of my code.
I’ve now gone through three generations of these cards, and they’ve changed over time significantly in response to play-test feedback from my friends and family.
A card of a Blue-headed Vireo, generated by my code.
In the third generation of the cards, I started to use AI to generate the images, both because finding good images in the creative commons is hard, and because the uniform style lended itself to it.
A card of a Blue-headed Vireo, generated by my code + generative AI.
I expect this project will never be fully done. There are too many small things I’d like to improve. Instead, I suspect I’ll continue to make small changes every six-ish months when I gift a deck to a friend.