Skip to content

Disable text anti-aliasing on all scoreboards for crisp scores - #273

Merged
ChuckBuilds merged 2 commits into
mainfrom
claude/scoreboard-font-crisp-0u2ghn
Aug 12, 2026
Merged

Disable text anti-aliasing on all scoreboards for crisp scores#273
ChuckBuilds merged 2 commits into
mainfrom
claude/scoreboard-font-crisp-0u2ghn

Conversation

@ChuckBuilds

@ChuckBuilds ChuckBuilds commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Summary

Score digits (and every other pixel-font glyph) rendered blurry on the LED matrix — most visibly reported on football-scoreboard's recent NFL scores. PIL anti-aliases PressStart2P glyphs by default, blending edges into dim partial-lit pixels on a 1:1 matrix, which muddies numbers (a "6" could read as a "G"). Every scoreboard's outline-drawing text helper now sets draw.fontmode = "1" to force crisp 1-bit rendering, matching the fix baseball-scoreboard already shipped for its main renderer.

Type of change

  • Bug fix in an existing plugin

Plugin(s) affected

football-scoreboard, hockey-scoreboard, basketball-scoreboard, soccer-scoreboard, nrl-scoreboard, lacrosse-scoreboard, afl-scoreboard, ufc-scoreboard, cricket-scoreboard, f1-scoreboard, baseball-scoreboard (odds overlay only — the main renderer was already fixed), march-madness

Related issues

N/A

Test plan

  • Rendered the plugin in the dev preview server (scripts/check_plugin.py from a core LEDMatrix checkout)
  • Loaded the plugin in LEDMatrix on real hardware

Ran the core plugin-safety harness (scripts/check_plugin.py) against all 12 affected plugins across every panel size — all render without crashes or bounds overflow. For the three plugins with committed golden images (football-scoreboard, soccer-scoreboard, f1-scoreboard), regenerated where the fix changed rendered pixels (football's celebration screen, soccer's celebration/live/recent/upcoming screens) and reviewed the diffs; f1's goldens and football's adaptive-layout goldens were already crisp (adaptive mode already picks pixel-perfect font sizes) and needed no update. Also verified with a small script that the fix eliminates all partial-lit (anti-aliased) pixels when drawing a glyph through each renderer's outline helper.

Required for plugin changes

  • Bumped version in plugins/<id>/manifest.json for every affected plugin (patch bump)
  • class_name in manifest.json matches the actual class in manager.py exactly — unchanged
  • entry_point matches the real file — unchanged
  • Updated the plugin's README.md if config keys changed — N/A, no config keys changed
  • config_schema.json is the source of truth for the web UI form — unchanged
  • Pre-commit hook ran successfully (auto-syncs plugins.json)

Checklist

  • My commits follow the message convention in CONTRIBUTING.md
  • I read CONTRIBUTING.md and CODE_OF_CONDUCT.md
  • I've not committed any secrets

Notes for reviewer

  • No behavior change beyond crisper text — fontmode = "1" only affects how FreeType rasterizes glyphs, not layout, color, or timing.
  • plugins.json is auto-updated by the pre-commit hook from the manifest version bumps.

Generated by Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Improved text rendering across scoreboard plugins, producing sharper, non-blurred characters and score digits on LED matrices.
    • Updated rendering for cricket, baseball, basketball, F1, football, hockey, lacrosse, March Madness, soccer, UFC, AFL, and NRL displays.
  • Chores

    • Updated plugin versions and release histories for the affected scoreboards.
    • Refreshed the catalog metadata date and latest-version information.

PIL anti-aliases PressStart2P/pixel-font glyphs by default, which blends
edges into dim partial-lit pixels on a 1:1 LED matrix -- muddying score
digits (a "6" could read as a "G"). Sets draw.fontmode = "1" in the
outline-drawing text helper of every scoreboard plugin (football, hockey,
basketball, soccer, nrl, lacrosse, afl, ufc, cricket, f1, plus baseball's
odds overlay and march-madness), matching the fix baseball-scoreboard's
main renderer already shipped. Regenerated the football and soccer golden
images that captured the old anti-aliased text; f1's goldens and
football's adaptive-mode goldens were already crisp and needed no change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S4ZW42WDNcFpmEKaDEFwZ7
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@ChuckBuilds, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 54 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 06fed05e-d998-4028-a4ed-57ab5f9d685f

📥 Commits

Reviewing files that changed from the base of the PR and between 86cc2ca and 76a26e0.

📒 Files selected for processing (12)
  • plugins/afl-scoreboard/manifest.json
  • plugins/baseball-scoreboard/manifest.json
  • plugins/basketball-scoreboard/manifest.json
  • plugins/cricket-scoreboard/manifest.json
  • plugins/f1-scoreboard/manifest.json
  • plugins/football-scoreboard/manifest.json
  • plugins/hockey-scoreboard/manifest.json
  • plugins/lacrosse-scoreboard/manifest.json
  • plugins/march-madness/manifest.json
  • plugins/nrl-scoreboard/manifest.json
  • plugins/soccer-scoreboard/manifest.json
  • plugins/ufc-scoreboard/manifest.json
