You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Added
FrameworkConfig Module: A centralized configuration file for the entire framework. You can now change debug mode, timeouts, rate limits, and sync hooks in one place without touching the core scripts
Safe Zones for update: If a module's update function crashes or yields for too long, it will no longer lag or crash the server. The framework will catch the error, retry it up to 3 times with exponential backoff, and then gracefully suspend the broken module
Synchronous Lifecycle Hooks (SYNC_HOOKS): Critical hooks (like playerAdded, characterAdded, humanoidAdded, and characterLoaded) now wait for all modules to finish before moving to the next hook. This guarantees strict execution order (e.g., characterAdded always finishes before humanoidAdded starts)
Improved
Non-Blocking YieldWatchdog: Completely rewrote the Watchdog. It no longer uses task.cancel or blocks the Heartbeat thread. Hung modules are now warned about without killing the thread, allowing them to safely finish their background tasks
Zero Thread Churn: Removed task.delay creation from the update loop. The framework now uses a single timing check, drastically reducing garbage collection overhead and memory spikes
Player Removing Safety: playerRemoving hooks are now guaranteed to finish before the player's profile is closed and the player instance is destroyed, preventing data loss
Optimized UI Updates: Added a new updateRawValue helper. When you call profile:add(), :set(), :addAt(), etc., the framework now updates only the specific ValueBase linked to that key/path, instead of recalculating the entire leaderstats table
Fixed
HangWatcher Collision: init and asyncInit no longer overwrite each other's tracking data (now uses unique keys like moduleName + init).
Missing Dependencies: Missing dependencies now fail fast. In SHOULD_DEBUG = true, it throws a hard error immediately. In production, it logs a clear warning
Client Loading Loop: Added a timeout for the client's loading screen if the server fails to attach the SERVER_LOADED_TAG
Notes
No breaking API changes: Your existing module logic works as-is. The framework just handles it much more safely now
Upgrading from v2.2.0? Don't forget to grab the new FrameworkConfig module and place it in ReplicatedStorage.Modules.Global (if you haven't already)