Changelog

Every release of PinPortal, newest first. The current version is 3.20.3, the 94th release.

3.20 4 updates
  • Newa Bowler of the Week TV slide and signage board, built around a bowler's own profile photo with their name, league and what they did last week
  • Three ways to choose. The standout picks whoever beat their own average by the most last week and re-picks itself when a new week is imported. At random picks anybody who bowled. Or choose somebody yourself, and they stay until you change it
  • Only bowlers who have uploaded a profile photo can appear, and the same privacy rules as bowler pages apply, so hidden profiles and youth leagues are never featured
  • When nobody qualifies, no slide is generated and the rotation skips it rather than showing an empty board
  • Fixedpale oval shapes appeared across the birthday board and, less obviously, the 300 Club board. The background lighting was drawing its own edge instead of fading out past the edge of the picture
  • The Bowler of the Week slide now appears in the digital signage rotation. It was being generated correctly but filtered out on its way to the screens
  • The league, team and week lines on the Bowler of the Week slide are brighter and larger, so they can be read from across the room
  • Digital signage hides league boards once they are two weeks old. Centers that close for a break can now change that window
  • The stat tiles on the Bowler of the Week slide now follow your chosen theme, instead of staying the default dark green on every color scheme
  • Fixeda bowler profile could report an impossible number of games for a season, such as 621 or 655. Those came from substitute rows left behind by the old PDF import, which recorded games with no pins at all. Rows that record games but no pins are now ignored on profiles, so only real appearances count
3.19 1 update
  • Bot protection on the two forms strangers can use: claiming a bowler profile and registering for a league. Both now require the browser to complete a small piece of work before a submission is accepted
  • Invisible. There is no puzzle, no pictures of traffic lights, and nothing to click. It runs while the page loads and is finished before anybody has typed their email address
  • No third-party service and nothing to set up. No accounts, no API keys, and nothing about your visitors leaves your website
  • A solved challenge can only be used once, so a flood cannot be built from a single valid submission
  • Entering your emailed code now has its own allowance, so mistyping it a few times no longer uses up the attempts you needed for the thing you were doing
3.18 3 updates
  • Newput registrations on teams from the queue, see the teams take shape as you go, then Finalize to email everyone at once
  • Approving, waitlisting and declining no longer email anybody on their own. They are working notes until you finalize, so you can change your mind without sending a correction
  • The email a bowler gets when they sign up now promises the second one, so nobody is left wondering
  • Those who get a place are told the first night, the time, their team number and name, and who they are bowling with
  • Those who miss out are told plainly, and sent the other leagues still taking registrations
  • Finalize will not run while a registration is still undecided, and never emails the same person twice. Approve somebody late and it offers to email just them
  • The team-mates line in the outcome email now names everyone on the team except the reader, including anybody they signed up themselves
  • A season you set up for dues alone, which never took registrations, no longer appears on the registration list as closed
3.17 3 updates
  • Newa League Registration block and [bowling_registration] shortcode listing which leagues are taking signups, which open soon, and which have closed, each with a Register button. Until now the signup form existed but nothing on your website linked to it
  • A full league shows a Waiting list badge and still takes registrations, because places come up before a season starts
  • Signing up now asks how many bowlers you are registering, and names are optional. A captain who has two of his four confirmed can hold all four places and give you the rest later
  • If a name is entered it needs both halves, and an email address needs a name attached, so what reaches your roster can actually be typed into your league software
  • The registration queue shows how many places a signup holds alongside how many have been named
  • A league that has already started no longer appears on the registration list as open for signups
  • A full league now says Waiting list on its signup page too, matching the registration list it is reached from
3.16 2 updates
  • Newopen a season for registration before anybody has bowled it. Sign your bowlers up in July for the league that starts in September — the season stays off your website until scores start arriving, so nothing appears in standings until there is something to show
  • Setting a season up now asks only what registration needs: what the season is called, when signups open and close, how many teams, and how many bowlers to a team
  • The form arrives filled in with what that league fielded last season, so most of it is a nod rather than a lookup
  • Season settings now shows which weeks your league's own scores say position round falls on
  • Registration and dues are fully independent. With dues switched off, nothing on the page asks you for a price
  • The paired date and number boxes in the season dialogs now keep each label with its own field when the window is narrow
