diff --git a/site/app/tasks/components/tasks-page-skeleton.tsx b/site/app/tasks/components/tasks-page-skeleton.tsx
new file mode 100644
index 0000000000..73b99895ee
--- /dev/null
+++ b/site/app/tasks/components/tasks-page-skeleton.tsx
@@ -0,0 +1,70 @@
+import Link from "next/link";
+import { ArrowLeft, Filter, Search } from "lucide-react";
+import { Skeleton } from "@/components/ui/skeleton";
+
+export function TasksPageSkeleton() {
+ return (
+
+
+
+
+
+
Back to Leaderboard
+
+
+
+
+ Task
+
+
+ Detailed breakdown of individual task performance across different models.
+
+
+
+
+ {/* Filter bar skeleton */}
+
+
+ {/* Table skeleton */}
+
+
+
+
+
+ {Array.from({ length: 12 }).map((_, i) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/site/app/tasks/page.tsx b/site/app/tasks/page.tsx
index 128a61840e..75b8a88c76 100644
--- a/site/app/tasks/page.tsx
+++ b/site/app/tasks/page.tsx
@@ -1,8 +1,11 @@
import { Suspense } from "react";
+import Link from "next/link";
+import { ArrowLeft } from "lucide-react";
import tasksDataRaw from "@/zealt/tasks.json";
import pendingTasksData from "@/zealt/pending-tasks.json";
import PendingReviewCard from "@/components/pending-review-card";
import { TasksPageClient, type CompactTask, type CompactTrial } from "./components/tasks-page-client";
+import { TasksPageSkeleton } from "./components/tasks-page-skeleton";
type RawTaskTrial = {
task_name?: string;
@@ -105,9 +108,13 @@ export default function TasksPage() {
@@ -119,7 +126,7 @@ export default function TasksPage() {
) : (
-
Loading tasks... }>
+
}>
)}