task-11: complete QA + hardening with resilience fixes

- Created comprehensive QA checklist covering edge cases (missing EXIF, timezones, codecs, corrupt files)
- Added ErrorBoundary component wrapped around TimelineTree and MediaPanel
- Created global error.tsx page for unhandled errors
- Improved failed asset UX with red borders, warning icons, and inline error display
- Added loading skeletons to TimelineTree and MediaPanel
- Added retry button for failed media loads
- Created DEPLOYMENT_VALIDATION.md with validation commands and checklist
- Applied k8s recommendations:
  - Changed node affinity to required for compute nodes (Pi 5)
  - Enabled Tailscale LoadBalancer service for MinIO S3 (reliable Range requests)
  - Enabled cleanup CronJob for staging files
This commit is contained in:
OpenCode Test
2025-12-24 12:45:22 -08:00
parent 232b4f2488
commit 4e2ab7cdd8
13 changed files with 1444 additions and 131 deletions

View File

@@ -4,6 +4,7 @@ import Link from "next/link";
import { getAppName } from "@tline/config";
import { useState } from "react";
import { ErrorBoundary } from "./components/ErrorBoundary";
import { MediaPanel } from "./components/MediaPanel";
import { TimelineTree } from "./components/TimelineTree";
@@ -32,8 +33,12 @@ export default function HomePage() {
alignItems: "start",
}}
>
<TimelineTree onSelectDay={setSelectedDayIso} />
<MediaPanel selectedDayIso={selectedDayIso} />
<ErrorBoundary>
<TimelineTree onSelectDay={setSelectedDayIso} />
</ErrorBoundary>
<ErrorBoundary>
<MediaPanel selectedDayIso={selectedDayIso} />
</ErrorBoundary>
</div>
</main>
);