3.15 1 update
  • Newa small "Powered by PinPortal.io" link now sits under your league blocks, so a visitor who likes what they see on your site can find out what built it. It appears once per page however many blocks that page carries, and never on the admin screens or on the bowler claim and registration pages
  • Plans that include white labelling can switch it off in Settings
3.14 3 updates
  • Newexport a season's roster for setting up in your league software, as a printable sheet or a CSV. It is ordered the way the job is done, team by team with the captain first, and the printed sheet has a box to tick as each bowler goes in
  • Both include the entering average, which your league software asks for when a bowler is added. Bowlers not yet placed on a team are listed at the end
  • Email addresses and phone numbers appear only for users who can manage the whole site. A secretary sees the roster without them
  • Registration no longer requires dues tracking. A center can take signups online and export the roster without keeping a weekly ledger. Switch on either in Settings, or both, and the page shows only the half you use
  • Removed a leftover fallback that looked for one particular center's logo file by name. Your logo comes from Settings, where you chose it
3.13 3 updates
  • A week whose standing sheet has not been uploaded yet now says so, rather than showing standings, scores and high scores worked out without it. Those figures all depend on the handicaps, and the sheet is what confirms them. The page stays on that week with a note and a link to the last complete week
  • The importer now tells you when an export arrived with scores but no standing sheet, and what to change: in BLS, print the standing sheet before backing the league up. Its own weekly order has printing at step e and the backup at step h
  • Bowler profiles still show individual scores for such a week. Those come straight from the score file and do not depend on the sheet
  • Weeks imported before PinPortal recorded where standings came from are unaffected, because unknown is not the same as missing
  • Fixedswitching weeks with the week picker showed the chosen week's tables under the previous heading. The page heading, browser title and canonical link now follow the week you picked
3.12 9 updates
  • Fixeda bowler whose name begins with a word the standing sheet also uses as a column heading is now read onto the roster correctly. This covers first names beginning Zach and surnames such as Wong, Mendez or Hightower. Re-import a season to apply it to weeks already brought in
  • Fixedroster figures are now read from the column the sheet prints them under instead of being guessed from how large they are. A bowler three games into a season no longer has their pinfall recorded as their average, and one who has yet to bowl keeps the book average and handicap their team is scored on
  • Fixeda tied game split between two teams now records the half point on both sides, so the week's points total what was awarded
  • Fixedsomeone listed both on a team and in the substitutes table had their own team's figures overwritten by their substitute record
  • Fixeda league's gender corrections and hidden bowlers are kept when the league is saved from a screen that does not itself show those fields
  • Stray cells from the sheet's layout are no longer treated as roster entries
  • Fixedthe newest week no longer borrows the previous week's standings and roster. Where an export arrives without that week's standing sheet, PinPortal derives the standings from the week's own results and says that is what it did
  • The newest week's standings are now filled in by carrying your last standing sheet forward and adding the weeks bowled since, using BLS's own points-won column. This works for leagues where adding the season up from week one never could, such as a season that opened on a meeting night with no scores. It proves the arithmetic against two weeks that both have sheets before writing anything, and writes nothing if it cannot
  • The roster stored against each week reads names and figures the same way the handicap averages do: names that begin with a heading word are kept, figures come from the column the sheet prints them under, and an empty team slot keeps its figures to itself
  • Fixedcolumn headings and empty team slots are no longer mistaken for bowlers, so a roster lists only the people who bowl. Re-import a season to apply this to weeks already brought in
  • Fixeda week with a standing sheet but no score file, an opening meeting night typically, is now filed under the right season. It takes the season from the sheet's own header, or from the weeks already imported
  • Fixedan empty team slot is no longer listed as a substitute when a week's roster is built from the score file
  • Fixedthe newest week of a league, whose roster is built from the score file alone, also leaves empty team slots off
  • Season History on a bowler's profile now runs newest first. It was ordered by the season's name, which sorts Fall before Summer before Winter and interleaves every year with every other, so a profile could open on a season from a year ago with the current one buried below it
3.11 1 update
  • Fixeda team with a bowler bowling blind is now scored on the right handicap. An absent bowler's handicap still counts toward the team, and where the score file does not carry it, PinPortal takes it from your standing sheet or works it back from the blind score
