🟡 Release v2.378.5
⭐⭐ Moderate Complexity • 7 commits • 32 files changedStability & Usability Sprint — Fixed sprite upload validation to prevent in-game visual errors, resolved landing page crashes on org selection, and unlocked free giveaway entries for users with depleted point balances. Enhanced game theming and improved webhook processing reliability.
What’s New
For Platform Administrators
- Game Asset Validation – Sprite uploads (game balls, hoops, logos) are now validated to ensure they have real transparent backgrounds. Prevents users from uploading images with baked-in checkerboard or solid backgrounds that would appear as opaque squares in-game.
- Organization Dashboard Stability – Fixed 500 errors and error page flashing when switching between organizations. Dashboard now loads seamlessly without interrupting your workflow.
- Free Giveaway Access – Users can now enter free giveaway campaigns regardless of their current point balance, eliminating unnecessary barriers to participation in zero-cost promotions.
For End Users
- Proper Game Theming – Game completion screens now inherit the organization’s theme settings, ensuring visual consistency across the entire gamification experience.
- Free Entry Eligibility – Community members can participate in free giveaway entries even if their point account is at zero or shows a negative balance (e.g., after points expiry).
Apps Updated
User App
✓ Updated - 1 change
API
✓ Updated - 1 change
Admin
✓ Updated - 2 changes
MCP Server
— No changes
Shopify App
✓ Updated - 1 change
Games
— No changes
Detailed Changes
User App
User App
NJ-1032: Game Completion Screen Theming
- Moved game completion route from
/game/[id]/to/(main)/game/[id]/ - Game completion screens now inherit organization theme settings
- Ensures visual consistency with the rest of the user experience
- Removed duplicate layout logic from isolated game route group
Shared Services
Shared Services
Admin Panel
Admin Panel
NJ-1023: Sprite Upload Validation
- Added transparency detection for game asset uploads (basketball, hoop, logos)
- Automatically rejects fully-opaque images (baked checkerboard or solid backgrounds)
- Prevents visual errors where sprite backgrounds show as opaque squares in-game
- Provides clear user guidance: “This image needs a transparent background”
- Configurable alpha threshold and minimum transparent pixel fraction
- Enforces PNG output for transparency-required assets
- Fixed 500 errors when accessing organization dashboard
- Eliminated error page flashing during organization selection
- Replaced server-side
redirect()with client-side navigation component - Improved hydration compatibility with streamed layouts
- Added comprehensive integration tests for default community detection
Shopify Integration
Shopify Integration
NJ-968: Webhook Processing Enhancement
- Implemented dark QStash webhook processing route
- Improved webhook reliability and processing architecture
- Enhanced backend resilience for webhook-driven events
Admin Highlights
- 🎨 Game Asset Validation – Sprite uploads now validate transparency to prevent in-game display issues where opaque backgrounds appear as gray/white squares
- ⚡ Stable Organization Dashboard – Landing page no longer crashes or flashes errors when switching between organizations
- 🎁 Free Giveaway Flexibility – Users can participate in zero-cost giveaways regardless of their current point balance
User Highlights
- 🎮 Themed Game Completion – Game completion screens now automatically apply your community’s theme colors and branding
- 🎁 Free Entry Eligibility – Join free giveaway campaigns even with zero or negative point balances
Technical Details
Landing Page Stability (NJ-1019)
The organization dashboard was experiencing a 500 crash whenredirect() was called in a server component that streams data to the client. This conflicted with Next.js hydration, causing the “Rendered more hooks than during the previous render” error that prevented users from accessing their default communities. Fixed by moving the navigation to a DefaultCommunityRedirect client component that uses location.replace() after hydration completes, eliminating the streaming conflict.
Game Sprite Transparency Validation (NJ-523)
Added a newimageDataHasTransparency() utility that scans RGBA pixel data to detect meaningful transparency. Game sprites (basketball, hoop, logos) are composited over a scene background, so they must have a real transparent region. The common failure case is exporting a sprite from an image editor with the transparency checkerboard or a solid background baked into pixels — the result is fully opaque, which renders as an ugly gray/white square in-game. The validator is tunable (alpha threshold and minimum transparent pixel fraction) and fails open on CORS-tainted canvases to avoid blocking valid uploads.
Zero-Cost Giveaway Entries (NJ-524)
Updated the distribution management service to skip balance validation for zero-cost purchases (free giveaway entries). The original code checkedavailablePoints >= totalPurchasePrice for all purchases, which blocked users with zero or negative available balance from entering free drawings (particularly problematic after points expiry). Now balance validation only gates paid entries (totalPurchasePrice > 0). Also skips creating unnecessary zero-amount debit transactions for free entries, keeping the transaction history clean.
Release Stats
| Metric | Value |
|---|---|
| Total Commits | 7 |
| Lines Added | +1,896 |
| Lines Removed | -171 |
| Files Changed | 32 |
Contributors
jamescockayne1 commit • +850/-0 lines
ZuhayrK001 commit • +271/-39 linesv2.378.5 deployed on June 12, 2026



