{"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_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.7 - 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":1439,"url":"https:\/\/wade.one\/blog\/2026\/10\/20\/database-migrations-need-to-survive-two-app-versions-at-once\/","url_meta":{"origin":1440,"position":0},"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":521,"url":"https:\/\/wade.one\/blog\/2011\/03\/04\/using-ssl-in-restclient\/","url_meta":{"origin":1440,"position":1},"title":"Using SSL in RestClient","author":"Wade","date":"March 4, 2011","format":false,"excerpt":"UPDATE 14\/07\/2012: The author of the client has released version 2.5 a short while ago and also a video for using self-signed certificates in the client. RESTClient is a great little CLI and GUI tool for testing your REST API. I recently pushed a new API up in the office\u2026","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":1302,"url":"https:\/\/wade.one\/blog\/2026\/05\/14\/codex-is-moving-into-the-whole-development-workflow\/","url_meta":{"origin":1440,"position":2},"title":"Codex Is Moving Into the Whole Development Workflow","author":"Wade","date":"May 14, 2026","format":false,"excerpt":"OpenAI's latest Codex updates show the category moving beyond chat and autocomplete into review, terminals, browsers, and workflow context.","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":1181,"url":"https:\/\/wade.one\/blog\/2026\/04\/13\/what-i-check-before-i-trust-a-mobile-release\/","url_meta":{"origin":1440,"position":3},"title":"What I Check Before I Trust a Mobile Release","author":"","date":"April 13, 2026","format":false,"excerpt":"A mobile release can look fine in the app store and still be a bad idea. I usually trust it only after I have checked crash risk, permissions, API compatibility, startup behavior, rollout safety, and what happens after the update lands.","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":4},"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":1173,"url":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","url_meta":{"origin":1440,"position":5},"title":"Most Mobile App Complexity Is Not in the UI","author":"","date":"April 6, 2026","format":false,"excerpt":"The hard part of a mobile app is usually not the screen layout. It is sync, auth, state, permissions, offline behavior, and the release problems that show up after the UI already looks finished.","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":[]}],"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}]}}