3.10 5 updates
  • Newaffiliations. Set up the organisations your bowlers belong to, such as USBC or a travelling league, and bowlers pick from your list when they set up their claimed profile. It appears as a badge on their profile card
  • You can confirm a bowler's membership. A confirmed one is marked; one nobody has checked is still shown, because it is the bowler's own statement
  • PinPortal ships no logos. A name on its own needs nobody's permission and is all most centers will want. If you have permission to display an organisation's logo you can upload it, and confirming that you have permission is a required step, recorded with your name and the date
  • A logo only ever appears beside a bowler whose membership you have confirmed
  • Fixeduploading an affiliation logo refused files it should have accepted, and told you the file needed to be something it already was. AVIF and WebP now work wherever your site accepts them, and the message says what actually went wrong
  • SVG is only offered when your site accepts SVG uploads, which WordPress switches off by default. Offering a format that can never work was the reason for the misleading error
  • The upload now reports progress and failure, so a stale message can no longer look like a fresh one
  • A failed logo upload now names the cause exactly, including when something on the server such as a security scanner is the thing refusing it, and reports the file's name, size and type alongside
  • Fixeduploads could fail after the file had already been saved, because another plugin on the site interfered with WordPress's upload result. Logo and bowler photo uploads now survive that
  • A bowler managing their profile can now get to it. There is a link under their name, a button at the bottom, and one offered in the confirmation the moment they save a change, which is when they want to look
3.9 1 update
  • Newnicknames bowlers set for themselves are now checked for profanity and slurs before they can appear on a public page, including the obvious ways round a word list like spacing a word out or swapping digits for letters
  • The check is built to avoid the opposite mistake. Your team called Thorpedo, your Spicy Seniors league, and surnames like Cockburn and Fagan are all left alone
  • The thirty character limit now says so instead of quietly cutting a nickname short, and the box counts down as you near it
  • New setting: add your own words to the list. You can always set or clear any nickname yourself from Bowlers, which is how you overrule a wrongly refused one
3.8 4 updates
  • Newa season can keep the handicap rule it was actually bowled under. Rules change. A league moves from 90% of 210 to 100% of 200, and until now changing the league setting also changed every season behind it
  • Every season follows the league unless you say otherwise, so nothing changes until you want it to. Set a percentage or a base against a season in the league's settings and only that season uses it
  • Leave a box empty and that part follows the league, so a season that only moved its base does not have to restate everything else
  • Fixeda league could arrive under two different season labels depending on which file a week came from, splitting one season's weeks across two. Your score file and your standing sheet read the league title the same way now
  • Fixeda league whose season is written like "FALL 2025-2026" had the word FALL left stuck on the end of its name, which would have created a league that does not exist
  • FixedLeague Management could show only the first league, with an error in its place. Introduced in 3.8.0 by the new per-season handicap settings
  • Bowlers who claim their profile now get a button straight to it on the screen that confirms the claim, instead of being told to go back to their email for the link. Adding a nickname or saying which hand you bowl with is the next thing people want to do, and waiting on a second email was losing them
3.7 4 updates
  • Fixedleagues whose rules are not plain won and lost were read wrong. PinPortal now takes each column from the heading your standing sheet prints above it, instead of guessing from the shape of the numbers
  • Newa league ranked on percentage of wins to losses shows its % Won column, and a split season shows its season record beside the current split
  • Fixedon those leagues a team's scratch pinfall was being recorded as its points won, and rows were being invented from the lane assignments and the page footer underneath the standings
  • Fixedhalf points are no longer rounded away on screen. A team on 55 and a half now reads 55 and a half everywhere, not 56
  • Fixedthe team high score board now scores a night on the sum of the handicaps of the bowlers who actually bowled, the same way the weekly score sheet does. A substitute carries their own handicap rather than that of the member they stand in for
  • The board and the weekly scores are now worked out in one place, so they cannot disagree again
  • Fixeda team's three games now always add up to its series. A team name wider than the column it prints in could run into the numbers beside it; those rows are read correctly now, and games are checked before they reach a high score board
  • Where the arithmetic proves what a misread row should have said, PinPortal now restores it. Where it cannot, the games are cleared and the series kept, so the row says what is actually known
  • This is checked on the way in as well, so a misread row can no longer be stored
  • NewPinPortal works out when your position rounds are, on its own. Nothing in a league export says "this was a position round", but the pairings do, because on that week teams are drawn by standing instead of by the schedule. Leave the box empty and the announcement goes out on the right week without you telling it
  • A league with splits can now hold several position rounds, one at the end of each, each announced separately with its own fun night after it
  • Only leagues of eight teams or more are read this way. Below that the pattern turns up by chance often enough to be worth nothing
