{"id":1440,"date":"2026-10-21T18:00:00","date_gmt":"2026-10-21T17:00:00","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=1440"},"modified":"2026-10-21T18:00:00","modified_gmt":"2026-10-21T17:00:00","slug":"hashed-asset-names-make-cdn-releases-easier-to-reason-about","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/","title":{"rendered":"Hashed Asset Names Make CDN Releases Easier to Reason About"},"content":{"rendered":"<p>Replacing app.js and hoping every cache forgets the old version is a fairly unpleasant deployment strategy. I prefer filenames that change when the file content changes. The browser can cache the old file confidently, and new HTML can point to the new file without needing the two versions to fight over one URL.<\/p>\n<p>CloudFront&#8217;s <a href=\"https:\/\/docs.aws.amazon.com\/AmazonCloudFront\/latest\/DeveloperGuide\/Invalidation.html\">invalidation guidance<\/a> explains both invalidation and versioned filenames. Invalidation is useful, but it is not the whole caching story: a browser or another cache can still have its own copy. Giving changed assets a new path makes the intended version explicit.<\/p>\n<p>The deployment sequence matters too. Upload the new assets before publishing HTML that references them, and keep older assets available long enough for existing pages to keep working. Otherwise a release can leave somebody with an old page asking for a file you just deleted. HTML and long-lived static assets generally need different caching decisions.<\/p>\n<p>This is one of those changes that makes the operational explanation shorter. You can inspect a page and see which build it references, compare the files, and reason about rollback. A cache should make the site faster. It should not turn every release into a discussion about why one person&#8217;s browser still looks different.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Replacing app.js and hoping every cache forgets the old version is a fairly unpleasant deployment strategy.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[13],"tags":[272,271,273],"class_list":["post-1440","post","type-post","status-publish","format-standard","hentry","category-programming","tag-caching","tag-cloudfront","tag-web-deployment"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Hashed Asset Names Make CDN Releases Easier to Reason About - wade.one<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hashed Asset Names Make CDN Releases Easier to Reason About - wade.one\" \/>\n<meta property=\"og:description\" content=\"Replacing app.js and hoping every cache forgets the old version is a fairly unpleasant deployment strategy.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-21T17:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Hashed Asset Names Make CDN Releases Easier to Reason About\",\"datePublished\":\"2026-10-21T17:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/\"},\"wordCount\":217,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"keywords\":[\"caching\",\"cloudfront\",\"web-deployment\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/\",\"name\":\"Hashed Asset Names Make CDN Releases Easier to Reason About - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-21T17:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/21\\\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hashed Asset Names Make CDN Releases Easier to Reason About\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Hashed Asset Names Make CDN Releases Easier to Reason About - wade.one","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/","og_locale":"en_GB","og_type":"article","og_title":"Hashed Asset Names Make CDN Releases Easier to Reason About - wade.one","og_description":"Replacing app.js and hoping every cache forgets the old version is a fairly unpleasant deployment strategy.","og_url":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/","og_site_name":"wade.one","article_published_time":"2026-10-21T17:00:00+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/"},"author":{"name":"","@id":""},"headline":"Hashed Asset Names Make CDN Releases Easier to Reason About","datePublished":"2026-10-21T17:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/"},"wordCount":217,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"keywords":["caching","cloudfront","web-deployment"],"articleSection":["Programming"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/","url":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/","name":"Hashed Asset Names Make CDN Releases Easier to Reason About - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2026-10-21T17:00:00+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"Hashed Asset Names Make CDN Releases Easier to Reason About"}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}}]}},"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1476,"url":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/","url_meta":{"origin":1440,"position":0},"title":"HTTP 304 Means the Cached Copy Is Still Useful","author":"","date":"November 2, 2026","format":false,"excerpt":"An HTTP 304 response is supposed to arrive without a response body.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1439,"url":"https:\/\/wade.one\/blog\/2026\/10\/20\/database-migrations-need-to-survive-two-app-versions-at-once\/","url_meta":{"origin":1440,"position":1},"title":"Database Migrations Need to Survive Two App Versions at Once","author":"","date":"October 20, 2026","format":false,"excerpt":"A database migration can work perfectly on your development machine and still make a production deployment awkward.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1401,"url":"https:\/\/wade.one\/blog\/2026\/08\/22\/dotnets-mcp-c-sharp-sdk-2-0-makes-web-deployment-less-weird\/","url_meta":{"origin":1440,"position":2},"title":".NET&#8217;s MCP C# SDK 2.0 Makes Web Deployment Less Weird","author":"","date":"August 22, 2026","format":false,"excerpt":"The official MCP C# SDK 2.0 adopts stateless HTTP while keeping older clients and servers working during migration.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1185,"url":"https:\/\/wade.one\/blog\/2026\/04\/17\/the-case-for-smaller-deployments\/","url_meta":{"origin":1440,"position":3},"title":"The Case for Smaller Deployments","author":"","date":"April 17, 2026","format":false,"excerpt":"Smaller deployments are usually easier to trust, easier to roll back, and easier to debug. Once a release starts carrying too much change, the team spends more time managing risk than shipping value.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1251,"url":"https:\/\/wade.one\/blog\/2026\/05\/03\/the-vercel-incident-is-a-reminder-that-ai-tools-are-supply-chain-risk\/","url_meta":{"origin":1440,"position":4},"title":"The Vercel Incident Is a Reminder That AI Tools Are Supply Chain Risk","author":"","date":"May 3, 2026","format":false,"excerpt":"AI tools are now part of the software supply chain. That means they need the same security scrutiny as any other tool with access to systems and secrets.","rel":"","context":"In &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/wade.one\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1176,"url":"https:\/\/wade.one\/blog\/2026\/04\/08\/why-build-pipelines-become-part-of-the-product\/","url_meta":{"origin":1440,"position":5},"title":"Why Build Pipelines Become Part of the Product","author":"","date":"April 8, 2026","format":false,"excerpt":"Build pipelines stop being \"just internal tooling\" the moment they start deciding how fast you can ship, how often you break things, and how painful releases feel.","rel":"","context":"In &quot;Software Engineer&quot;","block_context":{"text":"Software Engineer","link":"https:\/\/wade.one\/blog\/category\/software-engineer\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=1440"}],"version-history":[{"count":1,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1440\/revisions"}],"predecessor-version":[{"id":1463,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1440\/revisions\/1463"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=1440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=1440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=1440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}