diff --git a/shared/components/AsyncComponent.tsx b/shared/components/AsyncComponent.tsx
new file mode 100644
index 00000000..f2ec9816
--- /dev/null
+++ b/shared/components/AsyncComponent.tsx
@@ -0,0 +1,282 @@
+// ========================================
+// Async Component Pattern
+// ========================================
+// Standard pattern for loading/error/empty states
+
+import React, { ReactNode } from 'react';
+import { Card, CardContent } from '@/components/ui/card';
+import { Alert, AlertDescription } from '@/components/ui/alert';
+import { Button } from '@/components/ui/button';
+import { Loader2, AlertCircle, Inbox, RefreshCw } from 'lucide-react';
+
+// ========================================
+// LOADING SKELETON
+// ========================================
+
+export const CardSkeleton: React.FC = () => {
+ return (
+
{message}
+{errorMessage}
+ )} + {onRetry && ( + + )} +{description}
} +