3.6 2 updates
  • NewPinPortal roles. League GM has everything in the plugin and nothing else on your site. League Manager runs leagues. League Treasurer takes dues but does not set them. The original League Secretary role is unchanged
  • Newany of them can be limited to particular leagues, set on the user's profile. Leave every box unticked for all leagues, tick some to restrict
  • Permissions are split so the person collecting cash need not be the person setting prices, and extra powers can be granted to one person without every holder of that role getting them
  • Note that a WordPress Administrator can always do everything, since they can edit users. To restrict somebody, give them a PinPortal role instead of Administrator
  • Fixeda league's newest week could show the previous week's standings. When your export contains scores for a week but no standing sheet for it yet, PinPortal recalculates that week's standings; a bug meant the recalculation was skipped for any league whose first week has no score file, so the older standings were carried forward and labelled as current
  • Fixedhalf points are now read from standing sheets. A team on 55 and a half is recorded as such, which also settles the order of two tied teams correctly
3.5 2 updates
  • Newcollect a whole league night in one go. One screen lists every bowler with this week's dues filled in and everyone ticked. Untick whoever did not pay, hit the button, and every payment and receipt is recorded at once
  • Each row offers the three amounts that actually come up at the desk: this week, enough to get up to date, or the whole rest of the season. A bowler who is behind shows how far behind, right on the row
  • Anyone who has already paid that week comes back unticked and greyed out, so running the sheet twice cannot double-charge them, and a double-click on the button is refused outright
  • Each bowler on the collection sheet now has their own payment method, because a real night is mixed: most hand over cash, one writes a check, two tap a card. Set the one most people used at the top and change only the rows that differ
  • The running total splits by method as you go, so the cash box can be counted against it without adding up receipts by hand
3.4 1 update
  • Newseason announcements. PinPortal can email your bowlers when registration opens, a few days before it closes, before the season starts, and for position round and fun night
  • Each notice goes out once, and anything whose date has already well passed is skipped, so switching this on late never sends a burst of old news
  • Registration notices go only to bowlers who opted in to hear from you. Season start, position round and fun night go to bowlers in that season, because that is the league talking to its own members
  • Registration dates, team limits and the withdrawal deadline are now set per season on the Dues page
3.3 1 update
  • Fixeda league could report itself full when it was not. Five full teams plus five pairs in a ten-team league looked like ten places taken, so the next bowler was waitlisted, when combining those pairs actually leaves two places open
  • Team places are now counted two ways: what is held today, and what would be held if part-teams and individuals were combined. Bowlers see the second number, so nobody is turned away for a shortage that a bit of matchmaking removes
  • Newa combine suggestion on the Dues page. It looks for groups that add up to exactly a full team first, so a pair and a trio in a five-per-team league are offered as one team. Nobody who signed up together is ever split, and nothing is applied until you accept it
3.2 1 update
  • NewLeague registration (Pro, off by default). Bowlers sign up on your site as a full team, part of a team, or an individual looking for a team, and confirm their email before anything reaches you
  • Nothing is accepted automatically. Every registration waits in a queue for you to approve, waitlist or decline, and approving one adds those bowlers to the season and schedules their dues in the same step
  • Capacity is counted in team places, so a part-team still takes a whole one and individuals are pooled. A full league keeps taking registrations onto a waiting list rather than turning people away
  • Registrants get a link to check on their place or withdraw themselves before your deadline
3.1 1 update
  • Newbowlers who have claimed their profile can see their own dues statement on their manage page: what they owe now, what is still to come, and which weeks are paid
  • Newoptional past-due reminder emails, one per bowler rather than one per unpaid week, with a grace period so nobody is chased the morning after league night
  • Reminders refuse to switch on while your domain publishes no SPF record, because that mail would be discarded without a bounce and you would never know it had not arrived
  • All PinPortal email is now branded and sent from your own domain, which matters for whether it arrives at all
3.0 1 update
  • NewLeague Dues (Pro, off by default). Set a weekly amount per league season and PinPortal tracks who has paid for which weeks, who is behind and by how long, and prints a receipt showing exactly which weeks a payment covered. Cash, check and card at the desk are all recorded the same way; no payment processor is required
  • Prepayments bank against the last weeks of the season, so a bowler who stops coming has already paid for the end
  • Turn it on under Settings. Nothing appears anywhere until you do, and importing scores never creates a charge
