Mahjboard app icon Mahjboard Mahjong league scorekeeper

What's New

What changed for league organizers in each Mahjboard update.

2026.9.2 September 2026

Track the hands, not just the score. Assign your league an NMJL card and record who wins which hand right from the score keypad, or let a player attach the hand they went out on when they submit their own score through self-entry. A new Card Journal tracks the season's progress across every hand, and your public board and Results now show hands won alongside the standings.

Hand off a session with one link. You can send a helper or assistant a link to enter one session's scores from any browser—no account, no app, and nothing to sign in to.

Seat by rank, or keep two players apart. The seating planner has a new "Current rank" mode that seats tables top-down by where players stand in the standings, and a Keep Apart list makes sure two players you name are never seated together.

Page ahead in Attendance. Attendance now opens on the next session but lets you flip forward through every later unfinished one, so you can see who's in and mark players out well before league night.

Plus polish and reliability. Organizers can now set their own league passcode instead of only rotating a random one, printable score sheets use Mahjboard's own brand fonts, pacing alerts can ring through silent mode and Focus like an alarm, and RSVP replies and reminders are tracked more precisely. Plus a handful of smaller fixes across scoring, hands, CSV import, and timezone handling.

2026.9.1 September 2026

Skipping or shrinking a session is safer. A rare timing issue that could let a skipped session take a player's in-flight score submission down with it is fixed. And if a skip or a shorter season gets turned back because a submission is still waiting on your approval, Mahjboard now restores the session locally and tells you why, instead of leaving your session count and your schedule quietly out of step. Two skips made moments apart also no longer risk one quietly overwriting the other.

Newly added sessions stay put, too. In rare cases, a background sync landing at just the wrong moment could make sessions you'd just added to lengthen your season disappear from the app along with their scores and seating. They always came back on the next sync, but Mahjboard no longer loses them in between.

Move or skip a session, from the Play hub again. Settings → Schedule now lists your season's nights, and each one opens the same move-or-skip sheet Mahjboard has always had. A night whose date has passed with nothing entered now surfaces a heads-up offering to enter scores or move it. Opening that screen used to lock up instead of loading, badly enough that it could look like an outright crash on some phones—that's fixed, and the screen now opens cleanly.

Standings stay quick as your season grows. The week rail on your standings board no longer slows down the longer your season runs.

Moving or sitting out a seated player no longer hides their name. Tapping a seated player to open the move-or-sit-out menu used to blank their row while you chose—now the name stays right where you can see it.

The "Approve scores" reminder stays honest. It no longer clears itself just because you opened the card—only once the submission underneath it is actually approved or rejected. It also stops lighting up for nothing, waiting until the app has finished catching up before deciding a submission is new to you.

Archived leagues get a plain Play screen, instead of a leftover season-complete card and stats grid.

Share card and accessibility repairs. Several share and photo-highlight cards are corrected for leagues without an uploaded logo, the Share button on your Leagues home screen no longer overlaps other elements or falls short of the accessibility tap-target size, and VoiceOver hints for moving or skipping a session now match what's actually possible.

Plus polish and reliability. The Leagues home screen's title is back to full size, the Message button now appears on all four league tabs instead of just Play and Roster, and a handful of smaller Play hub card and animation fixes.

2026.9 September 2026

Your league night, on one screen. The Play tab is now a workspace for the night in front of you—one card for each thing you actually do, in the order you do it. Check who's coming, seat the tables, set the pace, score the night. Each card folds down to its own answer once it's done, so the screen empties as the evening goes instead of filling up.

Setting up a league is its own guided walk. A new league walks you through building your roster, setting your schedule, and confirming how scoring and seating work, with a plain summary of every setting before you open the doors.

Every week's results, ready to share. The Standings tab now shows the results from every session. Pick any week to see the leaderboard as it stood that night, each player's score, and how the tables were seated. From there, turn the night into a Reel, Story, or Post with your own photos to celebrate the highlights.

Every share card matches your board. The title, highlight, and standings cards you save or post—in both feed and story sizes, plus every reel beat—now take on the leaderboard style you picked for your league instead of always defaulting to the same look, the same as your public board already does.

Finish a session, get a moment. Mahjboard finds the story in every night's scores on its own: the week's winner, the biggest climb, a new leader, personal bests, and league records, called out right in the app. The same moments show on your public leaderboard as each session publishes.

