Skip to content
CAI
Software that uses CAICheck a score

24pullrequests/24pullrequests

51.7

Adequate · 19 September 2026

3.2k

lines of production code

Ruby

with JavaScript

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a Ruby on Rails web application designed to track and visualize open-source contributions, specifically tailored for the '24 Pull Requests' holiday initiative. It enables users to authenticate via GitHub, submit pull requests or manual code gifts, and manage these contributions through a dashboard with calendar-based gifting features. The platform aggregates data from GitHub repositories to display project statistics, language filters, and user profiles, while also supporting administrative management of projects and automated email notifications for engagement.

How it got here

2012 — Rails 4 initialization and core feature development

29 changes.

The project was initialized as a Ruby on Rails application, establishing the core domain models for contributions and gifts alongside a complete controller and view layer. This period focused on building the foundational user-facing features, including authentication, project claiming, and the gift-giving workflow, while simultaneously setting up the testing infrastructure and database schema.

2013–2014 — Service extraction and UI modernization

13 changes.

The codebase underwent significant structural refactoring by extracting GitHub integration and gift logic into dedicated service classes, accompanied by comprehensive test coverage. Concurrently, the user interface was modernized through a migration to Bootstrap 3 SCSS, conversion of views to ERB, and the addition of interactive features like event maps and email confirmation workflows.

2016–2025 — ERB migration and contribution expansion

6 changes.

The project standardized its view layer by migrating all templates from HAML to ERB, ensuring consistent rendering across core UI components and shared partials. Concurrently, the platform expanded its scope by renaming 'Pull Requests' to 'Contributions' and introducing support for non-GitHub contributions, allowing users to submit and manage diverse types of contributions via a new form.

Features

Add HTML and text templates for the thank-you email

New ERB templates have been added for the thank-you mailer, providing both HTML and plain-text versions of the message. The email congratulates users on sending 24 pull requests and encourages continued contribution beyond the holiday season.

_app/views/thank\_you\mailer · high confidence

Added Rails 3 executable script

A new executable script at script/rails has been added to support Rails 3 gems. This script bootstraps the application by loading the configuration from config/application and config/boot, allowing users to run Rails commands directly from the application root.

script · high confidence

Added email confirmation capability

Users can now confirm their email addresses via a verification link sent in a new confirmation email. The email includes a personalized greeting using the user's nickname and provides a direct link to confirm the address, with instructions to ignore the message if the change was unintended.

_app/views/confirmation\mailer · high confidence

Added standard Rails development binstubs and Docker startup script

The application now includes a set of executable binstubs in the bin directory to streamline local development workflows. These include standard Rails entry points (rails, rake, bundle, rspec), a spring binstub for faster test execution, and utility scripts for environment setup (setup), updates (update), and JavaScript dependency management (yarn). Additionally, a new bin/dev script provides a convenient way to start the Rails server, and a bin/docker-start script has been added to handle database readiness checks and migrations within a Docker development environment.

bin · high confidence

Emoji support added to the application

The application now supports rendering emojis in user-generated content. This change introduces two new JavaScript files, \emoji.js\ and \emojione.js\, into the \vendor/assets/javascripts\ directory. The \emojione.js\ file provides a comprehensive mapping of emoji shortcodes (like \:smile:\) and ASCII emoticons (like \:)\) to their corresponding Unicode characters and images. The \emoji.js\ file contains the logic to scan DOM elements and replace these text representations with actual emoji graphics, enabling users to see emojis correctly displayed in their posts and comments.

vendor · high confidence

Initial controller layer for the 24 Pull Requests application

This change introduces the complete set of application controllers that define the core user-facing behavior of the site. It establishes authentication and authorization flows (requiring login for actions like creating contributions, gifts, and events, while keeping public pages like the homepage and project index open), implements user session management via OmniAuth, and provides the logic for key features such as the dashboard, gift-giving calendar, project search and claiming, language-based filtering, and account management (including email confirmation and deletion).

app/controllers · high confidence

Introduce interactive map and geolocation for events