2.9 8 updates
  • NewLeague Explorer, a drill-down tree from league to season to team to bowler, with each bowler's season average, games, pins, handicap and best game/series ([bowling_explorer] + Gutenberg block). Levels load on demand, so it stays fast on centers with years of history
  • League Explorer: bowlers with a profile can now expand their trading card inline, right inside the tree, instead of navigating to another page
  • Every bowler's individual game scores are now stored with each import, so scoring history can be charted (average, handicap and series trends, season-over-season improvement). Absences are recorded as absences rather than zeros. Applies to imports from this version onward; re-import a saved ZIP to backfill earlier weeks
  • Newbowler trend charts on profile cards, average over time, series each week, and handicap over time, plus a season-by-season table showing improvement. Charts are inline SVG rendered on your server: no chart library, no external requests, and they print correctly
  • Fixedtrend charts are now drawn per league. A bowler in more than one league had every league merged into a single line, so a scratch league's zero handicap alternated with another league's real one and the chart looked like spikes falling to the floor
  • Fixedthe line now breaks between seasons instead of diving to the new season's rebuilt average, which looked like a sudden collapse in form
  • Fixedseason-over-season change compares a league against its own previous season, not against whichever league happened to be listed above it
  • Changedno-tap league scores are excluded from trends and season summaries. A no-tap 9-count scores as a strike, so those averages are not on the same scale as the rest of a bowler's record
  • Fixedweeks before a bowler had bowled a game no longer plot as a zero
  • Fixedteam results are no longer eligible for the milestones, high-score, or top-bowler boards. The boards reject scores no single bowler can shoot (over 300 a game, over 900 a scratch series) and names that are team labels. Handicap scores, which legitimately pass those numbers, are unaffected, and the underlying data is left untouched
  • Fixedpages nested under your Leagues or Bowlers page returned 404. The plugin claims those URLs for its own league and bowler pages, and was refusing anything it did not recognise; it now hands the request back to WordPress when a real page lives there. A league of the same name still wins
2.8 8 updates
  • NewBowler profile claiming (Pro), bowlers claim their profile via printed QR claim slips (instant, in-person verified) or an approval queue; verified email + optional marketing opt-in with provable consent
  • NewMailing list building, opted-in contacts export as CSV and fire pinportal_marketing_optin/optout hooks for newsletter plugins
  • NewClaimed bowlers can submit their own profile photo, published only after operator approval
  • Claim slips print per league (QR deep links) from the Bowlers page; claims are rate-limited, enumeration-proof, and youth profiles can never be claimed
  • Dashboard environment check now verifies your domain's email authentication (SPF/DKIM). Without it, Gmail silently discards emails your site sends, including profile-claim verification codes
  • Email Support button on the dashboard: copies a full diagnostic report (versions, environment, email auth, data counts, theme/plugins, migration errors; never names, emails, or keys) and opens a pre-addressed support email in your own mail program
  • Fixleagues with a score-less first week (e.g. a meeting night) had TV boards, signage, and recap featured images generated for that empty week instead of the current one. Post-import generation now always targets the league's true latest week, and recaps refuse a wrong-week featured image
  • Profile photos are now resized in the bowler's browser before upload (max 1600px JPEG), so phone camera photos no longer fail the 5 MB limit
  • Fixleague and bowler sitemaps returned 404 when an SEO plugin (Yoast, Rank Math) was active. Their catch-all "*-sitemap.xml" routing intercepted ours; PinPortal now serves its sitemaps before rewrite routing
  • Licensing: wordpress.org compliance mode enabled and the store's org gatekeeper token added, per updated Freemius integration settings
  • Claimed bowlers can now edit their own nickname and bowling hand from their manage link; changes appear on their profile immediately
