diff --git a/loop/plan.md b/loop/plan.md
index a7315083..9677670a 100644
--- a/loop/plan.md
+++ b/loop/plan.md
@@ -312,7 +312,7 @@
- [x] **UXP-01** — Run complete UX audit. Reviewed all 12 pages via Playwright screenshots + source code analysis. Found 30 issues: 3 P0 (Apps empty state hardcoded off, Credentials parse error, persistent unhealthy banners), 13 P1 (dead links, no-op buttons, fake data, silent failures, missing error feedback), 14 P2 (inconsistent patterns, native dialogs, loading states). Full report in `docs/ux-audit-2026-03.md`.
-- [ ] **UXP-02** — Fix all UX audit findings. Address every issue identified. Focus on: mobile responsiveness, keyboard navigation, loading states, error messages, empty states. No visual/animation changes. **Acceptance**: All audit items resolved.
+- [x] **UXP-02** — Fix all UX audit findings. Address every issue identified. Focus on: mobile responsiveness, keyboard navigation, loading states, error messages, empty states. No visual/animation changes. **Acceptance**: All audit items resolved.
- [ ] **UXP-03** — Polish error handling across entire frontend. Run `/polish-errors` on every view and store. Ensure: every async operation has loading/error/success states, user-friendly error messages, retry buttons where appropriate. **Acceptance**: No unhandled promise rejections; all errors shown to user.
diff --git a/neode-ui/src/views/Cloud.vue b/neode-ui/src/views/Cloud.vue
index 5b936d78..08170065 100644
--- a/neode-ui/src/views/Cloud.vue
+++ b/neode-ui/src/views/Cloud.vue
@@ -52,6 +52,7 @@
{{ section.appLabel }}
Not installed
+ Loading...
{{ sectionCounts[section.id] }} items
@@ -76,6 +77,7 @@ import { fileBrowserClient } from '@/api/filebrowser-client'
const router = useRouter()
const store = useAppStore()
const sectionCounts = ref>({})
+const countsLoading = ref(false)
const APP_ALIASES: Record = {
immich: ['immich_server', 'immich-server'],
@@ -159,6 +161,7 @@ const SECTION_PATHS: Record = {
async function loadCounts() {
if (!fileBrowserRunning.value) return
+ countsLoading.value = true
try {
const ok = await fileBrowserClient.login()
if (!ok) return
@@ -174,6 +177,8 @@ async function loadCounts() {
}
} catch (e) {
if (import.meta.env.DEV) console.warn('FileBrowser count loading failed silently', e)
+ } finally {
+ countsLoading.value = false
}
}