diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx
index 3d66a3c56..9e8f04cf4 100644
--- a/apps/web/src/app/projects/page.tsx
+++ b/apps/web/src/app/projects/page.tsx
@@ -18,6 +18,7 @@ import { useRouter } from "next/navigation";
import { useCallback, useEffect, useState } from "react";
import { DeleteProjectDialog } from "@/components/delete-project-dialog";
import { RenameProjectDialog } from "@/components/rename-project-dialog";
+import { ThemeToggle } from "@/components/theme-toggle";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import { Checkbox } from "@/components/ui/checkbox";
@@ -215,6 +216,7 @@ export default function ProjectsPage() {
Select Projects
+
)}
diff --git a/apps/web/src/components/theme-toggle.tsx b/apps/web/src/components/theme-toggle.tsx
index 8302a19c6..b843b318a 100644
--- a/apps/web/src/components/theme-toggle.tsx
+++ b/apps/web/src/components/theme-toggle.tsx
@@ -3,6 +3,7 @@
import { Button } from "./ui/button";
import { Sun, Moon } from "lucide-react";
import { useTheme } from "next-themes";
+import { useEffect, useState } from "react";
interface ThemeToggleProps {
className?: string;
@@ -10,16 +11,27 @@ interface ThemeToggleProps {
export function ThemeToggle({ className }: ThemeToggleProps) {
const { theme, setTheme } = useTheme();
+ const [mounted, setMounted] = useState(false);
+
+ // Wait for client-side render to avoid hydration mismatch
+ useEffect(() => setMounted(true), []);
+
+ if (!mounted) return null; // don't render on the server
return (
);
-}
+}
\ No newline at end of file