Skip to content

style: site-wide dashboard refresh within the design system - #1546

Merged
LucasSantana-Dev merged 8 commits into
mainfrom
chore/repaint-prototype
Jun 23, 2026
Merged

LucasSantana-Dev merged 8 commits into
mainfrom
chore/repaint-prototype

Conversation

@LucasSantana-Dev

@LucasSantana-Dev LucasSantana-Dev commented Jun 23, 2026 •

Copy link
Copy Markdown
Owner

A consistent visual refresh across all 25 dashboard pages, applied within the existing design system — no new palette, fonts, or dependencies.

Direction (approved off a real before/after prototype)

"Refresh within the system" — keep the lucky-* tokens + shadcn primitives + Sora/Manrope, and tighten the visual craft:

  • Panel/card definition — border border-lucky-border so surfaces read as defined, not floating on the dark canvas
  • Label hierarchy — small metadata labels → uppercase tracking-wide font-semibold (instant "this is metadata" signal)
  • Density rhythm — consistent px-4 py-3 row padding, tidied gaps
  • Hover polish — transition-colors hover:bg-lucky-bg-active/25 on interactive rows; neon-accent left border on nav/quick-action rows
  • Badges — rounded-sm + uppercase font-semibold

Method

Prototyped the treatment on DashboardOverview (reference), got direction sign-off on a real before/after, then fanned out 5 agents × 5 pages (parallel, file-disjoint), each mirroring the reference. className/visual only — no copy, props, logic, or JSX-structure changes.

Verification

  • Frontend: tsc clean, 854 tests pass (78 files), coverage gate green, npm run lint clean.
  • Per-page tests all green during the fan-out (~453 page tests).

Not visually verified

The dashboard is auth-gated, so I could only capture the DashboardOverview reference (see the PR thread / prototype). Recommend a quick smoke test: cd packages/frontend && npm run dev.

Scope note

Marketing/auth/legal pages (Landing, Login, Docs, Changelog, Features, Privacy/Terms) have different layouts and were intentionally left out of this pass — a light follow-up.


Summary by cubic

Site-wide dashboard refresh within the design system and a single navbar server switcher, plus Portuguese translations across 23 dashboard feature pages. Clearer panels/labels/badges, hover polish, and fixes to Discord avatar/icon URLs, button cursors, and decorative icon a11y; no dependency changes.

  • New Features

    • Added pt-BR i18n across 23 dashboard pages; wrapped user-facing strings in t(), expanded en.json/pt-BR.json, and updated i18n init to expose groups in both default and namespaced forms.
  • Refactors

    • Consolidated server switching to the navbar GuildChip with a user avatar/logout menu; removed sidebar switchers and the sidebar user footer; deleted GuildSwitcher/ServerSelector.
    • Panels now have borders; metadata labels and badges are uppercase with tracking-wide and rounded-sm; original spacing restored; hover polish kept; replaced emoji/back glyphs with lucide-react icons; marked decorative chevron/arrow icons aria-hidden for a11y.
    • Added getUserAvatarUrl/getGuildIconUrl helpers and updated usages; restored pointer cursors in index.css. Build/lint clean; tests updated and green.

Written for commit 2cefbf0. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Style
    • Refined UI styling across admin, automation, music, moderation, server, and dashboard pages: clearer bordered panels/cards, updated header typography (uppercase, tracking-wide), improved spacing, and more consistent hover/rounded-corner and badge/button visuals.
    • Updated several badges, filters, and section headers to match the newer design language (including “Active”/status elements and panel wrappers).
    • Replaced VoteBadge emoji icons with decorative SVG icons.
  • Tests
    • Updated UI tests to reflect the new back-button labeling and the switch from emoji assertions to decorative SVG icon checks.

Panel borders for definition, uppercase tracking-wide section/stat labels for
hierarchy, tighter density + badge refinement, and a neon-accent hover on the
quick-action rows. All via existing lucky-* tokens + shadcn primitives — no new
palette, fonts, or deps. Reference treatment for the site-wide refresh.
Apply the approved overview treatment site-wide across the 24 dashboard pages:
panel borders for definition, uppercase tracking-wide metadata labels, density
rhythm, hover polish, and rounded-sm uppercase badges — all via existing lucky-*
tokens + shadcn primitives. Visual/className-only; no copy/logic/structure
changes. 854 frontend tests green.
@vercel

vercel Bot commented Jun 23, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
lucky Ready Ready Preview, Comment Jun 23, 2026 8:55pm

@coderabbitai

coderabbitai Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Global UI styling pass across 25 frontend page components. Changes apply a unified design system: border-lucky-border is added to previously unbordered Card/panel containers, section headings gain uppercase/tracking-wide, badges switch from rounded-full/rounded-xl to rounded-sm/rounded-lg, and label weights are strengthened to font-semibold. VoteBadge replaces emoji icons with SVG icons, Config navigation uses icons instead of characters, and EmbedBuilder receives code formatting cleanup with no logic changes.

Changes

Frontend UI Styling System Update

Layer / File(s) Summary
Config page icon navigation and heading updates
packages/frontend/src/pages/Config.tsx, packages/frontend/src/pages/Config.test.tsx
Config page gains ChevronRight and ArrowLeft icon imports and replaces literal arrow characters with icons in module selector and back button. Module-selection card and header borders switch from soft to standard token. Configuration headings gain uppercase/tracking-wide. Tests updated to query back button by accessible role instead of literal text.
VoteBadge emoji-to-SVG icon replacement
packages/frontend/src/components/Layout/VoteBadge.tsx, packages/frontend/src/components/Layout/VoteBadge.test.tsx
VoteBadge component replaces emoji icons (🗳️ and 💛) with lucide-react SVG icons (ThumbsUp, Heart). Icon imports and JSX rendering updated with aria-hidden attributes. Tests modified to assert aria-hidden on SVG icons instead of emoji elements.
DashboardOverview panel borders, headers, and motion updates
packages/frontend/src/pages/DashboardOverview.tsx
CompactStat gains updated icon sizing, label typography (uppercase+tracking), and delta badge styling. Dashboard panels (Total Members, Recent Cases, Quick Actions, Recent Music, Level Leaderboard, Starboard Highlights) gain border-lucky-border and uppercase headers. Quick Actions links switch to transition-all with left-border highlight and ArrowRight hover translation. Framer Motion transition props expanded to explicit object form.
EmbedBuilder JSX reformatting and form label weights
packages/frontend/src/pages/EmbedBuilder.tsx
JSX expressions throughout EmbedBuilder are reformatted to multi-line style: embed preview rendering (title, fields, footer), FieldEditor callbacks, modal set helper, button label ternary, and delete handler. Form field labels (Template Name, Color, Thumbnail URL, Image URL) change from font-normal to font-semibold.
Admin, ServerSettings, and ServersPage headers and borders
packages/frontend/src/pages/Admin.tsx, packages/frontend/src/pages/ServerSettings.tsx, packages/frontend/src/pages/ServersPage.tsx
Admin section headings (Global Feature Toggles, Server Management) gain uppercase/tracking-wide. ServerSettings cards across five sections gain border-lucky-border and description paragraphs adopt type-meta uppercase/tracking/semibold styling. ServersPage surface panel, heading text, and primary guild button hover updated.
Badge shape and button hover styling updates
packages/frontend/src/pages/AdminSupport.tsx, packages/frontend/src/pages/AutoMessages.tsx, packages/frontend/src/pages/AutoMod.tsx, packages/frontend/src/pages/CustomCommands.tsx, packages/frontend/src/pages/Roles.tsx, packages/frontend/src/pages/Starboard.tsx
Status filter buttons and StatusBadge change from rounded-full to rounded-sm with uppercase/font-semibold. AutoMessages channel/embed/next badges and AutoMod tag/channel/role badges adopt the same treatment. CustomCommands row hover switches to hover:bg-lucky-bg-active/25. Starboard "Active" badge changes to rounded-sm/bg-lucky-success/uppercase.
Explicit borders added to card/panel containers
packages/frontend/src/pages/AutoMod.tsx, packages/frontend/src/pages/Moderation.tsx, packages/frontend/src/pages/ServerLogs.tsx, packages/frontend/src/pages/ReactionRoles.tsx, packages/frontend/src/pages/PreferredArtists.tsx, packages/frontend/src/pages/Starboard.tsx, packages/frontend/src/pages/Levels.tsx
Adds border border-lucky-border to previously unbordered Card wrappers in AutoMod (Templates, Content Filters, Exemptions), Moderation (filters and cases table), ServerLogs (filter and logs list), ReactionRoles MessageCard, PreferredArtists tab panels, Starboard entries/settings, and Levels leaderboard/settings/rewards.
AutoMod section headers and utility function refactoring
packages/frontend/src/pages/AutoMod.tsx
AutoMod main header gains uppercase/tracking styling. Section headers (Templates, Content Filters, Exemptions) gain uppercase/tracking-wide. normalizeNumber validation refactored from single-line early-returns to multi-line equivalent checks. spamTimeWindow onChange handler reformatted to multi-line arrow function.
Section header typography standardization
packages/frontend/src/pages/GuildAutomation.tsx, packages/frontend/src/pages/TrackHistory.tsx, packages/frontend/src/pages/TwitchNotifications.tsx, packages/frontend/src/pages/Lyrics.tsx
GuildAutomation section headers switch to type-meta uppercase/letter-spacing. TrackHistory section headers and RankingCard gain uppercase/tracking styling. TwitchNotifications page header and section containers updated. Moderation table headers gain uppercase/semibold/tracking. Lyrics search form and artist labels switch to type-meta uppercase styling.
Panel shape and border opacity updates
packages/frontend/src/pages/LastFm.tsx, packages/frontend/src/pages/Spotify.tsx, packages/frontend/src/pages/Music.tsx, packages/frontend/src/pages/Support.tsx
LastFm and Spotify panels replace rounded-xl/translucent border with rounded-lg/solid border-lucky-border and reduce padding. Spotify step badge changes rounded-full to rounded-sm. Music hero reduces tracking-wider to tracking-wide. Support form containers switch to small border radius.
Starboard section and field labels typography
packages/frontend/src/pages/Starboard.tsx
Starboard section headers switch to type-title/uppercase/letter-tracking. Empty-state and top-entry Cards gain borders. Field labels (channel, emoji, threshold, self-star toggle) standardized to type-meta uppercase/letter-tracking styling.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~15 minutes

Possibly related PRs

  • LucasSantana-Dev/Lucky#161: Touches DashboardOverview.tsx including CaseRow and Framer Motion transitions as part of the same dashboard UI/style rollout.
  • LucasSantana-Dev/Lucky#955: Modifies packages/frontend/src/pages/Starboard.tsx and packages/frontend/src/pages/Levels.tsx with overlapping UI/JSX styling changes.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately reflects the main objective of the pull request: a visual/styling refresh across dashboard pages within the existing design system.
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 chore/repaint-prototype

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.

@github-actions

Copy link
Copy Markdown

Failed to generate code suggestions for PR

@github-actions

github-actions Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

Size Change: +12.8 kB (+2.82%)

Total Size: 466 kB

