Releases: JamesAwesome/led-ticker-plugins
Release list
flair v0.14.0 — lottery config font + stickers scale-1 fix
Lottery: config-selected font + crisp pixel fonts
flair.lottery now accepts a font in config (previously locked to Inter-Bold). Requires core ≥ 4.27 (the RESOLVES_OWN_FONT opt-out) — the widget auto-sizes the chosen font to each ball face; an unknown font name errors clearly, and omitting font keeps the Inter-Bold default.
When the chosen font is a pixel font (e.g. spleen-6x12, core ≥ 4.25), the ball-face auto-sizer snaps to the font's native grid (12/24/…) so the text renders exact 1-bit instead of blurring off-grid. Outline fonts keep the existing continuous auto-size.
[[playlist.section.widget]]
type = "flair.lottery"
words = ["HALAL", "GYRO", "RICE"]
font = "spleen-6x12" # crisp pixel faces (core >= 4.27)Fix: stickers crash at scale 1
flair.stickers crashed at scale 1 (min() iterable argument is empty). The standard-emoji pack (core ≥ 4.21) grew emoji_slugs() to ~1,400 slugs, ~1,360 of them hires-only — they render nothing at scale 1, so a smallsign firing could compose an empty sprite. The random-mode pool now filters to slugs that actually rasterize at the target scale; compose_sticker also guards an empty sprite as defense-in-depth.
Core floor raised to ≥ 4.27.
led-ticker-flair 0.13.0
flair.stickers: random-mode variety cap (PR #80)
Random mode (no explicit emoji = [...] list) now samples ≤ 12 distinct slugs per firing and builds the sticker wall from those — chaos across firings, coherence within one. A seedless refire resamples the subset every firing. Explicit emoji = [...] lists are completely untouched.
Behavior change on this release: the cap applies to today's curated set too (45 slugs > 12), so bare transition = "flair.stickers" walls show fewer distinct emoji per firing than before. This is the designed companion to led-ticker-core 4.21.0's standard-emoji pack, where the drawable set grows to ~1,395 slugs.
No config changes; no new core floor.
baseball v1.6.0 — demo mode for all five widgets
baseball v1.6.0 — demo mode for all five widgets
Every baseball widget (scores, standings, promotions, statcast, attendance) gains a demo = true config field. When set, the widget renders a fixed, curated fixture instead of calling the live MLB / Baseball Savant feeds — no network, no API key — and short-circuits before any fetch or background poll ever starts.
Two things it's for
- Preview every view on demand. Some cards only appear in specific game states — the attendance team card needs a Final game, a live at-bat needs a game in progress.
demo = truerenders them all immediately, so you can dial in a config on your sign without waiting for real game state. - Reproducible showcase renders. The fixtures are deterministic, so screenshots and GIFs of the hero cards come out identical every time.
The demo fixtures run through the same card builders as live data — a live at-bat with count/outs/baserunners, a Final, an upcoming-game preview, a full division board, same-day promos, a 452 ft home run drawing its trajectory arc, and a team card with weather and an animated capacity bar.
As always, scale-1 (smallsign) shows the classic scrolling line and scale>1 (bigsign / longboi) shows the hero cards — demo = true changes only the data, not the layout.
Config
scoresandpromotionsrequireteamunlessdemo = true.standings,statcast, andattendanceneed no team (league-wide by default).
Also
standings.teamsis now optional at construction — omit it to track the overall leader's division. (Previously required; league-capable behavior, unchanged output.)
baseball v1.5.0 — consistent label contrast across all hires cards
baseball v1.5.0 — consistent label contrast across all hires cards
Brings the brighter LABEL_HI label color (introduced for the attendance card in v1.4.0) to the other four widgets' hires cards, so label contrast is consistent through every hires widget view. The dim LABEL washed out on-panel; the readable LABEL_HI is now used for all small labels/headers.
- scores — the "FINAL" status (scoreboard + two_row).
- standings — all column headers (W-L / GB / STRK, and W / L / PCT / GB / L10 / STRK) plus the rank digit.
- promotions — the "PROMOTION" label.
- statcast — "STATCAST", "EXIT VELO", the column labels + sub-labels, "DISTANCE" / "PITCH TYPE", and the pitch-name caption.
Contrast-only: sizes are unchanged. Decorative dim elements (empty bases/outs, count separators, the division-leader "-" cell, the missing-distance "—" placeholder) intentionally keep the dim tone. The global palette LABEL is unchanged, so non-baseball widgets are unaffected.
baseball v1.4.0 — attendance hero card + animated capacity bar (phase 5)
baseball v1.4.0 — Attendance hero card (Phase 5) — completes the five-widget design uplift
baseball.attendance gains the design handoff's hero card at scale>1 (bigsign 256 + longboi 512) with an animated capacity bar, for both the team view and the league-superlative view. This is the final widget of the five-widget uplift (scores, standings, promotions, statcast, attendance).
Team card
- Big paid-attendance number,
% FULL,VS AVG(vs the team's season home average), the belted stadium name, and a right-anchoredNN,NNN CAP. - A capacity bar in the home team's color that animates from empty to its fill on card entry, with a tick at the season-average fraction.
- On longboi, the card also shows game-day weather (temp + condition) and a prominent stadium name.
League-superlative card
- The superlative (
BIGGEST CROWD/FULLEST PARK/ …) as the label, the big value, and two adaptive stat columns — crowd superlatives show% FULL+ capacity; fullest/emptiest show the raw crowd + capacity. - Belted venue name, a team-colored chip, and a fill bar (no tick — league mode has no single team's history).
Also
layout = "auto" / "big" / "long"config field. Scale-1 (smallsign) keeps the classic scrolling lines unchanged; a game not yet Final falls back to the classic line rather than an empty bar.- Brighter, higher-contrast labels on the attendance cards for on-panel readability.
- Season average uses
attendanceAverageHomefrom the/attendanceendpoint (the prototype's documented field does not exist).
led-ticker-flair 0.12.0
New transition: flair.fairy (PR #76)
A Tinkerbell-style fairy — a white-hot sparkle-star — crosses the panel trailing a long dwelling cone of gold pixie dust and settling a thin line; when it reaches the far edge the line opens into two twinkling gold edges, revealing the incoming widget in the gap.
Three direction variants (sprite-family convention):
transition = "flair.fairy.forward" # flies left->right
transition = "flair.fairy.reverse" # flies right->left
transition = "flair.fairy.alternating" # flips each firing
transition = {type = "flair.fairy.forward", seed = 42, color = [180, 120, 255]}- Knobs:
seed(pins flight path + spark field),color(dust/line/edge tint; head stays white). Direction = variant, not a knob. - Two-phase: pixie-dust flight over the outgoing, then the settled line opens to reveal the incoming against black (same no-GetPixel constraint as lightning/poker). Section bg_color shows inside the gap from the first sliver.
- Perf designed-in: every spark is a pure function of (column, index, quantized t) — no particle state, no caches, no warm-up. avg 0.28ms/frame dev; CI tripwires bound per-frame paint volume.
- Bigsign smoke config: plugins/flair/examples/config.fairy-smoke.bigsign.toml.
Requires led-ticker-core >= 4.18.0.
led-ticker-flair 0.11.1
flair.poker: heart un-pinched (PR #75)
The heart mask is now core's :heart: emoji implicit curve (with the emoji's normalization — the earlier "shield" reading came from a different normalization, not the curve). Fixes the pinched, dangling tip on resting heart glyphs and large ripple rings; spades (which reuse the heart mask flipped) lose their needle-top for free.
- No config changes; knobs unchanged.
- Guarded by a new pinch tripwire (narrow-row taper bound that the old mask demonstrably fails).
- Full-reveal coverage matrix unchanged; perf same class as 0.10.1 (geometry process-cached).
led-ticker-flair 0.11.0
New transition: flair.lightning (PR #74)
A zigzag bolt strikes across the outgoing widget — white-hot head, flickering electric blue-white trail — then the crack pulls apart into twin glowing zigzag edges, revealing the incoming widget inside the widening gap.
transition = "flair.lightning" # fresh bolt every firing
transition = {type = "flair.lightning", seed = 42} # reproducible bolt path
transition = {type = "flair.lightning", color = [255, 92, 38]} # tinted trail (head stays white)- Two-phase: strike (bolt draws itself L→R over the outgoing) then peel (incoming revealed inside the opening crack, against black outside — same no-GetPixel constraint poker documents).
- Bolt: random-walk zigzag, vertex every 6–10 logical px, center-half band (visual-gate tuned).
- Perf designed-in from the poker arc: pure per-frame functions, no caches, no warm-up; first firing costs the same as every other (avg 0.13ms/frame dev, worst 0.50ms; CI tripwires bound per-frame paint volume).
- Bigsign smoke config:
plugins/flair/examples/config.lightning-smoke.bigsign.toml.
Requires led-ticker-core >= 4.18.0.
baseball v1.3.0 — statcast hero card + animated trajectory (phase 4)
baseball v1.3.0 — Statcast design uplift (Phase 4)
baseball.statcast gains the design handoff's hero card at scale>1, with an animated trajectory whose arc genuinely differs per batted ball.
Hero card (bigsign + longboi)
- Each superlative renders as a hero card: player, color-coded result, exit-velo headline, and launch-angle / distance / pitch details. Scale-1 (smallsign) keeps the classic scrolling superlative lines, byte-identical.
layout = "auto"(default) /"big"/"long".
Animated trajectory (both scale>1 signs)
- Batted-ball superlatives (
longest_hr,hardest_hit) draw an animated arc: the ball flies (~1.5s) then rests at a result-driven landing act —clears(wall tick),fair(ground),track(warning-track line),caught(glove),grounder(flat skip). The flight restarts fresh each time the card is shown. - The arc has teeth: apex height, peak position, descent, and landing come from the ball's real launch angle, exit velo, distance, and batted-ball type — a 470ft moonshot towers over a 365ft wall-scraper, a line-drive draws a flat rope where a fly ball domes. A given ball always draws the same arc; different balls diverge.
- Longboi uses the full-width DISTANCE slot; the bigsign fits a compact panel in the block under the result label.
- Pitch superlatives (
fastest_pitch,slowest_pitch) show the pitch type in that slot instead (no arc).
Notes
- Pure, deterministic trajectory geometry (
trajectory.plan_arc) — no randomness, fully testable. - Enriched
StatRecordcarries the full play context; NaN/inf distances are rejected at the source (no render-loop raise). - All hero-card text is width-guarded so pitch names can't overlap the distance panel or clip the edge.
baseball v1.2.0 — promotions design uplift (phase 3)
baseball v1.2.0 — Promotions design uplift (Phase 3)
baseball.promotions gains the design handoff's hires layouts behind layout = "auto":
- Held promo card (bigsign 256px, and longboi 512px via explicit
layout = "card"): date, promo name, opponent chip + VS line, offer· BYsponsor, start time. A name too wide for its band scrolls inside a hard-clipped marquee while the rest of the card holds still. - Hires crawl (longboi default;
layout = "ticker"elsewhere): the full promo line as engine-scrolled hires segments. Short lines hold centered; overflowing lines rest flush-right. - Masked-clip infrastructure (
_mask.py): offscreen HeadlessCanvas rasterization through the public core surface — no core changes needed. - Scale-1 (smallsign) keeps the classic text rows unchanged.
Hardware-tuning round (longboi)
- Crawl advance no longer bakes in a trailing spacer — scroll stops land flush-right (also fixes the v1.1.x scores crawl's 22px over-scroll; ticker-mode story spacing tightens accordingly).
- Long card: px26 name marquee with even vertical rhythm; time right-anchored at the card edge; right info block one size smaller; the name band extends full-width when the cyan sub line is empty (the norm for clubs that don't populate offerType/presentedBy — e.g. PHI), so most names fit statically.
Notes
- Promos are target-date scoped (today-first), matching the classic widget's semantics.
- Emoji in free-form API text are sanitized out of hires renders (measure/paint drift guard).