📝 Walkthrough

Walkthrough

The PR disables Pillow font anti-aliasing across 12 scoreboard plugins by using 1-bit rendering. It updates each plugin’s patch version, release history, and the catalog metadata date and versions.

Changes

Scoreboard text rendering

Layer / File(s) Summary
Standard scoreboard renderers
plugins/{afl,baseball,basketball,cricket,football,hockey,lacrosse,march-madness,nrl,soccer,ufc}-scoreboard/...
Renderer methods configure Pillow font mode 1 before drawing bitmap text.
F1 renderer coverage
plugins/f1-scoreboard/f1_renderer.py, plugins/f1-scoreboard/manifest.json
Twenty F1 rendering methods use 1-bit font rendering. The plugin version and release history are updated.
Release and catalog metadata
plugins.json, plugins/*/manifest.json
Plugin patch versions and release-history entries are updated for the 12 affected plugins. Two unchanged release notes normalize em dash encoding.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: disabling text anti-aliasing across all scoreboard plugins for crisp score rendering.
Docstring Coverage ✅ Passed Docstring coverage is 94.59% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/scoreboard-font-crisp-0u2ghn

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codacy-production

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

🟢 Metrics 0 complexity

Metric Results
Complexity 0

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

The Plugin Safety CI gate (check_manifest_version_fields.py) requires the
newest versions[] entry to declare a core-version floor. The version bumps
in the previous commit didn't carry one forward, unlike every prior entry
in these manifests. Add ledmatrix_min_version: "2.0.0", matching the floor
every older entry already declares.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01S4ZW42WDNcFpmEKaDEFwZ7

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@plugins/afl-scoreboard/manifest.json`:
- Around line 21-25: Add the ledmatrix_min_version field with value "2.0.0" to
the new 1.6.2 release record in the manifest, alongside its released date and
notes, using the current field name rather than deprecated ledmatrix_min.

In `@plugins/baseball-scoreboard/manifest.json`:
- Around line 33-37: Add the actual ledmatrix_min_version field to the new
versions[0] release entries in plugins/baseball-scoreboard/manifest.json lines
33-37, plugins/basketball-scoreboard/manifest.json lines 21-25,
plugins/cricket-scoreboard/manifest.json lines 25-29, and
plugins/football-scoreboard/manifest.json lines 27-31, preserving each release’s
existing version, date, and notes metadata.

In `@plugins/f1-scoreboard/manifest.json`:
- Around line 32-36: Add the required ledmatrix_min_version field to the 1.8.1
release record in manifest.json, using "2.0.0" or the actual supported minimum;
retain the existing version, released date, and notes fields.

In `@plugins/hockey-scoreboard/manifest.json`:
- Around line 57-61: Add the ledmatrix_min_version field with value "2.0.0" to
the 1.9.2 release object in the manifest, preserving its existing version,
released, and notes fields and using the current field name rather than
deprecated ledmatrix_min.

In `@plugins/lacrosse-scoreboard/manifest.json`:
- Around line 53-57: Update the new release records in
plugins/lacrosse-scoreboard/manifest.json lines 53-57,
plugins/march-madness/manifest.json lines 23-27,
plugins/nrl-scoreboard/manifest.json lines 21-25, and
plugins/soccer-scoreboard/manifest.json lines 29-33 to include
ledmatrix_min_version set to "2.0.0"; use this field instead of the deprecated
ledmatrix_min.

In `@plugins/ufc-scoreboard/manifest.json`:
- Around line 35-39: Add the missing ledmatrix_min_version field to the 1.3.5
entry in the manifest’s versions array, setting it to 2.0.0 to match the
previous release and using the non-deprecated field name.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ad9e6e27-8674-40eb-9f7e-d9ea176e166c

📥 Commits

Reviewing files that changed from the base of the PR and between a7a0905 and 86cc2ca.

⛔ Files ignored due to path filters (12)
  • plugins/football-scoreboard/test/golden/128x32/celebration_switch.png is excluded by !**/*.png
  • plugins/football-scoreboard/test/golden/128x64/celebration_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x32/celebration_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x32/live_scroll.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x32/live_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x32/recent_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x32/upcoming_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x64/celebration_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x64/live_scroll.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x64/live_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x64/recent_switch.png is excluded by !**/*.png
  • plugins/soccer-scoreboard/test/golden/128x64/upcoming_switch.png is excluded by !**/*.png