📦 View Changed
Filename Size Change
packages/frontend/dist/assets/Admin-BfV4y9I5.js 2.3 kB +2.3 kB (new file) 🆕
packages/frontend/dist/assets/Admin-rMz1u-AZ.js 0 B -2.3 kB (removed) 🏆
packages/frontend/dist/assets/AdminSupport-Ca5TZsiK.js 0 B -1.57 kB (removed) 🏆
packages/frontend/dist/assets/AdminSupport-y9XiOca4.js 1.6 kB +1.6 kB (new file) 🆕
packages/frontend/dist/assets/api-BzWozooH.js 0 B -3.78 kB (removed) 🏆
packages/frontend/dist/assets/api-IIHeW0Kf.js 3.78 kB +3.78 kB (new file) 🆕
packages/frontend/dist/assets/AutoMessages-cMpxzLTX.js 2.65 kB +2.65 kB (new file) 🆕
packages/frontend/dist/assets/AutoMessages-CY4RERKG.js 0 B -2.67 kB (removed) 🏆
packages/frontend/dist/assets/AutoMod-C6qttZaf.js 0 B -4.17 kB (removed) 🏆
packages/frontend/dist/assets/AutoMod-CT4ytRD8.js 4.19 kB +4.19 kB (new file) 🆕
packages/frontend/dist/assets/badge-CI5dBtqB.js 500 B +500 B (new file) 🆕
packages/frontend/dist/assets/badge-Cyf9WI3E.js 0 B -501 B (removed) 🏆
packages/frontend/dist/assets/Card-Cn7VmmCW.js 505 B +505 B (new file) 🆕
packages/frontend/dist/assets/Card-CWzXGqFf.js 0 B -505 B (removed) 🏆
packages/frontend/dist/assets/Changelog-BanXTAbh.js 0 B -38.3 kB (removed) 🏆
packages/frontend/dist/assets/Changelog-X_V_T9CC.js 38.3 kB +38.3 kB (new file) 🆕
packages/frontend/dist/assets/CommandsConfig-COOMFMHL.js 1.5 kB +1.5 kB (new file) 🆕
packages/frontend/dist/assets/CommandsConfig-Droq50nK.js 0 B -1.5 kB (removed) 🏆
packages/frontend/dist/assets/Config-BTYddjru.js 1.97 kB +1.97 kB (new file) 🆕
packages/frontend/dist/assets/Config-D7i0-1wO.js 0 B -1.95 kB (removed) 🏆
packages/frontend/dist/assets/CustomCommands-D5-XiBkm.js 2.12 kB +2.12 kB (new file) 🆕
packages/frontend/dist/assets/CustomCommands-DCTdhuaB.js 0 B -2.11 kB (removed) 🏆
packages/frontend/dist/assets/DashboardOverview-BcUVSSMa.js 3.96 kB +3.96 kB (new file) 🆕
packages/frontend/dist/assets/DashboardOverview-C37tRW0d.js 0 B -3.9 kB (removed) 🏆
packages/frontend/dist/assets/dialog-DQxlHzrx.js 953 B +953 B (new file) 🆕
packages/frontend/dist/assets/dialog-Wr0drB1Q.js 0 B -957 B (removed) 🏆
packages/frontend/dist/assets/Docs-C6gntWLC.js 0 B -17.6 kB (removed) 🏆
packages/frontend/dist/assets/Docs-CKrTfteH.js 17.6 kB +17.6 kB (new file) 🆕
packages/frontend/dist/assets/DocsShell-C3fBkagq.js 0 B -1.42 kB (removed) 🏆
packages/frontend/dist/assets/DocsShell-C6af3BJy.js 1.42 kB +1.42 kB (new file) 🆕
packages/frontend/dist/assets/EmbedBuilder-CpEEhQCu.js 0 B -3.32 kB (removed) 🏆
packages/frontend/dist/assets/EmbedBuilder-DFqyqn-T.js 3.28 kB +3.28 kB (new file) 🆕
packages/frontend/dist/assets/Features-1qtav5a7.js 0 B -755 B (removed) 🏆
packages/frontend/dist/assets/Features-C1W9vAZ2.js 756 B +756 B (new file) 🆕
packages/frontend/dist/assets/GuildAutomation-B8fgISbg.js 2.89 kB +2.89 kB (new file) 🆕
packages/frontend/dist/assets/GuildAutomation-DJfujXTK.js 0 B -3 kB (removed) 🏆
packages/frontend/dist/assets/index-CF5vfQpU.js 0 B -56.7 kB (removed) 🏆
packages/frontend/dist/assets/index-CZkVnlCF.js 70.1 kB +70.1 kB (new file) 🆕
packages/frontend/dist/assets/index-TVLDmMPK.css 0 B -18.2 kB (removed) 🏆
packages/frontend/dist/assets/index-wcDJcD1b.css 18.1 kB +18.1 kB (new file) 🆕
packages/frontend/dist/assets/input-BvcOOYvw.js 464 B +464 B (new file) 🆕
packages/frontend/dist/assets/input-CjufYqD3.js 0 B -463 B (removed) 🏆
packages/frontend/dist/assets/label-1R1-aiZY.js 0 B -476 B (removed) 🏆
packages/frontend/dist/assets/label-BzfU7OSq.js 478 B +478 B (new file) 🆕
packages/frontend/dist/assets/Landing-B3efbngK.js 5.2 kB +5.2 kB (new file) 🆕
packages/frontend/dist/assets/Landing-Da821DYa.js 0 B -5.2 kB (removed) 🏆
packages/frontend/dist/assets/LastFm-AdIg_23J.js 0 B -1.94 kB (removed) 🏆
packages/frontend/dist/assets/LastFm-Cq3HboLB.js 1.74 kB +1.74 kB (new file) 🆕
packages/frontend/dist/assets/Levels-DJGdC_m-.js 2.27 kB +2.27 kB (new file) 🆕
packages/frontend/dist/assets/Levels-yfGfm1UA.js 0 B -2.27 kB (removed) 🏆
packages/frontend/dist/assets/Login-B-pgKXFV.js 2.49 kB +2.49 kB (new file) 🆕
packages/frontend/dist/assets/Login-DmG9XD_m.js 0 B -2.5 kB (removed) 🏆
packages/frontend/dist/assets/Lyrics-BN5YNVKM.js 0 B -1.34 kB (removed) 🏆
packages/frontend/dist/assets/Lyrics-BU8BAKhB.js 1.34 kB +1.34 kB (new file) 🆕
packages/frontend/dist/assets/Moderation-C-gCOLn4.js 3.79 kB +3.79 kB (new file) 🆕
packages/frontend/dist/assets/Moderation-DngAPiHd.js 0 B -3.77 kB (removed) 🏆
packages/frontend/dist/assets/Music-BTCUTvdk.js 5.95 kB +5.95 kB (new file) 🆕
packages/frontend/dist/assets/Music-DKXwGLp6.js 0 B -5.91 kB (removed) 🏆
packages/frontend/dist/assets/MusicConfig-BttHyXlT.js 0 B -1.65 kB (removed) 🏆
packages/frontend/dist/assets/MusicConfig-CT4gce22.js 1.64 kB +1.64 kB (new file) 🆕
packages/frontend/dist/assets/PreferredArtists-DdZhfDd2.js 3.72 kB +3.72 kB (new file) 🆕
packages/frontend/dist/assets/PreferredArtists-Dy46LZuV.js 0 B -3.79 kB (removed) 🏆
packages/frontend/dist/assets/PrivacyPolicy-D3mUwwHQ.js 1.77 kB +1.77 kB (new file) 🆕
packages/frontend/dist/assets/PrivacyPolicy-DiVfA0Nw.js 0 B -1.77 kB (removed) 🏆
packages/frontend/dist/assets/ReactionRoles-BjDFXv7S.js 7.92 kB +7.92 kB (new file) 🆕
packages/frontend/dist/assets/ReactionRoles-DGDs3anF.js 0 B -7.97 kB (removed) 🏆
packages/frontend/dist/assets/Roles-BKy5FrsL.js 3.34 kB +3.34 kB (new file) 🆕
packages/frontend/dist/assets/Roles-CoZTTooF.js 0 B -3.33 kB (removed) 🏆
packages/frontend/dist/assets/SectionHeader-D3cCS5fg.js 0 B -894 B (removed) 🏆
packages/frontend/dist/assets/SectionHeader-N3yFUtCJ.js 895 B +895 B (new file) 🆕
packages/frontend/dist/assets/select-cjSI3iD1.js 1.22 kB +1.22 kB (new file) 🆕
packages/frontend/dist/assets/select-DsnfQ2MZ.js 0 B -1.23 kB (removed) 🏆
packages/frontend/dist/assets/ServerLogs-BdRKwBJd.js 0 B -3.06 kB (removed) 🏆
packages/frontend/dist/assets/ServerLogs-YUlzrTuu.js 3.04 kB +3.04 kB (new file) 🆕
packages/frontend/dist/assets/ServerSettings-DL7JxhZq.js 3.99 kB +3.99 kB (new file) 🆕
packages/frontend/dist/assets/ServerSettings-z-oqxFXx.js 0 B -4.17 kB (removed) 🏆
packages/frontend/dist/assets/ServersPage-BD9FrgOA.js 3.04 kB +3.04 kB (new file) 🆕
packages/frontend/dist/assets/ServersPage-CufneTGQ.js 0 B -2.99 kB (removed) 🏆
packages/frontend/dist/assets/Skeleton-CLrCJPjB.js 0 B -235 B (removed) 🏆
packages/frontend/dist/assets/Skeleton-Dw7rqj6-.js 235 B +235 B (new file) 🆕
packages/frontend/dist/assets/Spotify-BLmlL13j.js 0 B -1.94 kB (removed) 🏆
packages/frontend/dist/assets/Spotify-DEFuDha0.js 1.75 kB +1.75 kB (new file) 🆕
packages/frontend/dist/assets/Starboard-Bxitlcmn.js 0 B -1.77 kB (removed) 🏆
packages/frontend/dist/assets/Starboard-Q2B6EmhP.js 1.82 kB +1.82 kB (new file) 🆕
packages/frontend/dist/assets/StatTile-C_zapBcs.js 0 B -637 B (removed) 🏆
packages/frontend/dist/assets/StatTile-CDN5ntev.js 635 B +635 B (new file) 🆕
packages/frontend/dist/assets/Support-CNIYB05d.js 1.55 kB +1.55 kB (new file) 🆕
packages/frontend/dist/assets/Support-DuBJ9wBw.js 0 B -1.52 kB (removed) 🏆
packages/frontend/dist/assets/switch-BQXdLpBR.js 0 B -542 B (removed) 🏆
packages/frontend/dist/assets/switch-Dmfl-yeB.js 540 B +540 B (new file) 🆕
packages/frontend/dist/assets/TermsOfService-BNGXxF4N.js 0 B -1.59 kB (removed) 🏆
packages/frontend/dist/assets/TermsOfService-DQDAUljm.js 1.6 kB +1.6 kB (new file) 🆕
packages/frontend/dist/assets/TrackHistory-9hF6u_H3.js 2.31 kB +2.31 kB (new file) 🆕
packages/frontend/dist/assets/TrackHistory-HBi1YIUs.js 0 B -2.29 kB (removed) 🏆
packages/frontend/dist/assets/TwitchNotifications-BmZQgCMa.js 0 B -2.43 kB (removed) 🏆
packages/frontend/dist/assets/TwitchNotifications-BpsK3nUb.js 2.43 kB +2.43 kB (new file) 🆕
packages/frontend/dist/assets/useActiveHeading-BttgpYh5.js 1.35 kB +1.35 kB (new file) 🆕
packages/frontend/dist/assets/useActiveHeading-oFjIQqAd.js 0 B -1.36 kB (removed) 🏆
packages/frontend/dist/assets/useFeatures-BCyHgJv3.js 2.06 kB +2.06 kB (new file) 🆕
packages/frontend/dist/assets/useFeatures-R3CAOQbP.js 0 B -2.06 kB (removed) 🏆
packages/frontend/dist/assets/vendor-radix-DPjwWaDf.js 0 B -39.9 kB (removed) 🏆
packages/frontend/dist/assets/vendor-radix-qkfmDH9H.js 39.9 kB +39.9 kB (new file) 🆕
packages/frontend/dist/assets/vendor-react-B2lWEVt_.js 0 B -55.7 kB (removed) 🏆
packages/frontend/dist/assets/vendor-react-B7C34xnu.js 55.7 kB +55.7 kB (new file) 🆕
packages/frontend/dist/assets/vendor-state-CNyyWKJO.js 0 B -24.2 kB (removed) 🏆
packages/frontend/dist/assets/vendor-state-Dw4-MN6C.js 24.2 kB +24.2 kB (new file) 🆕
packages/frontend/dist/assets/vendor-ui-DLf1J8hB.js 0 B -65.7 kB (removed) 🏆
packages/frontend/dist/assets/vendor-ui-Dy3hnobj.js 65.8 kB +65.8 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
packages/frontend/dist/assets/legalNav-B6k3CWsW.js 274 B
packages/frontend/dist/assets/rolldown-runtime-Cyuzqnbw.js 471 B
packages/frontend/dist/assets/routeMeta-BZjtwMbs.js 595 B
packages/frontend/dist/assets/sentry-DhXOA89y.js 3.76 kB
packages/frontend/dist/assets/usePageMetadata-DTv-6eVb.js 327 B
packages/frontend/dist/assets/vendor-forms-C-bof8GF.js 25.9 kB

compressed-size-action

@coderabbitai coderabbitai Bot added the enhancement New feature or request label Jun 23, 2026
coderabbitai[bot]
coderabbitai Bot previously requested changes Jun 23, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/frontend/src/pages/DashboardOverview.tsx (1)

439-461: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use the shared /25 hover token here.

Quick Actions is the only refreshed row group still using hover:bg-lucky-bg-active/40, so it reads heavier than the rest of the dashboard polish.

♻️ Proposed fix
- className='group flex items-center gap-3 border-l-2 border-l-transparent px-4 py-2.5 transition-all hover:border-l-lucky-brand hover:bg-lucky-bg-active/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-lucky-brand/60'
+ className='group flex items-center gap-3 border-l-2 border-l-transparent px-4 py-2.5 transition-colors hover:border-l-lucky-brand hover:bg-lucky-bg-active/25 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-lucky-brand/60'
🤖 Prompt for 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.

In `@packages/frontend/src/pages/DashboardOverview.tsx` around lines 439 - 461,
The Link component in the visibleQuickActions.map function uses
hover:bg-lucky-bg-active/40 for its hover background, which is visually heavier
than other dashboard elements. Replace hover:bg-lucky-bg-active/40 with the
shared hover token hover:bg-lucky-bg-active/25 in the className prop of the Link
component to maintain visual consistency with the rest of the dashboard polish.
🤖 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 `@packages/frontend/src/pages/Starboard.tsx`:
- Around line 215-218: The Badge component displaying "Active" in the
Starboard.tsx file has insufficient contrast between the background color
`bg-lucky-success` and the text color `text-lucky-text-primary`. Replace the
`text-lucky-text-primary` class with a text color token that provides better
contrast against the success background color, following the same contrast
pattern used in the tinted badges elsewhere in the codebase. Review the design
token definitions to ensure the new text color pairing meets accessibility
standards for the extra small text size.

---

Outside diff comments:
In `@packages/frontend/src/pages/DashboardOverview.tsx`:
- Around line 439-461: The Link component in the visibleQuickActions.map
function uses hover:bg-lucky-bg-active/40 for its hover background, which is
visually heavier than other dashboard elements. Replace
hover:bg-lucky-bg-active/40 with the shared hover token
hover:bg-lucky-bg-active/25 in the className prop of the Link component to
maintain visual consistency with the rest of the dashboard polish.
🪄 Autofix (Beta)

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

Run ID: 9cb46f3f-24f8-46e5-9d36-3020108f24ce

📥 Commits

Reviewing files that changed from the base of the PR and between ac5e0e9 and 29a2ada.

📒 Files selected for processing (25)
  • packages/frontend/src/pages/Admin.tsx
  • packages/frontend/src/pages/AdminSupport.tsx
  • packages/frontend/src/pages/AutoMessages.tsx
  • packages/frontend/src/pages/AutoMod.tsx
  • packages/frontend/src/pages/Config.tsx
  • packages/frontend/src/pages/CustomCommands.tsx
  • packages/frontend/src/pages/DashboardOverview.tsx
  • packages/frontend/src/pages/EmbedBuilder.tsx
  • packages/frontend/src/pages/GuildAutomation.tsx
  • packages/frontend/src/pages/LastFm.tsx
  • packages/frontend/src/pages/Levels.tsx
  • packages/frontend/src/pages/Lyrics.tsx
  • packages/frontend/src/pages/Moderation.tsx
  • packages/frontend/src/pages/Music.tsx
  • packages/frontend/src/pages/PreferredArtists.tsx
  • packages/frontend/src/pages/ReactionRoles.tsx
  • packages/frontend/src/pages/Roles.tsx
  • packages/frontend/src/pages/ServerLogs.tsx
  • packages/frontend/src/pages/ServerSettings.tsx
  • packages/frontend/src/pages/ServersPage.tsx
  • packages/frontend/src/pages/Spotify.tsx
  • packages/frontend/src/pages/Starboard.tsx
  • packages/frontend/src/pages/Support.tsx
  • packages/frontend/src/pages/TrackHistory.tsx
  • packages/frontend/src/pages/TwitchNotifications.tsx
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
  • GitHub Check: Test — bot
  • GitHub Check: Checks
  • GitHub Check: Test — frontend
  • GitHub Check: Test — backend
  • GitHub Check: cubic · AI code reviewer
  • GitHub Check: quality / SAST (CodeQL) (javascript-typescript)
  • GitHub Check: compressed-size
  • GitHub Check: Build — bot
🔇 Additional comments (25)
packages/frontend/src/pages/EmbedBuilder.tsx (1)

46-48: LGTM!

Also applies to: 60-69, 80-88, 106-113, 131-133, 147-159, 199-202, 248-248, 261-261, 310-310, 322-322, 350-362, 377-381, 393-395, 456-456, 504-506, 515-528, 549-561, 574-576, 592-600, 611-613

packages/frontend/src/pages/DashboardOverview.tsx (1)

97-121: LGTM!

Also applies to: 144-147, 190-195, 293-296, 305-329, 355-367, 423-430, 472-480, 568-583, 632-632, 647-649, 727-730

packages/frontend/src/pages/AutoMod.tsx (1)

65-65: LGTM!

Also applies to: 175-175, 233-233, 297-297, 361-364, 679-679, 708-711, 729-731, 753-755, 855-859, 869-869

packages/frontend/src/pages/Moderation.tsx (1)

450-450: LGTM!

Also applies to: 493-500, 546-549

