diff --git a/containers/libreportal/frontend/core/setup/js/setup-wizard.js b/containers/libreportal/frontend/core/setup/js/setup-wizard.js
index 1c1b649..8180a41 100755
--- a/containers/libreportal/frontend/core/setup/js/setup-wizard.js
+++ b/containers/libreportal/frontend/core/setup/js/setup-wizard.js
@@ -422,7 +422,11 @@ class SetupWizard {
const refused = c.verdict === 'refuse';
const warned = c.verdict === 'warn';
const id = `sw-storage-${i}`;
- const detail = refused ? c.refusals : (warned ? c.warnings : '');
+ // Checks are joined with "; " on the shell side. Split them back out:
+ // a drive can trip several at once, and one run-on paragraph buries the
+ // fstab line the user is meant to copy.
+ const detailParts = String((refused ? c.refusals : c.warnings) || '')
+ .split(/;\s+/).map(s => s.trim()).filter(Boolean);
const badge = refused
? 'unusable'
: (warned ? 'needs care' : '');
@@ -435,7 +439,7 @@ class SetupWizard {
${this.escapeHtml(c.fstype)} · ${this.escapeHtml(c.size)} (${this.escapeHtml(c.free)} free)${c.removable ? ' · removable' : ''}
- ${detail ? `
${this.escapeHtml(detail)}` : ''}
+ ${detailParts.length ? detailParts.map(d => `
${this.escapeHtml(d)}`).join('') : ''}
`;
diff --git a/scripts/webui/data/generators/system/webui_system_update.sh b/scripts/webui/data/generators/system/webui_system_update.sh
index c73f733..3ca7c7c 100755
--- a/scripts/webui/data/generators/system/webui_system_update.sh
+++ b/scripts/webui/data/generators/system/webui_system_update.sh
@@ -11,6 +11,10 @@ webuiSystemUpdate() {
webuiSystemUpdateCheck
webuiSystemVerify
webuiSystemNetworkCheck
+ # Storage locations + candidate drives. The setup wizard reads this to
+ # decide whether its Storage step appears at all, and the Disks view reads
+ # the same file, so both always agree.
+ declare -f webuiGenerateStorageCandidates >/dev/null 2>&1 && webuiGenerateStorageCandidates
isSuccessful "System information updated!"
}