Events now feature an interactive map on the show and index pages, allowing users to visualize event locations via latitude and longitude data attributes. The event creation and editing forms include a map picker component that lets users select a location, which is then saved as geolocation coordinates. Additionally, the event list displays upcoming and past events with map pins, and the event detail page shows the specific location on the map alongside event details.

app/views/events · high confidence

New admin controllers for Dasher webhooks and project management

This change introduces two new admin controllers. The DasherController provides a real-time webhook endpoint for receiving GitHub pull request data, secured by an API key check. The ProjectsController allows administrators to view, edit, and deactivate projects, supporting pagination and the ability to update project details such as the homepage and GitHub URL.

app/controllers/admin · high confidence

New email notification system for user engagement

The application now sends automated emails to users for account confirmation, periodic project suggestions, and seasonal greetings. A new ConfirmationMailer handles email address verification, while the ReminderMailer provides daily and weekly digests of suggested projects (limited to eight items) and a specific November reminder about the upcoming season. Additionally, a ThankYouMailer sends a holiday appreciation message to users after their contributions.

app/mailers · high confidence

New rake tasks for managing contributions, projects, and notifications

This change introduces a suite of new rake tasks organized into namespaces (users, organisations, projects, pull\_requests, emails) to manage the application's core data and user communications. Key capabilities include resetting and refreshing contribution counts for users and organisations, downloading and updating pull request data from GitHub, checking and reactivating inactive projects based on their scores, and sending daily or reminder emails to users. A new \JsonApi\ library is also added to handle paginated API responses, supporting the data fetching tasks.

lib/tasks · high confidence

New user profile and contribution views with calendar and merge tracking

The user profile page now displays contributions in a tabbed interface including Gifts (calendar), Contributions, and Merges, with support for viewing historical years. A new 'mergers' page lists maintainers who have merged pull requests, and user avatars now show merged contribution counts. Contributions can now include markdown body text, and the profile includes a sync button to fetch pull requests. The user index and language pages have been updated to support infinite pagination and display contributors using specific languages.

app/views/users · high confidence

Project initialized with Rails 4.0.5, Puma, and Docker support

The repository is established as a Ruby on Rails application targeting Ruby 4.0.5, replacing the previous Unicorn web server with Puma as defined in the Procfile. A Docker development environment is introduced via a new Dockerfile and docker-compose.yml, allowing users to run the application and its PostgreSQL database using Docker Compose. The project also includes standard configuration files such as .editorconfig, .rubocop.yml, and .rspec, along with documentation for contributors (CONTRIBUTING.md, CODE\_OF\_CONDUCT.md) and repository guidelines (AGENTS.md). Legacy static assets, including a canvas-based snow animation script and a standalone index.html, have been removed.

(repo-wide) · high confidence

Behavioural changes

Add meta information to the pull requests endpoint

The pull requests endpoint now includes pagination metadata (count and total pages) in its response. This is achieved by introducing a base decorator class that dynamically defines an attributes method, and a specific PullRequestsDecorator that exposes the count and total\_pages fields, along with helper methods for pagination.

app/decorators · high confidence

Added asset manifest configuration

A new manifest file has been added to configure the asset pipeline, explicitly linking the application's CSS and JavaScript bundles along with the images directory.

app/assets/config · high confidence

Admin projects interface migrated to ERB with pagination and homepage editing

The admin projects views have been converted from HAML to ERB templates. This update introduces pagination for the project list using Kaminari and adds a new 'homepage' field to the project editing form, allowing administrators to set a homepage URL for projects.

app/views/admin · high confidence

Dashboard views converted to ERB with new gift and account management features

The dashboard interface has been migrated from HAML to ERB templates, introducing several new user-facing capabilities. Users can now manage their account preferences, including email frequency, ignored organizations, and time zone settings, via a dedicated preferences page. A new account deletion flow allows users to confirm or cancel the removal of their account. The main dashboard view now displays contributions, pull requests, and suggested projects, with support for adding new contributions. Additionally, a new 'gifts' feature enables users to view, create, and manage gifts linked to their contributions, with forms for selecting dates and specific pull requests.

app/views/dashboards · high confidence

Database schema and seed data initialization