packages/frontend/src/pages/ServerLogs.tsx (1)

263-263: LGTM!

Also applies to: 357-357

packages/frontend/src/pages/ReactionRoles.tsx (1)

141-141: LGTM!

packages/frontend/src/pages/PreferredArtists.tsx (1)

457-457: LGTM!

Also applies to: 503-503, 673-673, 721-721

packages/frontend/src/pages/Levels.tsx (1)

199-203: LGTM!

Also applies to: 213-230, 243-244, 320-321

packages/frontend/src/pages/Admin.tsx (1)

108-108: LGTM!

Also applies to: 153-153, 181-181

packages/frontend/src/pages/Config.tsx (1)

58-58: LGTM!

Also applies to: 78-81, 113-113

packages/frontend/src/pages/ServerSettings.tsx (1)

592-592: LGTM!

Also applies to: 638-638, 728-735, 807-807, 817-817, 854-854, 864-864

packages/frontend/src/pages/ServersPage.tsx (1)

46-83: LGTM!

Also applies to: 141-149, 189-197

packages/frontend/src/pages/GuildAutomation.tsx (1)

368-368: LGTM!

Also applies to: 445-445, 457-457, 475-475, 544-547

packages/frontend/src/pages/TrackHistory.tsx (1)

131-141: LGTM!

Also applies to: 216-216, 240-246, 302-302, 327-330

packages/frontend/src/pages/TwitchNotifications.tsx (1)

231-231: LGTM!

Also applies to: 251-257, 268-268, 295-302, 317-317, 327-327, 341-342, 356-356, 392-398

packages/frontend/src/pages/LastFm.tsx (1)

98-98: LGTM!

Also applies to: 123-123, 169-169, 191-191, 206-206, 222-222

packages/frontend/src/pages/Spotify.tsx (1)

98-98: LGTM!

Also applies to: 123-123, 145-150, 169-169, 192-192, 207-207, 223-223, 235-235

packages/frontend/src/pages/Music.tsx (1)

181-181: LGTM!

Also applies to: 200-200

packages/frontend/src/pages/Support.tsx (1)

134-134: LGTM!

Also applies to: 144-144, 155-156, 160-162, 185-185

packages/frontend/src/pages/Lyrics.tsx (1)

56-59: LGTM!

Also applies to: 61-64, 66-68, 86-86, 141-148, 150-153

packages/frontend/src/pages/AdminSupport.tsx (1)

50-50: LGTM!

Also applies to: 85-85, 185-185

packages/frontend/src/pages/AutoMessages.tsx (1)

355-355: LGTM!

Also applies to: 403-403, 413-413, 425-432

packages/frontend/src/pages/CustomCommands.tsx (1)

200-200: LGTM!

Also applies to: 212-212

packages/frontend/src/pages/Roles.tsx (1)

592-592: LGTM!

packages/frontend/src/pages/Starboard.tsx (1)

166-170: LGTM!

Also applies to: 182-185, 209-214, 221-225, 239-242, 256-259, 280-283

Comment thread packages/frontend/src/pages/Starboard.tsx

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

3 issues found across 25 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/src/pages/DashboardOverview.tsx">

<violation number="1" location="packages/frontend/src/pages/DashboardOverview.tsx:97">
P2: Non-interactive `CompactStat` rows have hover styling that contradicts the PR's stated pattern of applying hover polish only to interactive rows, creating false affordances.</violation>
</file>

<file name="packages/frontend/src/pages/Starboard.tsx">

<violation number="1" location="packages/frontend/src/pages/Starboard.tsx:215">
P3: Use a higher-contrast success badge treatment here. The `bg-lucky-success` + `text-lucky-text-primary` pairing on `text-xs` text can be hard to read.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread packages/frontend/src/pages/Music.tsx Outdated
Comment thread packages/frontend/src/pages/DashboardOverview.tsx
Comment thread packages/frontend/src/pages/Starboard.tsx
VoteBadge used emoji as icons in the shell header (shown on every page) and
Config used literal arrow glyphs (a go-affordance + a redundant back arrow).
Swap for lucide (ThumbsUp/Heart, ChevronRight) and drop the redundant arrow;
update the tests that asserted on the emoji/text.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

0 issues found across 4 files (changes from recent commits).

Requires human review: Auto-approval blocked by 3 unresolved issues from previous reviews.

Re-trigger cubic

The site-wide refresh's per-page padding/gap changes (p-8->p-6, added gap-4,
row-padding shuffles on ~6 pages) were inconsistent and not part of the approved
direction. Restore each page's original spacing while keeping the vetted parts:
panel borders, uppercase label hierarchy, badge restyles, lucide icons, hover
polish. Net result = original spacing + visual-definition improvements.
coderabbitai[bot]
coderabbitai Bot previously requested changes Jun 23, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/frontend/src/pages/GuildAutomation.tsx (1)

368-368: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Remove redundant utility classes that duplicate type-meta properties.

The type-meta utility already defines text-transform: uppercase, letter-spacing: 0.07em, and font-weight: 600. The explicit uppercase, tracking-wide, and font-semibold classes in the className are redundant and create potential cascade conflicts. The tracking-wide class (0.025em) also conflicts with type-meta's built-in 0.07em letter-spacing.

♻️ Simplify to rely on type-meta's built-in properties
-<h2 className='type-meta text-lucky-text-tertiary uppercase tracking-wide font-semibold'>
+<h2 className='type-meta text-lucky-text-tertiary'>

Apply this pattern to all four affected headings (lines 368, 445, 457, 475).

As per coding guidelines, the @utility type-meta definition in packages/frontend/src/index.css lines 290-297 already provides uppercase transform, letter-spacing, and font-weight.

Also applies to: 445-447, 457-459, 475-477

🤖 Prompt for 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.

In `@packages/frontend/src/pages/GuildAutomation.tsx` at line 368, The h2 elements
in GuildAutomation.tsx contain redundant utility classes that duplicate
properties already defined in the type-meta utility class from
packages/frontend/src/index.css. The type-meta utility already provides
uppercase text transformation, letter-spacing of 0.07em, and font-weight of 600,
making the explicit uppercase, tracking-wide, and font-semibold classes
redundant. Additionally, tracking-wide's 0.025em letter-spacing conflicts with
type-meta's 0.07em. Remove the uppercase, tracking-wide, and font-semibold
classes from the className attributes of all four affected h2 elements at lines
368, 445, 457, and 475, keeping only the type-meta and text-lucky-text-tertiary
classes to rely on the utility's built-in properties.
🤖 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 `@packages/frontend/src/pages/Config.tsx`:
- Line 164: The ChevronRight icon is decorative and should not be announced by
screen readers since the button already has an accessible name from the module
title and description. Add the aria-hidden="true" attribute to the ChevronRight
component to ensure assistive technologies skip over the SVG structure and only
announce the meaningful button label.
- Line 181: The ArrowLeft icon component in the back button is decorative since
the button's accessible name already comes from the "Back" text label. Add the
aria-hidden="true" attribute to the ArrowLeft component to prevent screen
readers from announcing the SVG structure and duplicate information to users
with assistive devices.

---

Outside diff comments:
In `@packages/frontend/src/pages/GuildAutomation.tsx`:
- Line 368: The h2 elements in GuildAutomation.tsx contain redundant utility
classes that duplicate properties already defined in the type-meta utility class
from packages/frontend/src/index.css. The type-meta utility already provides
uppercase text transformation, letter-spacing of 0.07em, and font-weight of 600,
making the explicit uppercase, tracking-wide, and font-semibold classes
redundant. Additionally, tracking-wide's 0.025em letter-spacing conflicts with
type-meta's 0.07em. Remove the uppercase, tracking-wide, and font-semibold
classes from the className attributes of all four affected h2 elements at lines
368, 445, 457, and 475, keeping only the type-meta and text-lucky-text-tertiary
classes to rely on the utility's built-in properties.
🪄 Autofix (Beta)

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

Run ID: 95c0dae7-28a3-489d-b7ae-4f4781bd231e

📥 Commits

Reviewing files that changed from the base of the PR and between 29a2ada and 2fa8d9f.

📒 Files selected for processing (11)
  • packages/frontend/src/components/Layout/VoteBadge.test.tsx
  • packages/frontend/src/components/Layout/VoteBadge.tsx
  • packages/frontend/src/pages/Config.test.tsx
  • packages/frontend/src/pages/Config.tsx
  • packages/frontend/src/pages/DashboardOverview.tsx
  • packages/frontend/src/pages/EmbedBuilder.tsx
  • packages/frontend/src/pages/GuildAutomation.tsx
  • packages/frontend/src/pages/LastFm.tsx
  • packages/frontend/src/pages/Levels.tsx
  • packages/frontend/src/pages/Music.tsx
  • packages/frontend/src/pages/TrackHistory.tsx
✅ Files skipped from review due to trivial changes (6)
  • packages/frontend/src/components/Layout/VoteBadge.tsx
  • packages/frontend/src/pages/Music.tsx
  • packages/frontend/src/components/Layout/VoteBadge.test.tsx
  • packages/frontend/src/pages/LastFm.tsx
  • packages/frontend/src/pages/Levels.tsx
  • packages/frontend/src/pages/EmbedBuilder.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/frontend/src/pages/TrackHistory.tsx
  • packages/frontend/src/pages/DashboardOverview.tsx
📜 Review details
⏰ Context from checks skipped due to timeout. (9)
  • GitHub Check: Test — bot
  • GitHub Check: Test — shared
  • GitHub Check: Test — backend
  • GitHub Check: Checks
  • GitHub Check: Test — frontend
  • GitHub Check: cubic · AI code reviewer
  • GitHub Check: quality / SAST (CodeQL) (javascript-typescript)
  • GitHub Check: quality / Lint (lint)
  • GitHub Check: compressed-size
🔇 Additional comments (4)
packages/frontend/src/pages/Config.tsx (2)

3-9: LGTM!


64-64: LGTM!

Also applies to: 84-87, 119-119

packages/frontend/src/pages/Config.test.tsx (1)

73-75: LGTM!

Also applies to: 92-92

packages/frontend/src/pages/GuildAutomation.tsx (1)

544-544: 📐 Maintainability & Code Quality

No action needed. The space-y-3 spacing at line 544 is the correct original spacing being restored as part of the PR's stated objective to "Restore each page's original spacing while keeping the vetted parts." This change is intentional and fully aligns with the PR's goal.

			> Likely an incorrect or invalid review comment.

Comment thread packages/frontend/src/pages/Config.tsx Outdated
Comment thread packages/frontend/src/pages/Config.tsx Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 7 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/src/pages/Levels.tsx">

<violation number="1" location="packages/frontend/src/pages/Levels.tsx:218">
P2: Leaderboard row padding changed to `p-4` instead of the standardized `px-4 py-3` pattern used across the dashboard refresh.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread packages/frontend/src/pages/Levels.tsx
LucasSantana-Dev added a commit that referenced this pull request Jun 23, 2026
Adds an isolated **staging environment** so dashboard/frontend changes
can be visually verified on a real branch — with real Discord OAuth +
guild data — before they reach production. (The whole repaint-screenshot
saga proved we had no way to do this.)

## What it is
A dashboard-only mirror of prod on the homelab, live at
**https://lucky-staging.lucassantana.tech** (already stood up + verified
— currently serving #1546 for review).

- `docker-compose.staging.yml` — isolated stack (project
`lucky-staging`, own network/volumes/ports 8093, **no bot**, reuses the
prod Discord app + the prod tunnel)
- `scripts/deploy-staging.sh` + wrapper — checkout ref → build locally →
migrate → up → health-check (infra compose from main, app source from
the branch); self-heals the tunnel↔staging-network link
- `deploy/hooks.json` — `deploy-staging` webhook hook; webhook container
mounts the staging checkout
- `.github/workflows/deploy-staging.yml` — add the **`staging`** label
to a PR → it auto-deploys + comments the URL (single shared env, one PR
at a time); `workflow_dispatch` for any ref
- `docs/STAGING.md`

## Isolation
Separate compose project, containers (`lucky-staging-*`), network,
DB/redis volumes, nginx host port (8093 vs 8090). Shares the prod
Discord `CLIENT_ID` (staging redirect added) and tunnel (staging
public-hostname added → `lucky-staging-nginx:8080`).

## Activation after merge
1. Host prod checkout syncs to main (next prod deploy) →
`docker-compose.yml` webhook mount + `hooks.json` land
2. Recreate the webhook container once (picks up the staging-dir mount +
the new hook)
3. Label any PR `staging` → auto-deploy

Host-side (staging `.env`, tunnel ingress, DNS, Discord redirect) is
already configured.

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Adds a single, isolated homelab staging environment to visually review
dashboard/frontend branches with real Discord OAuth and guild data
before merging to main. Label a PR `staging` to auto-build and deploy
the branch to https://lucky-staging.lucassantana.tech.

- **New Features**
- Isolated `lucky-staging` stack via `docker-compose.staging.yml` (own
project/network/volumes, port 8093); dashboard-only, no bot; reuses prod
Discord app and Cloudflare tunnel.
- Auto-deploys when a PR is labeled `staging` via
`.github/workflows/deploy-staging.yml`; posts the URL on the PR;
supports `workflow_dispatch` for any ref; actionlint-safe env handling.
- Webhook in `deploy/hooks.json` runs
`scripts/deploy-staging-wrapper.sh`; `docker-compose.yml` mounts the
staging checkout for builds.
- `scripts/deploy-staging.sh`: checks out the ref, builds images
locally, runs migrations, brings up the stack, health-checks, and
re-attaches `lucky-tunnel` to the staging network.
- Docs: `docs/STAGING.md` with usage and isolation details. Single
shared env; one PR at a time.

- **Migration**
- After merge, recreate the webhook container once to pick up the new
mount and hook; then label any PR `staging` to deploy. Host-side env,
tunnel ingress, DNS, and Discord redirect are already configured.

<sup>Written for commit 95f08c2.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/LucasSantana-Dev/Lucky/pull/1547?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->
@LucasSantana-Dev LucasSantana-Dev added the staging Deploy this PR to the staging environment label Jun 23, 2026
- Server switcher: remove the two redundant sidebar switchers (the ACTIVE GUILD
  card + the SERVER dropdown) and the sidebar user footer; the navbar now holds
  the single GuildChip switcher with a UserMenu (avatar + logout) to its right.
  Deletes the now-dead GuildSwitcher + ServerSelector components.
- Avatar: ServersPage passed the raw Discord avatar hash; build the CDN URL via
  a shared @/lib/discord helper (reused by the navbar UserMenu).
- Cursor: Tailwind v4 preflight sets button{cursor:default}; restore
  cursor-pointer on enabled buttons via an index.css base layer.
@github-actions

github-actions Bot commented Jun 23, 2026 •

Copy link
Copy Markdown

🧪 Staging deploy triggered — building 2cefbf0 on the homelab.

Once it's up (~2-3 min for the image build), review it at https://lucky-staging.lucassantana.tech.

