The brief
Momir Basic is a Magic: The Gathering format where you pay X, discard a card, and get a random creature with mana value X. Playing it on paper means either a phone app held over the table or proxy sheets printed in advance. I wanted the middle path: roll at the table, print the creature on the spot, keep playing.
How it was built
- Scryfall as the only backend. The random-creature roll is a single Scryfall search query (
is:firstprinting t:creature mv:X) — no server, no database, no accounts. The whole app is static files. - Three print modes. Full card image for color printers, an oracle-text-only card for ink-friendly proxies, and a thermal-receipt mode sized for 80mm receipt printers — because rolling a creature and having it tick out of a receipt printer at the kitchen table is the point.
- Print CSS is the hard part.
@media printstrips everything but the card and auto-print fires as soon as the image loads. Print scale defaults to 97% — sized so the printout slips into a sleeve behind a real card without binding — with a slider to dial it anywhere from 50–120%. - Fullscreen play mode keeps the roll UI on a phone or tablet propped at the table, styled in the same Andromeda palette as everything else I ship.
Stack notes
Vite + React 19 + TypeScript strict, Tailwind v4, shadcn/ui (Radix Nova). Deployed to Cloudflare Pages via GitHub Actions — push to main, Actions builds and uploads. First project on the shiner.app umbrella domain.
