Releases: elfhosted/PostersPlus
v1.1.0-elf.7
1.1.0-elf.7 (2026-06-11)
Bug Fixes
v1.1.0-elf.6
1.1.0-elf.6 (2026-06-11)
Bug Fixes
v1.1.0-elf.5
1.1.0-elf.5 (2026-06-10)
Features
v1.1.0-elf.4
1.1.0-elf.4 (2026-06-10)
Bug Fixes
v1.1.0-elf.3
1.1.0-elf.3 (2026-06-10)
Bug Fixes
v1.1.0-elf.2
1.1.0-elf.2 (2026-06-10)
Bug Fixes
v1.1.0-elf.1
1.1.0-elf.1 (2026-06-10)
Features
- add fake textless review report (446dbb7)
- fleet-wide MDBList 429 cooldown over upstream key rotation (7fac294)
- observability, render limits, rate limiting, leader-elected jobs (2a968bc)
- pluggable storage/coordination/blobstore backends on v1.1.0 (b040a1d)
- PRESET_MDBLIST_FETCH — opt-in MDBlist fallback for /p endpoint (#30) (55469b7)
- public-tier lock UI, ElfHosted branding, SEO on tabbed configurator (4f0e04b)
- static-preset overload moat — anonymous /p route on v1.1.0 (5170828)
Bug Fixes
- address codex pre-merge review (CDN 302 on /poster, compose volume) (f5c233b)
- derive preset genre from TMDB when rating is uncached (#28) (9d1b242)
Miscellaneous Chores
- align fork release line to upstream v1.1.0 (a31bfeb)
v1.0.3-elf.4 — opt-in MDBlist fetch for /p endpoint
Fork-only patch on top of upstream v1.0.3.
What changed
Features
PRESET_MDBLIST_FETCHenv (default false) opts /p into a live MDBlist fetch on cache miss. The/ppreset endpoint historically never called MDBlist — anonymous traffic was assumed to need protection from burning the operator's quota. With elf.2's fleet-wide cooldown the worst-case quota burn is now bounded (~120s of paused traffic per 429), so it's safe to enable. Required for preset-only instances (where/posteris gated byPRESET_ENABLED+ noACCESS_KEY→ nothing else warms the rating cache → every preset render was permanent-N/A). (#30)
Behaviour when enabled:
- Same gating as
/poster— global cooldown + per-title back-off. - Coalesced via the shared
_rating_fetch_inflightdict so a burst of concurrent/prequests for the sameimdb_idfans out into exactly one MDBlist call. - Fetch joins the existing image/logo/trending gather so added wall-time is bounded by
max(), notsum(). _RateLimited(retry_after)→ honourRetry-After(cap 1h) for per-title back-off.FETCH_FAILED→ set 1h per-title back-off.- Success → cache the rating row (full awards/festival/cult parsing) and flip
will_persistso the composite gets the long preset TTL on first hit.
Relationship to upstream
The /p/ preset endpoint is fork-only, so this feature isn't applicable upstream.
v1.0.3-elf.3 — preset endpoint genre fix
Fork-only patch on top of upstream v1.0.3.
What changed
Bug Fixes
- Preset endpoint (
/p/...) was rendering literal "Genre: Unknown" for any title that hadn't been rating-cached by a paid/postercall. The preset path deliberately never calls MDBlist (so anonymous traffic can't burn the operator's quota), and its standalone genre-resolution block had no fallback when cached rating data was absent. Now derives the genre label from TMDB'sgenre_ids— same logic/posterhas used since elf.1. (#28)
Relationship to upstream
The /p/ preset endpoint is fork-only — upstream UmbraProjects/PostersPlus has no equivalent route, so this bug and fix are not applicable there.
v1.0.3-elf.2 — MDBlist Retry-After + fleet-wide 429 cooldown
Fork-only patch on top of upstream v1.0.3. The -elf.N suffix is a semver pre-release tag so this sorts strictly between v1.0.3 and the next upstream v1.0.4.
What changed
Bug Fixes
-
MDBlist 429 handling now honours
Retry-Afterand applies a fleet-wide cooldown. When MDBlist returned an HTTP 429, the fork was discarding theRetry-Afterheader, applying a flat 1-hour per-title back-off, and continuing to fan out concurrent requests so every queued title individually tripped its own 429. Now: theRetry-Aftervalue is parsed and used (capped at 1h) for the per-title back-off, and a short global cooldown (capped at 120s) is set on any 429 and checked before every MDBlist call. With the Redis coordinator this cooldown is fleet-wide; with the in-process coordinator it's per-worker. Logs match upstream's format. (#26) -
Rating-display-mode=2 no longer renders literal "Genre ★ None" when no rating is available (e.g. no MDBlist key configured, per-title back-off active, or global cooldown active). Falls back to "N/A" at the source. (#26)
Relationship to upstream
Backport of MDBlist 429 hardening that landed in upstream UmbraProjects/PostersPlus around v1.0.0. Our fork branched off pre-v1.0.0 and missed it.