Single shared environment — the most-recently-labeled PR occupies it. The build runs locally on the homelab; watch the deploy log there if it doesn't come up.

@github-actions

github-actions Bot commented Jun 23, 2026 •

Copy link
Copy Markdown
Warnings
⚠️

Big PR — 4351 lines changed across 43 files. Consider splitting into smaller, reviewable chunks.

Generated by 🚫 dangerJS against 2cefbf0

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

3 issues found across 8 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/src/lib/discord.ts">

<violation number="1" location="packages/frontend/src/lib/discord.ts:8">
P2: Dead unused export `getGuildIconUrl` introduced without adoption</violation>
</file>

<file name="packages/frontend/src/components/Layout/Layout.tsx">

<violation number="1" location="packages/frontend/src/components/Layout/Layout.tsx:115">
P2: UserMenu subscribes to entire Zustand stores without selectors, causing unnecessary re-renders on any auth/guild state mutation.</violation>
</file>

<file name="packages/frontend/src/components/Layout/Sidebar.tsx">

<violation number="1" location="packages/frontend/src/components/Layout/Sidebar.tsx:389">
P1: Mobile sidebar lacks an accessible close control after GuildHeader removal. The removed header contained an explicit close button (`X` with aria-label), and the only remaining dismissal mechanism is a backdrop click handler on an `aria-hidden` overlay, which is inaccessible to keyboard users and screen readers. Add an explicit close button inside the mobile sidebar or add an Escape key handler and remove `aria-hidden` from the backdrop with a keyboard-accessible close action.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread packages/frontend/src/components/Layout/Sidebar.tsx
Comment thread packages/frontend/src/lib/discord.ts
Comment thread packages/frontend/src/components/Layout/Layout.tsx
Wrap user-facing strings on dashboard feature pages in t() and add English plus
Brazilian-Portuguese translations so the language switcher translates the
dashboard. EN values are verbatim (no English visual change). Marketing and
legal prose pages deferred as a separate content-translation job.
Address CodeRabbit a11y note — the ChevronRight/ArrowLeft icons next to text
labels are decorative; hide them from screen readers.
@LucasSantana-Dev
LucasSantana-Dev dismissed stale reviews from coderabbitai[bot] and coderabbitai[bot] June 23, 2026 20:56

CodeRabbit (bot) review: a11y notes addressed (aria-hidden on decorative icons, 2cefbf0); all threads resolved; the type-meta redundant-class note left intentionally (removing tracking-wide would change approved letter-spacing).

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

0 issues found across 1 file (changes from recent commits).

Requires human review: This PR makes extensive changes across 25+ dashboard pages, including i18n integration, new user menu, removal of server selector components, and layout restructuring — not just visual updates.

Re-trigger cubic

@LucasSantana-Dev
LucasSantana-Dev enabled auto-merge (squash) June 23, 2026 20:56
@sonarqubecloud

Copy link
Copy Markdown

@LucasSantana-Dev
LucasSantana-Dev merged commit abda321 into main Jun 23, 2026
47 checks passed
@LucasSantana-Dev
LucasSantana-Dev deleted the chore/repaint-prototype branch June 23, 2026 20:59
LucasSantana-Dev added a commit that referenced this pull request Jun 23, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>2.22.0</summary>

##
[2.22.0](v2.21.0...v2.22.0)
(2026-06-23)


### Features

