Skip to content
CAI
Software that uses CAICheck a score

rails/propshaft

59.0

Adequate · 20 September 2026

1.1k

lines of production code

Ruby

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Propshaft is a lightweight, zero-dependency asset pipeline for Ruby on Rails that replaces external bundlers or Sprockets. It provides a complete workflow for locating, compiling, and digesting static assets like CSS, JavaScript, and images, while supporting Subresource Integrity for security. The system manages asset resolution through static and dynamic resolvers, generates manifests for production, and serves files via middleware in development environments.

How it got here

2021 — Initial release and core feature development

16 changes.

This period marks the initial release of Propshaft as a lightweight, zero-dependency asset pipeline for Rails, introducing core capabilities such as asset resolution, compilation, and manifest generation. Key features added include Subresource Integrity (SRI) support, bulk stylesheet helpers, and a dedicated asset server middleware. The work also involved establishing a robust testing infrastructure with integration and unit tests, alongside dependency refinements to target Rails 8.1.

2023–2025 — Asset URL resolution and testing expansion

5 changes.

This period focused on implementing dedicated compilers for resolving asset URLs in CSS, JavaScript, and source maps, ensuring correct digesting and dependency tracking. The work was supported by comprehensive test coverage for these new features and the addition of test fixtures for dependency chains and manifest formats. Additionally, the project expanded its testing infrastructure to include dedicated Gemfiles for Rails versions 7.0 through 8.1.

Features

Added benchmark suite for asset resolution and compilation

A new benchmarking suite has been added to the \benchmarks\ directory to measure the performance of Propshaft's asset handling. This includes executable scripts for the CSS asset URL compiler, static resolver, and dynamic resolver, along with a \Trackrod\ helper class that generates synthetic test assets (images, CSS, and JavaScript) to drive these benchmarks. This allows users to quantify the impact of changes on compilation and resolution speeds.

benchmarks · high confidence

Initial release of Propshaft asset pipeline

Propshaft is introduced as a new asset pipeline for Ruby on Rails applications, replacing the need for external bundlers or Sprockets. It provides a complete asset processing workflow including a load path for locating assets, a compiler system for transforming files (such as replacing CSS/JS URLs or handling source maps), and a processor that handles precompilation, manifest generation, and output to a digested directory. The library supports dynamic and static resolution of asset paths, subresource integrity (SRI) hashes for security, and a clean task to manage old asset versions. It is designed to be a lightweight, zero-dependency alternative for serving and digesting static assets in development and production.

propshaft · high confidence

New release and test scripts added to bin

Added a new \bin/release\ script that automates the gem release process by updating the version file, committing changes, pushing tags, and publishing to RubyGems. Also added a \bin/test\ executable to simplify running the test suite using Bundler and Rails plugin test helpers.

bin · high confidence

Propshaft 1.3.2: Subresource Integrity, bulk stylesheet helpers, and asset server middleware

Propshaft has been upgraded to version 1.3.2, introducing Subresource Integrity (SRI) support for enhanced security. The \stylesheet\_link\_tag\ and \javascript\_include\_tag\ helpers now accept an \integrity: true\ option to automatically generate and include integrity hashes in secure contexts (HTTPS or local development). Additionally, these helpers support \:all\ and \:app\ symbols to include all known stylesheets or only those from the application's \app/assets\ directory, respectively. The asset server is now a proper middleware (\Propshaft::Server\) that can be enabled in development and test environments, and the \Propshaft::Helper\ module is automatically included in Action View. The manifest now supports integrity hashes and distinguishes between app and engine assets, while the load path prioritizes application assets over engine assets.

lib/propshaft · high confidence

Support for asset URL resolution in CSS, JavaScript, and source maps

Propshaft now includes dedicated compilers for resolving asset URLs within CSS (\url()\), JavaScript (\RAILS\_ASSET\_URL()\), and source map references (\sourceMappingURL\). These new components ensure that relative asset paths are correctly resolved, digested, and prefixed with the configured URL root, while also tracking dependencies between assets to ensure correct digesting when files rely on one another.

lib/propshaft/compiler · high confidence

Behavioural changes

New Rake tasks for asset management and debugging

The asset management rake tasks have been extracted into a dedicated file, introducing new capabilities for developers. A new \assets:clean\ task now accepts an optional \count\ parameter to control how many previous asset versions are retained, aligning with behavior from other asset pipelines. Additionally, a new \assets:reveal\ task (and its subtask \assets:reveal:full\) allows users to inspect the logical paths and full file paths of available assets. The \assets:precompile\ task now includes a warning when executed in the development environment to alert users that changed assets will not be served until the manifest is cleared.

