Big feature + security release
New
- See other users' equipped badges. Public
/profiles/{userId}/equippedendpoint + coloured badge dots next to every leaderboard row, podium spot, category-leaderboard entry, and compare-view user name. Respects every privacy toggle. - Admin quest customization. Add / edit / override daily + weekly quests from the Jellyfin admin page. New
GET/POST /admin/questsAPI, a quest editor section in the admin UI, and aDisabledQuestIdslist for removing built-in quests your server can't satisfy. - Comprehensive translations. All 171 built-in badges now translated to fr / es / de / it / pt / zh-CN / ja. UI key count 553 → 614 — covers every tab (achievement profile, stats snapshot, personal records, heatmap, streak calendar, prestige leaderboard, notification prefs, server stats, compare, leaderboards, recap, quests) and the full admin page.
Fixed
- Disable-equipped-badges toggle actually works now. The SidebarInjectionMiddleware was shipping a bloated inline script that created the sidebar pills + header dots unconditionally — ignoring both the per-user
ShowEquippedShowcasepreference and the admin-levelForceHideEquippedShowcaseoverride. Middleware now emits only the three external scripts, deferring to the gatedsidebar.js. - Live broadcast so the showcase preference takes effect without a hard refresh.
Security audit
Full audit pass. Findings applied:
HIGH
- Compare endpoint (
/compare/{userIdA}/{userIdB}) required caller to be in{userIdA, userIdB}or admin — previously any authenticated user could pollute any other user's on-diskCompareHistory.UserOwnershipFilteronly guards routes with a{userId}token, which this endpoint does not use. - Stored XSS fixed across the admin leaderboard, audit-log viewer, and every admin-page badge renderer. Admin-authored custom badges'
Title/Rarity/Description+ crafted Jellyfin usernames were rendered intoinnerHTMLunescaped. Also fixed inPages/standalone.jsshowcase/equipped cards andPages/showcase.html.
MEDIUM
- Equipped preview in leaderboard response now hides for users with
HideFromLeaderboard=true,HideFromCompare=true, orShowEquippedShowcase=false— previously only the showcase toggle blocked it. /profiles/{userId}/equippedtightened — previously required BOTH leaderboard + compare opt-outs to hide.- Profile-card endpoint returns a unified "unavailable" HTML page for both missing users and render failures, killing the 200 vs 404 user-enumeration oracle.
GiftScorenow validates recipient viaIUserManager, clamps amount to[1, 10000], emits an audit log, and is rate-limited. Stops an attacker from ballooning profiles JSON with bogus IDs.EquipBadge,UnequipBadge,PinBadge,EquipTitle,LoginPing,BuyBadgenow rate-limited withuser-60-per-min.
LOW
- Webhook
HttpClientset toAllowAutoRedirect=false.WebhookUrlValidatoronly vets the initial URL — a malicious webhook could 302-redirect to cloud-metadata / localhost. /testendpoint no longer leaks plugin version + web-injection patched paths + last-error strings to anonymous callers unlessEnableDebugEndpointsis explicitly enabled (default nowfalse).- Middleware exception path restores the response body more safely.
Thanks
Thanks to the French user who sent the detailed feedback on the fork (Xbox logo bug + deactivate-equipped-badges + quest modification request).
MD5: EB00EB09EAB2D172F21279035C9EDDD1