Release history
Changelog
Every new feature, fix and speed-up on s&box Explorer, newest first.
- Last 30 days
- 90
- Features shipped
- 233
- Fixes
- 218
- Days with changes
- 66
114 changes in November 2025 Clear filters
November 2025
8
-
Fix
4:08 PM
Fix favorites section padding on live server with higher CSS specificity
994a5bc -
Fix
3:57 PM
Fix profile layout for logged-out users - apply custom layout order and visibility
c0e23dc -
Fix
3:35 PM
Fix profile layout persistence and move Steam presence to hero links
3d32418 -
Fix
2:01 PM
Fix notifications routing and update deployment script
1df07b4 -
Fix
12:08 PM
Profile widgets display and management
Details
- Fixed widget loading race condition causing widgets to disappear on page load
- Fixed org-page.js loading conflict on player profiles
- Improved widget editor modal styling with modern gradients and animations
- Redesigned Featured Package widget with separate org/package fields
- Added auto-fetch for package title and thumbnail from API
- Made package metadata fields read-only to prevent malicious content
- Fixed API response parsing (data.data.widgets structure)
- Added widgetsLoaded flag to prevent premature rendering
- Improved form field styling with better focus states and spacing
b1f09cd -
Fix
10:39 AM
Corrected level calculation and improved admin reputation management
Details
- Fixed exponential level calculation (now properly scales to 100 levels)
- Added badge count display in leaderboard
- Fixed recalculate API to use same database connection
- Added getPdo() method to ReputationSystem for API access
- Display actual usernames instead of Steam IDs in admin panel
- Added test-badges.php for debugging reputation calculations
233f9bf -
Fix
8:39 AM
Fix tooltips and org page full-width layout
Details
- Add Tippy.js with Popper.js for proper tooltips
- Initialize tooltips globally in footer
- Fix org pages to use full width (no sidebar)
- Add org-profile-wrapper class for org-specific styling
- Remove verbose comments from PHP and CSS files
188e60f -
Fix
8:07 AM
Fix profile system: sticky sidebar, widget/layout save, and data persistence
714316d
4
-
Fix
2:53 AM
Sync API endpoints and fix bugs in reputation/version comparison
Details
- Fix ReputationSystem endpoint (removed non-existent getLevel/getNextLevelInfo)
- Fix VersionHistoryService fetchPackageVersions argument count
- Fix CacheManager::set argument order in VersionHistoryService
- Add missing package type endpoints to tests (addons, maps, models)
- Add user reputation/badges endpoints to test suite
- Remove invalid package compare test
- All 42 endpoints now passing
25f0744 -
Fix
1:02 AM
Fix admin routing and preload warnings - Add proper /admin/ route handling - Set isAdminPage flag before head.php inclusion - Conditionally preload bundle-init.js and main.js only on non-admin pages
fa5cdc3 -
Fix
12:53 AM
Fix PWA install for desktop browsers with manual instructions fallback
08e330c -
Fix
12:34 AM
Fix notification system for favorited/followed package updates
Details
- Add PackageChangeDetector to detect package updates (Title, Version, Description, etc.)
- Add NotificationDispatcher to query both favorites and followed_packages tables
- Integrate change detection into refresh-worker.php cache refresh workflow
- Update frontend polling interval from 60s to 10s for real-time notifications
- Add toast notifications for new package updates with click-to-navigate
- Implement cache invalidation after notification creation
- Deduplicate users appearing in both favorites and follows tables
Fixes notification system to reliably fire when favorited or followed packages are updated.
1bd2f91
15
-
Fix
9:22 AM
Fix admin auth check and improve moderation logs UI
Details
- Fixed moderation-logs.php to use isAdmin() function instead of checking session directly
- Added structured log parsing with timestamp, Steam ID, action, and reason extraction
- Improved UI with color-coded badges, collapsible JSON content, and better layout
- Added clear logs button with confirmation dialog and success/error messages
30f26c8 -
Fix
7:23 AM
Fix d-none class conflicts in profile layout customization
Details
- Remove d-none class before setting inline display styles
- Add d-none class when hiding elements
- Fixes layout controls bar, drag handles, visibility button, theme controls, and modal visibility
- Resolves issue where !important CSS rule was overriding JavaScript inline styles
6ef36bf -
Fix
5:20 AM
Fix βeta Tester badge styling - correct character encoding
38b034c -
Fix
5:17 AM
Fix Steam presence not showing on profiles
Details
- Add classList.remove('d-none') when rendering presence indicator
- Add classList.add('d-none') when hiding presence indicator
- Add .d-none and display utility classes to base.css
- Run steam_presence_settings table migration
985e3de -
Fix
5:08 AM
Fix all UI/UX issues: accessibility, touch targets, animations, forms, and loading states
98b1d63 -
Fix
4:03 AM
Fix all reference validation issues
Details
- Add missing includes/error.php template for auth error pages
- Generate missing Microsoft tile images (mstile-70x70, mstile-150x150, mstile-310x310)
- Standardize manifest references to /manifest.json across all files
- Remove duplicate favicon/site.webmanifest file
- Clean up commented-out auto-refresh.php include in index.php
- All file references now validated and working correctly
78eb4e9 -
Fix
3:23 AM
Fix database schema integrity issues
Details
- Enhanced cache_tags table schema with proper id and created_at columns
- Fixed cache_tags table creation to handle existing tables correctly
- Verified all schema migrations are complete and working
- All database operations tested and passing (10/10 tests)
- Schema integrity verified (29/29 checks passed)
d356f10 -
Fix
2:50 AM
Fix API endpoint synchronization and profile layout persistence
Details
- Added missing API routing rules to router.php for dev server
- /api/user/* -> profile-api.php
- /api/user-experience-api.php/* -> user-experience-api.php
- /api/community-api.php/* -> community-api.php
- /api/announcement-api.php/* -> announcement-api.php
- /api/theming-api.php/* -> theming-api.php
- /api/reputation/* -> api.php
- Added corresponding routing rules to .htaccess for production
- Fixed profile-api.php to use user_settings.profile_layout instead of profile_layouts table
- Updated profile-api.php route patterns to handle both /user/* and /* paths
- Fixed frontend JavaScript API calls:
- user-profile-redesign.js: Updated profile-layout endpoints
- version-history.js: Fixed package versions and compare endpoints
- Fixed saved_searches table creation in AdvancedSearchEngine.php
- Fixed profile welcome message to only show for truly empty profiles
- Fixed profile layout customization to persist correctly across reloads
- Layout now gracefully handles sections that don't exist on the page
0cf02df -
Fix
2:20 AM
Activity Timeline setting persistence and missing fetchUserProfile function
Details
- Added fetchUserProfile() function to api_functions.php for resolving usernames to Steam IDs
- Added CacheManager require to api_functions.php to fix undefined class error
- Fixed ActivityTimelineManager setEnabled() to use UPDATE instead of INSERT OR REPLACE
- Added activity_timeline_enabled column to user_settings schema and migration list
- Fixed saveUserSettings() to preserve activity_timeline_enabled when saving other settings
a4d43e3 -
Fix
1:28 AM
Fix API endpoint synchronization with enhanced error handling and rate limiting
Details
- Enhanced error handling in admin panels (reputation-management, index, org-claims-full)
- Added content-type checking before JSON parsing to prevent crashes
- Handle both JSON and plain text error responses (403, 429, 500)
- Added loading states and button state management
- Improved console error logging for debugging
- Added rate limit headers to recalculate-all-users-reputation endpoint
- Retry-After header for client retry guidance
- X-RateLimit-Remaining and X-RateLimit-Reset headers
- Better 429 response handling
- Enhanced API documentation (api-doc.php)
- Added response schema tables with field descriptions
- Added JSON response examples for endpoints
- Improved endpoint rendering with schema display
- Created centralized API client library (api-client.js)
- Consistent error handling across all API calls
- Automatic JSON parsing and validation
- Rate limit detection with retry information
- Custom ApiError class with helper methods (isAuthError, isRateLimitError, etc)
- Support for GET, POST, PUT, DELETE methods
- Query parameter building and header configuration
Impact: Prevents crashes, improves error handling, better developer experience
ece1104 -
Fix
1:12 AM
Fix reputation recalculation endpoint with batch processing and error handling
Details
- Add batch processing (100 users at a time) to prevent HTTP timeouts
- Fix JSON output by clearing output buffers and disabling error display
- Add proper error handling for failed API calls and null player data
- Suppress 404 errors for player endpoints (expected when users don't have s&box)
- Fix database locking issues by catching cache deletion errors
- Update frontend to show progress and process batches automatically
- Add offset/batch_size parameters for incremental processing
dad2167 -
Fix
12:27 AM
Fix active-users.php tab switching and error handling
89a00bf -
Fix
12:15 AM
Fix missing avatar images on leaderboard
Details
ISSUE: Users without avatars or with animated Steam avatars showed 404 errors
FIXES:
- Changed default avatar from /assets/default-avatar.png to /assets/placeholder.png (existing file)
- Added onerror handler to fallback to placeholder.png if avatar fails to load
- Created default-avatar.svg as additional fallback option
- Updated both leaderboard.php and reputation.js to handle missing avatars
Now all users display properly on the leaderboard even without profile pictures!
4cf1b29 -
Fix
12:13 AM
Fix reputation leaderboard API 500 error
Details
ISSUE: Leaderboard API was failing with 500 error due to missing columns
FIXES:
- Removed JOIN with user_settings table (doesn't have display_name/avatar)
- Modified getLeaderboard() to fetch user data from s&box API
- Added try-catch error handling to leaderboard endpoint
- Now fetches display names and avatars via fetchPlayerData()
- Falls back to steam_id if player data unavailable
The leaderboard now properly loads user data from the API instead of expecting it in the database.
6914793 -
Fix
12:11 AM
Fix leaderboard.php to properly load styles.css
Details
- Added proper HTML structure with head section
- Included styles.css using css() helper function
- Added meta tags and Google Analytics includes
- Follows same pattern as other standalone pages (news.php, changelog.php)
- Properly closes body and html tags
245f9b6
6
-
Fix
9:08 PM
Fix getBadges to return full badge metadata (name, description, icon)
eab0b78 -
Fix
8:58 PM
Fix 500 error in manual org assignment - add missing api_functions.php dependency and timeout protection
b032eea -
Fix
5:01 AM
Fix claimed-orgs API by removing problematic output buffering
Details
Root Cause:
- Output buffering (ob_start/ob_clean/ob_end_flush) was causing issues
- The debug version without buffering works perfectly
- Log shows successful claim: voxels org with 12 packages
Fix:
- Removed all output buffering code
- Simplified to just require bootstrap and set header
- Matches the working debug version structure
Verified Working:
- Debug log shows successful claim of 'voxels' organization
- Authentication working
- Database connected
- 12 packages found
- Org claimed successfully
The API should now work properly without the 500 error.
7e0447f -
Fix
4:59 AM
Fix output buffering issue in claimed-orgs API
Details
Issue:
- ob_clean() was clearing ALL output including session data
- This caused authentication to fail silently
- Result: 500 error with empty JSON response
Fix:
- Only clean buffer if there's unwanted output
- Check if output starts with '{' (JSON) before cleaning
- Suppress notices and warnings instead of displaying them
- Keep output buffer but don't blindly clear it
Added Test Scripts:
- test-claim.php: Tests all dependencies
- test-claim-simple.php: Minimal API test
This should resolve the 500 error by preserving session data while still catching unwanted output.
0466e1a -
Fix
4:53 AM
Fix 500 error in claimed-orgs API with better error handling
Details
Improvements:
- Added file existence check for user_packages.php
- Added function existence check for fetchUserPackages
- Wrapped fetchUserPackages calls in try-catch blocks
- Made reputation calculation non-blocking (won't fail claim/unclaim if it errors)
- Added detailed error logging for debugging
- Each org fetch is wrapped individually so one failure doesn't stop others
- Claim/unclaim operations succeed even if reputation update fails
This prevents the 500 error and ensures the core functionality (claiming/unclaiming orgs) always works, even if reputation calculation has issues.
f6550b6 -
Fix
4:42 AM
Fix reputation system 500 error
Details
Issues Fixed:
- Changed from \['steamId'] to \['resolvedSteamId']
- Added fallback to username if resolvedSteamId not available
- Added null check before attempting to load reputation
- Wrapped reputation system calls in try-catch for error handling
- Added error logging for debugging
The reputation system now properly handles the user profile data structure and won't crash if there are any issues loading reputation data.
a68d5d2
9
-
Fix
9:44 PM
Fix cache staleness issues by standardizing TTL values
Details
- Increased org/user package cache TTL from 1800s/3600s to 7200s (2 hours)
- Increased staleness check threshold from 1800s to 3600s (1 hour)
- Increased API response cache from 300s to 600s (10 minutes)
- Increased player data cache from 300s to 1800s (30 minutes)
- Increased news cache from 600s to 1800s (30 minutes)
This prevents premature cache invalidation and reduces unnecessary background refresh triggers, improving performance and consistency.
b2fc81c -
Fix
9:01 PM
Some css stuffs
Details
fixed some css stuff
ac167e2 -
Fix
8:35 PM
CSS stuffs
Details
did i break it? maybe
b81ea0f -
Fix
5:36 PM
Auto-refresh system
Details
- Implemented Windows scheduled task for automatic cache refresh
- Added cache monitoring tools (check-cache-status, check-cache-types, check-old-caches)
- Fixed scheduled task setup script with proper trigger configuration
1782f2c -
Fix
4:39 PM
Fix auto-refresh system - cached organization data now refreshes correctly every 30 minutes
Details
- Fixed refresh-worker.php to load bootstrap.php instead of config.php (CacheManager now loads properly)
- Fixed SQLite parameter binding by adding CAST(? AS INTEGER) to all age calculations
- Increased auto-refresh probability from 20% to 50% for better coverage
- Fixed admin refresh-status.php cache directory path
- Created tools/cron-refresh.php for optional scheduled refreshes
System now works automatically on page loads (no setup required). Optional: Use web cron service or server cron for guaranteed 30-min intervals.
All caches now correctly update timestamps and reset age to 0 after refresh. STALE status clears automatically once organizations are refreshed.
6b9d858 -
Fix
5:46 AM
Include commits with empty body in changelog generation
Details
- Remove trim() call that was stripping trailing empty body fields
- Commits with no body now correctly parse all 7 git log fields
- Fixes issue where docs and other commits without descriptions were missing
- Changelog now includes all 300+ commits instead of only 144
a11cb0e -
Fix
4:56 AM
Correct footer cache path and enhance admin refresh-status page
Details
- Fix footer.php cache path from '../cache/' to '../../cache/' (correct from backend/includes/)
- Replace inline styles in admin/refresh-status.php with proper CSS includes
- Add breadcrumb navigation to refresh-status page
- Add stats overview cards showing total orgs, packages, cache size, and stale count
- Improve table styling with better visual hierarchy
- Add icons to organization names and status badges
- Highlight stale cache rows with warning styling
- Better button styling and layout
- More consistent with overall admin panel design
bc53b2e -
Fix
12:58 AM
Fix SSL certificate issues and improve privacy/UX - Disable SSL verification for development IP addresses - Mask IP addresses in admin active users page (192.168.x.x format) - Suppress theme notification on settings page load
9e7c438 -
Fix
12:46 AM
Audit and update all theme files for consistency and robustness
Details
- Fixed hex color length issues across multiple themes (cyberpunk, dracula, retro-terminal, synthwave)
- Removed duplicate scrollbar definitions (monokai, one-dark-pro, tokyo-night, solarized-dark)
- Fixed background/background-color property override conflicts in all themes
- Added missing component styles to one-dark-pro and tokyo-night themes
- Fixed undefined CSS variable references (--border-color)
- Standardized scrollbar styling across all 20 themes
- Added proper URL quotes and inset shorthand in rust theme
- All themes now pass stylelint validation with zero errors
- Ensured complete CSS variable definitions matching theme template
- All themes include: tables, pagination, collapsible, cards, buttons, inputs, navigation, glow effects, animations, and responsive styles
70f3315
5
-
Fix
11:41 PM
Fix missing CSS variables across 10 themes
Details
- cyberpunk: Add missing color variables (cyan, magenta, yellow, green)
- monokai: Add scrollbar variables, remove duplicate definitions
- one-dark-pro: Add 14 missing variables (scrollbar, link, button, card, nav, input)
- tokyo-night: Add 14 missing variables (scrollbar, link, button, card, nav, input)
- ocean: Add 17 standard variables for full template compatibility
- solarized-dark: Add 17 standard variables for full template compatibility
- sunset: Add 17 standard variables for full template compatibility
- synthwave: Add 17 standard variables for full template compatibility
- retro-terminal: Add 17 standard variables, maintain terminal aesthetic
- minimal-dark: Add link-color and border-hover, fix undefined reference
All 19 themes now have complete variable sets and consistent component styling.
810e5f9 -
Fix
10:51 PM
Fix all Stylelint issues across CSS files
Details
- Convert rgba() to modern rgb() syntax with percentage alpha values
- Change decimal alpha values to percentages (0.5 -> 50%)
- Shorten hex colors (#ffffff -> #fff)
- Replace deprecated word-wrap with overflow-wrap
- Fix keyword casing (optimizeLegibility -> optimizelegibility)
- Update media query syntax to modern range notation
- Fix invalid mask gradient syntax
- Correct :full-screen to :fullscreen pseudo-class
- Add standard font-feature-settings alongside vendor prefixes
9885eb7 -
Fix
6:46 PM
Fix lightbox errors by filtering video URLs from Screenshots array
3245df8 -
Fix
3:25 AM
Package description rendering for s&box API format
Details
- Update renderJsonDescription() to parse s&box API's text/attributes structure
- Add support for heading1-6, paragraphs, blockquotes, code blocks, and lists
- Handle image and file attachments in descriptions
- Add comprehensive CSS styling for .rich-description elements
- Maintain backward compatibility with alternative JSON formats
- Fix CSS linting issue with blockquote padding
Fixes description display on package detail pages like /facepunch/flatgrass/ to match the live site at https://sbox.game
01b46fd -
Fix
2:09 AM
Improve lightbox system with accurate indexing and enhanced UX
Details
- Fix critical indexing bug where clicking images showed wrong content
- Add index mapping to correctly handle mixed media (videos/images)
- Implement smooth image transitions with preloading
- Add mobile swipe gesture support for navigation
- Enhance keyboard navigation (arrows, escape)
- Improve responsive design for mobile devices
- Add loading states and error handling
- Optimize performance with image preloading
- Enhance visual transitions and animations
a578e84
5
-
Fix
8:36 PM
Font-variation-settings:
Details
fill = 1
6532864 -
Fix
6:47 PM
Auto-caching system to update correctly within 30 minutes
Details
- Fixed cache key format from 'org_username' to 'org_packages_username' across all files
- Updated auto-refresh.php to query database cache instead of file-based caches
- Increased refresh frequency (20% probability, 2-min throttle, 3 orgs per run)
- Fixed AJAX refresh to do synchronous updates with proper JSON responses
- Added automatic cleanup of expired cache entries (hourly)
- Fixed cache age display by defining variables in correct scope
- Updated refresh-worker.php to save to database cache with proper TTL
- Updated tools/refresh-endpoint.php to work with database cache
- Fixed tools/precache-popular-orgs.php cache key format
- Added missing CSS imports to admin/refresh-status.php for proper styling
All cache operations now use consistent 'org_packages_' and 'user_packages_' key prefixes.
7d11a72 -
Fix
4:54 PM
Fix CSS linting issues in news.css
Details
- Use modern color function notation with percentage alpha values
- Add standard mask property alongside -webkit-mask
- Add standard line-clamp alongside -webkit-line-clamp
- Use modern media query range notation (width <= X)
- Use inset shorthand property
- Fix box-shadow alpha value notation
c8224d0 -
Fix
3:40 AM
Resolve all Stylelint errors across CSS files
Details
- Fix syntax errors in ocean.css and sunset.css (unclosed SVG URLs, extra braces)
- Remove duplicate properties (font-feature-settings, appearance, backdrop-filter, background-clip)
- Fix selector specificity issues in admin.css
- Add generic font family fallbacks for icon fonts
- Update .stylelintrc.json to allow camelCase naming and vendor prefixes
- All CSS files now pass Stylelint validation with zero errors
71bbbf1 -
Fix
12:28 AM
Fix missing version ID display in package versions list
4adbff4
1
-
Fix
7:40 PM
Enhance media display and fix styling issues
Details
- Add support for video media in package details
- Improve media grid layout and responsiveness
- Update lightbox functionality to handle both images and videos
- Fix styling issues in packages.css
086067b
Generated from the project's commit history whenever the site is deployed. Times are server time.