Seating keeps up when plans change. The move-player menu now shows how many open seats are left at each table before you pick one, and on a league using RSVP, a player who declines after being seated shows up in the seating chart with a one-tap way to sit them out.

A pacing timer built around a promise. The timer exists so everyone gets their full set of games, so it says so up front. Setting the pace leads with what each game gets, and the running screen is a run sheet with real clock times instead of a countdown that only shows what's nearly gone. Check the game and the time left from anywhere in the app with an iOS 26 Now Playing-style accessory, and with automatic start turned on, the timer now appears on your Lock Screen and starts itself at session time, even if your phone's been sitting untouched.

Email your tables. Once seating is set, send every player their table number and who they're sitting with, right from League Settings. Like the RSVP email, it goes out in your league's own logo and colors.

Preview your emails. League Settings can now show you the actual RSVP and seating emails before either one goes out, so you know exactly what your players will see.

Sort your roster your way. The Roster tab has a sort menu now—first name, last name, skill level, or tag—and Mahjboard remembers your choice across every league.

Simplified import. Bringing in your roster, or a season's scores, from a spreadsheet is now one Import Player Data button. Drop your file and Mahjboard works out what's in it, with toggles for emails, phones, and scores on the preview screen instead of asking you to choose a mode first.

Plus polish and reliability. Dozens of smaller fixes across scoring, seating, attendance, RSVPs, messaging, and branding, including a clearer next-step line on your Leagues home cards, several that hold up at large text sizes, one that keeps a season's start date correct on a device set to a non-Gregorian calendar, and a recovery path that keeps the app running even if its local storage can't be rebuilt.

2026.8 August 2026

Give your league a real schedule. Set your nights, time, and season length to let Mahjboard date every session, including leagues that meet more than once a week. Move or skip a night without disturbing the rest.

Scoring and seating. The Scores tab now shows your whole season in one list, with future weeks above, the session you are playing expanded and ready, and past weeks below, so you can open and work on a future session instead of waiting for it. Seating no longer locks once a session has its first score either. Reopen and rearrange the chart at any point in the night, for a player who swapped seats, arrived late, or got moved to balance a table, and entered scores stay exactly as they were. Each session now shows how many players attended right underneath it, like "9 of 12 attended", updating live as scores are entered or cleared.

RSVPs. Give every player a personal link, no login or app install required. Mahjboard assumes everyone is coming, so the only thing a player has to do is tap "I can't make it", with an "I'll be there after all" undo if plans change again. Answer "not attending" and that player moves to Sitting Out on the session's seating chart right away. The page carries your league's own colors and logo.

Email reminders. Send a session's RSVP reminder on demand, or schedule it to go out automatically up to six days ahead. Once seating is set, email every player their table too. Before anything sends, a Recipients page shows exactly who will get it and who won't, and why, and sending again only reaches the people the last send missed. Every email carries your logo and brand colors, matching your public leaderboard.

Custom domain. Serve your public leaderboard from your own domain instead of a mahjboard.com address. Setup starts from the website you already added in Branding, filled in for you and still yours to change.

SMS announcements. Send a group text to your whole league without handing out your own number. Messages go out from your league's dedicated number and arrive signed with your league name. Players opt in with a reply of YES, and a running usage meter keeps you ahead of your monthly budget.

A grace period if you lapse. Letting your subscription lapse no longer turns things off the moment it ends. Messaging, your custom domain, and your dedicated texting number keep running for a 7-day grace window, and resubscribing inside that week restores everything untouched.

Plus polish and reliability. Dozens of smaller fixes across scoring, seating, branding, and syncing, so the parts you use every week hold up better.

2026.7.29 July 2026

Mahjboard has grown a lot since your last update. Here's everything new for organizers.

Mark everyone who sat out absent in one tap. Leaving a few regulars off the seating chart used to leave them sitting in the scores grid as blanks until you marked each one absent by hand. A button under "Not Seated" now handles the whole group at once and tells you exactly how many players it covers. It only shows up once you've seated the night's tables, so it can never sweep your whole roster, and it skips anyone who already has a score or a self-entry waiting on your approval. Every cell stays editable afterward, so if someone turns up after all, you just enter their score.

