diff --git a/web/components/skeletons/FriendsSkeleton.tsx b/web/components/skeletons/FriendsSkeleton.tsx
new file mode 100644
index 00000000..3f16b08b
--- /dev/null
+++ b/web/components/skeletons/FriendsSkeleton.tsx
@@ -0,0 +1,40 @@
+import { Card } from '../ui/Card';
+import { Skeleton } from '../ui/Skeleton';
+
+export const FriendsSkeleton = () => {
+ return (
+
+ {/* Header Skeleton */}
+
+
+
+
+ {/* Summary Cards Skeleton */}
+
+ {[1, 2].map((i) => (
+
+
+
+
+
+
+
+ ))}
+
+
+ {/* Friends Grid Skeleton */}
+
+ {[1, 2, 3, 4, 5, 6].map((i) => (
+
+
+
+
+
+
+
+
+ ))}
+
+
+ );
+};
diff --git a/web/pages/Friends.tsx b/web/pages/Friends.tsx
index 039eb5db..62810544 100644
--- a/web/pages/Friends.tsx
+++ b/web/pages/Friends.tsx
@@ -1,6 +1,7 @@
import { AnimatePresence, motion } from 'framer-motion';
import { ArrowRight, Search, TrendingDown, TrendingUp, Users } from 'lucide-react';
import { useEffect, useState } from 'react';
+import { FriendsSkeleton } from '../components/skeletons/FriendsSkeleton';
import { EmptyState } from '../components/ui/EmptyState';
import { THEMES } from '../constants';
import { useTheme } from '../contexts/ThemeContext';
@@ -119,6 +120,10 @@ export const Friends = () => {
const isNeo = style === THEMES.NEOBRUTALISM;
+ if (loading) {
+ return