fix(pwa): cache-bust icon link tags (?v=20260515-3a)
CI / test (push) Has been cancelled

iOS Safari caches the apple-touch-icon per origin and ignores byte-level
changes on the same URL. Adding a version query forces a refetch on
fresh visits without renaming the source files. Buttressed across all
standalone Twig templates and the SPA index plus the manifest icons so
Chrome desktop also refetches.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-15 14:37:56 -04:00
parent 8ae4a2fd5a
commit 5e8d9efb7b
15 changed files with 58 additions and 58 deletions
+4 -4
View File
@@ -5,11 +5,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>WeVisto</title> <title>WeVisto</title>
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a" />
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png" /> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a" />
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png" /> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a" />
<link rel="manifest" href="/build/manifest.webmanifest" /> <link rel="manifest" href="/build/manifest.webmanifest" />
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png" /> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a" />
<meta name="theme-color" content="#fdf6ee" /> <meta name="theme-color" content="#fdf6ee" />
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
+3 -3
View File
@@ -11,19 +11,19 @@
"theme_color": "#fdf6ee", "theme_color": "#fdf6ee",
"icons": [ "icons": [
{ {
"src": "/build/icons/icon-192.png", "src": "/build/icons/icon-192.png?v=20260515-3a",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/build/icons/icon-512.png", "src": "/build/icons/icon-512.png?v=20260515-3a",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/build/icons/icon-512-maskable.png", "src": "/build/icons/icon-512-maskable.png?v=20260515-3a",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
+4 -4
View File
@@ -5,11 +5,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>WeVisto</title> <title>WeVisto</title>
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a" />
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png" /> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a" />
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png" /> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a" />
<link rel="manifest" href="/build/manifest.webmanifest" /> <link rel="manifest" href="/build/manifest.webmanifest" />
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png" /> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a" />
<meta name="theme-color" content="#fdf6ee" /> <meta name="theme-color" content="#fdf6ee" />
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes" />
+3 -3
View File
@@ -11,19 +11,19 @@
"theme_color": "#fdf6ee", "theme_color": "#fdf6ee",
"icons": [ "icons": [
{ {
"src": "/build/icons/icon-192.png", "src": "/build/icons/icon-192.png?v=20260515-3a",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/build/icons/icon-512.png", "src": "/build/icons/icon-512.png?v=20260515-3a",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "any" "purpose": "any"
}, },
{ {
"src": "/build/icons/icon-512-maskable.png", "src": "/build/icons/icon-512-maskable.png?v=20260515-3a",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable" "purpose": "maskable"
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title> <title>{% block title %}Welcome!{% endblock %}</title>
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
{% block stylesheets %} {% block stylesheets %}
{% endblock %} {% endblock %}
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Setup help — WeVisto</title> <title>Setup help — WeVisto</title>
<style> <style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Sign in — WeVisto</title> <title>Sign in — WeVisto</title>
<style> <style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Create account — WeVisto</title> <title>Create account — WeVisto</title>
<style> <style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Name your frame — WeVisto</title> <title>Name your frame — WeVisto</title>
<style> <style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Set up your frame — WeVisto</title> <title>Set up your frame — WeVisto</title>
<style> <style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Add photo to your frame — WeVisto</title> <title>Add photo to your frame — WeVisto</title>
<style> <style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0} *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Photo added — WeVisto</title> <title>Photo added — WeVisto</title>
<style> <style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0} *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Decline photo — WeVisto</title> <title>Decline photo — WeVisto</title>
<style> <style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0} *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Photo declined — WeVisto</title> <title>Photo declined — WeVisto</title>
<style> <style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0} *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
+4 -4
View File
@@ -3,10 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-3a">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png"> <link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-3a">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png"> <link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-3a">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-3a">
<title>Link invalid — WeVisto</title> <title>Link invalid — WeVisto</title>
<style> <style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0} *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}