diff --git a/docker-compose.yml b/docker-compose.yml
index 8a5b7741..083c5ab6 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -34,6 +34,17 @@ services:
# UID/GID are mainly useful on Linux hosts to avoid root-owned output files.
user: "${UID:-1000}:${GID:-1000}"
+ polyweather_prewarm:
+ <<: *polyweather-base
+ container_name: polyweather_prewarm
+ restart: unless-stopped
+ profiles: ["workers"]
+ command: python scripts/prewarm_dashboard_worker.py --include-detail --include-market
+ volumes:
+ - ${POLYWEATHER_RUNTIME_DATA_DIR:-/var/lib/polyweather}:/var/lib/polyweather
+ - ${POLYWEATHER_RUNTIME_DATA_DIR:-/var/lib/polyweather}:/app/data
+ user: "${UID:-1000}:${GID:-1000}"
+
polyweather_prometheus:
image: prom/prometheus:v3.4.1
container_name: polyweather_prometheus
diff --git a/frontend/app/loading.tsx b/frontend/app/loading.tsx
new file mode 100644
index 00000000..e99baf0e
--- /dev/null
+++ b/frontend/app/loading.tsx
@@ -0,0 +1,5 @@
+import { DashboardShellSkeleton } from "@/components/dashboard/DashboardShellSkeleton";
+
+export default function Loading() {
+ return