Changelog - RC5 - Complete Release Notes
Release Date: December 27, 2025
Version: 5.0.0-RC5
Compatibility: PHP 8.0+, SQLite/JSON Storage
Summary
This release includes comprehensive improvements to the Premium theme configuration system, API routing fixes, critical bug fixes for group management, significant backend UX improvements, theme optimization, and automatic theme mode improvements. All changes maintain backward compatibility and respect the core architecture constraints.
Part 1: API Routing Configuration
Summary
Fixed 404 errors for API endpoints (/api/presence/update and /api/notifications) by adding proper routing rules to redirect API requests to api.php instead of index.php.
Changes
1. .htaccess (Root directory)
Added: API routing rule before the general rewrite rule
- Location: Line 16-19
- Change: Added rule to redirect
/api/* requests to public/api.php - Supports: Subdirectories and subdomains
# Redirect API requests to public/api.php (supports subdirectories)
RewriteCond %{THE_REQUEST} \s+/api/ [NC]
RewriteRule ^api/(.*)$ public/api.php?url=/api/$1 [QSA,L]
2. public/.htaccess (Public directory)
Added: API routing rule before the general rewrite rule
- Location: Line 28-30
- Change: Added rule to redirect
/api/* requests to api.php - Modified: Changed condition from
^/api/ to /api/ to support subdirectories (removed anchor ^)
# Redirect API requests to api.php
# Supports subdirectories: /forum/api/... or /api/...
RewriteCond %{REQUEST_URI} /api/ [NC]
RewriteRule ^api/(.*)$ api.php?url=/api/$1 [QSA,L]
3. nginx.conf
Added: API location block and FastCGI configuration
- Location 1: Line 67-70 (before static files section)
- Change: Added location block to route
/api/* requests to public/api.php - Modified: Changed from
^/api/ to /api/ to support subdirectories (removed anchor ^)
# API entry point (supports subdirectories)
location ~ /api/ {
try_files $uri /public/api.php?url=$uri&$args;
}
- Location 2: Line 82-97 (before main PHP entry point)
- Change: Added FastCGI configuration block for
api.php
# API PHP entry point
location ~ ^/public/api\.php$ {
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_index api.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param QUERY_STRING $query_string;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
}
- Location 3: Line 202-205 (HTTPS section, commented)
- Change: Added same API routing rules in the commented HTTPS configuration section for consistency
Technical Details
Why these changes were needed
- API endpoints were returning 404 errors because requests to
/api/* were being routed to index.php instead of api.php - The
api.php file uses runApi() method which calls dispatchApi() instead of dispatch(), ensuring proper API response handling
Compatibility
These changes support:
- ✅ Root installation:
https://example.com/api/... - ✅ Subdirectory installation:
https://example.com/forum/api/... - ✅ Subdomain installation:
https://forum.example.com/api/... - ✅ Any combination of the above
Pattern Changes
- Before: Used anchored patterns
^/api/ (only matches at start of path) - After: Use non-anchored patterns
/api/ (matches anywhere in path) - Reason: Allows matching
/api/ even when preceded by a subdirectory path like /forum/api/
Testing
After applying these changes, the following endpoints should work correctly:
GET /api/notificationsPOST /api/presence/update- All other
/api/* endpoints
Server Configuration Required
Apache
No additional configuration needed. Just ensure mod_rewrite is enabled.
Nginx
- Test configuration:
sudo nginx -t - Reload Nginx:
sudo systemctl reload nginx - Adjust
fastcgi_pass path if different (check your PHP-FPM socket location)
Part 2: Premium Theme Enhancements
Summary
Added comprehensive theme configuration system to the Premium theme, allowing administrators to customize layout, visual styles, and feature toggles without modifying core files. All changes are contained within the themes/premium directory.
Changes
1. Theme Configuration (themes/premium/theme.json)
Added: 15 new configurable parameters for theme customization
Layout Options:
layout_style: Choose between centered, wide, or compact layoutsnavbar_style: Glass, solid, or transparent navbar stylescard_style: Elevated, bordered, or minimal card designs
Visual Options:
animation_level: Control animation intensity (none, subtle, normal, high)border_radius: Adjust border radius multiplier (0.5x to 2x)font_size: Adjust font size multiplier (0.8x to 1.5x)spacing: Adjust spacing multiplier (0.8x to 1.5x)enable_gradients: Toggle gradient effectsenable_shadows: Toggle shadow effectsenable_parallax: Toggle parallax scrolling effects
Feature Toggles:
show_hero: Display hero section on homepage and forums pageshow_stats: Display statistics sectionshow_breadcrumbs: Display breadcrumb navigationshow_cta: Display call-to-action sectionsshow_avatars: Display user avatars in postsshow_signatures: Display user signatures in postsshow_share_buttons: Display social sharing buttonsenable_reactions: Enable reaction picker in postsshow_notifications_bell: Display notification bell in navbarenable_sticky_navbar: Make navbar sticky on scrollenable_back_to_top: Display back-to-top buttonenable_smooth_scroll: Enable smooth scrolling behaviorenable_lazy_loading: Enable lazy loading for imagesshow_user_presence: Display user presence indicatorsenable_tooltips: Enable Bootstrap and custom tooltipsenable_auto_refresh: Auto-refresh notifications
2. Theme Helper (app/Helpers/ThemeHelper.php)
Added: getThemeSetting($key, $default) method
- Purpose: Retrieve theme configuration values from
theme.json - Usage:
ThemeHelper::getThemeSetting('show_hero', true)
3. Header Template (themes/premium/views/layouts/frontend/header.php)
Modified: Applied theme settings to header and navigation
- Changes:
- Applied
show_notifications_bell to conditionally display notification bell - Applied
enable_sticky_navbar to add sticky-top class to navbar - Applied
navbar_style to add CSS classes (navbar-glass, navbar-solid, navbar-transparent) - Applied
enable_smooth_scroll to add data-smooth-scroll attribute - Applied visual settings (
card_style, animation_level, border_radius, font_size, spacing, enable_gradients, enable_shadows, enable_parallax) by adding classes to <body> tag - Injected theme settings into JavaScript via
data-theme-settings attribute - Fixed:
implode() error by initializing $bodyClasses before use - Fixed: Syntax error by removing extraneous
<?php tag - Fixed: Admin panel link visibility by improving
isAdmin detection logic
4. Main Layout (themes/premium/views/layouts/frontend/main.php)
Modified: Applied layout style setting
- Change: Applied
layout_style to add classes (theme-layout-centered, theme-layout-wide, theme-layout-compact) to <main> tag
5. Footer Template (themes/premium/views/layouts/frontend/footer.php)
Modified: Added back-to-top button and recent registrations section
- Changes:
- Implemented
enable_back_to_top to display scroll-to-top button - Integrated
enable_smooth_scroll for smooth scrolling behavior - Added: "Recent Registrations" section displaying 5 latest registered users with avatars, usernames, and registration dates
- Fixed: Avatar display using
AvatarHelper::getUrl() for correct URL generation - Fixed: Translation key for "Recent Registrations" to display translated text
6. Banner Component (themes/premium/views/components/banner.php)
Modified: Applied breadcrumbs setting
- Change: Applied
show_breadcrumbs to conditionally display breadcrumbs
7. Categories Index (themes/premium/views/categories/index.php)
Modified: Applied hero, stats, and CTA settings
- Changes:
- Applied
show_hero, show_stats, show_cta to conditionally display sections - Moved "Statistics" section to appear after main content (category cards)
- Fixed:
getAllPosts() error by iterating through discussions to count posts
8. Discussions Index (themes/premium/views/discussions/index.php)
Modified: Applied hero, stats, and CTA settings
- Changes:
- Applied
show_hero, show_stats, show_cta to conditionally display sections - Moved "Statistics" section to appear after main content (discussion list)
- Fixed:
getAllPosts() error by iterating through discussions to count posts
9. Post Thread Component (themes/premium/views/components/post-thread.php)
Modified: Applied post display settings
- Changes:
- Applied
show_avatars to conditionally display user avatars or placeholder with initials - Applied
show_signatures to conditionally display user signatures - Applied
show_share_buttons to conditionally display share buttons - Applied
enable_reactions to conditionally display reaction picker
10. Main JavaScript (themes/premium/assets/js/main.js)
Modified: Integrated theme settings for dynamic behavior
- Changes:
- Integrated
getThemeConfig() to read settings from injected JSON script - Applied
enable_tooltips to initialize Bootstrap tooltips and custom Flatboard tooltips - Applied
enable_auto_refresh to control setInterval for notifications - Applied
enable_lazy_loading to initialize lazy loading or remove loading="lazy" attributes - Applied
show_user_presence to control updatePresence() calls - Applied
enable_smooth_scroll to set document.documentElement.style.scrollBehavior - Applied
enable_parallax, animation_level, border_radius, font_size, spacing by setting CSS custom properties or adding classes to document.documentElement
11. Frontend CSS (themes/premium/assets/css/frontend.css)
Modified: Applied theme settings for dynamic styling
- Changes:
- Applied
card_style with specific CSS rules for elevated, bordered, minimal styles - Applied
enable_shadows and enable_gradients to conditionally disable these effects - Applied
border_radius, font_size, spacing, animation_level, layout_style, enable_parallax by setting CSS custom properties or adding classes
12. Theme Colors Component (themes/premium/views/components/theme-colors.php)
Modified: Fixed function re-declaration error
- Change: Added
if (!function_exists('hexToRgb')) to prevent re-declaration of the hexToRgb function - Added: Dynamic CSS variables for
--theme-border-radius, --theme-font-size, and --theme-spacing-multiplier based on theme settings
13. RSS Service (app/Services/RssService.php)
Modified: Added permission filtering for RSS feeds
- Change: Added filter to
getAllDiscussions() to only include discussions from categories visible to anonymous users using Category::canView($categoryId, null)
14. Sitemap Service (app/Services/SitemapService.php)
Verified: Confirmed correct permission filtering
- Status: Already correctly filters discussions, categories, and tags based on
Category::canView($categoryId, null) and Tag::canView(null)
Architecture
- Configuration: Theme settings stored in
theme.json (JSON format) - Access: Settings retrieved via
ThemeHelper::getThemeSetting($key, $default) - Application: Settings applied through:
- PHP conditional rendering in views
- CSS classes and custom properties
- JavaScript configuration injection
- Dynamic CSS variable generation
Compatibility
- ✅ All changes contained within
themes/premium directory - ✅ No core file modifications required
- ✅ Backward compatible with existing installations
- ✅ Works with both JSON and SQLite storage backends
Part 3: Group Management Improvements
Summary
Fixed critical issues with group management including duplicate group creation when renaming default groups, missing protection against deletion of default groups, and improved group identification logic to use IDs and permissions instead of names.
Changes
1. Group Model (app/Models/Group.php)
Modified: initDefaults() method to identify default groups by ID/permissions instead of name
- Problem: When renaming "Administrateur" to "Admin", the system would recreate "Administrateur" because it checked groups by name
- Solution: Modified to use
GroupHelper::getAdminGroupId(), getModeratorGroupId(), getMemberGroupId(), and getGuestGroupId() to identify default groups by their permissions and IDs - Benefits:
- Prevents duplicate group creation when renaming default groups
- Allows administrators to rename default groups without side effects
- More robust identification system that doesn't depend on group names
2. Group Helper (app/Helpers/GroupHelper.php)
Added: New methods for group management
Modified: Existing methods to use ID-based identification
isAdmin(), isModerator(), getAdminGroupId(), getModeratorGroupId(), getMemberGroupId(), getGuestGroupId() already use permission-based identification with fallback to names
3. Group Controller (app/Controllers/Admin/GroupController.php)
Modified: delete() method to add protection against deletion
Added: Validation to prevent deletion of default groups
- Uses
GroupHelper::isDefaultGroup() to check if the group is a default group - Returns error message:
groups.message.cannot_delete_default
Added: Validation to prevent deletion of groups with users
- Uses
GroupHelper::hasUsers() to check if the group has assigned users - Returns error message:
groups.message.cannot_delete_with_users
Added: Proper error handling and JSON responses
- Returns appropriate HTTP status codes (400 for validation errors, 500 for server errors)
- Returns user-friendly error messages in the response
4. Translation Files
Added: New translation keys for group deletion errors
5. Admin Groups View (app/Views/admin/groups.php)
Improved: UX for group inheritance dropdown
- Changes:
- Separated base groups (Admin, Moderator, Member, Guest) from other groups using
<optgroup> - Ordered base groups logically (Admin → Moderator → Member → Guest)
- Fixed duplicate "Aucun (groupe vide)" option
- Fixed incorrect group identification (e.g., "Administrateur - invité")
- Uses
GroupHelper methods to identify groups by ID instead of name - Uses nested translation keys (
groups.type.admin, groups.type.moderator, etc.)
Technical Details
Why these changes were needed
- Duplicate Groups: When administrators renamed default groups,
initDefaults() would recreate them because it checked by name, leading to duplicate groups like "Administrateur - invité" - Missing Protection: Default groups could be deleted, potentially breaking the system
- Data Integrity: Groups with users could be deleted, leaving users in an invalid state
Group Identification Strategy
The system now uses a three-tier identification strategy:
- Primary: Check for specific permissions (
admin.access, moderation.moderate) - Secondary: Use cached group IDs from helper methods
- Fallback: Check group names for backward compatibility
This ensures:
- ✅ Groups can be renamed without breaking the system
- ✅ New groups with similar permissions are correctly identified
- ✅ Backward compatibility with existing installations
Bug Fixes
1. Duplicate Group Creation
- Error: Renaming "Administrateur" to "Admin" would create a duplicate "Administrateur" group
- Root Cause:
initDefaults() checked groups by name instead of ID/permissions - Fix: Modified to use
GroupHelper methods that identify groups by permissions and IDs
2. Group Deletion Issues
- Error: Default groups could be deleted, and groups with users could be deleted
- Root Cause: No validation in
GroupController::delete() - Fix: Added validation using
isDefaultGroup() and hasUsers() methods
3. Incorrect Group Display
- Error: Groups incorrectly displayed as "Administrateur - invité" in dropdown
- Root Cause: Logic in dropdown view didn't uniquely identify groups
- Fix: Improved logic using
$baseGroupsMap to ensure each group is identified only once
Part 4: Backend UX Improvements
Summary
Improved user experience in the admin panel by eliminating the need to manually refresh pages after create, update, or delete operations. Changes are now reflected immediately in the interface without full page reloads. Applied to all admin pages for consistent behavior across the entire backend.
Changes
1. Admin Utilities JavaScript (themes/assets/js/admin-utils.js)
Added: New utility functions for dynamic admin operations
reloadAdminList(url, containerSelector, callback)
- Reloads admin list content via AJAX without full page reload
- Preserves scroll position
- Reinitializes Bootstrap tooltips and event listeners
- Falls back to full page reload on error
removeAdminListItem(elementSelector, callback)
- Removes an item from the DOM with fade-out animation
- Displays empty state message if list becomes empty
- Executes callback after removal
resetAdminForm(formId, listTabId)
- Resets form fields to initial state
- Clears hidden ID fields
- Resets color and icon previews
- Switches to list tab after reset
updateAdminTableRow(rowSelector, data)
- Updates table row cells with new data
- Escapes HTML to prevent XSS
addAdminTableRow(tbodySelector, data, rowTemplate)
- Adds new row to admin table
- Removes empty state message
- Reinitializes tooltips and event listeners
2. Backend Footer (app/Views/layouts/backend/footer.php, themes/premium/views/layouts/backend/footer.php)
Modified: Added admin-utils.js to footer
- Change: Included
admin-utils.js before other admin scripts - Location: After
admin-sidebar.js, before core JS files
3. Groups Management (app/Views/admin/groups.php)
Modified: Replaced page reloads with dynamic updates
4. Categories Management (app/Views/admin/categories.php)
Modified: Replaced page reloads with dynamic updates
5. Reactions Management (app/Views/admin/reactions.php)
Modified: Replaced page reloads with dynamic updates
6. Users Management (app/Views/admin/users.php, app/Views/admin/users/edit.php)
Modified: Replaced page reloads with dynamic updates
7. Reports Management (app/Views/admin/reports.php)
Modified: Replaced page reloads with dynamic updates
8. Bans Management (app/Views/admin/bans.php)
Modified: Replaced page reloads with dynamic updates
- Create/Revoke/Delete Operations:
- Uses
reloadAdminAfterAction() to reload page dynamically - Maintains ban list state
9. Backups Management (app/Views/admin/backups.php)
Modified: Replaced page reloads with dynamic updates
- Create/Restore/Delete Operations:
- Uses
reloadAdminAfterAction() to reload page dynamically - Maintains backup list state
10. Plugins Management (app/Views/admin/plugins.php)
Note: This page intentionally uses full page reloads
- Toggle Plugin Operations:
- Full page reload required to properly load/unload plugin assets
- Ensures plugin changes are fully applied
11. Themes Management (app/Views/admin/themes.php, app/Views/admin/theme-config.php)
Note: These pages intentionally use full page reloads
12. Updates Management (app/Views/admin/updates.php)
Modified: Replaced page reloads with dynamic updates
- Check/Apply Updates:
- Uses
reloadAdminAfterAction() to reload page dynamically - Maintains update status display
13. Configuration Page (app/Views/admin/config.php, themes/premium/views/admin/config.php, themes/bootswatch/views/admin/config.php)
Modified: Enhanced dynamic updates with language change detection
Technical Details
Why these changes were needed
- Users had to manually refresh pages after every operation (create, update, delete)
- This created a poor user experience and slowed down workflow
- Full page reloads were unnecessary when only list content needed updating
Implementation Strategy
- AJAX List Reloading: Fetch full page HTML, extract list container, replace DOM content
- Direct DOM Manipulation: Remove deleted items directly from DOM with animation
- Form Reset: Clear form fields and switch to list view after successful operations
- Fallback Handling: Gracefully fall back to full page reload if AJAX fails
Universal Application
The dynamic reloading system has been applied to most admin pages:
- ✅ Groups Management
- ✅ Categories Management
- ✅ Reactions Management
- ✅ Users Management (list and edit)
- ✅ Reports Management
- ✅ Bans Management
- ✅ Backups Management
- ✅ Updates Management
- ✅ Configuration (with special handling for language changes)
Note: The following pages intentionally use full page reloads:
- ⚠️ Plugins Management (requires full reload to load/unload plugin assets)
- ⚠️ Themes Management (requires full reload to apply theme changes and reload assets)
Benefits
- ✅ Faster Operations: No page reload delay
- ✅ Better UX: Immediate visual feedback
- ✅ Preserved State: Scroll position and form state maintained
- ✅ Smooth Animations: Fade-out effects for deletions
- ✅ Backward Compatible: Falls back to full reload if utilities unavailable
- ✅ Consistent Experience: Same behavior across all admin pages
- ✅ Smart Reloading: Language changes trigger full reload (required for translations), other changes use dynamic updates
Compatibility
- ✅ Works with all admin pages using the standard list/form structure
- ✅ Compatible with Bootstrap tooltips and modals
- ✅ Supports drag-and-drop reordering (Sortable.js)
- ✅ Graceful degradation if JavaScript fails
Part 5: Code Quality Improvements
Summary
Cleaned up verbose logging in the translation system to reduce log noise and improve performance.
Changes
1. Translator Helper (app/Helpers/Translator.php)
Modified: Removed verbose debug logging
Benefits:
- ✅ Reduced log file size
- ✅ Improved performance (fewer I/O operations)
- ✅ Cleaner logs focusing on actual issues
- ✅ Better debugging experience
Technical Details
Why these changes were needed
- Debug logs were generated on every page load for every translation lookup
- Log files were growing excessively large
- Most debug information was not useful for production debugging
- Only actual errors need to be logged
Testing Checklist
API Routing
- ✅
GET /api/notifications returns correct response - ✅
POST /api/presence/update works correctly - ✅ All other
/api/* endpoints function properly - ✅ Works with root installation
- ✅ Works with subdirectory installation
- ✅ Works with subdomain installation
Premium Theme
- ✅ Theme settings are properly loaded from
theme.json - ✅ All feature toggles work correctly (hero, stats, CTA, avatars, signatures, etc.)
- ✅ Visual settings (layout, navbar style, card style) are applied
- ✅ CSS variables are correctly set for dynamic styling
- ✅ JavaScript reads theme configuration from injected JSON
- ✅ Recent registrations section displays correctly in footer
- ✅ Back-to-top button appears and functions correctly
- ✅ RSS feeds and sitemaps respect category permissions
- ✅ Admin panel link is visible for admin users
Group Management
- ✅ Default groups cannot be deleted
- ✅ Groups with users cannot be deleted
- ✅ Renaming default groups doesn't create duplicates
- ✅ Group inheritance dropdown displays correctly
- ✅ Base groups are properly identified and separated
- ✅ Translation keys are correctly displayed
Backend UX
- ✅ No manual page refresh required after operations (all admin pages)
- ✅ Lists update dynamically via AJAX
- ✅ Smooth animations for deletions
- ✅ Forms reset automatically after success
- ✅ Language changes trigger automatic page reload for translations
- ✅ Consistent behavior across all admin pages
Automatic Theme Mode
- ✅ Automatic mode now correctly detects browser/system preferences
- ✅ Real-time updates when system preferences change
- ✅ Uses standard
prefers-color-scheme media query - ✅ Works across all themes (premium, default, bootswatch, futurist)
Code Quality
- ✅ Log files are cleaner and more focused
- ✅ No excessive debug logging
- ✅ Error logs still capture important issues
Migration Notes
For Existing Installations
API Routing
- Apache: No action required, changes are automatic
- Nginx: Test configuration with
sudo nginx -t and reload with sudo systemctl reload nginx
Premium Theme
- No migration needed: All changes are backward compatible
- Optional: Review
themes/premium/theme.json to customize settings
Group Management
- No migration needed: Changes are automatic and backward compatible
- Action required: If you have duplicate groups from previous renaming, you may need to manually clean them up:
- Go to Admin Panel > Users > Groups
- Identify duplicate groups (e.g., "Administrateur - invité")
- Reassign any users from duplicate groups to the correct group
- Delete duplicate groups (if they have no users)
Code Quality
- No action required: Log cleanup is automatic
Premium Theme Optimization
- No action required: Removed files automatically fall back to default views
- Benefit: Theme is now lighter and easier to maintain
- Note: Only customized views remain in the theme
Files Modified
API Routing
.htaccess (root directory)public/.htaccessnginx.conf
Premium Theme
themes/premium/theme.json (new)app/Helpers/ThemeHelper.phpthemes/premium/views/layouts/frontend/header.phpthemes/premium/views/layouts/frontend/main.phpthemes/premium/views/layouts/frontend/footer.phpthemes/premium/views/components/banner.phpthemes/premium/views/categories/index.phpthemes/premium/views/discussions/index.phpthemes/premium/views/components/post-thread.phpthemes/premium/assets/js/main.jsthemes/premium/assets/css/frontend.cssthemes/premium/views/components/theme-colors.phpapp/Services/RssService.phpapp/Services/SitemapService.php
Group Management
app/Models/Group.phpapp/Helpers/GroupHelper.phpapp/Controllers/Admin/GroupController.phpapp/Views/admin/groups.phplanguages/fr/admin.jsonlanguages/en/admin.json
Backend UX
themes/assets/js/admin-utils.js (new)app/Views/layouts/backend/footer.phpthemes/premium/views/layouts/backend/footer.phpthemes/bootswatch/views/layouts/backend/footer.phpapp/Views/admin/groups.phpapp/Views/admin/categories.phpapp/Views/admin/reactions.phpapp/Views/admin/users.phpapp/Views/admin/users/edit.phpapp/Views/admin/reports.phpapp/Views/admin/bans.phpapp/Views/admin/backups.phpapp/Views/admin/plugins.phpapp/Views/admin/themes.phpapp/Views/admin/theme-config.phpapp/Views/admin/updates.phpapp/Views/admin/config.phpthemes/premium/views/admin/config.phpthemes/bootswatch/views/admin/config.php
Premium Theme Optimization
- 58 view files removed from
themes/premium/views/ (all unmodified views) - Theme now only contains customized views
- Automatic fallback to default views for removed files
Automatic Theme Mode Fix
themes/assets/js/main.jsthemes/assets/js/theme-initializer.jsthemes/assets/js/theme-initializer-backend.jsthemes/premium/assets/js/main.jsthemes/default/assets/js/main.jsthemes/bootswatch/assets/js/main.jsthemes/futurist/assets/js/main.js
Code Quality
app/Helpers/Translator.php
Breaking Changes
None. All changes are backward compatible.
Known Issues
None at this time.
Credits
- API routing improvements
- Premium theme configuration system
- Group management enhancements
- Automatic theme mode improvements
- Code quality improvements
Support
For issues or questions related to this release, please refer to the official Flatboard documentation or contact support.