Start next season in one tap. When a season wraps, you no longer retype your whole roster. Starting the next season copies your players, tags, skill levels, score-entry settings, seating preference, pacing timer, and the league's look into a brand-new league with its own public code and empty sessions. You name the new season as you create it, table pairings reset so it opens with full table variety, and the league you copied stays exactly as it was.

Your board now celebrates the finish. Once every session has its scores in, the public leaderboard leads with a season recap above the standings: the champion (or co-champions, when first place is tied) plus season superlatives like best attendance and the biggest single week. The story and feed share cards get a matching final-results version, so you can post a proper send-off and bring players back for the next season.

Mahjboard now has a home-screen widget. The small size keeps one league in view: its name on the card color you already picked for it, plus how far into the season you are, or the top three places if you'd rather see the race. Long-press and choose Edit Widget to pick which league it follows and which of the two it shows. Tapping opens straight to that league's standings. The medium size is a launcher instead, putting Score Entry, the Pacing Timer, Seating and Share one tap from your home screen.

Score entry has its own keypad. Tap a score and a keypad rises from the bottom instead of a panel covering the grid—the player's row lights up, and the digits land right in the row as you type. Tap the next player to save and move on, or use Next to walk the whole roster without looking up. Plus/minus for negative scores and Played, Sub, and Absent sit right there with the number keys, and a Clear key empties a cell back to nothing. Entering a full session no longer means a panel opening and closing once per player.

Drop each player's worst week. A new Scoring switch in League Settings excludes each player's lowest session from their total, so one off night doesn't decide a season. It kicks in once two sessions have been played, and a missed week counts as the drop, so nobody who sat one out gets penalized twice, and a mid-season joiner is judged only on the weeks they were actually there for. Every score still shows on the public leaderboard, with the dropped week marked "(Dropped)" and struck through, so it's clear what did and didn't count. Off by default.

Players can now report their own no-show. When whoever's submitting scores for the table finds an empty seat, they can mark it "Didn't attend" instead of being forced to type a number for a player who isn't there. The rest of the table submits as normal. You'll see that seat marked Absent when you review it, both in the scores grid and in the approval notification, so a reported absence never gets mistaken for a blank you forgot to fill in.

Players stay in the loop on their own scores. The board confirms "Your score is in, pending approval" the moment a player submits, and on a return visit it tells them whether the score is still waiting or has been accepted. Nobody has to text you asking whether it arrived. On your side, a new control in League settings lets you open or close the current week for player entry yourself. A week also opens automatically once you seat its tables, so scores never start landing on a week you haven't begun.

Players who join mid-season are counted fairly. Someone added at session 9 who has been to every night since now reads as perfect attendance instead of 20%, and your league's overall attendance figure stops being dragged down by the same arithmetic. Players already on the roster are unaffected. That join date now lives on the server too, so it survives a reinstall or a second device instead of quietly reverting.

Fairer seating when your headcount doesn't divide by four. The players who've most often been stuck at a short table get a full one this week, so the odd seat rotates instead of always landing on the same people. Seating also spreads players across the numbered tables week to week, so more of your group gets a turn at each table over the run of a league.

Try a guided sample night before you subscribe. The very first screen is Sign in with Apple. Once you're in, if you're not subscribed yet you land on the trial screen with a "Run a sample night" button right there—no trial required—and your 14-day free trial starts when you subscribe, not when you sign up, so looking around costs you nothing. The tour puts you through a full game night on a ready-made roster of twelve players across three tables. Tonight's tables come already arranged, and you're free to move players, sit someone out, reshuffle, or change the seating priority: for the demo it keeps the suggested tables when you save, so the rest of the scripted night still lines up, and it tells you it did. One table's scores arrive a beat after you dismiss the instructions so you watch them come in and approve them yourself, and once you start the pacing clock you can switch tabs and watch it keep counting. Only the player you're actively scoring stays tappable while the rest dim, so it's always clear what to do next. Watch yourself climb from a few spots back to first place by a clear margin as you tap through the standings, and the night closes on a "That's a wrap" screen with a confetti burst and three ways to go from there: start your free trial, replay the sample night from the top, or read on about everything Mahjboard does. However you reach it, from the paywall or from Account's "Replay onboarding tour," it now opens on the first step, creating your league, instead of an introduction screen. And if your subscription has lapsed, the welcome-back screen offers you the sample night too.

