excid3/noticed
61.4
Adequate · 19 September 2026
1.2k
lines of production code
Ruby
primary language
1
measurement over time
What this system is
This system is a Rails engine gem that provides a flexible, multi-channel notification delivery framework for Ruby on Rails applications. It supports asynchronous, bulk, and ephemeral notifications across various channels including email, webhooks, and messaging platforms like Slack and Discord. The library manages notification persistence, recipient resolution, and read-state tracking while integrating with ActiveJob for reliable background processing.
How it got here
2020 — Noticed 3.0 major release and Rails modernization
18 changes.
This period focused on the major version 3.0.0 release of the Noticed gem, introducing a new core architecture with Zeitwerk autoloading, ActiveJob-based delivery, and expanded notification channels. The work also involved modernizing the codebase for Rails 6.2+ and 8.0+ compatibility, standardizing on Ruby 3.0, and adding comprehensive generators and test coverage to support the new features.
2023–2024 — Delivery architecture and bulk support
11 changes.
This period focused on restructuring the notification delivery system to support conditional execution, ActiveJob scheduling, and bulk delivery for platforms like Slack and Discord. It introduced core infrastructure for recipient evaluation, read-state tracking, and ephemeral notifications, while expanding test coverage and Rails version compatibility.
Features
Add bin/rails binstub for engine development
A new bin/rails executable has been added to the project, allowing users to run Rails commands directly from the repository root. This binstub is configured to load the engine's code and point to a dummy application located in the test directory, facilitating local development and testing of the engine without requiring global gem installation.
bin · high confidence
Added generator templates for custom notifiers and delivery methods
The library now includes ERB templates for generating base classes and custom delivery mechanisms. Users can generate an ApplicationNotifier, ApplicationDeliveryMethod, and ApplicationBulkDeliveryMethod to serve as base classes for their own implementations. Additionally, templates for custom single and bulk delivery methods are provided, allowing developers to scaffold specific delivery logic (e.g., email, Slack) by subclassing the generated base classes and configuring them via \deliver\_by\ or \bulk\_deliver\_by\ blocks in their notifiers.
lib/generators/noticed/templates · high confidence
Introduce bulk delivery methods for Bluesky, Discord, Slack, Webhook, and Test
This change adds a new \BulkDeliveryMethods\ namespace with five concrete delivery implementations: Bluesky (posting to the AT Protocol), Discord (webhook posting), Slack (with configurable error raising), Webhook (supporting JSON, form, body, and auth), and Test (for capturing delivered events). These classes allow users to configure and send bulk notifications to these specific platforms via the \bulk\_deliver\_by\ DSL, extending the notification system's capability beyond single-message delivery.
_lib/noticed/bulk\_delivery\methods · high confidence
New generators for Notifiers and custom delivery methods
The library now provides dedicated generators to scaffold application components. The \notifier\ generator creates a specific Notifier class and an abstract \ApplicationNotifier\ base class (skipping the base if it already exists), while the \delivery\_method\ generator creates custom delivery method classes, supporting both standard and bulk variants via a \--bulk\ flag. These generators place files in \app/notifiers/\ and \app/notifiers/delivery\_methods/\ (or \bulk\_delivery\_methods/\), streamlining the setup of custom notification logic.
lib/generators/noticed · high confidence
Support for ephemeral, one-off notifications
Users can now send notifications without defining a persistent database record by using the new \Noticed::Ephemeral\ base class. This change introduces a lightweight notifier structure that supports dynamic recipient evaluation, includes translation helpers, and integrates with existing delivery methods, allowing for flexible, transient notification workflows.
app/models/noticed · high confidence
Behavioural changes
Added notification counter cache for improved performance
A new database migration adds a \notifications\_count\ integer column to the \noticed\_events\ table. This counter cache allows the application to track the number of notifications associated with an event without requiring expensive database queries, thereby improving performance when displaying notification counts to users.
db · high confidence
Drops Rails 6.1 support and adds Rails 8.0/8.1 compatibility
Noticed 3.0.0 removes support for Rails 6.1, requiring users to upgrade to Rails 6.2 or newer. The gem now includes Appraisals and CI configurations for Rails 8.0 and Rails 8.1 (beta), ensuring compatibility with the latest Rails versions. Additionally, the project standardizes on Ruby 3.0 as the minimum supported version.
(repo-wide) · high confidence
Introduces base job classes and configurable event job behavior
The application now includes a base \Noticed::ApplicationJob\ that discards jobs on deserialization errors, and a \Noticed::EventJob\ responsible for enqueuing bulk and individual deliveries. The \EventJob\ is now configurable via a parent class, allowing users to change its base implementation, while its execution logic respects \perform?\ checks to avoid unnecessary job enqueuing.
app/jobs · high confidence
Migration to Zeitwerk autoloading and introduction of deprecation warnings
The library now uses Zeitwerk for autoloading, replacing the previous Railtie-based loading mechanism. This change includes the removal of the \noticed\_tasks.rake\ file and the configuration of the loader to ignore generators and specific delivery method directories. Additionally, deprecation warnings have been introduced for the \Noticed::Base\ and \Noticed::DeliveryMethods::Base\ constants, guiding users to migrate to \Noticed::Event\ and \Noticed::DeliveryMethod\ respectively, while also defining new error classes \ValidationError\ and \ResponseUnsuccessful\.
lib · high confidence
New notification delivery, recipient, and read-state capabilities
This change introduces core infrastructure for the notification system via new concerns in app/models/concerns. The Deliverable concern adds support for defining custom delivery methods (bulk and single), specifying required parameters, and evaluating recipients via blocks or private methods, while also deprecating the legacy :database delivery method and the params/param DSL in favor of required\_params/required\_param. It enables asynchronous delivery via deliver\_later (aliased to deliver) and aligns delivery options (wait, queue, priority) with ActiveJob. The NotificationMethods concern allows adding custom methods to the generated Notification class for each notifier. The Readable concern adds scopes and methods to mark notifications as read/unread and seen/unseen, introducing read\_at and seen\_at tracking.
app/models/concerns · high confidence
Noticed gem major version bump to 3.0.0 with new core components
The Noticed gem has been updated to version 3.0.0, introducing several new internal modules to support notification handling. A new \ApiClient\ module provides a standardized helper for making POST requests with support for JSON, form data, and basic authentication. A \Coder\ class handles serialization and deserialization of notification parameters using ActiveJob's argument system, including error handling for missing records. The \HasNotifications\ concern allows models to easily query and manage notifications associated with them, with database-specific logic for PostgreSQL, MySQL, and SQLite. Additionally, a \Translation\ module standardizes i18n scope handling for notifiers, and a \RequiredOptions\ module adds validation for required configuration options. The \NotificationChannel\ is moved to lib for better autoload handling, and the engine registers a deprecator and includes the \HasNotifications\ concern in ActiveRecord models.
lib/noticed · high confidence
Refactored delivery architecture with conditional execution and ActiveJob integration
The notification delivery system has been restructured to support conditional execution via \if\/\unless\ configuration options and ActiveJob scheduling parameters (\wait\, \wait\_until\, \queue\, \priority\) for both single and bulk deliveries. A new \DeliverBy\ class manages delivery method instantiation and validation, while \DeliveryMethod\ and \BulkDeliveryMethod\ base classes now evaluate these conditions and callbacks before performing deliveries. Additionally, the base application record has been moved to \app/models/noticed/application\record.rb\ with a \noticed\\ table prefix, and the \Event\ model now handles JSON serialization for params with Rails 7.1+ compatibility.
noticed · high confidence
Refactored delivery methods to use ActiveJob and added new integrations
The delivery methods in this directory have been refactored to integrate with ActiveJob, enabling asynchronous delivery for methods like Email (via \deliver\_later\ support) and iOS. New delivery methods have been added to support ActionCable, Action Push Native, Discord, Firebase Cloud Messaging (FCM), Microsoft Teams, and Vonage SMS, expanding the available notification channels. Existing methods such as Slack, Twilio, and Webhook have been updated with improved error handling, configuration options (e.g., \raise\_if\_not\_ok\ for Slack, \error\_handler\ for FCM/Twilio), and support for dynamic mailers and custom formatting.
_lib/noticed/delivery\methods · high confidence
Test coverage
Added UserMailer and updated ApplicationMailer defaults for testing; Added comprehensive test coverage for notification delivery, recipients, and translations; Added dummy notifiers for testing delivery configurations; Added test coverage for notification delivery methods; Added test dummy models and updated ApplicationRecord for compatibility; Added tests for EventJob enqueueing and before\_enqueue behavior; Added tests for notification delivery, event validation, and read/seen states; Added tests for the Webhook bulk delivery method; Test dummy app configuration and formatting updates; Updated Rails dummy app initializer templates; Updated dummy app environment configurations for Rails 7.1+ compatibility; Updated test dummy app configuration and layout templates; Updated test dummy app configuration for modern Rails compatibility; Updated test dummy database schema for Rails 7.1 compatibility.
Dependencies
Expanded Rails version support in test environments
The gemfiles directory has been updated to add appraisal configurations for Rails 7.0, 7.1, 7.2, 8.0, 8.1 (beta), and the Rails main branch, enabling testing against these versions. The configuration also switches the MySQL adapter to the \trilogy\ gem for Rails 7.1 and newer, while Rails 7.0 continues to use the \activerecord-trilogy-adapter\. Additionally, the SQLite3 dependency version has been bumped to \\~\> 2.0\ for Rails 8.0+ and the main branch, whereas earlier versions use \\~\> 1.7\.
gemfiles · high confidence
Updated gem dependencies and raised minimum Rails version
The gem now requires Rails 6.1 or higher (previously 6.0) and includes new optional dependencies for iOS notifications via apnotic and Firebase notifications via googleauth. Development dependencies have been updated to include appraisal, standard, webmock, and minitest (restricted to versions below 6.0), and the gemspec now mandates Multi-Factor Authentication for gem pushes.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 61.
Lenses
- Code Health 100
- Architecture 69
- Maturity 53
- Readiness 61
- Security 67
- Domain Modelling 100
Changes since last survey
- 300 commits — 273 feature/other, 27 fixes
By area
- (root) — 135 commits
- (repo) — 32 commits
- docs/delivery_methods — 28 commits
- lib/noticed — 28 commits
- app/models — 19 commits
- .github/workflows — 14 commits
- test/delivery_methods — 8 commits
- docs/bulk_delivery_methods — 6 commits
- lib/generators — 6 commits
- test/dummy — 5 commits
- gemfiles/rails_6_1.gemfile.lock — 4 commits
- gemfiles/rails_7_0.gemfile.lock — 3 commits
- lib/noticed.rb — 3 commits
- app/jobs — 2 commits
- test/delivery_method_test.rb — 2 commits
- test/notifier_test.rb — 2 commits
- app/channels — 1 commit
- db/migrate — 1 commit
- test/ephemeral_notifier_test.rb — 1 commit
Notable commits
- fix: Add notification and recipient to email params. Fixes #366
- fix: Check if respond to private methods before send. Fixes #475
- fix: Documentation Fix (#510)
- fix: Fix Action Push Native silent logic (#560)
- fix: Fix BulkDeliveryMethod base class (#519)
- fix: Fix noticed:notifier generator in README (#438)
- fix: Fix anchor link to "Sending notifications" (#464)
- fix: Fix channel name (#499)
- fix: Fix concurrent-ruby with activesupport for older Rails
- fix: Fix crash when trying to bulk notify from an ephemeral notifier (#486)
- fix: Fix evaluate_option example (#447)
- fix: Fix example command in READMe (#435)
- fix: Fix github actions
- fix: Fix lazy load hook names and version bump
- fix: Fix recipients not finding private methods
- fix: Fix test
- fix: Fix undefined ApplicationDeliveryMethod (#470)
- fix: Fixes for: README.md (#421)
- fix: Include trilogy gem for Rails 7.1+ and try testing against MySQL 8.2 to see if it gets around this bug https://github.com/trilogy-libraries/trilogy/issues/43
- fix: Minor sig fix in docs (#405)
- …and 280 more
Architecture
- 0 containers · 1 bounded contexts · 0 dependency edges (baseline)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
excid3/noticed was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit aca286e10dd5b3e4910e87f89aaf6da151ab2d12 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.