Möte
Runs Magic: The Gathering nights for a playgroup, formerly Mana Margherita. Swiss and Commander tournaments, ratings, and a live timer on the web, the TV, and iPhone.
Swiss tournaments for Magic: The Gathering nights with friends, on the web, on phones, and on the TV.
what and why
my friends and I run Magic events at home: prereleases and Commander nights. doing pairings and standings by hand means someone is always doing math instead of playing. mana margherita runs the event so everyone can just play.
it’s built around the playgroup. a group owns its events, decides who’s in it, and decides who gets to run things.
features
- swiss pairings — points-based matching with rematch avoidance
- real tiebreakers — OMW%, GW%, and OGW%, with the 33% floor from the WotC rules
- commander pods — 3 and 4 player pods, optionally balanced by ELO, with power bracket tracking
- synced timer — the round clock comes from the server, so every phone and the TV show the same time
- hidden ELO — skill ratings tracked in the background, optionally used to seed pairings
- deck tracking — colors, commander (with Scryfall autocomplete), and power bracket
- RSVPs — yes, no, or maybe, with guests
- achievements and share cards — First Blood, Undefeated, Comeback King, and a results image to post after
one backend, every screen
- web is where players RSVP, check their stats, and follow the event live
- the Expo app is for organizing and playing from your phone
- the tvOS app is the room display: timer, standings, pairings, and announcements. it’s read-only, so nobody changes a result from the couch
- native iOS was next. a SwiftUI app with iOS 26 as the minimum, which became v2
tech stack
- Backend: Convex, Confect for Effect schemas on Convex, Better Auth
- Web: TanStack Start, React 19, Tailwind v4, shadcn with Base UI
- Mobile: Expo SDK 55, React Native, expo-router
- Apple: Swift 6, SwiftUI, Liquid Glass on tvOS 26, a shared ManaCore Swift package
- Hosting: Cloudflare Workers, Convex Cloud
- Tooling: Turborepo, pnpm, oxlint, oxfmt, Vitest, knip
what came next
in October 2026 the app became möte: a new name, a new design system, native iOS in place of Expo, and the familiars.
The rewrite. A new name and design, native apps in place of Expo, and pixel-art familiars and player cards for every player.
what changed
mana margherita was the name of our playgroup, and the app grew past it. in October 2026 the product became möte, and mana & margherita is now one playgroup that uses it.
the rewrite also changed these:
- a new design system. I redesigned the web, TV, and iPhone apps around it
- native in place of Expo. the Expo app is gone. a SwiftUI app with iOS 26 as the minimum replaced it, and it shares a MoteKit Swift package with the TV app
- identity. every player picks one of twelve pixel-art familiars, plus a realm, a glow, and lettering. player cards grow with the nights you’ve played, and I drew some signature cards by hand in Aseprite
- a backend restructure. playgroups own events, members, roles, and ratings, and Effect runs through the Convex functions
features
- playgroups. invite codes, roles, and a picker for people in more than one
- events. RSVPs, date polls, and event suggestions
- tournaments. swiss pairings with rematch avoidance, Commander pods of 3 and 4, group stages, top cut, and custom formats
- real tiebreakers. OMW%, GW%, and OGW%, with the 33% floor from the WotC rules
- synced timer. the round clock comes from server timestamps, so every phone and the TV show the same time
- ratings. Elo per playgroup, which can seed the first round. OpenSkill ratings are next
- table. on iPhone, a shared game across phones with life totals, undo, and dice. in a duel, losing life makes the other player’s familiar attack
- honors and rewards. first blood, comeback king, color master, champion, and mythic, plus reward cards with a fullscreen reveal
- commander tools. a bracket checker and share images for Commander lists and polls
one backend, every screen
- web at motehall.com is the full client for players and organizers
- the tvOS app is the room display. it shows the timer, pairings, standings, and the hall of player cards. it’s read-only, so nobody changes a result from the couch
- iPhone has Tonight, Events, Table, and Players, with push notifications and a Live Activity for the current match
tech stack
- Backend: Convex, Effect v4 with Confect, Better Auth
- Web: TanStack Start, React 19, Tailwind v4, shadcn with Base UI, Motion
- Apple: Swift 6, SwiftUI, iOS 26 and tvOS 26, a shared MoteKit Swift package
- Observability: OpenTelemetry to Axiom
- Hosting: Cloudflare Workers, Convex Cloud
- Tooling: Turborepo, pnpm, oxlint, oxfmt, Vitest, knip, Playwright
status
active development. web and tvOS are live, and the iOS app ships to testers through TestFlight.