The application now includes a complete database schema definition (schema.rb) and a seed script (seeds.rb) for development and test environments. The schema defines tables for users, contributions (renamed from pull requests), projects, events, gifts, skills, and various organizational structures, including fields for social integration (Twitter, Gravatar), email preferences, and geographic data. The seed script populates these tables with synthetic test data using FactoryBot and Faker, ensuring a consistent baseline for local development and testing.

db · high confidence

Database schema evolution and migration updates

This update applies a comprehensive set of database migrations to the application's schema. It introduces new tables for organisations, events, skills, labels, and aggregation filters, while adding numerous columns to existing tables such as users (e.g., gravatar\_id, twitter tokens, profile fields, geolocation, time zone, unsubscribe token), projects (e.g., inactive status, featured flag, homepage, contributing URL), and pull requests (e.g., language, comments count, merged\_by\_id). Significant structural changes include renaming the 'pull\_requests' table to 'contributions' and updating associated foreign keys and counter caches, as well as changing the 'organiser' column in events to 'name' and expanding the event description from string to text. The migrations also handle data type conversions, such as changing user UIDs to integers and adding array support for ignored organisations.

db/migrate · high confidence

Extracted core GitHub integration and gift logic into dedicated service classes

The application now uses dedicated service classes in app/services to handle specific domains: AuthHash extracts user profile details (name, blog, location) from authentication hashes; GithubClient centralizes Octokit API calls with improved error handling for unauthorized or unavailable repositories; Downloader manages the synchronization of user organizations and pull requests, including auto-gifting logic; GiftFactory standardizes gift creation; Notification handles email delivery with better error logging; and RepoWithLabels fetches repository metadata and labels. This refactoring moves logic out of models and controllers into reusable, testable services.

app/services · high confidence

Initial Bootstrap 3 SCSS styling and component assets

The application's stylesheet architecture has been migrated to SCSS and integrated with Bootstrap 3, establishing a new visual baseline. This change introduces a centralized \application.scss\ manifest that imports modular styles for the site layout, user profiles, project contributions, and language filtering. It also adds specific UI components, including a responsive calendar view with gift-handling interactions, a 'scroll to top' button, custom checkbox skins, and a typeahead search interface, while defining a cohesive color palette and typography for the user interface.

app/assets/stylesheets · high confidence

Introduce Contribution model and gift-giving workflow

The application now uses a new Contribution model to represent both pull requests and manual code gifts, replacing the previous PullRequest-centric approach. This change introduces a dedicated gift-giving workflow where users can assign their contributions to specific dates in December via the Gift and GiftForm models, with automatic gifting support for contributions mentioning '24 pull request' in the body. The system also includes an AggregationFilter to manage contribution visibility, a Calendar class to handle the gift-giving date range, and a ScoreCalculator to evaluate project quality based on repository metadata and activity.

app/models · high confidence

Introduction of application, count, and project helper modules

The application now includes three new helper modules to centralize view logic. ApplicationHelper provides utilities for language handling (escaping and parameterizing), locale management, and a new Markdown rendering method using the Commonmarker 2.x API. CountHelper introduces methods to calculate counts for projects, contributions, and users, with support for filtering by language. ProjectHelper adds methods for determining project status, generating edit and view paths based on admin context, and retrieving avatar URLs.

app/helpers · high confidence

JavaScript assets restructured with new interactive features

The application's JavaScript manifest has been reorganized to explicitly require specific libraries including Bootstrap, Typeahead, iCheck, and Emojify, replacing the previous CoffeeScript-based structure. This change introduces several new user-facing capabilities: a 'scroll to top' button appears after scrolling down, project creation forms can now be autofilled from GitHub URLs, and event pages feature interactive maps with geolocation support and datetime pickers. Additionally, the projects listing page now supports infinite scrolling and improved filter interactions via iCheck, while pull request and dashboard views utilize timeago for relative timestamps.

app/assets/javascripts · high confidence

Migrate application views from HAML to ERB

The application's view templates in app/views/application and related directories have been converted from HAML to ERB syntax. This change updates the rendering engine for core UI components, including the header, footer, user navigation, and error pages, ensuring consistent template handling across the site.

app/views/application · high confidence

Migrate organisation views from HAML to ERB

The organisation listing, detail, and JSON rendering templates have been converted from HAML to ERB. This change updates the user interface for browsing organisations and viewing their members and contributions, including the addition of an infinite pagination feature for the organisation list and the use of Octicons helpers for pull request badges. JSON responses for organisations and their members are now generated using ERB-based Rabl templates.

app/views/organisations · high confidence

Migrate project views from HAML to ERB

The project listing, detail, and management interfaces have been converted from HAML to ERB templates. This change updates the rendering engine for project pages, including the project index with its label and language filters, the project show page (which now displays contributing URLs and contribulator scores), and the admin controls for editing, deactivating, and reactivating projects. The migration also includes the new project claim form and ensures consistent styling with Octicons and Bootstrap helpers across the project views.

app/views/projects · high confidence

New GitHub login page with CSRF protection

The login interface now features a dedicated view for GitHub authentication, displaying a prominent button that initiates the OAuth flow via the configured default provider. This change integrates the omniauth-rails\_csrf\_protection gem to ensure that the login form includes necessary CSRF protection tokens, enhancing security during the authentication process.

app/views/sessions · high confidence

New application layout with flash alerts and scroll-to-top

The application layout has been replaced with a new ERB template that includes a GitHub corner badge, conditional animated snow on the homepage, and a 'scroll to top' feature. Users will now see dismissible flash alerts (notices and alerts) with close buttons, and a specific alert prompting unconfirmed users to verify their email address.

app/views/layouts · high confidence

Rails 8 environment configuration files added

New environment configuration files for development, test, and production have been added to align with Rails 8 defaults. The development environment enables code reloading, server timing, and allows web console access from Vagrant hosts. The production environment enforces SSL, sets the log level to info by default, configures Postmark for email delivery, and integrates Google Analytics. The test environment disables eager loading to improve test suite performance and disables request forgery protection.

config/environments · high confidence

Rails 8.0 application configuration and routing setup

The application configuration has been updated to target Rails 8.0, setting the default configuration version to 8.0 in \config/application.rb\ and enabling the \bootsnap\ gem in \config/boot.rb\ to speed up boot time. The routing structure has been reorganized to reflect current features: the \languages\ resource now exposes nested \projects\, \pull\_requests\, and \users\ endpoints; \projects\ support \claim\ and \reactivate\ actions; and \contributions\ (backed by the \pull\_requests\ controller) expose a \meta\ endpoint. Additionally, the web server configuration has been switched to Puma in \config/puma.rb\, and the database configuration now uses environment variables for credentials with a production pool size of 20.

config · high confidence

Rails 8.0 upgrade scaffolding and security hardening

This change introduces the configuration files required for upgrading to Rails 8.0, including the \new\_framework\_defaults\_8\_0.rb\ initializer which prepares the app for new defaults like timezone preservation and stricter freshness checks. It also adds a \secret\_token.rb\ initializer that enforces the \SECRET\_TOKEN\ environment variable in production, removing the hardcoded fallback to improve security. Additionally, the update includes scaffolding for other framework versions (5.0, 5.2, 6.1) to ease future migrations, configures \Rack::Attack\ for rate limiting, sets up \Bugsnag\ for error tracking in production, and initializes \SimpleForm\ with Bootstrap 3 styling.

config/initializers · high confidence

Reminder emails now include suggested projects and plain-text support

The reminder email templates have been updated to display a list of suggested open-source projects for users to contribute to, including each project's name, main language, and description. This change also introduces plain-text versions of the daily, weekly, and November reminder emails to ensure compatibility with email clients that do not render HTML. Additionally, the sign-off section has been updated to direct users to Mastodon for social interaction and provides a direct link to unsubscribe from the emails.

_app/views/reminder\mailer · high confidence

Rename Pull Requests to Contributions and add non-PR support

The site has renamed the 'Pull Requests' concept to 'Contributions' across the user interface, including the index, show, and meta pages. This change introduces support for recording contributions that are not GitHub pull requests; users can now submit non-PR contributions via a new form that captures repository name, issue URL, body, and date. The contribution display templates now distinguish between pull requests and other contributions, rendering appropriate links and titles. Additionally, non-PR contributions can now be edited and destroyed by their authors, and the contribution body is rendered using Markdown formatting.

app/views/contributions · high confidence

Social sharing buttons now use ERB and include GitHub watch/fork widgets

The shared social buttons partial has been converted from HAML to ERB and now renders a Facebook Like button alongside GitHub watch and fork count iframes. This change updates the template format for the social sharing component and adds specific GitHub repository interaction metrics to the user interface.

app/views/shared · high confidence

Static pages migrated from HAML to ERB templates

The static site views (including the homepage, about, API documentation, contributing guide, and contributors list) have been converted from HAML syntax to standard ERB templates. This change aligns the view layer with the application's primary templating engine, ensuring consistency across the codebase and simplifying maintenance for developers familiar with ERB.

app/views/static · high confidence

Updated design assets with vectorized logos and print-ready files

The design folder now includes new vector source files for branding assets, specifically a print-ready PDF/AI logo for the 24pr initiative and a color EPS logo for DNSimple. These additions replace or supplement previous raster assets, providing scalable graphics for high-quality printing and web use.

design · high confidence

Test coverage

Added controller specs for core application features; Added mailer previews for reminder emails; Added mailer specs for confirmation, reminder, and thank-you emails; Added model specs for Calendar, Contribution, Event, Gift, Organisation, Project, and User; Added request specs for admin project management; Added request specs for core user and project workflows; Added test coverage for new service layer components; Added test support helpers for login, pull requests, and performance; Added tests for PullRequestsDecorator; Added tests for application and count helper methods; Initial RSpec test suite and test infrastructure setup.

Dependencies

Routine dependency updates

This change updates the project's gem dependencies, including bumping versions for libraries such as dalli, rails-i18n, reline, octokit, pg, bigdecimal, rack-attack, loofah, parser, hashdiff, net-imap, rspec-core, bootsnap, faraday, date, rubocop, commonmarker, webmock, mimemagic, securerandom, brakeman, zeitwerk, sassc, jwt, octicons, octicons\_helper, puma, msgpack, erubi, ffi, regexp\_parser, json, version\_gem, i18n, and others. These updates ensure the application uses the latest stable versions of its dependencies, which may include bug fixes, performance improvements, and security patches.

(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 52.

Lenses

  • Code Health 71
  • Architecture 82
  • Maturity 67
  • Readiness 85
  • Security 72
  • Domain Modelling 43
  • Accessibility 45

Changes since last survey

  • 300 commits — 300 feature/other, 0 fixes

By area

  • (root) — 150 commits
  • (repo) — 147 commits
  • app/assets — 3 commits

Notable commits

  • change: Address JavaScript review comments
  • change: Bump action_text-trix from 2.1.17 to 2.1.18
  • change: Bump action_text-trix from 2.1.18 to 2.1.19
  • change: Bump addressable from 2.8.9 to 2.9.0
  • change: Bump anonymous_loader from 0.1.1 to 0.1.2
  • change: Bump anonymous_loader from 0.1.2 to 0.1.3
  • change: Bump auth-sanitizer from 0.1.2 to 0.1.3
  • change: Bump auth-sanitizer from 0.1.3 to 0.1.4
  • change: Bump auth-sanitizer from 0.1.4 to 0.2.0
  • change: Bump auth-sanitizer from 0.2.1 to 0.2.2
  • change: Bump auth-sanitizer from 0.2.2 to 0.2.3
  • change: Bump bigdecimal from 4.0.1 to 4.1.0
  • change: Bump bigdecimal from 4.1.0 to 4.1.1
  • change: Bump bigdecimal from 4.1.1 to 4.1.2
  • change: Bump bigdecimal from 4.1.2 to 4.1.3
  • change: Bump bootsnap from 1.23.0 to 1.24.1
  • change: Bump bootsnap from 1.24.3 to 1.24.4
  • change: Bump bootsnap from 1.24.4 to 1.24.5
  • change: Bump bootsnap from 1.24.6 to 1.25.0
  • change: Bump bootsnap from 1.25.0 to 1.26.0
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

24pullrequests/24pullrequests 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 7274318b3fe0e4fc4d4cf39a5d00f00b23c7cbc7 — 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.