WP Manifestindependent plugin directory
manifest / content / lgw-division-widget

League Game Widget WP Registry grade A. No security issues foundWP RegistryNo security issues foundOpen the reportA

Word press plugin to deal with displaying our league tables

★ 0stars
63release downloads
v2026.31.9latest · 2mo ago

Install

Download lgw-division-widget-v2026.31.9.zip From the v2026.31.9 release on GitHub, Jul 30, 2026

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/dbinterz/lgw-division-widget/releases/download/v2026.31.9/lgw-division-widget-v2026.31.9.zip
Updates itself. It ships its own updater, so new versions appear under Dashboard → Updates.

A WordPress plugin that renders mobile-friendly league tables and fixtures for lawn bowls and other league sports, powered by published Google Sheets CSV data.


Features

  • 📱 Mobile responsive — sticky Pos and Team columns, compact fixture layout on small screens
  • 🏆 Promotion & relegation zones — colour coded with ▲/▼ symbols for accessibility
  • ✅ Clinched detection — automatic shading when promotion/relegation is mathematically confirmed
  • 🏅 Club badges — upload logos via WordPress Media Library, mapped to team names
  • 🖱 Team modal — click any team name to see their full record and fixture list
  • 🖨 Print views — print button on league table, fixtures, and team modal
  • 🌙 Dark mode — auto-follows device/OS setting with manual toggle, preference remembered per device
  • 💰 Sponsor logos — primary sponsor above title, additional sponsors rotate randomly below table
  • ⚡ Server-side caching — configurable cache duration to speed up page loads
  • 🔄 GitHub auto-updates — WordPress update notifications direct from GitHub releases
  • 🔍 Team name validation — scorecard form checks team names and fixture pairings against the division CSV, with one-click correction for swapped home/away or missing suffixes (e.g. "Belmont" → "Belmont A")

Installation

  1. Download the latest release zip from Releases
  2. In WordPress go to Plugins → Add New → Upload Plugin
  3. Upload the zip and activate
  4. Go to Settings → LGW Widget to configure badges and sponsors

Usage

Add a shortcode block to any page:

[lgw_division csv="YOUR_CSV_URL" title="Division 1" promote="2" relegate="2"]

Shortcode Parameters

Parameter Description Required
csv Published Google Sheets CSV URL ✅ Yes
title Heading shown above the widget No
promote Number of promotion places No
relegate Number of relegation places No
sponsor_img Override primary sponsor image for this division No
sponsor_url Override primary sponsor link for this division No
sponsor_name Override primary sponsor alt text for this division No

Getting the CSV URL

  1. In Google Sheets go to File → Share → Publish to web
  2. Select the sheet, choose CSV format, click Publish
  3. Copy the URL and use it as the csv parameter

Settings

Go to Settings → LGW Widget to manage:

  • Sponsors — add logos with links; first sponsor appears above the title, others rotate below the table
  • Club Badges — map team names (as they appear in the sheet) to badge images
  • Cache Settings — configure how long data is cached (default 5 minutes)
  • Plugin Updates — force an immediate check for updates from GitHub
  • Clear Cache — force all divisions to fetch fresh data on next load

Google Sheet Structure

The plugin expects two sections in the sheet:

League Table

A section with a LEAGUE TABLE header row, followed by column headers starting with POS, then team data rows.

Fixtures

A section with a FIXTURES header row, followed by a column header row containing HPts, HTeam, HScore, AScore, ATeam, APts, then date rows and fixture rows.


Scorecard Submission

The [lgw_submit] shortcode adds a scorecard entry page for clubs.

Setup

  1. Go to Settings → LGW Widget and add each club with a passphrase under Score Entry — the what3words address for the clubhouse makes a good default (e.g. filled.count.ripen)
  2. Add an Anthropic API key under API Settings if you want AI photo parsing
  3. Create a page with [lgw_submit] — clubs visit this page to submit scorecards

How it works

  • Clubs log in with their club name and passphrase (no WordPress account needed) — passphrase entry is case-insensitive
  • Three entry methods: photo (AI reads the scorecard image), Excel (upload the LGW template), or manual
  • First submission sets status to Pending — awaiting confirmation from the other club
  • Second club can Confirm (scores agree → Confirmed ✅) or Amend (scores differ → Disputed ⚠️)
  • League admin resolves disputes via wp-admin → Scorecards
  • Confirmed scorecards appear when clicking a played fixture row in the league table

