diff --git a/containers/libreportal/frontend/index.html b/containers/libreportal/frontend/index.html
index 6113cf0..65172ac 100755
--- a/containers/libreportal/frontend/index.html
+++ b/containers/libreportal/frontend/index.html
@@ -86,6 +86,7 @@
+
diff --git a/containers/libreportal/frontend/js/components/backup/backup-page.js b/containers/libreportal/frontend/js/components/backup/backup-page.js
index 7eff02b..7e89d6b 100644
--- a/containers/libreportal/frontend/js/components/backup/backup-page.js
+++ b/containers/libreportal/frontend/js/components/backup/backup-page.js
@@ -94,6 +94,7 @@ class BackupPage {
this.applyActiveTabUi(this.currentTab);
this.bindEvents();
await this.refreshAll();
+ await window.Dismissible?.load();
this.render();
this.updatePageHeader();
this.updatePrimaryAction();
@@ -213,7 +214,7 @@ class BackupPage {
const dismissWarn = e.target.closest('[data-action="dismiss-config-warning"]');
if (dismissWarn) {
- localStorage.setItem('libreportal:backup-config-warning-dismissed', '1');
+ window.Dismissible?.dismiss('backup-config-warning');
const banner = dismissWarn.closest('.backup-warning-banner');
const divider = banner?.nextElementSibling;
if (divider && divider.classList.contains('config-divider')) divider.remove();
@@ -830,10 +831,10 @@ class BackupPage {
const body = document.getElementById('backup-configuration-body');
if (!body) return;
- // The warning is a dismissible nudge, so its dismissed state lives in
- // localStorage (per-browser) rather than server config. Banner + its
- // divider are omitted entirely once dismissed.
- const warningDismissed = localStorage.getItem('libreportal:backup-config-warning-dismissed') === '1';
+ // Dismissed state is persisted server-side via Dismissible
+ // (data/ui-state.json), so it follows the user across browsers/devices.
+ // Banner + its divider are omitted entirely once dismissed.
+ const warningDismissed = !!window.Dismissible?.isDismissed('backup-config-warning');
const warningHTML = warningDismissed ? '' : `