📒 Files selected for processing (33)
  • plugins.json
  • plugins/afl-scoreboard/game_renderer.py
  • plugins/afl-scoreboard/manifest.json
  • plugins/afl-scoreboard/sports.py
  • plugins/baseball-scoreboard/manifest.json
  • plugins/baseball-scoreboard/odds_manager.py
  • plugins/basketball-scoreboard/game_renderer.py
  • plugins/basketball-scoreboard/manifest.json
  • plugins/basketball-scoreboard/sports.py
  • plugins/cricket-scoreboard/cricket_renderer.py
  • plugins/cricket-scoreboard/manifest.json
  • plugins/f1-scoreboard/f1_renderer.py
  • plugins/f1-scoreboard/manifest.json
  • plugins/football-scoreboard/game_renderer.py
  • plugins/football-scoreboard/manifest.json
  • plugins/football-scoreboard/sports.py
  • plugins/hockey-scoreboard/game_renderer.py
  • plugins/hockey-scoreboard/manifest.json
  • plugins/hockey-scoreboard/sports.py
  • plugins/lacrosse-scoreboard/game_renderer.py
  • plugins/lacrosse-scoreboard/manifest.json
  • plugins/lacrosse-scoreboard/sports.py
  • plugins/march-madness/manager.py
  • plugins/march-madness/manifest.json
  • plugins/nrl-scoreboard/game_renderer.py
  • plugins/nrl-scoreboard/manifest.json
  • plugins/nrl-scoreboard/sports.py
  • plugins/soccer-scoreboard/game_renderer.py
  • plugins/soccer-scoreboard/manifest.json
  • plugins/soccer-scoreboard/sports.py
  • plugins/ufc-scoreboard/fight_renderer.py
  • plugins/ufc-scoreboard/manifest.json
  • plugins/ufc-scoreboard/sports.py

Comment thread plugins/afl-scoreboard/manifest.json
Comment thread plugins/baseball-scoreboard/manifest.json
Comment thread plugins/f1-scoreboard/manifest.json
Comment thread plugins/hockey-scoreboard/manifest.json
Comment thread plugins/lacrosse-scoreboard/manifest.json
Comment thread plugins/ufc-scoreboard/manifest.json

Copy link
Copy Markdown
Owner Author

@coderabbitai The ledmatrix_min_version findings above (afl, baseball, basketball, cricket, f1, football, hockey, lacrosse, march-madness, nrl, soccer, ufc) were flagged against commit 86cc2ca, but all 12 were already fixed in the very next commit, 76a26e0 ("Declare ledmatrix_min_version on the new manifest entries") — pushed for the same reason the safety CI check caught it. Every versions[0] entry now carries "ledmatrix_min_version": "2.0.0", matching the floor every prior entry in these manifests declares. No further action needed here.


Generated by Claude Code

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@ChuckBuilds Confirmed. Commit 76a26e0 addresses the 12 manifest findings. Each new versions[0] entry now declares "ledmatrix_min_version": "2.0.0".


🧠 Learnings used
Learnt from: ChuckBuilds
Repo: ChuckBuilds/ledmatrix-plugins PR: 244
File: plugins/baseball-scoreboard/manifest.json:33-37
Timestamp: 2026-08-04T17:52:59.647Z
Learning: For new `versions[0]` release records in plugin manifests, use `ledmatrix_min_version` instead of the deprecated `ledmatrix_min`. The manifest-version-fields CI gate rejects new entries that use `ledmatrix_min`.

Learnt from: ChuckBuilds
Repo: ChuckBuilds/ledmatrix-plugins PR: 249
File: plugins/hockey-scoreboard/manifest.json:57-62
Timestamp: 2026-08-04T20:06:30.022Z
Learning: In LEDMatrix plugin manifests, `src/plugin_system/compatibility.py` resolves the declared minimum core version in this order: top-level `min_ledmatrix_version`, `requires.min_ledmatrix_version`, `versions[0].ledmatrix_min_version`, then deprecated `versions[0].ledmatrix_min`. Newest `versions` entries must use `ledmatrix_min_version`; the core store validation deprecates `ledmatrix_min`.

Learnt from: ChuckBuilds
Repo: ChuckBuilds/ledmatrix-plugins PR: 244
File: scripts/check_manifest_version_fields.py:78-83
Timestamp: 2026-08-04T17:53:57.373Z
Learning: In `scripts/check_manifest_version_fields.py`, a plugin can declare its minimum LEDMatrix core version at the manifest top level as `min_ledmatrix_version`, in `requires.min_ledmatrix_version`, or in `versions[0]`. The validator must accept a non-empty floor from either of the first two locations when `versions[0]` lacks `ledmatrix_min_version`. It must still report deprecated `versions[0].ledmatrix_min` when that key is present without `ledmatrix_min_version`.

If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

You are interacting with an AI system.

@ChuckBuilds
ChuckBuilds merged commit 5c90167 into main Aug 12, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants