nickjj/docker-rails-example
66.0
Adequate · 20 September 2026
421
lines of production code
Ruby
primary language
1
measurement over time
What this system is
This system is a Ruby on Rails web application that has undergone a comprehensive modernization of its technology stack, upgrading from Rails 6.1 to 8.1 and Ruby 2.7 to 4.0. It manages frontend assets and interactivity using esbuild, Tailwind CSS, and Hotwire, while relying on PostgreSQL and Redis for data persistence and caching. The infrastructure is containerized with Docker Compose and includes operational features such as a comprehensive health check endpoint and automated code quality tools.
Behavioural changes
Clarified 502 error page title
The title on the 502 Bad Gateway error page has been updated from 'A New Version of the Site Was Just Released' to 'A New Version of This Site Was Just Released' to provide clearer context to users encountering the maintenance message.
public · high confidence
Major stack upgrade to Rails 8, Ruby 4, and Docker Compose v2 with new asset pipeline
This release upgrades the application to Rails 8.1.3.1 and Ruby 4.0.6, replacing the previous Webpacker-based asset pipeline with esbuild and Hotwire (Turbo/Stimulus). The Docker infrastructure has been modernized by renaming docker-compose.yml to compose.yaml to support Docker Compose v2, introducing service profiles (postgres, redis, web, worker, cable, assets) for modular startup, and updating base images to Debian Trixie. PostgreSQL is upgraded to version 18.6 and Redis to 8.10.1. The build process now supports custom user/group IDs (APP\_UID/APP\_GID) and enables Docker BuildKit by default. Front-end dependencies have shifted from Webpacker/Babel to esbuild, TailwindCSS v4, and Heroicons, while the run script has been refactored to use helper functions and new commands like quality and format.
(repo-wide) · high confidence
Migrate JavaScript stack from Webpacker/Turbolinks to esbuild/Hotwire
The application's frontend build system has been replaced, removing the Webpacker configuration and its associated pack files in favor of a simpler esbuild-based setup. This change swaps the Turbolinks library for Hotwire's Turbo, updating the entry point to import @hotwired/turbo-rails, and restructures the Stimulus controller initialization under a new controllers directory. Additionally, the legacy Action Cable consumer files have been removed, and Tailwind CSS configuration files previously managed by Webpacker are no longer present in this directory.
app/javascript · high confidence
Migrate asset pipeline from Sprockets to Propshaft and Tailwind v4
The application's asset pipeline has been replaced, removing the Sprockets-based manifest and CSS compilation in favor of Propshaft and Tailwind CSS v4. Users will no longer have styles compiled via the old Sprockets directives; instead, styling is now handled by Tailwind v4 using a direct import in the new application.tailwind.css file, and static assets are served directly without the previous manifest.js linking logic.
app/assets · high confidence
Migrate from Turbolinks to Hotwire and update layout tags
The application layout has been updated to replace Turbolinks with Hotwire, switching from \stylesheet\_pack\_tag\ and \javascript\_pack\_tag\ with \data-turbolinks-track\ to \stylesheet\_link\_tag\ and \javascript\_include\_tag\ with \data-turbo-track\. Additionally, the meta description has been refined to highlight the app's production-ready Docker setup, and the footer now includes a direct link to the GitHub repository.
app/views · high confidence
Rails 7 upgrade and ActionCable cleanup
The application has been upgraded to Rails 7, which includes updating the base model class to use the new \primary\_abstract\_class\ method instead of the deprecated \self.abstract\_class = true\. Additionally, the empty \connect\ method in the ActionCable connection class has been removed, as it is no longer required in the newer framework version.
app/channels, app/models · high confidence
Rails 8.0 configuration updates and environment-specific behavior changes
The application's environment configurations have been updated to align with Rails 8.0 standards, introducing several behavioral changes for developers and operators. In development, code reloading is now controlled via \config.enable\_reloading\ instead of \config.cache\_classes\, asset digesting is explicitly disabled, and the web console is configured to allow access from any IP (\0.0.0.0/0\) to support Docker workflows. Production settings now use \config.enable\_reloading = false\, enable fragment caching by default, enforce SSL, and adjust logging to respect the \RAILS\_LOG\_LEVEL\ environment variable while silencing health check paths. Test environment configurations now disable reloading, conditionally enable eager loading based on the \CI\ environment variable, set the Active Job queue adapter to \:test\, and change exception handling to \:rescuable\. Common across environments are the removal of deprecated deprecation warning configurations, the addition of verbose logging for jobs and redirects, and the enforcement of strict callback action checks.
config/environments · high confidence
Rails 8.0 initializer updates and new configuration defaults
This change updates the application's initializer configuration to align with Rails 8.0 standards and introduces new runtime optimizations. YJIT is now enabled by default to improve performance, and the Redis client is renamed to \RedisConn\ for better clarity. The Hotwire Turbo Drive support in Rack::MiniProfiler is explicitly enabled in development. Several legacy or default Rails initializers (such as \application\_controller\_renderer\, \backtrace\_silencers\, \cookies\_serializer\, \mime\_types\, and \wrap\_parameters\) have been removed as they are no longer required or have been superseded by newer defaults. The Content Security Policy initializer has been updated to use the newer \config.content\_security\_policy\ block syntax with nonce generation, and the filter parameter logging initializer now includes additional sensitive fields (\email\, \cvv\, \cvc\).
config/initializers · high confidence
Rails bin scripts updated for Spring removal and new setup options
The bin scripts have been refactored to remove the Spring binstub (bin/spring, bin/webpack) and its loading logic from bin/rails and bin/rake, replacing them with direct execution paths. A new bin/rubocop script has been added to explicitly load the RuboCop configuration. Additionally, bin/setup now supports a --reset flag to trigger database resets, and bin/docker-entrypoint-web has been updated to use a safer copy command for assets.
bin · high confidence
Refactored static pages and enhanced health check with Redis verification
The application now uses a dedicated PagesController for static content, replacing the previous StaticController structure. The health check endpoint has been moved to a new UpController, which now verifies connectivity to both the database and Redis (using the renamed RedisConn) before returning a success status, providing a more comprehensive system health check for users and monitoring tools.
app/controllers · high confidence
Updated database seeding comments to emphasize idempotency
The comments in db/seeds.rb have been updated to clarify that the seeding script should ensure the existence of required records across all environments (production, development, test) and must be idempotent to allow safe execution at any time. The example code was also updated to demonstrate this pattern using find\_or\_create\_by! instead of simple creation.
db · high confidence
Upgrade to Rails 8.1 and replace Webpacker with esbuild
The application has been upgraded to Rails 8.1 (via \config.load\_defaults 8.1\), which includes a migration from Webpacker to esbuild (evidenced by the deletion of all \config/webpack\ files and \config/webpacker.yml\). This change introduces several behavioral updates: the default thread count for Puma is reduced from 5 to 3, the Sidekiq web dashboard is disabled by default in routes for security, and the application now uses MessagePack as the serializer for Active Support messages, cookies, and Redis cache. Additionally, the root route has been renamed from \static\#home\ to \pages\#home\, and a dedicated health check endpoint is now available at \/up/\.
config · high confidence
Test coverage
Added health check tests and updated test infrastructure
This change adds dedicated tests for the new health check controller (UpController), verifying that both the main health endpoint and the database health endpoint return success. It also updates the test suite infrastructure by renaming the static controller tests to pages controller tests, switching system tests to use headless Chrome instead of standard Chrome, and refactoring the test helper and connection test classes into modules for better organization.
test · high confidence
Dependencies
Upgrade to Rails 8.1 and Ruby 4.0.6 with modernized asset pipeline
The application has been upgraded from Rails 6.1 to Rails 8.1 and from Ruby 2.7.2 to Ruby 4.0.6. This change replaces the legacy Webpacker and Turbolinks stack with Hotwire (Turbo and Stimulus), esbuild for JavaScript bundling, and Propshaft for CSS/asset management. Additionally, the Puma web server is updated to version 7.1, Sidekiq to 8.0, and Redis client to 5.2, while the debug tooling switches from byebug to the standard debug gem.
(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 66.
Lenses
- Code Health 100
- Architecture 66
- Maturity 90
- Readiness 58
- Security 97
- Domain Modelling 100
- Accessibility 63
Changes since last survey
- 300 commits — 291 feature/other, 9 fixes
By area
- (root) — 280 commits
- (repo) — 8 commits
- .github/workflows — 4 commits
- .github/FUNDING.yml — 2 commits
- app/views — 2 commits
- .github/docs — 1 commit
- bin/docker-entrypoint-web — 1 commit
- config/application.rb — 1 commit
- config/database.yml — 1 commit
Notable commits
- fix: Fix Action Cable to configure custom URL
- fix: Fix Hadolint command reference
- fix: Fix Postgres volume mount for version 18.X
- fix: Fix Rails 8.0 diff link
- fix: Fix Rails 8.1.0 reference
- fix: Fix bundle:update to use the js image
- fix: Fix tty allocation in Docker Compose for stdin
- fix: Fixed Procfile.dev spelling
- fix: Revert removing RAILS_ENV=test
- change: Add GitHub sponsor support
- change: Add Hotwire Spark for live reloading
- change: Add Rails 8.0 commit diff link
- change: Add callout for a common Docker Compose error
- change: Add docker compose logs to CI
- change: Add libyaml-dev for psych gem failing to install
- change: Add link to github repo
- change: Add required property to depends_on
- change: Add run quality command
- change: Add support for setting a custom uid:gid
- change: Allow args to be passed to ./run test
- …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
nickjj/docker-rails-example 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 20 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 d8e29ba2fa5a5ed419dd7027226300974402994b — 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-b51f968c9b10.