Excel template

The plugin parses the standard LGW scorecard Excel template. Cells with unresolved formulas (total shots) are handled automatically by summing rink scores as a fallback.


Changelog

[2026.31.9]

Changed

  • Stripe Checkout session creation is now idempotent. Both lgw_entry_stripe_create_session() (single entry) and lgw_entry_stripe_create_batch_session() (bulk basket) now send an Idempotency-Key header on the POST /v1/checkout/sessions call — lgw-entry-<id>-<amount> and lgw-batch-<batch> respectively. A retried request (e.g. after a dropped response) returns the same Checkout Session instead of creating a second one, so a club can't be double-charged; the key includes the amount/batch so a genuine re-quote is still distinct. Aligns the outbound leg with the Stripe "accept a one-time payment" blueprint (product/price → Checkout mode=payment → checkout.session.completed webhook); the inbound webhook + the full outbound request shape are both proven offline via rest_do_request + pre_http_request interception. No behaviour change when Stripe isn't configured.

[2026.31.8]

Fixed

  • Scorecard fuzzy name suggestions no longer capped at 3. Both "Did you mean:" surfaces in lgw-scorecard.js — the import/review issue resolver (.lgw-ir-accept) and the inline new-name dialog (.lgw-npd-suggest) — hard-sliced suggestions.slice(0, 3), so with more than three similar roster names the correct one could be truncated off before the user saw it. lgwFuzzyPlayerMatch() returns only exact-category matches (initial ↔ full first name, nickname, Levenshtein ≤ 2 typo), not noisy fuzz, so the cap was arbitrary truncation rather than ranking. Introduced a shared LGW_MAX_NAME_SUGGESTIONS = 8 constant used at both sites; flex-wrap keeps the list usable on mobile.

[2026.31.7]

Changed

  • Multi-competition bulk entry — one club, one basket, one payment. [lgw_champ_bulk_entry champ="a,b,c"] now accepts a comma/space list of championships and renders a single form: one club selector, one contact field, a per-competition entries[<champ>] textarea (only competitions whose entry window is open are shown; closed ones listed as skipped), and one global "Enter & pay" button. lgw_ajax_entry_bulk_submit reads champs (with legacy single champ/scalar entries fallback), assigns one shared batch id across all competitions, creates ledger rows per comp (free → confirmed+projected+emailed immediately; paid → pending_payment), then opens a single Stripe Checkout over every paid entry via lgw_entry_stripe_create_batch_session(). That session now titles each line item by the entry's own championship (per-entry title_cache) so the receipt itemises across competitions. Guard: mixed currencies across paid comps are rejected (one Stripe session = one currency). Admin notification consolidated into lgw_entry_notify_admins_bulk_multi() — one email grouped by competition. Webhook confirmation (lgw_entry_stripe_webhook_finish_batch) was already batch-keyed and champ-agnostic, so it confirms the whole multi-comp batch unchanged. Single-championship usage is unchanged.
  • Live basket total on the bulk form. Each competition textarea carries data-fee/data-cur/data-need; inline JS counts valid entries (mirroring lgw_entry_parse_bulk — newline units, singles comma-split, teams needing N /-separated members), renders a per-competition subtotal, sums fees per currency into a basket line, and reflects the grand total in the submit button label ("Enter & pay £43.00"). Recomputes on every keystroke; no server round-trip.

Fixed

  • Entry-form theming. Entry cards ([lgw_champ_entry] / [lgw_champ_bulk_entry]) now carry a lgw-entry-card class pinned to the light palette in lgw-scorecard.css (mirroring the existing .lgw-ca-box rule), so @media(prefers-color-scheme:dark) no longer flips only the card to #1e1e2e against a light page (which also left grey helper text unreadable). Entry cards are pinned to the plugin's Saira font (.lgw-entry-card selectors), and both entry shortcodes now enqueue the lgw-saira Google Font (and add it as a lgw-scorecard style dependency) so entry-only pages actually load it — previously the bulk textareas were monospace and the rest of the card fell back to the site theme font (Manrope).

