This release represents a comprehensive refactoring of the RAGS codebase, focusing on memory management, type safety, error handling, and performance. There is a lot of new changes. Some of those are breaking, but user configurations should not be affected. In certain edge-cases, i.e., custom services the users may need to update. See below for a full list of changes.
-
Error class hierarchy:
AgsError,AgsConfigError,AgsServiceError,AgsDBusError,AgsRuntimeErrorwith context support -
Global signal registry (
SignalRegistry) for centralized connection tracking and cleanup -
Disposableinterface and pattern for explicit resource cleanup -
Type-safe GObject helpers for safer property access
-
Type-safe signal definitions with
SignalDefinitionandSignalPayloadtypes -
Lazy window registration via
App.registerLazyWindow(), for windows created on-demand -
Runtime theme switching with
App.registerTheme(),App.setTheme(),App.activeTheme -
Window names automatically added as CSS classes for scoping
-
autoSuspendoption to defer polling until bound to visible widgets -
disposesignal emitted on cleanup -
diffBind()method for binding to differences between values -
Development warnings for unregistered signals
-
Error recovery with exponential backoff (
retryWithBackoff) -
errorsignal emitted on service failures -
Frame-synced animation primitives
-
System info helpers
-
Promisified
send_and_read_asyncwithGLib.PRIORITY_DEFAULT
-
Comprehensive JSDoc added to all public APIs
-
Service lifecycle documentation (Construction → Initialization → Ready → Disposal)
-
Dropped various deprecated features and cleanup
-
Improved widget registration and initialization
-
Widget
class_namesgetter now cached (called hundreds of times per second) -
Battery icon name caching to reduce repeated string allocations
-
Network access points caching infrastructure
-
All signal handlers now have null-safe cleanup
-
Widget
_onHandlerIdsinitialized properly with destroy cleanup -
Improved signal handler lifecycle management
-
Notifications: Added
_timeoutIdsMap to track and cancel timeouts properly -
Network: Added null check for
get_ssid(); changed.mapto.forEachwhere appropriate -
App: Fixed deprecation warnings (
cacheCoverArttomaxStreamVolume) -
Fetch: Wrapped
GBytesfromsend_and_read_asyncinMemoryInputStream
Some of the breaking changes:
-
All services now implement
Disposableinterface -
Services require explicit
dispose()calls for cleanup -
Signal connections must be tracked with
trackConnection()andglobalSignalRegistry.register() -
Variable class now throws errors instead of logging them in many cases
-
Empty catch blocks replaced with proper error handling
-
Errors include context for better debugging
-
Widget base class uses native private fields (
#field) instead of__fieldpattern -
Internal widget storage changed from direct properties to
#internalFieldsMap
- Memory leaks in signal connection management across all services
- Non-null assertions, which got replaced with proper validation
- Type safety issues
- CSS error handling and reporting improved
Maintenance release to prepare the repository for future plans. Features dependency updates, minor bug fixes, and a large number of tooling consolidation. There should be no breaking changes between 1.9.0 and 1.10.0.
We've migrated to PNPM, and a more Nix-centric setup with proper CI/CD and user-facing documentation.
- TypeDoc setup for generated type documentation
- Hand-written guides in documentation
- Comprehensive JSDoc annotations across all modules
- GitHub Pages deployment for documentation
- Project README updated with usage examples
- New prettier configuration
- Streamlined ESLint flat config (ESLint 10 compatible)
- Bumped all dependencies to latest versions
- Linting issues across codebase
- Dependency hashes updated
- SystemTray now uses a
Widgetwrapper forDbusmenuGtk3.Menu, which fixes styling issues