diff --git a/app-staging.yaml b/app-staging.yaml
index 91789e20..966c5cb0 100644
--- a/app-staging.yaml
+++ b/app-staging.yaml
@@ -1,6 +1,13 @@
runtime: python313
service: ocotillo-staging
handlers:
+ # version.json must never be cached so the new-version polling is reliable
+ - url: /version.json
+ static_files: dist/version.json
+ upload: dist/version.json
+ secure: always
+ http_headers:
+ Cache-Control: no-store
# Serve all static files with url ending with a file extension
- url: /(.*\..+)$
static_files: dist/\1
diff --git a/app.yaml b/app.yaml
index b68d7d3f..b56b6b2c 100644
--- a/app.yaml
+++ b/app.yaml
@@ -1,6 +1,13 @@
runtime: python313
service: ocotillo
handlers:
+ # version.json must never be cached so the new-version polling is reliable
+ - url: /version.json
+ static_files: dist/version.json
+ upload: dist/version.json
+ secure: always
+ http_headers:
+ Cache-Control: no-store
# Serve all static files with url ending with a file extension
- url: /(.*\..+)$
static_files: dist/\1
diff --git a/public/version.json b/public/version.json
new file mode 100644
index 00000000..1efcf1bb
--- /dev/null
+++ b/public/version.json
@@ -0,0 +1 @@
+{"buildTime":"dev"}
\ No newline at end of file
diff --git a/src/components/AppShell.tsx b/src/components/AppShell.tsx
index a0ede246..b31e8e29 100644
--- a/src/components/AppShell.tsx
+++ b/src/components/AppShell.tsx
@@ -63,6 +63,8 @@ import { ReportBugButton } from '@/components/Button'
import { AmpRole, PRIMARY_NAV, RESOURCE_NAV, type NavItem } from '@/config/navigation'
import { useAccessCapabilities } from '@/hooks'
import { useSearch } from '@/providers/search-provider'
+import { NewVersionBanner } from '@/components/NewVersionBanner'
+import pkg from '../../package.json'
// Support panel state shared between the sidebar footer button and the panel itself
export const SupportPanelContext = createContext<{
@@ -353,6 +355,14 @@ function AppSidebar() {
{/* Help & Support button — hidden until panel content is defined */}
{/*