diff --git a/app/(app)/[owner]/[repo]/actions/error.tsx b/app/(app)/[owner]/[repo]/actions/error.tsx
new file mode 100644
index 00000000..e649aa80
--- /dev/null
+++ b/app/(app)/[owner]/[repo]/actions/error.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
+import { Button } from "@/components/ui/button";
+
+interface ErrorProps {
+ error: Error & { digest?: string };
+ reset: () => void;
+}
+
+export default function Error({ error, reset }: ErrorProps) {
+ return (
+
+
+ Something went wrong
+ {error.message}
+
+
+
+ );
+}
diff --git a/app/(app)/[owner]/[repo]/actions/loading.tsx b/app/(app)/[owner]/[repo]/actions/loading.tsx
new file mode 100644
index 00000000..0f41d747
--- /dev/null
+++ b/app/(app)/[owner]/[repo]/actions/loading.tsx
@@ -0,0 +1,11 @@
+import { SkeletonBlock } from "@/components/ui/skeleton";
+
+export default function Loading() {
+ return (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ );
+}
diff --git a/app/(app)/[owner]/[repo]/commits/loading.tsx b/app/(app)/[owner]/[repo]/commits/loading.tsx
new file mode 100644
index 00000000..4b200817
--- /dev/null
+++ b/app/(app)/[owner]/[repo]/commits/loading.tsx
@@ -0,0 +1,11 @@
+import { SkeletonBlock } from "@/components/ui/skeleton";
+
+export default function Loading() {
+ return (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ );
+}
diff --git a/app/(app)/[owner]/[repo]/issues/error.tsx b/app/(app)/[owner]/[repo]/issues/error.tsx
new file mode 100644
index 00000000..e649aa80
--- /dev/null
+++ b/app/(app)/[owner]/[repo]/issues/error.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
+import { Button } from "@/components/ui/button";
+
+interface ErrorProps {
+ error: Error & { digest?: string };
+ reset: () => void;
+}
+
+export default function Error({ error, reset }: ErrorProps) {
+ return (
+
+
+ Something went wrong
+ {error.message}
+
+
+
+ );
+}
diff --git a/app/(app)/[owner]/[repo]/issues/loading.tsx b/app/(app)/[owner]/[repo]/issues/loading.tsx
new file mode 100644
index 00000000..0f41d747
--- /dev/null
+++ b/app/(app)/[owner]/[repo]/issues/loading.tsx
@@ -0,0 +1,11 @@
+import { SkeletonBlock } from "@/components/ui/skeleton";
+
+export default function Loading() {
+ return (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ );
+}
diff --git a/app/(app)/[owner]/[repo]/pulls/error.tsx b/app/(app)/[owner]/[repo]/pulls/error.tsx
new file mode 100644
index 00000000..e649aa80
--- /dev/null
+++ b/app/(app)/[owner]/[repo]/pulls/error.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
+import { Button } from "@/components/ui/button";
+
+interface ErrorProps {
+ error: Error & { digest?: string };
+ reset: () => void;
+}
+
+export default function Error({ error, reset }: ErrorProps) {
+ return (
+
+
+ Something went wrong
+ {error.message}
+
+
+
+ );
+}
diff --git a/app/(app)/[owner]/[repo]/pulls/loading.tsx b/app/(app)/[owner]/[repo]/pulls/loading.tsx
new file mode 100644
index 00000000..0f41d747
--- /dev/null
+++ b/app/(app)/[owner]/[repo]/pulls/loading.tsx
@@ -0,0 +1,11 @@
+import { SkeletonBlock } from "@/components/ui/skeleton";
+
+export default function Loading() {
+ return (
+
+ {Array.from({ length: 5 }).map((_, i) => (
+
+ ))}
+
+ );
+}