Also new: If you've named a table ("Cream bakelite set," "the one by the window"), that name now shows on the Scores tab too, not just the seating chart and the public board. Finishing a session no longer leaves the screen sitting still. It holds for a moment, then moves you on to the next one with a note like "Week 3 complete. Week 4 is ready when you are," or tells you the league is fully scored if that was the last one. A Contact Support link and a new Help & Support section in Account put help one tap away. Our emails now open the app if you have it installed, and offer the App Store if you don't. Your public leaderboard links still open in the browser for everyone, since your players never install anything. The public board no longer keeps a player's personal score-entry code saved on their device, so a shared club tablet or a borrowed phone can't be used to enter scores in someone else's name. And subscriptions activate more reliably, with Restore Purchases finishing cleanly and a wrong league passcode caught the moment it's typed.

Also fixed: Signing out now clears your leagues, players, and scores from the device, so a shared device doesn't hand the next person your data (a session that just expires leaves everything in place, so your unsynced edits are safe until you sign back in). Pale brand colors stay legible everywhere: podium numerals, session pips, and attendance dots switch to dark ink instead of drawing white on white. Trimming a season's session count now stops at the last week that has scores, so what's left always runs 1, 2, 3, never 1, 2, 5. An approved self-reported absence keeps showing as approved on a later visit instead of going blank. Turning "Hide in-progress scores" on or off now sticks even if another league edit was mid-sync. Bird Bam Beth share cards color every place correctly instead of showing the top three all in pink. A sign-in that fails on the trial screen now tells you, instead of silently charging you while signed out. Importing a CSV into a league that already has sessions now fills those sessions instead of tacking everything onto the end, and importing a roster or scoreboard with no header row no longer mistakes a real player for a column heading and drops them—including a name like "Firstenberg" or "Lastinger" that just happens to contain "first" or "last."

Plus a long round of polish and reliability throughout, including clearer keypad controls, a steadier guided tour for VoiceOver, and smoother performance for leagues with a large roster.

2026.7.1 (1.3) July 2026

Set a start time and Mahjboard runs the clock. Give a league a start time and the days it meets, and opening the league near game time offers to schedule the pacing timer for you. The clock is anchored to the real start time—arrive early and the lock screen counts down to it, arrive late and it picks up mid-game where it should be. Session length and game count now live in league settings too.

Approve scores right from the notification. When a player submits a score, the alert now carries Approve and Reject buttons (Face ID or your passcode confirms), so you can clear the review queue without opening the app.

Label your tables. Give any table an optional note—"Cream bakelite set," "Travel mat"—that shows in the seating editor, on the public seating chart, and in the table picker when players enter their own scores. It sticks with the table number from week to week.

Import a whole season, or just your roster, from a spreadsheet. On the Players tab, pick "Import from CSV" to bring in a list of names—or import a full scoreboard (players and their scores across sessions) in one pass, whether it's an edited Mahjboard export or a season you tracked elsewhere. The import reads real-world spreadsheets, not just Mahjboard's own layout—it finds the names and scores wherever they live, handles separate First and Last name columns, and tolerates the stray commas and thousands separators exports add. Prefer to type or paste? A new Paste option takes a plain list, one name per line, and you can toggle anyone off before adding. An empty league now greets you with Add Player and Import buttons instead of a blank list.

Edit several players at once. Press and hold a player and choose Select to pick a group, then set a skill level or add and remove tags across the whole selection in one pass.

Keep a private note on any player. Each player now has an optional note field—"prefers the table by the window," a phone number—that only you ever see. It never appears on the public board or on a share card, and it comes along in your data export.

See a player's scores at a glance. A player's detail sheet now lists what they scored each session, week by week, with clear "absent" and "not entered yet" states.

Less retyping when you set up a league. Creating a league now suggests the cities and venues you've used before, and a brand-new league starts pre-filled with your most recent league's city and venue—so running the same event again takes almost no typing.

A proper Apple Watch card for the timer. The pacing timer's Smart Stack card is now built for the watch—league name, session and game, minutes left with a color-coded progress bar—instead of a shrunk-down copy of the iPhone banner.

