The Propshaft Version Lever You Were Told Was Gone A developer team migrating to Rails 8.1.3 with Propshaft mistakenly believed the asset version string for cache busting had been removed. The version setting remains functional, as confirmed by reading Propshaft's source code and testing a fresh Rails app; it is wired into the digest via `config.assets.version` and defaults to "1.0" in generated initializers. The confusion stems from missing documentation in Propshaft's README, not from removal of the feature. A piece of feedback to the Rails community crossed my feed this week. A team had migrated an application to Rails 8.1.3, adopted Propshaft — the asset pipeline that replaced Sprockets as the Rails 8 default — and concluded that it had removed the ability to set a version string to force new fingerprints on precompile. Their words were that this introduced “a weakness to the platform.” The reasoning was sound: they used that lever to be certain a client was running the latest deployed assets, and now it appeared to be gone. The instinct is correct. That lever matters. But the conclusion is wrong, and the way I know it is wrong is the point of this post: I cloned Propshaft, read the source, and then generated a fresh Rails 8.1.3 app and tested it, rather than trusting the blog posts. The version setting is still there. It is wired into the digest. The Rails generator writes it into your initializer with a comment explaining what it does. And when I precompiled twice to prove it, it behaved exactly as advertised. It is missing from Propshaft’s README — which is a different problem from being removed, and a much smaller one. Search for “Propshaft cache busting” and every result says the same thing, more or less correctly: Propshaft appends a content-based fingerprint to each filename. application.css becomes application-a1b2c3d4.css . When the content changes, the digest changes, the filename changes, and the browser fetches the new file. Unlike Sprockets, there is no config.assets.version to manage — the content hash handles everything. That last sentence is the one that does the damage. It is repeated across tutorials, and it is the source of the belief that the lever was deleted. The first half is true. The second half is folklore. Propshaft is small enough to read in a sitting, which is exactly why I reach for git clone before I reach for an opinion. The whole digest mechanism is one method in lib/propshaft/asset.rb : def digest @digest ||= Digest::SHA1.hexdigest " {content with compile references} {load path.version}" .first 8 end Read it slowly. The string being hashed is not just the file’s content. It is the content concatenated with load path.version . The fingerprint is a SHA1 of So where does load path.version come from? Two short hops up. The load path is built in lib/propshaft/assembly.rb : def load path @load path ||= Propshaft::LoadPath.new config.paths, compilers: compilers, version: config.version, <- right here file watcher: config.file watcher, integrity hash algorithm: config.integrity hash algorithm end And config.version is config.assets.version , which the Propshaft railtie sets a default for in lib/propshaft/railtie.rb : config.assets.version = "1" The chain is unbroken: flowchart LR A "config.assets.version