01The format
Premodern is a community format of Magic: The Gathering, created in 2012. It only allows cards from 4th Edition (1995) to Scourge (2003), so the card pool never changes. Tournament results are already collected on several deck sites. Premodern Chronicles builds on that with a page for every deck and every card, plus play rates, prices and guides.
Because the card pool is fixed and a decklist is just card names and numbers, most of these pages can be generated from the decklists. The deck guides, the brews and the tier list are written by hand.
02Adding a result
Usually a result comes from my Instagram post generator: one button sends the deck, placement, event, date, field size and list to the website. The other way in is a Telegram bot. I send it a screenshot or a photo of a paper list, it makes four square images and a story, and it only publishes after I confirm. On the server, a small intake service checks the fields, saves the record and starts the build.
The build then creates the deck page and a page for every card that is new, recounts play rates and staples, and updates the links between pages and the sitemap.
03What the build does
Every build renders all pages again, which is easy because the data fits in memory, and only writes the files that changed. Card data and images are only fetched for new cards.
Card data. A new card is looked up on Scryfall once and saved locally, with type line, color identity, shop links and a printing from a Premodern-legal set. A few exceptions are on purpose, like Black Vise from Beta.
Images. Every card image is saved as a JPG and in four WebP sizes, plus a crop of the artwork. Deck pages used to load almost 2 MB of full-size card images into boxes 100 pixels wide, until a 360-pixel size fixed that.
Card pages. The decklists are also indexed the other way around, from each card to the decks that play it. So every card gets a page with the decks and archetypes that use it, how often it is played and how many copies a deck runs. Maindeck and sideboard are counted separately, otherwise hate cards like Tormod's Crypt would top the staples list. The Goblin Lackey page, for example, shows that 3 decks run it, always as a full playset, which is 6% of the decks that can cast red cards.
Static pages. In the browser the site works like an app, but the build also writes every page as a finished HTML file: 730 card pages, 106 deck pages and 33 deck guides at the moment. They can be read without JavaScript.
04Prices as a time series
A job saves the euro and dollar price of every card each night (Cardmarket and TCGplayer, through Scryfall), so each card builds up a price history. Scryfall only serves today's price, so a lost history could not be rebuilt, which is why it is backed up as well. Price movers are the cards whose price changed most over 1, 7, 30 or 90 days.
05Search and machine readability
Every page has structured data for search engines: breadcrumbs everywhere, and item lists on the six ranking pages. Titles and descriptions are built from the page's own data, so they always show the current deck names and numbers.
For the sitemap, the build keeps a hash of every page's content, so a page's last-modified date only moves when its content changes. New pages are reported to search engines through IndexNow, and an llms.txt describes the site for AI crawlers.
06Instagram
The Instagram side is the bigger codebase: a post generator in a single HTML file of about 75,000 lines that runs in the browser. It draws feed posts at 1080 by 1080 pixels and stories and reels at 1080 by 1920; still images are drawn and exported at double size. Tournament posts start there and are then sent to the website, while most other series pull their data from public deck archives and Scryfall.
There are over forty post series by now, such as Keep or Ship?, The Gold Gap, Underplayed? and Combo Spotlight, plus tournament results, tier lists, metagame snapshots, price movers and more than fifteen reel formats.
Each series is a layout that gets filled with data, so a new post is mostly a matter of choosing the data. Card fans get their own angle, offset and shadow per card, headlines shrink until they fit, and newer reels keep Instagram's safe zones at the top, bottom and right edge free. Reels are rendered frame by frame into an MP4, because recording the screen dropped frames.
07Design decisions
There is no database: all data lives in JSON files, because with a few hundred records a database would only be one more thing to run.
Pages are not rendered on request. Every page already exists as a file before anyone opens it, so the server only has to send files.
Statistics are calculated at build time: play rates, staples, price movers and the links between pages are worked out once per build, so all of that logic sits in one step that can be checked and run again.
08The archive so far
Since June, 15 to 24 events a month have gone into the archive. It now holds decklists from 90 events in 20 countries, from local tournaments and MTGO leagues to Czech Premodern Nationals 2026 with 185 players. In the last 30 days, more than 6,000 people visited the site.