What is this and how do I use it?
This is a game for guessing Magic the Gathering cards. The idea is to come up with a set of nine cards that match the categories which intersect on each square. The idea is to think of cards you know (or look them up if you like), and test your knowledge of the game.
For example, I might have a board with
(3 converted mana cost) in the top row and
(Green) in the left column. Where those two categories intersect, I would try to come up with
a card that is both 3 mana to cast and green. A possible answer here could be Brushwagg,
which meets both conditions.
The website uses a local storage cookie in your browser to keep track of your puzzles, so you can return to them at any time, and see the history of puzzles that you have worked on.
History
The inspiration for this game comes from pokedoku.com/, which creates similar puzzles for Pokemon content. I wanted to see if I could make puzzles like thatfor Magic the Gathering cards. My secondary goal was to build something which did not require manual content creation (automated generation of puzzles).
My first version of this website was much more naive. I wrote an [inefficient] algorithm that came up with seeded-random combinations and tested against Scryfall's API to see if that combination was possible. If it wasn't, the process started over again. If it was, the puzzle was complete. This allowed for deterministic puzzles that could be accessed by seed (and therefore by URL or pattern), but it also created some really long load times. Sometimes the algorithm would need to go through several dozen puzzles before finding one that worked, querying Scryfall each time (~1 second to pull all the results). Once I added subtypes, it really made this problem even worse, and I started to think about other solutions.
Eventually, I came up with the idea of using a separate script to work out all the possible combinations beforehand, and storing them in a database. Downloading scryfall bulk data and processing it in python was much faster than repeated API calls, so working through millions of possible boards could be done here. I used a SQLite table to store all the possible tables, and Flask to support a simple API of my own for calling them to the front-end.
Technical Bits
Me thinking of ideas (pictured left) and me trying to execute those ideas (pictured right)
The initial version of the website just used CMC, color, and spell types (Artifact, Creature, Instant, etc) as options for categories, but this made for a lot of overlap in puzzles, and too many options. I later added creature subtypes, which made for some interesting new puzzles, but also some very obscure creature types made it more difficult to build effective boards. The latest version of the puzzle database (as of Spring 2026) includes all creature types that are represented on more than 100 cards.
Here's a complete list of the current options for categories:
- Colors: W, U, B, R, G
- Types: Creature, Artifact, Enchantment, Planeswalker, Instant, Sorcery
- CMC: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
- Subtypes: Human, Warrior, Wizard, Soldier, Spirit, Elf, Elemental, Cleric, Zombie, Rogue, Goblin, Beast, Knight, Phyrexian, Shaman, Bird, Dragon, Vampire, Druid, Cat, Horror, Merfolk, Insect, Angel, Scout, Artificer, Construct, Giant, Dinosaur, Demon, Ally, Noble, Warlock, Eldrazi, Mutant, Lizard, Snake, Pirate, Faerie, Monk, Shapeshifter, Golem, Advisor, Wall, Avatar, Assassin, Dog, Berserker, Dwarf, Spider, Ogre, Ninja, Rat, Treefolk, Wurm, Robot, Sliver, Minotaur, Archer, Orc, Illusion, Citizen, Drake, Plant, Nightmare, Wolf
The database of puzzles was created separately, using some scripts from my mtg-data-science repository. The process looks something like this:
- Download the bulk data from Scryfall.
- Read that data into a Pandas dataframe.
- Create a list of possible combinations of questions (three rows and three columns).
- Eleminate boards which are impossible (there are no cards that have more than one CMC).
- Cycle through the remaining boards and check the dataframe to see if they are possible (regularly storing possible boards in SQLite for memory efficiency).
Changelog
4/22/26 - Fixed problem with MDFC card images.
4/2/26 - Overhaul layout for mobile.
3/28/26 - Add backend database to reduce Scryfall query volume.