2.7 3 updates
  • NewSeason Milestones board, honor roll of big games and series (thresholds configurable), with a PERFECT badge on 300 games ([bowling_milestones] + Gutenberg block)
  • NewBeat Your Average board, bowlers whose weekly series most exceeded their average; every bowler is eligible, not just high scorers ([bowling_over_average] + Gutenberg block)
  • NewBirthday signage slide (Pro), bowlers with a birthday in the next 7 days, refreshed daily and on every import; automatically removed from the rotation when there are no birthdays
  • NewWeekly recap posts (Pro), auto-generate a blog post when a league's new week imports (off / draft / publish setting), or on demand per league. Covers standings movement, team of the night, high scores, 300 games, milestones, and the bowler who most beat their average; bowler and league names link to their pages; the week's TV board becomes the featured image
  • Fixbowler profiles are now correctly Pro-gated (the feature flag was missing from the gate list)
  • NewPrintable standing sheets, every league gets a print-optimized page at /leagues/{name}/print/ (standings, weekly highs, next week's lanes) styled with your brand, with a QR code to the live league page. Printer button on Manage Leagues
  • New[bowling_qr] shortcode + QR Code block for posters and flyers. QR codes are generated on your site by a bundled library, never by an external service
2.6 5 updates
  • Gutenberg blocks for everything: League List, League Summary, Standings, Weekly Scores, High Scores, Rosters, Lane Assignments, Top Bowlers, and Bowler Profile Card, with live editor previews and sidebar controls. Shortcodes continue to work unchanged.
  • Division leagues: standings now import and display grouped by division (previously divisions were flattened into one table)
  • Manual lane editor: set or fix upcoming lane assignments per league by hand (position rounds, division pairings)
  • Handicap settings per league: cap (maximum pins), allow-negative option, and rounding mode (drop fractions / nearest / up), applied to handicaps PinPortal computes for substitutes and entering averages
  • Standings provenance: weeks whose standings PinPortal computed from weekly results (no standing sheet available) are now flagged, and a footnote appears on public standings and the league diagnose report marks them
2.5 11 updates
  • NewBowler directory, bowlers as first-class profiles shared across leagues, with photos, imported from your league software's Names CSV export (only non-sensitive fields are read) or generated from existing rosters
  • Newpublic bowler profile pages at /bowlers/{name}/, photo, cross-league stats, season highs, history, perfect games; bowler names in rosters and high-score boards link to profiles
  • Youth protection: bowlers appearing only in youth leagues never get a public page or URL
  • Bowler profiles redesigned as a trading card: photo header, big bold stats, league rows
  • Bowler card: squared photo, and all card colors now follow the brand theme (preset or custom accent) automatically
  • FixTop Bowlers showed no data when a league's most recent import included a report-only week 1
  • Top Bowlers: ranked by average (configurable via orderby), no-tap leagues excluded from cross-league leaderboards by default (include_no_tap="1" to override), per-league handicap column removed
  • Top Bowlers: handicap game/series columns now appear only when the shortcode is scoped to a single league (handicap formulas differ between leagues)
  • Bowlers: one-click "Generate from Rosters" for all leagues at once, with automatic cross-league linking of unambiguous name matches
  • Bowlers: Merge tool, combine duplicate profiles; the removed profile's URL redirects to the survivor
  • Bowlers: Clean Up tools, bulk-merge exact-name duplicates across leagues (same-league name clashes flagged for review) and remove placeholder profiles from code-style roster entries
  • Bowlers: roster generation now skips code-style and single-word names
  • Placeholder cleanup narrowed to certain placeholders only (vocabulary + code patterns). Single-name bowlers, digit typos, and '2nd' suffixes are never touched
  • Bowler directory: sortable columns (name, book average, league count) and a 'possible duplicates only' filter
2.4 5 updates
  • Batch Migrate: duplicate-week warnings, per-PDF review details, source PDFs kept for verification, clearer failure guidance
  • Data Integrity: detects weeks imported with no data, per-season missing-week gaps, team score and roster average checks
  • Admin polish: consistent icon alignment on all buttons, cleaner league action buttons, clearer page copy
  • Uninstall cleanup moved to the licensing SDK's uninstall hook (data-keeping behavior unchanged)
  • Full support for leagues run in BLS without scoring-system integration (exports with no .S00 score files): standings, complete rosters, and high-score boards now import from the standing-sheet reports alone
  • Cross-version BLS compatibility test matrix (BLS-2022 and BLS-2023 exports verified)
  • Team standings: support the expanded standing-sheet layout used by BLS-2025/2026 (Lane/Avg/HDCP columns, fractional points, division sheets)
  • Clearer error when an export ZIP contains no standing sheets (generate them in BLS first, then re-export)
  • Compatibility matrix now covers BLS-2022, 2023, 2025, and 2026 exports
2.1 1 update
  • Gender override controls and rename-tolerant gender detection
  • Modern redesign of TV images and digital signage
  • Pre-printed future-week sheet handling in ZIP imports