lib/propshaft/railties · high confidence

Propshaft initializes its own logger and loads core components directly

Propshaft now manages its own logging infrastructure by storing a singleton logger instance (defaulting to STDOUT) and explicitly requiring its core components (Assembly, Errors, Helper) and ActiveSupport's delegation module at load time. This removes the previous reliance on ActiveSupport's autoload mechanism and the Railtie for basic initialization, ensuring the library is self-contained and ready to use even outside of a full Rails boot sequence.

lib · high confidence

Static resolver now reads from manifest and supports integrity checks

The static asset resolver has been refactored to initialize eagerly with a manifest object, enabling it to look up asset paths, integrity values, and app-specific assets directly from the manifest data rather than relying solely on disk lookups. This change introduces an \integrity\ method for Subresource Integrity support and adds configurable encoding options to the \read\ method, while also providing a warning mechanism when the manifest is outdated and cannot provide app asset paths.

lib/propshaft/resolver · high confidence

Test coverage

Added comprehensive test suite for Propshaft core components; Added dummy Rails application for integration testing; Added integration tests for asset resolution and integrity; Added test coverage for static and dynamic asset resolvers; Added test fixtures for CSS asset compilation; Added test fixtures for CSS dependency chains; Added test fixtures for asset path resolution and digested file handling; Added test fixtures for new manifest format with app key support; Added test fixtures for source map URL parsing edge cases; Added tests for CSS asset URL, JS asset URL, and source mapping URL compilers; Updated test fixtures for output manifest and assets.

Dependencies

Add dedicated Gemfiles for Rails 7.0–8.1 testing

The project now includes specific Gemfile variants for Rails versions 7.0, 7.1, 7.2, 8.0, and 8.1 to facilitate testing across these supported releases. For Rails 7.0 and 7.1, the setup pins minitest to versions below 6, while Rails 7.2, 8.0, and 8.1 utilize the minitest-mock gem. Each variant also includes standard dependencies like rake and debug, ensuring the library can be validated against the full range of supported Rails environments.

gemfiles · high confidence

Upgrade to Rails 8.1 and refine runtime dependencies

Propshaft now targets Rails 8.1.3, replacing the previous dependency on the full 'rails' gem with specific dependencies on 'actionpack' (\>= 7.0.0), 'activesupport' (\>= 7.0.0), and 'rack'. This change aligns the gem with the latest Rails release and reduces unnecessary runtime overhead by depending only on the frameworks actually used. Additionally, the project enforces Multi-Factor Authentication (MFA) for gem releases via metadata and adds Rubocop linting tools for development.

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

Lenses

  • Code Health 99
  • Architecture 69
  • Maturity 59
  • Readiness 50
  • Security 75

Changes since last survey

  • 300 commits — 276 feature/other, 24 fixes

By area

  • lib/propshaft — 132 commits
  • (root) — 88 commits
  • (repo) — 26 commits
  • test/fixtures — 16 commits
  • test/propshaft — 14 commits
  • .github/workflows — 5 commits
  • test/dummy — 5 commits
  • bin/release — 4 commits
  • lib/propshaft.rb — 3 commits
  • .devcontainer/Dockerfile — 2 commits
  • .devcontainer/devcontainer.json — 2 commits
  • benchmarks/css_asset_urls — 2 commits
  • test/test_helper.rb — 1 commit

Notable commits

  • fix: Fix CSS Asset Compiler to work with files started with data and http (#224)
  • fix: Fix Regexp used for CSS comment detection (#32)
  • fix: Fix Ruby 2.7 support in manifest test
  • fix: Fix Ruby warnings
  • fix: Fix Ruby warnings
  • fix: Fix assertionless tests in Resolver::StaticTest
  • fix: Fix broken tests after digest shortening (#179)
  • fix: Fix broken tests after digest shortening (#179)
  • fix: Fix deprecation
  • fix: Fix deprecation in engine mounting (#198)
  • fix: Fix markdown link in UPGRADING.md (#137)
  • fix: Fix string comarison with pathname error (#72)
  • fix: Fix tests
  • fix: Fix: Vary HTTP header (#136)
  • fix: Merge pull request #253 from rails/rm-fix-middleware
  • fix: Merge pull request #265 from flavorjones/fix-ci-minitest
  • fix: Merge pull request #4 from keshavbiswa/fix-readme-texts
  • fix: Merge pull request #60 from rails/revert-59-optional-server
  • fix: Refresh dependencies (to fix debug issue)
  • fix: Revert "Add support for asset host (#118)" (#131)
  • …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

rails/propshaft 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 dc979db89cd07c72ee4d11d415ae1cb4fd072623 — 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.