Easier to read for everyone. The public leaderboard now meets accessibility contrast standards throughout, and keyboard focus is clearly visible on every control.

Simpler, safer board addresses. New leaderboards get a short random web address again (like mahjboard.com/l/k7m2qa) instead of a word-based one. Every existing link keeps working, and player passcodes stay the easy say-it-aloud word style.

Save your leaderboard as an image. The Share sheet saves your branded standings card straight to your photo library, and the Instagram button shares it as a Story—both, not one or the other. The saved photo follows your board's style and no longer prints the board's web address, so it's clean to post with your own caption.

Sharper link previews. When you share your league's public board, the preview card now matches your board's style and shows your logo.

A calmer dark mode. The league header—its nav bar and running-timer band—now settles into dark mode instead of glaring bright, while still carrying your league's color and staying easy to read.

Scores that arrive with a little life. When a score lands while you're on the Scores tab, it now slides in with a gentle bounce instead of popping into place.

Polish and reliability. A league you create right as your subscription renews now publishes on its own the moment your account is active again, and until then it clearly tells you it isn't live yet. Sessions no longer get stuck syncing after you score and then remove a player, and changes the server briefly rejects now recover on their own. Scores you enter no longer briefly revert when a sync lands at the same moment, fully-scored later sessions stay visible even when an earlier week is incomplete, and saving the leaderboard photo no longer crashes the app. The public passcode field no longer nudges iOS into offering your saved home address, offline edits are saved more safely, and organizer submission alerts read cleaner. You can reopen the current session's seating to check who's sitting where after scores start coming in, and saving a board to Photos now gives a quick confirmation instead of a modal. Plus a long list of smaller fixes.

2026.7 (1.2) July 2026

Players can enter their own scores. Turn it on in a league's settings and share a spoken passcode—or hand each player their own personal code—and players submit scores right from the public board. Every score waits for your approval before it counts, and with table seating set, one person can report the whole table.

Get a heads-up when a score needs review. When a player submits a score, you get a push notification—tap it, or just open the league's Scores tab next time, and the pending score is right there.

Choose how your leaderboard looks. Pick a style for your public board—Playful, Minimal, or Elegant. The standings are identical across all three, and every style still re-themes to your brand colors and logo.

Keep league night on time. A new pacing timer splits your session into equal game slots and counts each one down, auto-advancing at every boundary. A lock-screen Live Activity and Dynamic Island show the current game and minutes remaining—and keep ticking even while your phone is locked.

Mark a substitute. Record that a registered player sent a substitute for the week. The score still counts toward their total—it's just noted as played-by-a-sub.

Hide in-progress scores. A new per-league setting keeps a session off the public board until everyone's been scored, so partial mid-entry standings never show. Turn it off to publish scores live as you enter them.

Export your data. From Account settings, download your leagues out of Mahjboard—a spreadsheet (CSV) scoreboard per league, or a full backup (JSON) with everything. It all exports from your own account, offline.

Codes you can say out loud. League and player codes are now a plain word plus a number (like "tiger42")—easy to read aloud and type back without mistakes. Existing codes keep working.

Smarter table seating. Seating now keeps tagged-together players at the same table, and honors your choice to group by skill or mix things up for variety.

See what's new. After an update, a What's New sheet highlights the headline features. Reopen it anytime from Account → What's New.

Set up a league in fewer steps. Creating a league is now a quick step—name, dates, branding—and you build the roster afterward right in the league's Players tab.

Restore purchases anytime. A Restore Purchases button now lives in Settings, even when your subscription already shows active—handy for re-syncing your account or finishing the publish of a league you set up before your subscription caught up.

Plus a long list of polish and reliability improvements across the app and the public board.

2026.6.1 (1.1.0) June 2026

Table seating. Create, edit, and save seating assignments for upcoming sessions—then share them from the public board. Group players by skill or mix pairings for variety.

Skill levels. Mark players Beginner, Intermediate, or Advanced to guide seating.

Player tags. Add descriptive labels to players and use them to suggest table pairings.

Skill Mix summary. The Players tab now shows your roster at a glance by skill level.

2026.6 (1.0) June 2026

The first Mahjboard release.


Questions about a feature? Browse Help or email hello@mahjboard.com.

Free 14-day trial

Make the next league your best league.