[2026.31.6]

Added

  • Reactivate an archived season. New lgw_revert_season POST handler in lgw-seasons.php + a "⏮ Make Active" button on each archived-season row. Demotes the current active season to archived (active => false) and promotes the chosen season (active => true), then re-sorts (active first, then descending by ID) and calls lgw_seasons_sync_to_drive() so Drive/Sheets writeback and Quick Score Entry follow the reactivated season's divisions. Guarded: the target must exist and be archived (never the active one); scorecard lgw_sc_season tags are left untouched (no un-stamping). Confirmation dialog on click; reverted=1 success notice; not_found error path.

[2026.31.5]

Added

  • Bulk club entry (club admins only). New [lgw_champ_bulk_entry champ="..."] shortcode + lgw_entry_bulk_submit AJAX. lgw_entry_parse_bulk() parses a textarea: entries newline-separated (singles also comma-separated); team members within an entry separated by / → mapped to the canonical A & B, Club via lgw_entry_build_string(). Gated by lgw_entry_user_may_bulk() (approved club admin via lgw_user_can_submit_for(), or manage_options); the club picker only lists clubs the user administers. Duplicates and wrong-member-count lines are skipped and reported. Free champs confirm + project immediately; paid champs use one combined Stripe Checkout for the whole batch — lgw_entry_stripe_create_batch_session() (one line-item per entry, tagged with a lgw_entry_batch id), and lgw_entry_stripe_webhook_finish_batch() confirms every pending row in the batch together after re-verifying the paid total against the sum of the batch's ledger amounts (idempotent, client-amount never trusted).
  • Player-list validation / capitation warning. lgw_entry_unknown_players() checks each entered name against the club's tracked players (lgw_players table, matched via lgw_clean_player_name()); unmatched names are returned to the entrant as a non-blocking warning ("unregistered players may affect your club's capitation fees") and audit-logged on the entry. Applies to both single and bulk entry. Degrades to a no-op if the players module is absent, so it never blocks entry.

[2026.31.4]