* **dashboard:** refresh, single server switcher, i18n, avatar+cursor
([#1546](#1546))
([abda321](abda321))
* **infra:** homelab staging environment for visual PR review
([#1547](#1547))
([c15fa38](c15fa38))
* **reaction-roles:** editable form, emoji picker, formatting, media,
export/import
([#1544](#1544))
([ac5e0e9](ac5e0e9))


### Bug Fixes

* **backend:** harden role + reaction-role write-path error handling
([#1543](#1543))
([18a36ba](18a36ba))
* **infra:** route staging via host port
([#1548](#1548))
([fe5b153](fe5b153))
* **infra:** staging deploy git ownership
([#1554](#1554))
([de5a322](de5a322))
* **infra:** staging deploy health check
([#1556](#1556))
([fda6eea](fda6eea))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Release 2.22.0 adds a refreshed dashboard and a revamped reaction-roles
editor, plus a new homelab staging environment for visual PR review. It
also improves backend error handling and stabilizes staging deploys.

- **New Features**
  - Dashboard refresh: single server switcher, i18n, avatar + cursor.
- Reaction-roles editor: emoji picker, formatting/media, import/export.
  - Homelab staging environment for visual PR review.

- **Bug Fixes**
  - Hardened role and reaction-role write-path error handling.
- Staging reliability: routing via host port, git ownership, and health
checks.

<sup>Written for commit ca8c234.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/LucasSantana-Dev/Lucky/pull/1560?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->
LucasSantana-Dev added a commit that referenced this pull request Jul 9, 2026
:robot: I have created a release *beep* *boop*
---


<details><summary>2.33.0</summary>

##
[2.33.0](https://github.com/LucasSantana-Dev/Lucky/compare/v2.32.3...v2.33.0)
(2026-07-09)


### Features

* **autoplay:** add implicit-dislike-penalty signal
([#1374](https://github.com/LucasSantana-Dev/Lucky/issues/1374))
([593c0ad](https://github.com/LucasSantana-Dev/Lucky/commit/593c0ada5b732b4a48d63204c8e849c4b5057677))
* **autoplay:** add recency-decay signal for queue diversity
([#1376](https://github.com/LucasSantana-Dev/Lucky/issues/1376))
([b85e2a0](https://github.com/LucasSantana-Dev/Lucky/commit/b85e2a0f5d79efd04590d17db58faee5f5a50d38))
* **autoplay:** boost candidates for frequently replayed tracks
([#1370](https://github.com/LucasSantana-Dev/Lucky/issues/1370))
([215edea](https://github.com/LucasSantana-Dev/Lucky/commit/215edea22b8e99ab114f3450323a5f5de61ce6fb))
* **autoplay:** guild opt-out toggle for sertanejo veto
([#1087](https://github.com/LucasSantana-Dev/Lucky/issues/1087))
([#1373](https://github.com/LucasSantana-Dev/Lucky/issues/1373))
([6cb5588](https://github.com/LucasSantana-Dev/Lucky/commit/6cb55883f850aca68f4a6d5c2d5a3e5b492df8d5))
* **autoplay:** guild-scope implicit dislike for autoplay skips
([#1578](https://github.com/LucasSantana-Dev/Lucky/issues/1578))
([70b8596](https://github.com/LucasSantana-Dev/Lucky/commit/70b8596e7d4a0de5468e701f111c288aef9abe35))
* **autoplay:** hit@k eval harness for recommendation scoring
([#1577](https://github.com/LucasSantana-Dev/Lucky/issues/1577))
([2a0c6c4](https://github.com/LucasSantana-Dev/Lucky/commit/2a0c6c43f83fc5bf2f552549f3dfc832aeb8a95f))
* **autoplay:** instrument outcome eval to disambiguate
[#1275](https://github.com/LucasSantana-Dev/Lucky/issues/1275)
([#1491](https://github.com/LucasSantana-Dev/Lucky/issues/1491))
([1921ab5](https://github.com/LucasSantana-Dev/Lucky/commit/1921ab58ac8de1826fe73a931a02a9a5bf9c7541))
* **autoplay:** quick-wins batch — mood-cache clear, provider telemetry,
accept-rate
([#1090](https://github.com/LucasSantana-Dev/Lucky/issues/1090)
[#1083](https://github.com/LucasSantana-Dev/Lucky/issues/1083)
[#1086](https://github.com/LucasSantana-Dev/Lucky/issues/1086))
([#1102](https://github.com/LucasSantana-Dev/Lucky/issues/1102))
([7d7e4f5](https://github.com/LucasSantana-Dev/Lucky/commit/7d7e4f5451a67eac311c72270e9fe59c7aa4ff98))
* **backend:** add zod validation to artists and toggles routes
([#1189](https://github.com/LucasSantana-Dev/Lucky/issues/1189))
([#1334](https://github.com/LucasSantana-Dev/Lucky/issues/1334))
([b59fb35](https://github.com/LucasSantana-Dev/Lucky/commit/b59fb35244d9f1712d0730035c154ba471e34544))
* **backend:** dedup key for support-report intake
([#1319](https://github.com/LucasSantana-Dev/Lucky/issues/1319))
([#1328](https://github.com/LucasSantana-Dev/Lucky/issues/1328))
([4d95307](https://github.com/LucasSantana-Dev/Lucky/commit/4d9530762e37c97440e2e6a6957886ff41fcc1b6))
* **backend:** move session store from Redis to Postgres
([#1111](https://github.com/LucasSantana-Dev/Lucky/issues/1111))
([#1396](https://github.com/LucasSantana-Dev/Lucky/issues/1396))
([ff5e0b6](https://github.com/LucasSantana-Dev/Lucky/commit/ff5e0b684aa369a208a3e01d9c9a8c4cc53e4308))
* **backend:** read-only guild members/roles service endpoints
([#1691](https://github.com/LucasSantana-Dev/Lucky/issues/1691))
([fd04b6e](https://github.com/LucasSantana-Dev/Lucky/commit/fd04b6ef5f8a1609a468bb97f43213df488af8a8))
* **backend:** request-id correlation middleware for
[#1286](https://github.com/LucasSantana-Dev/Lucky/issues/1286)
([#1417](https://github.com/LucasSantana-Dev/Lucky/issues/1417))
([671ed4c](https://github.com/LucasSantana-Dev/Lucky/commit/671ed4c90471670f68346b493eade85d55a92ee9))
* **backend:** support intake + admin routes + staff notification
([#1241](https://github.com/LucasSantana-Dev/Lucky/issues/1241))
([280faeb](https://github.com/LucasSantana-Dev/Lucky/commit/280faeb983e02ae498960cb98b1ca10e7f44af2f))
* **backend:** wire moderation executor into
GuildAutomationExecutionService
([#1066](https://github.com/LucasSantana-Dev/Lucky/issues/1066))
([43ed8db](https://github.com/LucasSantana-Dev/Lucky/commit/43ed8db3906c826d8f01738fc5a49052c7f94862))
* **batch:** batch-operation framework + bulk-move-messages flagship
([#1564](https://github.com/LucasSantana-Dev/Lucky/issues/1564))
([9d11bf5](https://github.com/LucasSantana-Dev/Lucky/commit/9d11bf5d985dc9765b75eecb0bc798e2fe0c6443))
* **bot:** /vaga command builds job posts with auto-tagged roles
([#1682](https://github.com/LucasSantana-Dev/Lucky/issues/1682))
([963e457](https://github.com/LucasSantana-Dev/Lucky/commit/963e457af6402437b10138124052df524af37a99))
* **bot:** add RSS bridge service for Criativaria guides
([#1608](https://github.com/LucasSantana-Dev/Lucky/issues/1608))
([2807cad](https://github.com/LucasSantana-Dev/Lucky/commit/2807cada542424d3e4b15eaf76ec56d6b7250c8a))
* **bot:** add weekly community digest service
([#1609](https://github.com/LucasSantana-Dev/Lucky/issues/1609))
([2a653bf](https://github.com/LucasSantana-Dev/Lucky/commit/2a653bff32f3e5afa15cb73aae4d41e0476da859))
* **bot:** afk status with mention replies
([#1689](https://github.com/LucasSantana-Dev/Lucky/issues/1689))
([d8b5ba1](https://github.com/LucasSantana-Dev/Lucky/commit/d8b5ba101ea69033f18d9236481c9f8225867f08))
* **bot:** criativaria live twitch notification (poll every 2 min)
([#1613](https://github.com/LucasSantana-Dev/Lucky/issues/1613))
([e1d10b6](https://github.com/LucasSantana-Dev/Lucky/commit/e1d10b6efa7dd570867f4e678e9d0f6e30368bf7))
* **bot:** extend mod-log posting, fix twitch startup silence
([#1698](https://github.com/LucasSantana-Dev/Lucky/issues/1698))
([fb48065](https://github.com/LucasSantana-Dev/Lucky/commit/fb4806554220e604094aee1e27a498376ad566ff))
* **bot:** instrument serversetup criativaria invocations
([#1288](https://github.com/LucasSantana-Dev/Lucky/issues/1288))
([#1390](https://github.com/LucasSantana-Dev/Lucky/issues/1390))
([c37f021](https://github.com/LucasSantana-Dev/Lucky/commit/c37f021f3c28a13a6a58ed2529dcc5e3269892b1))
* **bot:** persistent giveaways with reaction entry
([#1690](https://github.com/LucasSantana-Dev/Lucky/issues/1690))
([b715af9](https://github.com/LucasSantana-Dev/Lucky/commit/b715af9df16ad016eaa7feda5f6e287d2b441933))
* **bot:** post moderation case embeds to the mod-log channel
([#1696](https://github.com/LucasSantana-Dev/Lucky/issues/1696))
([884da0f](https://github.com/LucasSantana-Dev/Lucky/commit/884da0fc5d8d689751c02ab4546911d11dc11fb8))
* **bot:** reminders with /remind and delivery scheduler
([#1686](https://github.com/LucasSantana-Dev/Lucky/issues/1686))
([1228290](https://github.com/LucasSantana-Dev/Lucky/commit/12282903a07538c75869c5eabb24f2823fb7411d))
* **bot:** smart custom commands via generic command-kind seam (ADR
2026-07-03)
([#1684](https://github.com/LucasSantana-Dev/Lucky/issues/1684))
([f0c446c](https://github.com/LucasSantana-Dev/Lucky/commit/f0c446c5dad1ab343b9a8df57f7b89ea3eaccaa2))
* **bot:** starboard seeding and one-time first-star dm
([#1685](https://github.com/LucasSantana-Dev/Lucky/issues/1685))
([e12e2e4](https://github.com/LucasSantana-Dev/Lucky/commit/e12e2e4e18a1d5fc256c1c83b818384c8366fe60))
* **bot:** surface support url + correlation id in command error embeds
([#1240](https://github.com/LucasSantana-Dev/Lucky/issues/1240))
([1cc004b](https://github.com/LucasSantana-Dev/Lucky/commit/1cc004bcd4d14a36dc7c6d31442c6264972cdc24))
* **bot:** utility join-onboarding message + in-bot growth adr
([#1506](https://github.com/LucasSantana-Dev/Lucky/issues/1506))
([0a23775](https://github.com/LucasSantana-Dev/Lucky/commit/0a23775cdb458479e0e1b23ad1e42679d6036d57))
* **dashboard:** add role groups management page
([#1678](https://github.com/LucasSantana-Dev/Lucky/issues/1678))
([bb8bc2c](https://github.com/LucasSantana-Dev/Lucky/commit/bb8bc2c9d2e2a0dd2cccd3ff690c16531a576016))
* **dashboard:** reaction roles create and delete
([c5c351c](https://github.com/LucasSantana-Dev/Lucky/commit/c5c351cddeb494cbcebce5448f96538bd8f97954))
* **dashboard:** refresh, single server switcher, i18n, avatar+cursor
([#1546](https://github.com/LucasSantana-Dev/Lucky/issues/1546))
([abda321](https://github.com/LucasSantana-Dev/Lucky/commit/abda3219eb4e5fdbb376b619cf3ab99f390fdefc))
* **db:** add check constraints on guild_settings bounds
([#1124](https://github.com/LucasSantana-Dev/Lucky/issues/1124))
([#1338](https://github.com/LucasSantana-Dev/Lucky/issues/1338))
([a7c7400](https://github.com/LucasSantana-Dev/Lucky/commit/a7c74007bbb0df43e45e88de52971e3858ee729a))
* **deploy:** SHA-pinned deploys + auto-rollback on health failure
([#1230](https://github.com/LucasSantana-Dev/Lucky/issues/1230))
([e24f128](https://github.com/LucasSantana-Dev/Lucky/commit/e24f1284d89edc9a8a72cb2135df580c8f7467a7))
* **frontend:** add music surface pages and components
([bb40e9c](https://github.com/LucasSantana-Dev/Lucky/commit/bb40e9c667a79bfd588b1fc13a61b55c457c2fd8))
* **frontend:** add ServerLogs + ServerSettings UI pages
([#965](https://github.com/LucasSantana-Dev/Lucky/issues/965))
([89961d3](https://github.com/LucasSantana-Dev/Lucky/commit/89961d324aed39001737e1f9873b7def200aaa65))
* growth surfaces — /invite, landing SEO + CTA, guild telemetry
([#1494](https://github.com/LucasSantana-Dev/Lucky/issues/1494))
([205876d](https://github.com/LucasSantana-Dev/Lucky/commit/205876d4ad9ba415840abc4207ca9ac98a99e7f4))
* guild integrations pack
([#1669](https://github.com/LucasSantana-Dev/Lucky/issues/1669))
([64a41a4](https://github.com/LucasSantana-Dev/Lucky/commit/64a41a48a1147b06ca18e36cbd5f9a4551321d23))
* **guild-automation:** wire AutoMessages executor into execution
service ([#906](https://github.com/LucasSantana-Dev/Lucky/issues/906))
([#950](https://github.com/LucasSantana-Dev/Lucky/issues/950))
([b5e444b](https://github.com/LucasSantana-Dev/Lucky/commit/b5e444b20dc836cf2fc29c6d70ccb67c7ac2ae9e))
* **infra:** homelab staging environment for visual PR review
([#1547](https://github.com/LucasSantana-Dev/Lucky/issues/1547))
([c15fa38](https://github.com/LucasSantana-Dev/Lucky/commit/c15fa388a61db9d1c3cfe880885f32d6020a629d))
* **levels:** show member display names on leaderboard, not raw ids
([eb0d700](https://github.com/LucasSantana-Dev/Lucky/commit/eb0d7009a0519bb6c00f6dcab2865c7c571779ce))
* **logs:** async context propagation, discord alerts, noise filtering
([#1510](https://github.com/LucasSantana-Dev/Lucky/issues/1510))
([a952c54](https://github.com/LucasSantana-Dev/Lucky/commit/a952c5400518f29c650abb286fada80caf34f2cd))
* **moderation:** move a message to another channel via right-click
([#1516](https://github.com/LucasSantana-Dev/Lucky/issues/1516))
([9822893](https://github.com/LucasSantana-Dev/Lucky/commit/98228930177479a078016c1c20e1ba43d393b7fd))
* **music:** add previous-track command end to end
([#1239](https://github.com/LucasSantana-Dev/Lucky/issues/1239))
([#1347](https://github.com/LucasSantana-Dev/Lucky/issues/1347))
([7771167](https://github.com/LucasSantana-Dev/Lucky/commit/7771167e7cc1534c561d6bad3cfbd2bcf85e261f))
* **observability:** alert on redis control publish failures
([#1401](https://github.com/LucasSantana-Dev/Lucky/issues/1401))
([6e46cd7](https://github.com/LucasSantana-Dev/Lucky/commit/6e46cd7ab193dedbff4a7b62ac0c6060489a4607))
* **observability:** capture escaping errors to Sentry at chokepoints
([#1229](https://github.com/LucasSantana-Dev/Lucky/issues/1229))
([9448de4](https://github.com/LucasSantana-Dev/Lucky/commit/9448de4b2a4c41145a3db443faff3df1e5dae1b1))
* **observability:** deploy markers, heartbeat, alerts (Layers 1-3)
([#1103](https://github.com/LucasSantana-Dev/Lucky/issues/1103))
([24568c0](https://github.com/LucasSantana-Dev/Lucky/commit/24568c02af1b802624d08f184fa64dcadcc413b3))
* **queue:** queueResolver telemetry pilot
([#1084](https://github.com/LucasSantana-Dev/Lucky/issues/1084))
([#1100](https://github.com/LucasSantana-Dev/Lucky/issues/1100))
([527609a](https://github.com/LucasSantana-Dev/Lucky/commit/527609a86a3f1b67bda3dbf8b62b371213dc77ff))
* **reaction-roles:** editable form, emoji picker, formatting, media,
export/import
([#1544](https://github.com/LucasSantana-Dev/Lucky/issues/1544))
([ac5e0e9](https://github.com/LucasSantana-Dev/Lucky/commit/ac5e0e988a27468eb75ace887795ed80c2d75b5f))
* **role-groups:** composite add-styled-role v1
([#1557](https://github.com/LucasSantana-Dev/Lucky/issues/1557))
([c869811](https://github.com/LucasSantana-Dev/Lucky/commit/c8698117666b066f4f7aa5ad5bc38602321e6cd7))
* **security:** add security headers + csp report-only
([#1283](https://github.com/LucasSantana-Dev/Lucky/issues/1283))
([#1315](https://github.com/LucasSantana-Dev/Lucky/issues/1315))
([7413a1c](https://github.com/LucasSantana-Dev/Lucky/commit/7413a1cebe733cd62f583ed197cd3bba50428e82))
* **security:** collect CSP violations via report-uri sink
([#1283](https://github.com/LucasSantana-Dev/Lucky/issues/1283))
([#1415](https://github.com/LucasSantana-Dev/Lucky/issues/1415))
([6f68aa3](https://github.com/LucasSantana-Dev/Lucky/commit/6f68aa31b8d9a9582e36de85c77e32d58d8adfd5))
* service announce endpoint with timing-safe key + channel allowlist
([#1681](https://github.com/LucasSantana-Dev/Lucky/issues/1681))
([3fbf022](https://github.com/LucasSantana-Dev/Lucky/commit/3fbf02256d8aed9fb4df067dcba7d87389317acb))
* **settings:** add Discord role management page (CRUD + bulk-delete)
([#1524](https://github.com/LucasSantana-Dev/Lucky/issues/1524))
([7db3ca2](https://github.com/LucasSantana-Dev/Lucky/commit/7db3ca240dba8906cb2247266c806c1a178c58fe))
* **shared:** add reactionroles executor (capture/diff/apply)
([142882c](https://github.com/LucasSantana-Dev/Lucky/commit/142882cbe8cc23e12c6c183abd965d25231e1d4c))
* **shared:** support report foundation
([#1223](https://github.com/LucasSantana-Dev/Lucky/issues/1223))
([#1228](https://github.com/LucasSantana-Dev/Lucky/issues/1228))
([77258bc](https://github.com/LucasSantana-Dev/Lucky/commit/77258bc47c26dd58978112882a2793944d0b78e4))
* skip-reason telemetry via emoji reactions on now-playing
([#1377](https://github.com/LucasSantana-Dev/Lucky/issues/1377))
([5b1959f](https://github.com/LucasSantana-Dev/Lucky/commit/5b1959fd96057c396baf17f9929e6a32f9737eed))
* **staging:** opt-in test bot for pre-merge live smoke
([#1692](https://github.com/LucasSantana-Dev/Lucky/issues/1692))
([c54eaba](https://github.com/LucasSantana-Dev/Lucky/commit/c54eabab1525d04297b6241eba7ea979826159b1))
* **twitch:** add stream.offline, channel.update and channel.raid
EventSub events
([#1531](https://github.com/LucasSantana-Dev/Lucky/issues/1531))
([b05a9cf](https://github.com/LucasSantana-Dev/Lucky/commit/b05a9cfeab0fb6e389a70171e5e2264ae8a7577f))
* **twitch:** follower and subscriber role sync
([#1509](https://github.com/LucasSantana-Dev/Lucky/issues/1509))
([d353bc0](https://github.com/LucasSantana-Dev/Lucky/commit/d353bc068614da2310bf50393a3b321842bb8044))
* **ui:** community pages — Starboard and Levels as connected components
([fafa2ac](https://github.com/LucasSantana-Dev/Lucky/commit/fafa2ac225ba6af8c903acfda8bf45abed865606))
* **web:** per-route seo metadata + sitemap, robots, og-image
([79a5f0d](https://github.com/LucasSantana-Dev/Lucky/commit/79a5f0d88e2e9e5102822e9ff34222b280e082c2)),
closes [#1131](https://github.com/LucasSantana-Dev/Lucky/issues/1131)
[#1132](https://github.com/LucasSantana-Dev/Lucky/issues/1132)
* **web:** public /support form + admin report view + error-state wiring
([#1245](https://github.com/LucasSantana-Dev/Lucky/issues/1245))
([19d855e](https://github.com/LucasSantana-Dev/Lucky/commit/19d855e50ce7332280a7ae3e91f9bf8650c5ea21))


### Bug Fixes

* add missing fetch timeouts to GuildService Discord API calls
([#1641](https://github.com/LucasSantana-Dev/Lucky/issues/1641))
([a8a57d5](https://github.com/LucasSantana-Dev/Lucky/commit/a8a57d5b780e900e0fa856804910ef8e3ed67d7a))
* add timeouts to unbounded external fetch calls
([#1333](https://github.com/LucasSantana-Dev/Lucky/issues/1333))
([38dde55](https://github.com/LucasSantana-Dev/Lucky/commit/38dde55fb8631185fed7e3e025d94362fef68e13))
* **api:** wrap automod + moderation settings responses as { settings }
([#1142](https://github.com/LucasSantana-Dev/Lucky/issues/1142))
([04893fd](https://github.com/LucasSantana-Dev/Lucky/commit/04893fd55ef570eca5e8a0682798639a9b1b40e7))
* auth loop between web dashboard and api subdomains
([572e320](https://github.com/LucasSantana-Dev/Lucky/commit/572e320ef803d195a96eb0f66ec42445f73a1931))
* **auth:** log session lookup failures in optional auth
([#1286](https://github.com/LucasSantana-Dev/Lucky/issues/1286))
([ff2b3ab](https://github.com/LucasSantana-Dev/Lucky/commit/ff2b3ab9f3f06dd3b81194f4e3e3f8a113f523f5))
* **automod:** remove dead warn/mute/kick/ban switch cases
([#1511](https://github.com/LucasSantana-Dev/Lucky/issues/1511))
([8ec8ed7](https://github.com/LucasSantana-Dev/Lucky/commit/8ec8ed76cbba1e30442fe17c9f15aa9ccf494dff))
* **autoplay:** capture skip rejections (symmetric completion threshold)
([#1276](https://github.com/LucasSantana-Dev/Lucky/issues/1276))
([c282414](https://github.com/LucasSantana-Dev/Lucky/commit/c282414346bf6c2247ed5d8a22c0c9bfcc5fdeb2))
* **autoplay:** key track start-time per track, not per guild
([#1275](https://github.com/LucasSantana-Dev/Lucky/issues/1275))
([#1483](https://github.com/LucasSantana-Dev/Lucky/issues/1483))
([0853a90](https://github.com/LucasSantana-Dev/Lucky/commit/0853a90412ed64c6e9cec7732311e5648cdb49f1))
* **autoplay:** prevent over-queueing; ensure evicted recs get terminal
events ([#1589](https://github.com/LucasSantana-Dev/Lucky/issues/1589))
([815d763](https://github.com/LucasSantana-Dev/Lucky/commit/815d763329d60580f8034232b606d7d0b2814684))
* **autoplay:** provenance-aware genre guards open the seed neighborhood
([#1272](https://github.com/LucasSantana-Dev/Lucky/issues/1272))
([405af1e](https://github.com/LucasSantana-Dev/Lucky/commit/405af1eae055f661a42310717c39adab6aa220a4))
* **autoplay:** weight popularity over name similarity in similar mode
([#1273](https://github.com/LucasSantana-Dev/Lucky/issues/1273))
([cb24a7e](https://github.com/LucasSantana-Dev/Lucky/commit/cb24a7e9c6993b72be780c72710c524459f591d6))
* **backend:** add validateparams to forums route guildid and slug
([#1602](https://github.com/LucasSantana-Dev/Lucky/issues/1602))
([a7102f4](https://github.com/LucasSantana-Dev/Lucky/commit/a7102f4c5f54405af37d631bfd45506b8cef4615))
* **backend:** assert required env vars at startup and fail fast
([#1169](https://github.com/LucasSantana-Dev/Lucky/issues/1169))
([107e235](https://github.com/LucasSantana-Dev/Lucky/commit/107e235d6b22d7097dd67980b5944ad1bc138c65))
* **backend:** bound pagination limit on leaderboard + starboard entries
([#1307](https://github.com/LucasSantana-Dev/Lucky/issues/1307))
([c2b5cbe](https://github.com/LucasSantana-Dev/Lucky/commit/c2b5cbe2beceb2dc5761f74fb63eda03790de5d7))
* **backend:** degrade gracefully on external fetch timeouts
([#1342](https://github.com/LucasSantana-Dev/Lucky/issues/1342))
([#1345](https://github.com/LucasSantana-Dev/Lucky/issues/1345))
([5de7b69](https://github.com/LucasSantana-Dev/Lucky/commit/5de7b694e7215fd979ef506f66cb7d1f91067249))
* **backend:** enforce discord snowflake validation on all guild routes
([#1172](https://github.com/LucasSantana-Dev/Lucky/issues/1172))
([ec25670](https://github.com/LucasSantana-Dev/Lucky/commit/ec25670ea76a571c96ad20fc4e7df72d9ecf8255))
* **backend:** guard timingsafeequal against length mismatch in lastfm
route ([#1719](https://github.com/LucasSantana-Dev/Lucky/issues/1719))
([6d58671](https://github.com/LucasSantana-Dev/Lucky/commit/6d586711c804be9f66199338330ca0746c4e8fe5))
* **backend:** harden role + reaction-role write-path error handling
([#1543](https://github.com/LucasSantana-Dev/Lucky/issues/1543))
([18a36ba](https://github.com/LucasSantana-Dev/Lucky/commit/18a36ba673ffaa6e5a0f1d35f28bcd62a1c9c64c))
* **backend:** log swallowed spotify search errors
([#1285](https://github.com/LucasSantana-Dev/Lucky/issues/1285))
([#1318](https://github.com/LucasSantana-Dev/Lucky/issues/1318))
([72a7431](https://github.com/LucasSantana-Dev/Lucky/commit/72a74317105f6ae6aedb817344f79bcf0a16b373))
* **backend:** propagate db errors from deleteReactionRoleMessage
([#1604](https://github.com/LucasSantana-Dev/Lucky/issues/1604))
([b36fad0](https://github.com/LucasSantana-Dev/Lucky/commit/b36fad097822dd8013b02e5fd21d2cb536bab317))
* **backend:** replayed named creates return existing row
([#1320](https://github.com/LucasSantana-Dev/Lucky/issues/1320))
([#1326](https://github.com/LucasSantana-Dev/Lucky/issues/1326))
([be2b30c](https://github.com/LucasSantana-Dev/Lucky/commit/be2b30cdb69ad8d94665eb8ae2afb93c325bd5ce))
* **backend:** restrict cors allowlist to first-party hosts
([#1247](https://github.com/LucasSantana-Dev/Lucky/issues/1247))
([6021120](https://github.com/LucasSantana-Dev/Lucky/commit/602112012a2e42b0a0cbb7e5d1d2aa4299d9d7c1))
* **backend:** validate guildId snowflake on all 18 music routes
([#1297](https://github.com/LucasSantana-Dev/Lucky/issues/1297))
([b93cfb5](https://github.com/LucasSantana-Dev/Lucky/commit/b93cfb565288a36bb9c0cbb36640eadb874505d6))
* **backend:** wrap Spotify routes in asyncHandler
([#1184](https://github.com/LucasSantana-Dev/Lucky/issues/1184))
([#1219](https://github.com/LucasSantana-Dev/Lucky/issues/1219))
([a3be33b](https://github.com/LucasSantana-Dev/Lucky/commit/a3be33bceca656ff76325b3a7a10e53e4af83058))
* **batch:** bullmq worker requires maxretriesperrequest null redis
([#1665](https://github.com/LucasSantana-Dev/Lucky/issues/1665))
([f5adffe](https://github.com/LucasSantana-Dev/Lucky/commit/f5adffe8f17df02362ac34d619ad35836706e614))
* **bot:** accurate reply when previous button has no history
([#1191](https://github.com/LucasSantana-Dev/Lucky/issues/1191))
([#1331](https://github.com/LucasSantana-Dev/Lucky/issues/1331))
([eb9b2ea](https://github.com/LucasSantana-Dev/Lucky/commit/eb9b2ea28b1f0581910f73833e09caec41f50f34))
* **bot:** bound all Spotify API fetches with an 8s abort deadline
([#1302](https://github.com/LucasSantana-Dev/Lucky/issues/1302))
([b283159](https://github.com/LucasSantana-Dev/Lucky/commit/b2831594ecc1d456d6f683e89a2b22a996b9beb7))
* **bot:** capture failed error-replies to Sentry in interaction handler
([#1175](https://github.com/LucasSantana-Dev/Lucky/issues/1175))
([45665c2](https://github.com/LucasSantana-Dev/Lucky/commit/45665c2aff006ab26c8c0d6a3e2658df36d66aba))
* **bot:** catch floating promises in setTimeout callbacks
([#1210](https://github.com/LucasSantana-Dev/Lucky/issues/1210))
([#1218](https://github.com/LucasSantana-Dev/Lucky/issues/1218))
([8e790f9](https://github.com/LucasSantana-Dev/Lucky/commit/8e790f95f321da6b6e32206c4d29600dffef9401))
* **bot:** catch resume errors in skip delayed play
([#1353](https://github.com/LucasSantana-Dev/Lucky/issues/1353))
([#1354](https://github.com/LucasSantana-Dev/Lucky/issues/1354))
([c2d2758](https://github.com/LucasSantana-Dev/Lucky/commit/c2d275872fbab168a1e7c603ca415ab3d3284c27))
* **bot:** catch settings fetch errors in idle disconnect scheduling
([#1361](https://github.com/LucasSantana-Dev/Lucky/issues/1361))
([61b82e4](https://github.com/LucasSantana-Dev/Lucky/commit/61b82e4ce2f6f016b22ed5b0f6b672a4da55f0cb))
* **bot:** clear presence rotation interval on shutdown
([#1171](https://github.com/LucasSantana-Dev/Lucky/issues/1171))
([c6d35f5](https://github.com/LucasSantana-Dev/Lucky/commit/c6d35f5dee0a520b31ca51e7d0ad51105c09ad92))
* **bot:** collect /vaga descricao via modal, not a single-line option
([#1701](https://github.com/LucasSantana-Dev/Lucky/issues/1701))
([ba20cd8](https://github.com/LucasSantana-Dev/Lucky/commit/ba20cd8f0857983e0f0765e16cf91722ba568e6c))
* **bot:** dead-man heartbeat + exit on fatal init failure
([#1656](https://github.com/LucasSantana-Dev/Lucky/issues/1656))
([e379f5f](https://github.com/LucasSantana-Dev/Lucky/commit/e379f5f8bd62cfa6173cd514f1c83b5ef2080c65))
* **bot:** expand SoundCloud short links before discord-player
resolution
([#1177](https://github.com/LucasSantana-Dev/Lucky/issues/1177))
([ff84610](https://github.com/LucasSantana-Dev/Lucky/commit/ff84610786cfffbd3c106d168aad475543e32d16))
* **bot:** extend graceful bot-perm guard to mgmt + automod
([#1502](https://github.com/LucasSantana-Dev/Lucky/issues/1502))
([1ee510d](https://github.com/LucasSantana-Dev/Lucky/commit/1ee510dd3773d7f55d5a0b7d7e2be7bc0e027c17))
* **bot:** graceful bot-permission guard + moderation pilot
([#1498](https://github.com/LucasSantana-Dev/Lucky/issues/1498))
([#1499](https://github.com/LucasSantana-Dev/Lucky/issues/1499))
([e2664ce](https://github.com/LucasSantana-Dev/Lucky/commit/e2664ce97b6d99a63521036d3d4b5dbd0a051878))
* **bot:** ground autoplay on seed similarity + genre-condition scoring
([#1268](https://github.com/LucasSantana-Dev/Lucky/issues/1268))
([aeacbc6](https://github.com/LucasSantana-Dev/Lucky/commit/aeacbc61ce2618159d56333c22943777febf2dba))
* **bot:** harden youtube extractor registration
([#1468](https://github.com/LucasSantana-Dev/Lucky/issues/1468))
([#1472](https://github.com/LucasSantana-Dev/Lucky/issues/1472))
([2e7f1bb](https://github.com/LucasSantana-Dev/Lucky/commit/2e7f1bbec46aab6d68d19aa07a4a503027d304bd))
* **bot:** healthcheck gateway readiness instead of redis tcp ping
([#1047](https://github.com/LucasSantana-Dev/Lucky/issues/1047))
([5ce2514](https://github.com/LucasSantana-Dev/Lucky/commit/5ce2514d5fe6b73b8f1c869a63544e7f02977cb1))
* **bot:** lastfm-similar score crushed ~100x by match/100
([#1269](https://github.com/LucasSantana-Dev/Lucky/issues/1269))
([f6bba72](https://github.com/LucasSantana-Dev/Lucky/commit/f6bba729f3943edfb2e370015d93dc4b6a58d83b))
* **bot:** process threadcreate regardless of newlycreated flag
([#1606](https://github.com/LucasSantana-Dev/Lucky/issues/1606))
([be08786](https://github.com/LucasSantana-Dev/Lucky/commit/be08786eeac2b1213a58f1487d7d5b5eba53686a))
* **bot:** queue summary position is milliseconds, not seconds
([#1202](https://github.com/LucasSantana-Dev/Lucky/issues/1202))
([#1330](https://github.com/LucasSantana-Dev/Lucky/issues/1330))
([efa9800](https://github.com/LucasSantana-Dev/Lucky/commit/efa98005cafc9e4cbacfcd8cc7f28b7bd5e26b6e))
* **bot:** reject timeout in session restore race instead of resolving
null ([#1170](https://github.com/LucasSantana-Dev/Lucky/issues/1170))
([2456fb9](https://github.com/LucasSantana-Dev/Lucky/commit/2456fb9bc38c291c870e244e42ebbc26d119acdd))
* **bot:** skip startup session restore into empty voice channel
([#1469](https://github.com/LucasSantana-Dev/Lucky/issues/1469))
([dbcc08c](https://github.com/LucasSantana-Dev/Lucky/commit/dbcc08ce511b0f19b1bc2c490c584113485e59b3))
* **bot:** startup session restore scans postgres, not redis
([#1119](https://github.com/LucasSantana-Dev/Lucky/issues/1119))
([2636ba1](https://github.com/LucasSantana-Dev/Lucky/commit/2636ba1f8b0e379f7c3068778055cb6e643a9b0d))
* **bot:** stop all schedulers/timers on shutdown
([#1197](https://github.com/LucasSantana-Dev/Lucky/issues/1197))
([#1205](https://github.com/LucasSantana-Dev/Lucky/issues/1205))
([7180579](https://github.com/LucasSantana-Dev/Lucky/commit/71805799de105dd1cf33e158c958857035d502cc))
* **bot:** tear down Discord client on initializer step failure
([#1180](https://github.com/LucasSantana-Dev/Lucky/issues/1180))
([d81ac68](https://github.com/LucasSantana-Dev/Lucky/commit/d81ac683a3235a1b3fe39fa39eccb7aa971ce52a))
* **bot:** thread real Client into endGiveaway
([#1383](https://github.com/LucasSantana-Dev/Lucky/issues/1383))
([#1388](https://github.com/LucasSantana-Dev/Lucky/issues/1388))
([d3b274a](https://github.com/LucasSantana-Dev/Lucky/commit/d3b274afa694ae8b35e3052ba8a366afee32d98f))
* **bot:** validate text-based channel before send in embed command
([#1253](https://github.com/LucasSantana-Dev/Lucky/issues/1253))
([5add32f](https://github.com/LucasSantana-Dev/Lucky/commit/5add32f7e4d88164b89fe73e7ea8c9dcaf17f909))
* **bot:** wire role exclusion enforcement + guildmembers intent
([#1668](https://github.com/LucasSantana-Dev/Lucky/issues/1668))
([e8145af](https://github.com/LucasSantana-Dev/Lucky/commit/e8145afe9f4765b927b077d3df471a2280087e14))
* **bot:** wire setupwebmusichandler at startup
([#1321](https://github.com/LucasSantana-Dev/Lucky/issues/1321))
([#1351](https://github.com/LucasSantana-Dev/Lucky/issues/1351))
([dc68e7e](https://github.com/LucasSantana-Dev/Lucky/commit/dc68e7efce26598161380c60bedb1a728a72748d))
* bound external calls — Discord-429 storm + Musical-Taste hang
([#1141](https://github.com/LucasSantana-Dev/Lucky/issues/1141))
([739d653](https://github.com/LucasSantana-Dev/Lucky/commit/739d653271a12b5a278d141545c3b5618f39f50c))
* bound music queue params, type rolegroup mapping, harden ci lint
([#1588](https://github.com/LucasSantana-Dev/Lucky/issues/1588))
([309d5d9](https://github.com/LucasSantana-Dev/Lucky/commit/309d5d9c9bbb04d2362fd0fe65e2db0f677169c1))
* **ci:** add bot to required containers and replace dead unhealthy grep
([#1054](https://github.com/LucasSantana-Dev/Lucky/issues/1054))
([b16109e](https://github.com/LucasSantana-Dev/Lucky/commit/b16109ee1de691d9d1bac69ade0168a9a69b0a75))
* **ci:** add figurinhas2026 to Vercel deploy watch
([#1063](https://github.com/LucasSantana-Dev/Lucky/issues/1063))
([b3f5e64](https://github.com/LucasSantana-Dev/Lucky/commit/b3f5e6465be5a77222ad9eccb109c2df7c169a94))
* **ci:** archive squash-merged release branch instead of failing FF
([#946](https://github.com/LucasSantana-Dev/Lucky/issues/946))
([111e860](https://github.com/LucasSantana-Dev/Lucky/commit/111e860a9efa24590ee89e975da4ab7886aaacaf))
* **ci:** cf pages deploy uses root lockfile (stops silent failure)
([#1673](https://github.com/LucasSantana-Dev/Lucky/issues/1673))
([8824fc3](https://github.com/LucasSantana-Dev/Lucky/commit/8824fc377e17bd4938b8af7d21050b2aa47b4982))
* **ci:** danger node 24 compatibility
([#1659](https://github.com/LucasSantana-Dev/Lucky/issues/1659))
([862426a](https://github.com/LucasSantana-Dev/Lucky/commit/862426a32f7d786644a02c8bde5a4c5d1e6bb6e8))
* **ci:** grant review-tools caller the scopes its reusables require
([#1424](https://github.com/LucasSantana-Dev/Lucky/issues/1424))
([c215675](https://github.com/LucasSantana-Dev/Lucky/commit/c2156759754ed65cfecb8f8fa9b25f5347522f5c))
* **ci:** hard-fail deploy on sustained 429 instead of silent oauth pass
([#1045](https://github.com/LucasSantana-Dev/Lucky/issues/1045))
([2a6b05c](https://github.com/LucasSantana-Dev/Lucky/commit/2a6b05ccaad42dbade7b4ae374e27f8661b9ac0b))
* **ci:** lockfile-hash BuildKit npm cache key to prevent esbuild
version mismatch
([#1016](https://github.com/LucasSantana-Dev/Lucky/issues/1016))
([1b3c258](https://github.com/LucasSantana-Dev/Lucky/commit/1b3c2584baf7a9361da89bf911267ca6876ff667))
* **ci:** lockfile-hash BuildKit npm cache key to prevent esbuild
version mismatch
([#1065](https://github.com/LucasSantana-Dev/Lucky/issues/1065))
([3579966](https://github.com/LucasSantana-Dev/Lucky/commit/35799666b5acc8f90b109eef03757912d192379a))
* **ci:** lockfile-hash BuildKit npm cache key to prevent esbuild
version mismatch
([#1067](https://github.com/LucasSantana-Dev/Lucky/issues/1067))
([7c5c447](https://github.com/LucasSantana-Dev/Lucky/commit/7c5c447ebb128b2ea2cb4bc717c3a3d1d8a56c6c))
* **ci:** lockfile-hash BuildKit npm cache key to prevent esbuild
version mismatch
([#1075](https://github.com/LucasSantana-Dev/Lucky/issues/1075))
([00ee269](https://github.com/LucasSantana-Dev/Lucky/commit/00ee26962d35622af8bcaeb7a84f79bddb7ce5d8))
* **ci:** lowercase image ref in yt-dlp smoke test
([e6267f5](https://github.com/LucasSantana-Dev/Lucky/commit/e6267f516dc50c417be6cbebdfe1d9b1358368c0))
* **ci:** lowercase image ref in yt-dlp smoke test
([ccb2855](https://github.com/LucasSantana-Dev/Lucky/commit/ccb2855745d1640c5a75a2aaebdc1fd61605578a))
* **ci:** make husky optional in prepare script to unblock docker builds
([#1060](https://github.com/LucasSantana-Dev/Lucky/issues/1060))
([9bf7c0e](https://github.com/LucasSantana-Dev/Lucky/commit/9bf7c0e91e671eb1347d37d1265d6a2beb376d68))
* **ci:** pin GitHub Actions to commit SHAs, scope secrets, harden
Renovate
([#1706](https://github.com/LucasSantana-Dev/Lucky/issues/1706))
([1239e28](https://github.com/LucasSantana-Dev/Lucky/commit/1239e286df0e222f4a0b39f328c622901a96f916))
* **ci:** post error commit status on deploy lock contention
([#1052](https://github.com/LucasSantana-Dev/Lucky/issues/1052))
([869d6f0](https://github.com/LucasSantana-Dev/Lucky/commit/869d6f03eae0f807befa1f712ec3a4e6c422aa9d))
* **ci:** quality/Lint green again — core rules off for bot/shared at
root lint
([#1364](https://github.com/LucasSantana-Dev/Lucky/issues/1364))
([#1365](https://github.com/LucasSantana-Dev/Lucky/issues/1365))
([cc2322f](https://github.com/LucasSantana-Dev/Lucky/commit/cc2322f0ed999ffe1aabd341b1371260ace718d5))
* **ci:** scope docker build cache per matrix service
([#1712](https://github.com/LucasSantana-Dev/Lucky/issues/1712))
([3ed9aae](https://github.com/LucasSantana-Dev/Lucky/commit/3ed9aaec6e93ec713144427d2e8290300e214c15))
* **ci:** skip docker-build validation for non-docker-relevant PRs
([#1711](https://github.com/LucasSantana-Dev/Lucky/issues/1711))
([5ea19ea](https://github.com/LucasSantana-Dev/Lucky/commit/5ea19eabf162c7ab82a1bd242979df8d8354156e))
* **ci:** surface async deploy failures via commit statuses
([#1046](https://github.com/LucasSantana-Dev/Lucky/issues/1046))
([b0838ac](https://github.com/LucasSantana-Dev/Lucky/commit/b0838aca3cd3f7d69024619c4eb37eecea337b7f))
* **ci:** use v-prefixed trivy-action tag
([#934](https://github.com/LucasSantana-Dev/Lucky/issues/934))
([ffae3cf](https://github.com/LucasSantana-Dev/Lucky/commit/ffae3cfbb0941c6ca16a8bf387511c811cd6ed82))
* **codeql:** resolve open codeql alerts
([0e0dfbe](https://github.com/LucasSantana-Dev/Lucky/commit/0e0dfbe5c027788dcc94953a67b52bbe93cc952b))
* **compose:** tag container logs so loki labels them by name
([#1476](https://github.com/LucasSantana-Dev/Lucky/issues/1476))
([4e956df](https://github.com/LucasSantana-Dev/Lucky/commit/4e956dfaad3ab88ea4d7d1f2db5874b3535f4cdd))
* **deploy:** derive require_running_containers from docker compose
([#1601](https://github.com/LucasSantana-Dev/Lucky/issues/1601))
([5715249](https://github.com/LucasSantana-Dev/Lucky/commit/571524924f2efe0cd7b5ab0d990631a86f220378))
* **deploy:** persist last-good across deploys (gitignore it)
([#1234](https://github.com/LucasSantana-Dev/Lucky/issues/1234))
([44f6487](https://github.com/LucasSantana-Dev/Lucky/commit/44f6487bf6fad06c4bcab3f688feb7f974696719))
* **deploy:** pin to short image tag; never build under a pinned tag
([#1232](https://github.com/LucasSantana-Dev/Lucky/issues/1232))
([d874d59](https://github.com/LucasSantana-Dev/Lucky/commit/d874d59bf8bb49588c08c51226975cc80b8827b3))
* **deploy:** probe nginx health on container port 8080 not 80
([#1236](https://github.com/LucasSantana-Dev/Lucky/issues/1236))
([918689d](https://github.com/LucasSantana-Dev/Lucky/commit/918689dc29c7bd7163caa5bec2b0336cb508fd43))
* **deploy:** read webhook hooks.json from live directory mount
([#1231](https://github.com/LucasSantana-Dev/Lucky/issues/1231))
([e559f42](https://github.com/LucasSantana-Dev/Lucky/commit/e559f4260bf115400ecde124b6406275e42fd888))
* **deploy:** record auto-rollback last-good from image commit-sha
([#1235](https://github.com/LucasSantana-Dev/Lucky/issues/1235))
([9cc21e7](https://github.com/LucasSantana-Dev/Lucky/commit/9cc21e76d49a8fb0f3ea74a73ce7dcf59f460861))
* **deploy:** ship prisma cli in production images + unify esbuild
([#1080](https://github.com/LucasSantana-Dev/Lucky/issues/1080))
([8e422b3](https://github.com/LucasSantana-Dev/Lucky/commit/8e422b391dd939f12abf9dea5ab2501cd5777968))
* **deploy:** verify + cache-correct the frontend so deploys actually
reach users
([#1576](https://github.com/LucasSantana-Dev/Lucky/issues/1576))
([9178576](https://github.com/LucasSantana-Dev/Lucky/commit/9178576c2c3d9b2743b5417f2516f6d9208cacd8))
* **deploy:** wire GITHUB_DEPLOY_STATUS_TOKEN into lucky-webhook
container
([#1597](https://github.com/LucasSantana-Dev/Lucky/issues/1597))
([ad4b7ed](https://github.com/LucasSantana-Dev/Lucky/commit/ad4b7ed32a66ab945ed610333a58131379b7cc08))
* **deps:** bump multer to 2.2.0 to fix high-severity dos advisory
([#1493](https://github.com/LucasSantana-Dev/Lucky/issues/1493))
([4d57ac8](https://github.com/LucasSantana-Dev/Lucky/commit/4d57ac87b0b016ffd8d79306c0705f1294c9a37a))
* **deps:** bump qs to 6.15.2 and hono to 4.12.25 (audit)
([#1295](https://github.com/LucasSantana-Dev/Lucky/issues/1295))
([ae5d949](https://github.com/LucasSantana-Dev/Lucky/commit/ae5d949c2f756eb554a24621c952cd8021b7a580))
* **deps:** pin piscina 4.9.3 for high-severity rce advisory
([#1504](https://github.com/LucasSantana-Dev/Lucky/issues/1504))
([10b68e6](https://github.com/LucasSantana-Dev/Lucky/commit/10b68e6597bae7c39286662293f1587780df0a30))
* **deps:** resolve npm audit vulnerabilities (1 critical + 5 moderate)
([#1708](https://github.com/LucasSantana-Dev/Lucky/issues/1708))
([e2b07bf](https://github.com/LucasSantana-Dev/Lucky/commit/e2b07bfece040e3f65bf0e62ff5a7565b93b670d))
* **docker:** add C toolchain to deps-production for opus source-build
fallback
([#1310](https://github.com/LucasSantana-Dev/Lucky/issues/1310))
([5ed7f11](https://github.com/LucasSantana-Dev/Lucky/commit/5ed7f11e0747eef6f303d1aa8f3f1fe8889eb351))
* **docker:** bump npm to patch bundled undici/tar CVEs in base image
([#1709](https://github.com/LucasSantana-Dev/Lucky/issues/1709))
([a635a0c](https://github.com/LucasSantana-Dev/Lucky/commit/a635a0c33c77ff99cd27369d3a8398ea51cc96de))
* **docker:** copy CHANGELOG.md into frontend build context
([#937](https://github.com/LucasSantana-Dev/Lucky/issues/937))
([44f302e](https://github.com/LucasSantana-Dev/Lucky/commit/44f302e3faf8fd448558660e964ac93aaf5ef88f))
* **download:** drop invalid --extract-flat flag from yt-dlp download
([#1488](https://github.com/LucasSantana-Dev/Lucky/issues/1488))
([9d29144](https://github.com/LucasSantana-Dev/Lucky/commit/9d291441d59ce7a01e717ad04f6844ac3d8b7947))
* **frontend:** default add-to-discord cta to public application id
([#1495](https://github.com/LucasSantana-Dev/Lucky/issues/1495))
([efda71e](https://github.com/LucasSantana-Dev/Lucky/commit/efda71e38c7152abb0d5fca2a708cbe960720ec4))
* **frontend:** fix CF Pages API routing and remove Vercel Analytics
([#1596](https://github.com/LucasSantana-Dev/Lucky/issues/1596))
([2902984](https://github.com/LucasSantana-Dev/Lucky/commit/2902984146f090eca210149eb84ea6e593c40747))
* **frontend:** flush moderation empty state (stray dark band)
([#1693](https://github.com/LucasSantana-Dev/Lucky/issues/1693))
([c64041a](https://github.com/LucasSantana-Dev/Lucky/commit/c64041a9e5aa25d411ad5115cfa0038d779a693b))
* **frontend:** healthcheck uses busybox wget, not bash /dev/tcp
([#1106](https://github.com/LucasSantana-Dev/Lucky/issues/1106))
([ec7a449](https://github.com/LucasSantana-Dev/Lucky/commit/ec7a449140eb53be135db321d0b9ca8274aafd30))
* guard unsafe external API response handling
([#1207](https://github.com/LucasSantana-Dev/Lucky/issues/1207))
([#1217](https://github.com/LucasSantana-Dev/Lucky/issues/1217))
([3b26b72](https://github.com/LucasSantana-Dev/Lucky/commit/3b26b7279312643523533d945ee0d2e85d7b9337))
* **help:** split large command categories across embed fields
([#1489](https://github.com/LucasSantana-Dev/Lucky/issues/1489))
([0fa5786](https://github.com/LucasSantana-Dev/Lucky/commit/0fa578646fe0671eda85eb6b36db076c6e0fafb1))
* **infra:** route staging via host port
([#1548](https://github.com/LucasSantana-Dev/Lucky/issues/1548))
([fe5b153](https://github.com/LucasSantana-Dev/Lucky/commit/fe5b153b2ebadbfaf20f67c95e964f3f06d443fe))
* **infra:** staging deploy git ownership
([#1554](https://github.com/LucasSantana-Dev/Lucky/issues/1554))
([de5a322](https://github.com/LucasSantana-Dev/Lucky/commit/de5a3220dac6bd517280405c69097eaca8885380))
* **infra:** staging deploy health check
([#1556](https://github.com/LucasSantana-Dev/Lucky/issues/1556))
([fda6eea](https://github.com/LucasSantana-Dev/Lucky/commit/fda6eea11e2da3f215538850445d4b9dcfd9e394))
* **logs:** serialize server logs with level, message and actor
([#1677](https://github.com/LucasSantana-Dev/Lucky/issues/1677))
([acd8fe3](https://github.com/LucasSantana-Dev/Lucky/commit/acd8fe31493931cd1cba5e93ed46d93bd35fe514))
* **middleware:** resolve guildAccess non-atomic session+context
staleness window
([5a64dd1](https://github.com/LucasSantana-Dev/Lucky/commit/5a64dd17bb1d9143c82eee49821c38e75a7f13ab))
* **moderation:** route context menus in the live event handler
([#1517](https://github.com/LucasSantana-Dev/Lucky/issues/1517))
([0232237](https://github.com/LucasSantana-Dev/Lucky/commit/0232237d9912dac9281b2e53902c4487542b98ce))
* **music:** re-target music guild FKs to discordId
([#1270](https://github.com/LucasSantana-Dev/Lucky/issues/1270))
([765d9d8](https://github.com/LucasSantana-Dev/Lucky/commit/765d9d81d2b3e776b24d70e8089056f010dd6351))
* **music:** surface youtube unavailability instead of generic errors
([#1146](https://github.com/LucasSantana-Dev/Lucky/issues/1146))
([0e66fe2](https://github.com/LucasSantana-Dev/Lucky/commit/0e66fe2e2f7f70dcdabb81e18a25cff0bdf32a50))
* **player:** warn not error on bridge exhaustion for unplayable tracks
([#1507](https://github.com/LucasSantana-Dev/Lucky/issues/1507))
([d7a4a58](https://github.com/LucasSantana-Dev/Lucky/commit/d7a4a5885ffa74fe5cbf22819df08a4dbc53e729))
* **play:** isolate post-play background ops
([#1085](https://github.com/LucasSantana-Dev/Lucky/issues/1085))
([#1101](https://github.com/LucasSantana-Dev/Lucky/issues/1101))
([ba994c4](https://github.com/LucasSantana-Dev/Lucky/commit/ba994c428253737826bbd10540112714cc0d4c6f))
* **reaction-roles:** PUT panel edit deletes mappings by cuid not
snowflake
([#1675](https://github.com/LucasSantana-Dev/Lucky/issues/1675))
([#1676](https://github.com/LucasSantana-Dev/Lucky/issues/1676))
([a51c70f](https://github.com/LucasSantana-Dev/Lucky/commit/a51c70f77dac207c5c76c8b1155f77a033a5e04b))
* **reaction-roles:** validate roleIds, fix update rollback, serialize
concurrent appends
([#1587](https://github.com/LucasSantana-Dev/Lucky/issues/1587))
([6873ac8](https://github.com/LucasSantana-Dev/Lucky/commit/6873ac8d398aa26f50d6a204d7d1de83557a402e))
* **release:** set group-pull-request-title-pattern so releases auto-tag
([#1521](https://github.com/LucasSantana-Dev/Lucky/issues/1521))
([b0e0f5f](https://github.com/LucasSantana-Dev/Lucky/commit/b0e0f5f40497c4be98135acb66b24a79e6763df2))
* **release:** set pull-request-title-pattern to include version
([#1514](https://github.com/LucasSantana-Dev/Lucky/issues/1514))
([cde12ec](https://github.com/LucasSantana-Dev/Lucky/commit/cde12ecc9881b1ca496fb0112e98d3bae2910c8e))
* **release:** tag-guard reconciles autorelease label
([#1561](https://github.com/LucasSantana-Dev/Lucky/issues/1561))
([#1583](https://github.com/LucasSantana-Dev/Lucky/issues/1583))
([6505f44](https://github.com/LucasSantana-Dev/Lucky/commit/6505f446b55fd2eb5ca5c87c5d105f2da975e28c))
* resolve discord 429 rate-limit storm and archived thread crash
([#1078](https://github.com/LucasSantana-Dev/Lucky/issues/1078))
([e79858e](https://github.com/LucasSantana-Dev/Lucky/commit/e79858ec7505b441bf538e7c38452476bd3f78f1))
* resolve Prettier syntax error in queueManipulation.spec.ts
([#985](https://github.com/LucasSantana-Dev/Lucky/issues/985))
([7cf4c83](https://github.com/LucasSantana-Dev/Lucky/commit/7cf4c83ee45da7ade4559957ff7a707a3b15871a))
* **schema:** add unique guild+thread constraint to GuildForumThread
([#1607](https://github.com/LucasSantana-Dev/Lucky/issues/1607))
([6c4c8ab](https://github.com/LucasSantana-Dev/Lucky/commit/6c4c8ab9a7488149dece8f486160ca3125d17a4e))
* **security:** bump vite 8.0.16 + form-data 4.0.6 for high advisories
([#1457](https://github.com/LucasSantana-Dev/Lucky/issues/1457))
([58d21d5](https://github.com/LucasSantana-Dev/Lucky/commit/58d21d56ad437bb5526dd5dcc9e5af3603d4b310))
* **security:** pass staging webhook secret via env not argv
([#1600](https://github.com/LucasSantana-Dev/Lucky/issues/1600))
([d12efc5](https://github.com/LucasSantana-Dev/Lucky/commit/d12efc519570026cf9a6f1b075d57b99d41898e2))
* **security:** redact operational diagnostics from
/api/health/auth-config
([#1710](https://github.com/LucasSantana-Dev/Lucky/issues/1710))
([e1b6b61](https://github.com/LucasSantana-Dev/Lucky/commit/e1b6b61c493eabd4d633d9600c46ad29a3ffc781))
* **security:** redact secrets/PII from logs
([#1208](https://github.com/LucasSantana-Dev/Lucky/issues/1208))
([#1220](https://github.com/LucasSantana-Dev/Lucky/issues/1220))
([2a09f90](https://github.com/LucasSantana-Dev/Lucky/commit/2a09f900c87e9ca1ef8c50a5ece6b1d7eecbc11e))
* **security:** resolve CodeQL/Semgrep findings (XSS, cookie, log
injection, nginx headers)
([#1707](https://github.com/LucasSantana-Dev/Lucky/issues/1707))
([3a30135](https://github.com/LucasSantana-Dev/Lucky/commit/3a301358d7cae1091bcbb79a1ff17c638317e641))
* **security:** verify bot authorship before trusting slug marker
([#1599](https://github.com/LucasSantana-Dev/Lucky/issues/1599))
([23bf73a](https://github.com/LucasSantana-Dev/Lucky/commit/23bf73a3e7db054d63ab7faea60db66124fbbfe9))
* **shared:** drop buggy token-overlap util + optimize levenshtein
([#1246](https://github.com/LucasSantana-Dev/Lucky/issues/1246))
([5b65d47](https://github.com/LucasSantana-Dev/Lucky/commit/5b65d4768f0e3bf19ca9e211957ce2fec07ef4f6))
* **shared:** env-isolate environment.test.ts (no secret dumps)
([#1292](https://github.com/LucasSantana-Dev/Lucky/issues/1292))
([588037c](https://github.com/LucasSantana-Dev/Lucky/commit/588037cf8b3a7424ad922b15d28aeb8548eb082e))
* **shared:** export ./utils/monitoring subpath — fixes lucky-bot
crash-loop
([#1105](https://github.com/LucasSantana-Dev/Lucky/issues/1105))
([2c959f3](https://github.com/LucasSantana-Dev/Lucky/commit/2c959f3d9765acdedab969faaaa229869a657ded))
* **shared:** export config/* subpath for prod esm resolution
([#1250](https://github.com/LucasSantana-Dev/Lucky/issues/1250))
([f4167a8](https://github.com/LucasSantana-Dev/Lucky/commit/f4167a80f2b78a693e9aacf5744358137e400f17))
* **shared:** export utils/support subpath for prod esm resolution
([#1248](https://github.com/LucasSantana-Dev/Lucky/issues/1248))
([8d3c092](https://github.com/LucasSantana-Dev/Lucky/commit/8d3c09265997e360e050d9006b55e12c8320abf3))
* **shared:** guard JSON.parse on embed data in CustomCommandService
([#1168](https://github.com/LucasSantana-Dev/Lucky/issues/1168))
([1c46b55](https://github.com/LucasSantana-Dev/Lucky/commit/1c46b557d7bcd5c847aca14c0562cae8a9bb77a0))
* **shared:** log db error in feature-toggle override read
([#1286](https://github.com/LucasSantana-Dev/Lucky/issues/1286))
([#1411](https://github.com/LucasSantana-Dev/Lucky/issues/1411))
([0dfc409](https://github.com/LucasSantana-Dev/Lucky/commit/0dfc4091c1e688569f656851b39f06716eecb4a0))
* **shared:** make LevelService.addXP atomic to prevent lost XP under
concurrency
([#1178](https://github.com/LucasSantana-Dev/Lucky/issues/1178))
([d1edffe](https://github.com/LucasSantana-Dev/Lucky/commit/d1edffe1c410b7393e184c796edeec83e4a17cae))
* **shared:** make read-then-write service paths atomic
([#1199](https://github.com/LucasSantana-Dev/Lucky/issues/1199))
([#1340](https://github.com/LucasSantana-Dev/Lucky/issues/1340))
([ba1b840](https://github.com/LucasSantana-Dev/Lucky/commit/ba1b840accb4858837c0b46e8018b4d1bcd53291))
* **shared:** normalize embed template name on gettemplate
([#1327](https://github.com/LucasSantana-Dev/Lucky/issues/1327))
([#1350](https://github.com/LucasSantana-Dev/Lucky/issues/1350))
([d221b57](https://github.com/LucasSantana-Dev/Lucky/commit/d221b577db03473f0930747362c65861aae501fa))
* **shared:** safe env parsing via parseIntEnv helper
([#1209](https://github.com/LucasSantana-Dev/Lucky/issues/1209))
([#1335](https://github.com/LucasSantana-Dev/Lucky/issues/1335))
([32e3684](https://github.com/LucasSantana-Dev/Lucky/commit/32e36849ac0b8c9b3e839fc24a97f1f6c1972376))
* **shared:** surface Redis client init errors instead of silent swallow
([#1176](https://github.com/LucasSantana-Dev/Lucky/issues/1176))
([157c14e](https://github.com/LucasSantana-Dev/Lucky/commit/157c14ec558a5fffd54e34400eb6a0b02a5a2763))
* **shared:** validate EmbedData shape with Zod before storing custom
commands
([#1179](https://github.com/LucasSantana-Dev/Lucky/issues/1179))
([7419b0e](https://github.com/LucasSantana-Dev/Lucky/commit/7419b0e1f4a4547b8a019c184fe63a41c2dcb017))
* **shared:** validate guildautomation json on read
([#1194](https://github.com/LucasSantana-Dev/Lucky/issues/1194))
([#1346](https://github.com/LucasSantana-Dev/Lucky/issues/1346))
([93d9eea](https://github.com/LucasSantana-Dev/Lucky/commit/93d9eea104c989485b125eb2de494a8032c2f6b4))
* **shared:** wrap ModerationService.createCase in transaction to
prevent duplicate case numbers
([#1167](https://github.com/LucasSantana-Dev/Lucky/issues/1167))
([be52580](https://github.com/LucasSantana-Dev/Lucky/commit/be5258049b6826c4a7141d4b00a8b6f6777d332e))
* **sonar:** clear main reliability gate - s1244 and tailwind v4 fps
([#1671](https://github.com/LucasSantana-Dev/Lucky/issues/1671))
([c12059d](https://github.com/LucasSantana-Dev/Lucky/commit/c12059dfc059db1915706723659812b088c5f34c))
* **spotify:** log oauth token-exchange failures
([#1286](https://github.com/LucasSantana-Dev/Lucky/issues/1286) track b)
([8306c35](https://github.com/LucasSantana-Dev/Lucky/commit/8306c35b19587d5b59e8092c0e245a2ed087b658))
* **telemetry:** un-silence skip-reason emoji prefill errors
([#1660](https://github.com/LucasSantana-Dev/Lucky/issues/1660))
([5eabbd2](https://github.com/LucasSantana-Dev/Lucky/commit/5eabbd2bad04ee92885766ba7184219ea17e5758))
* **test:** close open handles causing jest force-exit in bot suite
([#1605](https://github.com/LucasSantana-Dev/Lucky/issues/1605))
([cf2a026](https://github.com/LucasSantana-Dev/Lucky/commit/cf2a026d4852e2889eb18e1a0ce2389d73da3333))
* **twitch:** add debug logging for skipped channel notifications
([#947](https://github.com/LucasSantana-Dev/Lucky/issues/947))
([0dcf1c2](https://github.com/LucasSantana-Dev/Lucky/commit/0dcf1c2e5c32cda64f80e21f20a9e888715f6ca8))
* **twitch:** re-subscribe to EventSub after unexpected reconnect
([#870](https://github.com/LucasSantana-Dev/Lucky/issues/870))
([#1395](https://github.com/LucasSantana-Dev/Lucky/issues/1395))
([78a30f3](https://github.com/LucasSantana-Dev/Lucky/commit/78a30f31b9e97bd9e5fe86397ce5bdca272c0c10))
* **twitch:** refresh bot subscriptions on web add/remove
([#870](https://github.com/LucasSantana-Dev/Lucky/issues/870))
([939d4b3](https://github.com/LucasSantana-Dev/Lucky/commit/939d4b3721158d0c52c2f9c7944709baf38d35c0))
* **ui:** address CodeRabbit findings on
[#856](https://github.com/LucasSantana-Dev/Lucky/issues/856)
([56f2c82](https://github.com/LucasSantana-Dev/Lucky/commit/56f2c823eeec6bf2d468595fec509284b31e82da))
* **web:** clear auth check promise on settle, not via 100ms timer
([#1311](https://github.com/LucasSantana-Dev/Lucky/issues/1311))
([5cc8eef](https://github.com/LucasSantana-Dev/Lucky/commit/5cc8eefd7d83a5319175b056616ffe097a031299))
* **web:** GuildAutomation error state when both fetches reject
([#1144](https://github.com/LucasSantana-Dev/Lucky/issues/1144))
([f789aa3](https://github.com/LucasSantana-Dev/Lucky/commit/f789aa3e0e110958a0d56230c8273caaca4e6a85))
* **web:** language dropdown switches app language via radio group
([d4fdd98](https://github.com/LucasSantana-Dev/Lucky/commit/d4fdd9880f1246eb985b1214899302eb7b115192))
* **web:** relabel landing RepoCard stats to real servers/users
([#1145](https://github.com/LucasSantana-Dev/Lucky/issues/1145))
([2d63983](https://github.com/LucasSantana-Dev/Lucky/commit/2d6398374f9f0081575992d978c7f57f22005858))
* **web:** remove dead featuresStore toggle code + rollback on failure
([#1147](https://github.com/LucasSantana-Dev/Lucky/issues/1147))
([f8697fb](https://github.com/LucasSantana-Dev/Lucky/commit/f8697fb36532a76f5106dd0fb1bc9d13e5351c71))
* **web:** report swallowed member-context fetch error to Sentry
([#1286](https://github.com/LucasSantana-Dev/Lucky/issues/1286) B3)
([#1416](https://github.com/LucasSantana-Dev/Lucky/issues/1416))
([85f141d](https://github.com/LucasSantana-Dev/Lucky/commit/85f141d7926ef9eeec4a1195dda9702df25d7c02))
* **web:** route handled errors to Sentry, enforce no-console
([#1296](https://github.com/LucasSantana-Dev/Lucky/issues/1296))
([a34e777](https://github.com/LucasSantana-Dev/Lucky/commit/a34e777d1627ad3a2715b49f211c4b7bd3e74266))
* **web:** surface swallowed fetch errors instead of silent catch
([#1254](https://github.com/LucasSantana-Dev/Lucky/issues/1254))
([6afb0cd](https://github.com/LucasSantana-Dev/Lucky/commit/6afb0cd4f1a81f5c5e1616c7925c7bc75b9524b6))


### Performance Improvements

* **bot:** bound autoplay Maps + parallelize replenisher awaits
([#1215](https://github.com/LucasSantana-Dev/Lucky/issues/1215))
([1e55afa](https://github.com/LucasSantana-Dev/Lucky/commit/1e55afa125acbb60f0b1d28ff9c168a5e32b8ead))
* **bot:** bound external scrobbler track cache with lru+ttl
([#1282](https://github.com/LucasSantana-Dev/Lucky/issues/1282))
([#1316](https://github.com/LucasSantana-Dev/Lucky/issues/1316))
([7f29efc](https://github.com/LucasSantana-Dev/Lucky/commit/7f29efce0ea9ad0b6ad1dff6edfae57d4f15b2f8))
* bound unbounded findMany queries
([#1206](https://github.com/LucasSantana-Dev/Lucky/issues/1206))
([#1214](https://github.com/LucasSantana-Dev/Lucky/issues/1214))
([cdc0082](https://github.com/LucasSantana-Dev/Lucky/commit/cdc0082b64f407c313850e00864055b669bec3d8))
* **shared:** batch recommendation telemetry counts in one groupBy
([#1308](https://github.com/LucasSantana-Dev/Lucky/issues/1308))
([e5a5973](https://github.com/LucasSantana-Dev/Lucky/commit/e5a5973d9c25d5926ab576b13265fe05c2d87032))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Release 2.33.0 ships smarter autoplay, new role management in the
dashboard, better moderation and Twitch integrations, and stronger
observability/security. It also includes wide-ranging fixes and
performance improvements across bot, backend, and web.

- **New Features**
- Autoplay scoring upgrades: implicit dislike penalty, recency decay,
replay boost, and evaluation harness.
- Dashboard: role groups and reaction roles management with editor
(emoji picker, media, import/export).
- Moderation and guild tools: move message via context menu, batch
operations (bulk move), AFK, reminders, giveaways, smart custom
commands, starboard seeding.
- Integrations: Twitch follower/subscriber role sync and new EventSub
events; RSS bridge and weekly digest.
- Backend/Web: support intake with admin views, Postgres session store,
server logs/settings pages, previous-track command, per-route SEO and
sitemap.
- Observability/Security: request-id correlation, deploy markers/alerts,
CSP headers and violation collection.

- **Bug Fixes**
- Timeouts and guardrails on external calls with graceful degradation;
mitigations for Discord 429 storms.
- Hardening for reaction roles, role writes, guild route validation,
JSON parsing, and DB constraints; atomic write paths.
- Bot stability: safer session restore and shutdown, extractor
registration, clearer YouTube errors, accurate previous button replies.
- CI/CD and deploy reliability: SHA-pinned deploys, health probes, cache
correctness, pinned actions, verified frontend caching.
- Security: dependency updates, redacted logs/health output, and
CodeQL/Semgrep findings resolved.

<sup>Written for commit 22727a164df9bd407b3493dd3459ca46984664c4.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/LucasSantana-Dev/Lucky/pull/1733?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Added release notes for version 2.33.0, highlighting new features, bug
fixes, and performance improvements.
* **Chores**
  * Updated the project version to 2.33.0.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

This branch was successfully deployed

1 active deployment
Preview — 2cefbf09 Deployed Jun 23, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request frontend size/xl staging Deploy this PR to the staging environment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant