**Grade: 8** ### Bugs - There are no explicit bugs in the given code. However, it is important to ensure data integrity between `CodingData` and `UnreadNumbers`. ### Optimizations - The `CodingData` structure could implement a custom initializer that ensures that `all` in `UnreadNumbers` is equal to the sum of other properties if that is a business requirement. - Consider renaming the `subs` property in `CodingData` to `subscriptions` to keep consistency across structures. ### Good points - The code is well-structured, with appropriately named components. - The use of `Decodable`, `Hashable`, and `Sendable` protocols enhances the versatility and functionality of the `UnreadNumbers` struct. - Consistent use of access control modifiers (`public`) for properties and initializers where necessary. - Efficient transformation from `CodingData` to `UnreadNumbers` using the `decoded` computed property. ### Summary The code snippet provides a well-crafted extension of a `NotificationFeed` class to manage unread notifications efficiently. It is well-structured, establishing clear separation of concerns particularly through the use of Codable structures for decoding and ensuring compatibility with concurrency through the `Sendable` protocol. Minor consistency improvements with property naming and initializing could enhance the code's robustness and readability further. ### Open source alternatives - [Rocket.Chat](https://github.com/RocketChat/Rocket.Chat) provides notification features that can be extended or used as a reference. - [Mattermost](https://github.com/mattermost/mattermost-server) also deals with notifications and could provide additional perspective on handling unread notification counts effectively.