Added

  • Common championship engine abstraction. New module lgw-champ-engine.php introduces the LGW_Champ_Engine interface with two adapters — LGW_Gchamp_Engine (new group-knockout store lgw_gchamp_<id>) and LGW_Champ_Engine_Legacy (section-bracket store lgw_champ_<id>) — plus a resolver lgw_champ_engine($id), lgw_champ_engine_list() and shared lgw_champ_engine_norm(). Callers speak one vocabulary (exists/get/draw_started/append_entry/remove_entry/list) and never branch on the storage back-end. Adding a future engine = one new class, zero caller edits.

    Changed

  • Entry form now supports the legacy champ engine, not just gchamp. lgw-entry.php was hard-wired to lgw_gchamp_*; the real NIPGL championships run on the legacy lgw_champ_* engine, so [lgw_champ_entry champ="..."] returned "Championship not found" for all of them (#28). lgw_entry_get_champ(), lgw_entry_project(), lgw_entry_unproject(), lgw_entry_norm() and the admin championship picker now route through lgw-champ-engine.php. Legacy engine: appends to entries[] pre-draw only (draw-started detected via section_*_draw_version / *_draw_in_progress / final_*); sections are not rebuilt on append (the champ draw step rebuilds from entries[], and lgw_champ_build_sections() shuffles); no preferences (old engine has none). lgw-champ.php/lgw-gchamp.php are unchanged — the adapters wrap their storage from outside.

[2026.31.3]

Added

  • Championship entry form + ledger. New module lgw-entry.php introduces the lgw_entry CPT (the ledger: players, club, discipline, status pending_payment|paid|confirmed|withdrawn|refunded, amount, payment ref, audit log) and the [lgw_champ_entry champ="..."] front-end shortcode. Players self-enter (login-gated) instead of an admin pasting into the gchamp textarea. A confirmed/paid entry is projected into the existing lgw_gchamp_<id>.entries[] (+ entry_preferences keyed by the entry string) by lgw_entry_project(), so the draw/bracket engine is untouched. Pre-draw only; post-draw entries are flagged for manual placement.
  • Per-club entry policy. Each club record gains an entry_policy (open = players may self-enter | club_admin = approved club admins only), resolved by lgw_entry_policy_for_club() with precedence: per-champ override → per-club → league default option lgw_entry_default_policy. Approved-admin checks reuse lgw_user_can_submit_for().
  • Stripe Checkout (raw REST, no SDK). When a champ has a fee, lgw_entry_stripe_create_session() creates a Checkout Session via wp_remote_post and the entrant is redirected to hosted checkout. A register_rest_route('lgw/v1','/stripe-webhook') endpoint verifies the Stripe-Signature HMAC manually, re-checks amount/currency, and flips pending_payment → paid idempotently. Secrets via options or LGW_STRIPE_SECRET_KEY / LGW_STRIPE_WEBHOOK_SECRET constants. Free entries confirm immediately; admins can mark paid offline.
  • LGW → Entries admin screen. Per-champ entries list with Confirm / Mark paid / Withdraw / Refund row actions, per-champ fee/deadline/capacity/policy config (option lgw_entry_cfg_<champ>, kept separate from the gchamp option), and a Stripe/policy settings box.

[2026.31.2]

Fixed

  • Orphaned concessions could not be cleared from the fixture modal. The normal concession clear path is keyed on home||away||date; postponing + rescheduling a conceded fixture changes the row date, so the modal's computed key no longer matched the concession's stored key (original date). Result: the overlay entry (lgw_concessions), auto-created 50-0 scorecard (lgw_sc_concession=1), score override (lgw_score_overrides) and cached fixture were stranded with no UI to remove them (e.g. a phantom confirmed result showing 0-0).

    Added

  • Force-clear concession admin button in the fixture modal (played and unplayed views). New AJAX lgw_force_clear_concession (nonce lgw_submit_nonce, manage_options) matches by team names across all dates and wipes every concession artifact for the pair — overlay entries, concession scorecards, score overrides — then wipes the cached fixture back to unplayed. Idempotent; page reloads on success.

[2026.31.1]

Added

  • Conditions of Play tab on [lgw_finals] (📜). A fourth tab beside competition / date / scoreboard rendering admin-editable rich text, stored per season as option lgw_finals_conditions_<season> and seeded from lgw_finals_conditions_default() (IBA Championships Stage 1 & 2 Conditions of Play 2026). Admins get an inline edit toggle → textarea → AJAX lgw_finals_save_conditions (nonce lgw_finals_nonce, manage_options, wp_kses against lgw_finals_conditions_allowed_html() — h3/h4/p/ul/ol/li/strong/em/a etc.). Tab choice persists in localStorage alongside the existing sort.

[2026.31.0]

Changed

  • Ghost unlit-segment now visible on completed finals. The ::before "88" ghost applied to both live and final all along, but color: inherit at 13% washed out the green final digits. Switched to explicit rgba — amber rgba(255,107,26,.16) for live, green rgba(72,224,138,.2) for final — so finished games keep the lit-panel look.

[2026.30.23]

Added

  • DSEG7 seven-segment webfont on the LED scoreboard (SIL OFL, bundled under fonts/dseg/; two @font-face weights, url() resolved relative to lgw-finals.css). Digits render as a real 7-seg display, with a ghost unlit-segment layer — a faint all-lit 88 via ::before at 13% opacity behind the live/final numbers.
  • Club names on the scoreboard — a sub-line under each player/team name (parsed from the Name, Club string), uppercase grey.

    Changed

  • Long team names wrap on the board instead of one-line ellipsis. <wbr> break points injected after each /, so pairs/triples split player-per-line under a tight card; .lgw-finals-led-team uses overflow-wrap: anywhere.

[2026.30.22]

Added

  • LED scoreboard view on the Finals Week page. New third tab (📟 Scoreboard) beside "By competition" / "By date & rink" renders an old-style dark-panel LED board of summary scores across every scheduled match — live matches first (amber glowing digits, pulsing ● LIVE · END n), then upcoming, then finished (green FINAL). Score cells carry stable ids (#lgw-led-<mid>-h/-a/-s) and refresh through the same update path as the rest of the page: admin saves and the public 30s poll both flow through updateScoreBlock(), which now mirrors totals onto the board via updateLed(). Tab choice persists in localStorage alongside the existing sort. Pure-additive: no scoring/data-model changes.

[2026.30.21]

Added

  • Live finals scoring is now an ordered log of checkpoints + ends (freely mixable). Two item kinds stored in $match['ends']:
    • end — a delta pair [h, a] (+ Add end); running += delta, end# = prev + 1.
    • checkpoint — ⚡ Update score: an absolute score declared at end N, stored as the delta needed to reach it (['0'=>dh,'1'=>da,'sum'=>1,'end'=>N]), so sum(item[0]/item[1]) is still the running total everywhere (poll, complete, finals-started). The running total jumps to a checkpoint's absolute; it is not a new base to re-add ends onto.
    • Example: Update 14-10@12 → Add 3-0 (17-10, end 13) → Update 18-14@16 (jump, new line) → Add 0-2 (18-16, end 17).
    • New helpers lgw_finals_score_items() (reads the log; migrates legacy 2026.30.20/.21 live_home/away/ends baseline into a leading checkpoint) and lgw_finals_fold_items() (folds to display rows + running totals + current end). apply_end_action/scoring_response/render_ends_table/render_scoring_area all rebuilt around them; set_total appends a checkpoint delta; reset clears the log.

      Changed

  • Rendering fully centralised server-side. The scoring area (table + toolbar) is produced only by lgw_finals_render_scoring_area() and returned as an HTML fragment by the save_end handlers and the live poll; the client-side renderEndsTable() mirror is removed. updateScoreBlock() uses the server's authoritative totals. Poll now returns html + homeTotal/awayTotal/curEnd/isLive.

    Fixed

  • Adding an end no longer drops earlier scoring from the displayed total (superseded by the log model + server-authoritative totals).

[2026.30.20]

Added

  • Summary (quick-score) live mode + Reset, for all finals competitions. A match can be scored end-by-end (detailed) or by overall updates (⚡ Quick score, stored as live_home/live_away on the match slot, mutually exclusive with ends). New ↺ Reset clears all ends / the summary score back to "not started" (schedule untouched). Toolbar: + Add end, ⚡ Quick score, ↺ Reset, ✓ Complete game.
  • The scoring-area markup is now produced by one server helper lgw_finals_render_scoring_area() (three states: detailed / summary / not-started), and the save_end AJAX handlers (gchamp + standard) return that HTML fragment plus totals via shared helpers lgw_finals_apply_end_action() + lgw_finals_scoring_response(), so the browser swaps in the fragment instead of rebuilding it — no client/server divergence. end_action gains reset and set_total; the render/score-block/status-class use a unified $is_live (ends or summary total).

[2026.30.19]

Fixed

  • "Enter final score" button dead after starting live scoring. In saveEnd() the order was: re-render ends table → bindMatchButtons() → updateScoreBlock(). But updateScoreBlock() replaces the score-block markup (including the edit-score ✏️ button), so the freshly-created button was never bound and looked disabled. Now updateScoreBlock() runs first and bindMatchButtons() binds the whole match element afterward.

[2026.30.18]

Fixed

  • Rename dropdown now surfaces names lingering only in the finals. lgw_gchamp_collect_all_entries() (the source for the rename dropdown) didn't scan finals_matches or days[*]['ko_qualifiers'], so an entry renamed before 2026.30.17 — whose old spelling survived only in those finals structures — couldn't be selected to correct it. Both are now collected, so the old name reappears in the dropdown and a resave (old → correct) patches the leftover finals copies (2026.30.17 already renames those structures on save).

[2026.30.17]

Fixed

  • Group Championship entry rename now propagates to the Finals Week bracket. lgw_ajax_gchamp_rename_entry renamed entries, group fixtures, per-day ko_bracket, days[*]['qualifiers'], and the top-level bracket/qualifiers — but not days[*]['ko_qualifiers'] (the name source lgw_gchamp_finals_slots() seeds from) nor finals_matches[*]['home'/'away'] (the finals snapshot the finals page reads directly). A corrected name therefore updated the group stage but still showed the old spelling in the finals. Both are now renamed (finals via the existing flat-matches helper). Verified: a rename of an over55-pairs entry updates 1 finals slot + 1 ko_qualifiers entry that previously stayed stale.

[2026.30.16]

Added

  • Per-match disc override. Beyond the whole-championship convention, admins can set a per-side disc colour for a single match from that match's date/time editor. Each side has a select with a — Default — option (empty = inherit the convention). Stored as finals_disc_home / finals_disc_away on the individual match slot; the extended save_datetime handlers (both gchamp in lgw-gchamp.php and standard in lgw-finals.php) persist it and return the resolved effective colours, which the JS uses to swap the chips live.

    Changed

  • Disc convention + override now work on every finals competition, not just Group Championships. The bulk header control and per-match overrides are available for standard championship finals (singles/pairs/triples/fours/…) too. The bulk control posts to a new generic lgw_finals_set_discs handler (verifies lgw_finals_nonce) that routes to lgw_gchamp_<id> or lgw_champ_<id> via an is_gchamp flag; the gchamp-only lgw_gchamp_finals_set_discs handler from 2026.30.15 is removed in favour of it.

[2026.30.15]

Added

  • Disc-colour chips on Finals Week matches. Each side shows a coloured dot + label (e.g. 🔴 Red / 🟡 Yellow) so viewers can identify entries on the green. Convention is set per championship (bulk) from the Finals page header via an admin "Discs: Home […] Away […] — Apply to all" control, stored as finals_disc_home / finals_disc_away on the gchamp option and applied to every match. Defaults Red (home) / Yellow (away). Palette: red, yellow, blue, green, orange, brown, black, white, pink. New AJAX handler lgw_gchamp_finals_set_discs (verifies lgw_gchamp_score nonce, validates slugs against lgw_finals_disc_palette()).

    Fixed

  • Club badges now display on Finals Week matches. The lookup lowercased the parsed club name but compared it against lgw_club_badges keys stored in original case (N.I.C.S., Ards), so no badge ever resolved. A lowercased key map is now built once for a case-insensitive match.

[2026.30.14]

Fixed

  • "Match not found" (still) on gchamp finals edits + dead "by competition / by date" sort tabs — a syntax error introduced by 2026.30.13. The 2026.30.13 edit wrapped the finals body inline script but left a duplicate, unclosed (function(){ before the existing sort IIFE (double-open, single close). The whole `

This README is longer than the copy stored here. Read the rest on GitHub →

Releases

Newest 25 of 60 recorded releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v2026.31.9 latest
Jul 30, 2026 2mo ago
lgw-division-widget-v2026.31.9.zip
4
Jul 30, 2026 2mo ago
lgw-division-widget-v2026.31.8.zip
0
Jul 29, 2026 2mo ago
lgw-division-widget-v2026.31.7.zip
2
Jul 29, 2026 2mo ago
lgw-division-widget-v2026.31.6.zip
0
Jul 28, 2026 2mo ago
lgw-division-widget-v2026.31.5.zip
2
Jul 28, 2026 2mo ago
lgw-division-widget-v2026.31.3.zip
2
Jul 28, 2026 2mo ago
lgw-division-widget-v2026.31.2.zip
2
Jul 27, 2026 2mo ago
lgw-division-widget-v2026.31.1.zip
1
Jul 27, 2026 2mo ago
lgw-division-widget-v2026.31.0.zip
2
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.23.zip
2
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.22.zip
2
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.21.zip
2
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.20.zip
0
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.19.zip
0
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.18.zip
1
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.17.zip
2
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.16.zip
2
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.15.zip
2
Jul 26, 2026 2mo ago
lgw-division-widget-v2026.30.14.zip
1
Jul 23, 2026 3mo ago
lgw-division-widget-v2026.30.13.zip
1
Jul 23, 2026 3mo ago
lgw-division-widget-v2026.30.12.zip
0
Jul 23, 2026 3mo ago
lgw-division-widget-v2026.30.11.zip
0
Jul 23, 2026 3mo ago
lgw-division-widget-v2026.30.10.zip
1
Jul 23, 2026 3mo ago
lgw-division-widget-v2026.30.9.zip
1
Jul 23, 2026 3mo ago
lgw-division-widget-v2026.30.8.zip
1
All releases on GitHub →
A grade

Security

League Game Widget 2026.31.9 · audited by WP Registry

No security issues found.

Audited release
2026.31.9
Findings
none
Worst severity
—
Content hash
85035d7a78c85464efd0c528…

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.