diff --git a/.eslintrc.ts b/.eslintrc.ts
deleted file mode 100644
index 2665bd73f5..0000000000
--- a/.eslintrc.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-module.exports = {
-	root: true,
-	// This tells ESLint to load the config from the package `eslint-config-custom`
-	extends: ["custom"],
-	settings: {
-		next: {
-			rootDir: ["apps/*/"],
-		},
-	},
-};
diff --git a/apps/web/app/(org)/dashboard/_components/Notifications/NotificationHeader.tsx b/apps/web/app/(org)/dashboard/_components/Notifications/NotificationHeader.tsx
index 3ec71b6457..79adcd26e2 100644
--- a/apps/web/app/(org)/dashboard/_components/Notifications/NotificationHeader.tsx
+++ b/apps/web/app/(org)/dashboard/_components/Notifications/NotificationHeader.tsx
@@ -1,39 +1,34 @@
 import { faCheckDouble } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { useQueryClient } from "@tanstack/react-query";
+import { useMutation, useQueryClient } from "@tanstack/react-query";
 import clsx from "clsx";
-import { useState } from "react";
 import { toast } from "sonner";
 import { markAsRead } from "@/actions/notifications/mark-as-read";
 
 export const NotificationHeader = () => {
-	const [loading, setLoading] = useState(false);
 	const queryClient = useQueryClient();
-
-	const markAsReadHandler = async () => {
-		try {
-			setLoading(true);
-			await markAsRead();
+	const mutation = useMutation({
+		mutationFn: () => markAsRead(),
+		onSuccess: () => {
 			toast.success("Notifications marked as read");
 			queryClient.invalidateQueries({
 				queryKey: ["notifications"],
 			});
-		} catch (error) {
+		},
+		onError: (error) => {
 			console.error("Error marking notifications as read:", error);
 			toast.error("Failed to mark notifications as read");
-		} finally {
-			setLoading(false);
-		}
-	};
+		},
+	});
 
 	return (
 		<div className="flex justify-between items-center px-6 py-3 rounded-t-xl border bg-gray-3 border-gray-4">
 			<p className="text-md text-gray-12">Notifications</p>
 			<div
-				onClick={markAsReadHandler}
+				onClick={() => mutation.mutate()}
 				className={clsx(
 					"flex gap-1 items-center transition-opacity duration-200 cursor-pointer hover:opacity-70",
-					loading ? "opacity-50 cursor-not-allowed" : "",
+					mutation.isPending ? "opacity-50 cursor-not-allowed" : "",
 				)}
 			>
 				<FontAwesomeIcon
diff --git a/apps/web/app/(org)/dashboard/caps/Caps.tsx b/apps/web/app/(org)/dashboard/caps/Caps.tsx
index 3e34fc6e56..6a822dc065 100644
--- a/apps/web/app/(org)/dashboard/caps/Caps.tsx
+++ b/apps/web/app/(org)/dashboard/caps/Caps.tsx
@@ -244,21 +244,21 @@ export const Caps = ({
 
 			return yield* fiber.await.pipe(Effect.flatten);
 		}),
-		onSuccess: Effect.fn(function* () {
+		onSuccess: () => {
 			setSelectedCaps([]);
 			router.refresh();
-		}),
+		},
 	});
 
 	const deleteCap = useEffectMutation({
 		mutationFn: (id: Video.VideoId) => withRpc((r) => r.VideoDelete(id)),
-		onSuccess: Effect.fn(function* () {
+		onSuccess: () => {
 			toast.success("Cap deleted successfully");
 			router.refresh();
-		}),
-		onError: Effect.fn(function* () {
+		},
+		onError: () => {
 			toast.error("Failed to delete cap");
-		}),
+		},
 	});
 
 	if (count === 0) return <EmptyCapState />;
diff --git a/apps/web/app/(org)/dashboard/caps/components/CapCard/CapCard.tsx b/apps/web/app/(org)/dashboard/caps/components/CapCard/CapCard.tsx
index edd2b0c96e..60a366cde3 100644
--- a/apps/web/app/(org)/dashboard/caps/components/CapCard/CapCard.tsx
+++ b/apps/web/app/(org)/dashboard/caps/components/CapCard/CapCard.tsx
@@ -17,6 +17,7 @@ import {
 	faVideo,
 } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useMutation } from "@tanstack/react-query";
 import clsx from "clsx";
 import Link from "next/link";
 import { useRouter } from "next/navigation";
@@ -27,7 +28,7 @@ import { ConfirmationDialog } from "@/app/(org)/dashboard/_components/Confirmati
 import { useDashboardContext } from "@/app/(org)/dashboard/Contexts";
 import { Tooltip } from "@/components/Tooltip";
 import { VideoThumbnail } from "@/components/VideoThumbnail";
-import { EffectRuntime } from "@/lib/EffectRuntime";
+import { useEffectMutation } from "@/lib/EffectRuntime";
 import { withRpc } from "@/lib/Rpcs";
 import { PasswordDialog } from "../PasswordDialog";
 import { SharingDialog } from "../SharingDialog";
@@ -97,31 +98,50 @@ export const CapCard = ({
 	);
 	const [copyPressed, setCopyPressed] = useState(false);
 	const [isDragging, setIsDragging] = useState(false);
-	const [isDownloading, setIsDownloading] = useState(false);
 	const { isSubscribed, setUpgradeModalOpen } = useDashboardContext();
 
 	const [confirmOpen, setConfirmOpen] = useState(false);
-	const [removing, setRemoving] = useState(false);
 
 	const router = useRouter();
 
-	const handleDeleteClick = (e: React.MouseEvent) => {
-		e.stopPropagation();
-		setConfirmOpen(true);
-	};
-
-	const confirmRemoveCap = async () => {
-		if (!onDelete) return;
-		try {
-			setRemoving(true);
-			await onDelete();
-		} catch (error) {
+	const downloadMutation = useMutation({
+		mutationFn: async () => {
+			const response = await downloadVideo(cap.id);
+			if (response.success && response.downloadUrl) {
+				const fetchResponse = await fetch(response.downloadUrl);
+				const blob = await fetchResponse.blob();
+
+				const blobUrl = window.URL.createObjectURL(blob);
+				const link = document.createElement("a");
+				link.href = blobUrl;
+				link.download = response.filename;
+				link.style.display = "none";
+				document.body.appendChild(link);
+				link.click();
+				document.body.removeChild(link);
+
+				window.URL.revokeObjectURL(blobUrl);
+			} else {
+				throw new Error("Failed to get download URL");
+			}
+		},
+	});
+
+	const deleteMutation = useMutation({
+		mutationFn: async () => {
+			await onDelete?.();
+		},
+		onError: (error) => {
 			console.error("Error deleting cap:", error);
-		} finally {
-			setRemoving(false);
+		},
+		onSettled: () => {
 			setConfirmOpen(false);
-		}
-	};
+		},
+	});
+
+	const duplicateMutation = useEffectMutation({
+		mutationFn: () => withRpc((r) => r.VideoDuplicate(cap.id)),
+	});
 
 	const handleSharingUpdated = () => {
 		router.refresh();
@@ -197,45 +217,18 @@ export const CapCard = ({
 	};
 
 	const handleDownload = async () => {
-		if (isDownloading) return;
-
-		setIsDownloading(true);
-
-		try {
-			toast.promise(
-				downloadVideo(cap.id).then(async (response) => {
-					if (response.success && response.downloadUrl) {
-						const fetchResponse = await fetch(response.downloadUrl);
-						const blob = await fetchResponse.blob();
-
-						const blobUrl = window.URL.createObjectURL(blob);
-						const link = document.createElement("a");
-						link.href = blobUrl;
-						link.download = response.filename;
-						link.style.display = "none";
-						document.body.appendChild(link);
-						link.click();
-						document.body.removeChild(link);
-
-						window.URL.revokeObjectURL(blobUrl);
-					}
-				}),
-				{
-					loading: "Preparing download...",
-					success: "Download started successfully",
-					error: (error) => {
-						if (error instanceof Error) {
-							return error.message;
-						}
-						return "Failed to download video - please try again.";
-					},
-				},
-			);
-		} catch (error) {
-			console.error("Download error:", error);
-		} finally {
-			setIsDownloading(false);
-		}
+		if (downloadMutation.isPending) return;
+
+		toast.promise(downloadMutation.mutateAsync(), {
+			loading: "Preparing download...",
+			success: "Download started successfully",
+			error: (error) => {
+				if (error instanceof Error) {
+					return error.message;
+				}
+				return "Failed to download video - please try again.";
+			},
+		});
 	};
 
 	const handleCardClick = (e: React.MouseEvent) => {
@@ -308,7 +301,7 @@ export const CapCard = ({
 						<CapCardButtons
 							capId={cap.id}
 							copyPressed={copyPressed}
-							isDownloading={isDownloading}
+							isDownloading={downloadMutation.isPending}
 							customDomain={customDomain}
 							domainVerified={domainVerified}
 							handleCopy={handleCopy}
@@ -340,17 +333,14 @@ export const CapCard = ({
 
 							<DropdownMenuContent align="end" sideOffset={5}>
 								<DropdownMenuItem
-									onClick={async () => {
-										try {
-											await EffectRuntime.runPromise(
-												withRpc((r) => r.VideoDuplicate(cap.id)),
-											);
-											toast.success("Cap duplicated successfully");
-											router.refresh();
-										} catch (error) {
-											toast.error("Failed to duplicate cap");
-										}
-									}}
+									onClick={() =>
+										toast.promise(duplicateMutation.mutateAsync(), {
+											loading: "Duplicating cap...",
+											success: "Cap duplicated successfully",
+											error: "Failed to duplicate cap",
+										})
+									}
+									disabled={duplicateMutation.isPending}
 									className="flex gap-2 items-center rounded-lg"
 								>
 									<FontAwesomeIcon className="size-3" icon={faCopy} />
@@ -376,7 +366,8 @@ export const CapCard = ({
 								</DropdownMenuItem>
 								<DropdownMenuItem
 									onClick={(e) => {
-										handleDeleteClick(e);
+										e.stopPropagation();
+										setConfirmOpen(true);
 									}}
 									className="flex gap-2 items-center rounded-lg"
 								>
@@ -392,8 +383,8 @@ export const CapCard = ({
 							description={`Are you sure you want to delete the cap "${cap.name}"? This action cannot be undone.`}
 							confirmLabel="Delete"
 							cancelLabel="Cancel"
-							loading={removing}
-							onConfirm={confirmRemoveCap}
+							loading={deleteMutation.isPending}
+							onConfirm={() => deleteMutation.mutate()}
 							onCancel={() => setConfirmOpen(false)}
 						/>
 					</div>
diff --git a/apps/web/app/(org)/dashboard/caps/components/Folder.tsx b/apps/web/app/(org)/dashboard/caps/components/Folder.tsx
index 0063b7e1ee..8b6eb67318 100644
--- a/apps/web/app/(org)/dashboard/caps/components/Folder.tsx
+++ b/apps/web/app/(org)/dashboard/caps/components/Folder.tsx
@@ -3,6 +3,7 @@ import type { Folder } from "@cap/web-domain";
 import { faTrash } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
 import { Fit, Layout, useRive } from "@rive-app/react-canvas";
+import { useMutation } from "@tanstack/react-query";
 import clsx from "clsx";
 import { Effect } from "effect";
 import Link from "next/link";
@@ -45,6 +46,7 @@ const FolderCard = ({
 	const [isDragOver, setIsDragOver] = useState(false);
 	const [isMovingVideo, setIsMovingVideo] = useState(false);
 	const { activeOrganization } = useDashboardContext();
+
 	// Use a ref to track drag state to avoid re-renders during animation
 	const dragStateRef = useRef({
 		isDragging: false,
@@ -73,16 +75,14 @@ const FolderCard = ({
 
 	const deleteFolder = useEffectMutation({
 		mutationFn: (id: Folder.FolderId) => withRpc((r) => r.FolderDelete(id)),
-		onSuccess: Effect.fn(function* () {
+		onSuccess: () => {
 			router.refresh();
 			toast.success("Folder deleted successfully");
-		}),
-		onError: Effect.fn(function* () {
-			toast.error("Failed to delete folder");
-		}),
-		onSettled: Effect.fn(function* () {
 			setConfirmDeleteFolderOpen(false);
-		}),
+		},
+		onError: () => {
+			toast.error("Failed to delete folder");
+		},
 	});
 
 	useEffect(() => {
diff --git a/apps/web/app/(org)/dashboard/caps/components/SelectedCapsBar.tsx b/apps/web/app/(org)/dashboard/caps/components/SelectedCapsBar.tsx
index e980e6e37d..57c035959d 100644
--- a/apps/web/app/(org)/dashboard/caps/components/SelectedCapsBar.tsx
+++ b/apps/web/app/(org)/dashboard/caps/components/SelectedCapsBar.tsx
@@ -25,10 +25,6 @@ export const SelectedCapsBar = ({
 }: SelectedCapsBarProps) => {
 	const [confirmOpen, setConfirmOpen] = useState(false);
 
-	const handleDeleteClick = () => {
-		setConfirmOpen(true);
-	};
-
 	const handleConfirmDelete = async () => {
 		await deleteSelectedCaps();
 		setConfirmOpen(false);
@@ -71,7 +67,7 @@ export const SelectedCapsBar = ({
 						</Button>
 						<Button
 							variant="destructive"
-							onClick={handleDeleteClick}
+							onClick={() => setConfirmOpen(true)}
 							disabled={isDeleting}
 							className="size-[40px] min-w-[unset] p-0"
 							spinner={isDeleting}
diff --git a/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx b/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx
index c7033ee4f2..1375f9dba1 100644
--- a/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx
+++ b/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx
@@ -11,6 +11,7 @@ import {
 } from "@cap/ui";
 import { faCopy, faShareNodes } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useMutation } from "@tanstack/react-query";
 import clsx from "clsx";
 import { motion } from "framer-motion";
 import { Check, Globe2, Search } from "lucide-react";
@@ -55,60 +56,28 @@ export const SharingDialog: React.FC<SharingDialogProps> = ({
 	const [initialSelectedSpaces, setInitialSelectedSpaces] = useState<
 		Set<string>
 	>(new Set());
-	const [loading, setLoading] = useState(false);
 	const [publicToggle, setPublicToggle] = useState(isPublic);
 	const [initialPublicState, setInitialPublicState] = useState(isPublic);
 	const tabs = ["Share", "Embed"] as const;
 	const [activeTab, setActiveTab] = useState<(typeof tabs)[number]>("Share");
 
-	const sharedSpaceIds = new Set(sharedSpaces?.map((space) => space.id) || []);
-
-	useEffect(() => {
-		if (isOpen && sharedSpaces) {
-			const spaceIds = new Set(sharedSpaces.map((space) => space.id));
-			setSelectedSpaces(spaceIds);
-			setInitialSelectedSpaces(spaceIds);
-			setPublicToggle(isPublic);
-			setInitialPublicState(isPublic);
-			setSearchTerm("");
-			setActiveTab(tabs[0]);
-		}
-	}, [isOpen, sharedSpaces, isPublic]);
-
-	const isSpaceSharedViaOrganization = useCallback(
-		(spaceId: string) => {
-			const space = spacesData?.find((s) => s.id === spaceId);
-			if (!space) return false;
-			return sharedSpaceIds.has(space.id);
-		},
-		[spacesData, sharedSpaceIds],
-	);
-
-	const handleToggleSpace = (spaceId: string) => {
-		setSelectedSpaces((prev) => {
-			const newSet = new Set(prev);
-			if (newSet.has(spaceId)) {
-				newSet.delete(spaceId);
-			} else {
-				newSet.add(spaceId);
-			}
-			return newSet;
-		});
-	};
-
-	const handleSave = async () => {
-		try {
-			setLoading(true);
-			const result = await shareCap({
-				capId,
-				spaceIds: Array.from(selectedSpaces),
-				public: publicToggle,
-			});
+	const updateSharing = useMutation({
+		mutationFn: async ({
+			capId,
+			spaceIds,
+			public: isPublic,
+		}: {
+			capId: string;
+			spaceIds: string[];
+			public: boolean;
+		}) => {
+			const result = await shareCap({ capId, spaceIds, public: isPublic });
 
 			if (!result.success) {
 				throw new Error(result.error || "Failed to update sharing settings");
 			}
-
+		},
+		onSuccess: () => {
 			const newSelectedSpaces = Array.from(selectedSpaces);
 			const initialSpaces = Array.from(initialSelectedSpaces);
 
@@ -171,11 +140,45 @@ export const SharingDialog: React.FC<SharingDialogProps> = ({
 			}
 			onSharingUpdated(newSelectedSpaces);
 			onClose();
-		} catch (error) {
+		},
+		onError: () => {
 			toast.error("Failed to update sharing settings");
-		} finally {
-			setLoading(false);
+		},
+	});
+
+	const sharedSpaceIds = new Set(sharedSpaces?.map((space) => space.id) || []);
+
+	useEffect(() => {
+		if (isOpen && sharedSpaces) {
+			const spaceIds = new Set(sharedSpaces.map((space) => space.id));
+			setSelectedSpaces(spaceIds);
+			setInitialSelectedSpaces(spaceIds);
+			setPublicToggle(isPublic);
+			setInitialPublicState(isPublic);
+			setSearchTerm("");
+			setActiveTab(tabs[0]);
 		}
+	}, [isOpen, sharedSpaces, isPublic]);
+
+	const isSpaceSharedViaOrganization = useCallback(
+		(spaceId: string) => {
+			const space = spacesData?.find((s) => s.id === spaceId);
+			if (!space) return false;
+			return sharedSpaceIds.has(space.id);
+		},
+		[spacesData, sharedSpaceIds],
+	);
+
+	const handleToggleSpace = (spaceId: string) => {
+		setSelectedSpaces((prev) => {
+			const newSet = new Set(prev);
+			if (newSet.has(spaceId)) {
+				newSet.delete(spaceId);
+			} else {
+				newSet.add(spaceId);
+			}
+			return newSet;
+		});
 	};
 
 	const handleCopyEmbedCode = async () => {
@@ -347,13 +350,19 @@ export const SharingDialog: React.FC<SharingDialogProps> = ({
 								Cancel
 							</Button>
 							<Button
-								spinner={loading}
-								disabled={loading}
+								spinner={updateSharing.isPending}
+								disabled={updateSharing.isPending}
 								size="sm"
 								variant="dark"
-								onClick={handleSave}
+								onClick={() =>
+									updateSharing.mutate({
+										capId,
+										spaceIds: Array.from(selectedSpaces),
+										public: publicToggle,
+									})
+								}
 							>
-								{loading ? "Saving..." : "Save"}
+								{updateSharing.isPending ? "Saving..." : "Save"}
 							</Button>
 						</>
 					) : (
diff --git a/apps/web/app/(org)/dashboard/folder/[id]/components/FolderVideosSection.tsx b/apps/web/app/(org)/dashboard/folder/[id]/components/FolderVideosSection.tsx
index b852095050..f996f5652d 100644
--- a/apps/web/app/(org)/dashboard/folder/[id]/components/FolderVideosSection.tsx
+++ b/apps/web/app/(org)/dashboard/folder/[id]/components/FolderVideosSection.tsx
@@ -87,10 +87,10 @@ export default function FolderVideosSection({
 
 			return yield* fiber.await.pipe(Effect.flatten);
 		}),
-		onSuccess: Effect.fn(function* () {
+		onSuccess: () => {
 			setSelectedCaps([]);
 			router.refresh();
-		}),
+		},
 	});
 
 	const handleCapSelection = (capId: Video.VideoId) => {
diff --git a/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomain.tsx b/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomain.tsx
index 1c2a42741a..f895c8a006 100644
--- a/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomain.tsx
+++ b/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomain.tsx
@@ -4,6 +4,7 @@ import {
 	faGlobe,
 } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useMutation } from "@tanstack/react-query";
 import clsx from "clsx";
 import { CheckCircle, XCircle } from "lucide-react";
 import { useRouter } from "next/navigation";
@@ -25,29 +26,32 @@ export function CustomDomain() {
 	const [isVerified, setIsVerified] = useState(
 		!!activeOrganization?.organization.domainVerified,
 	);
-	const [loading, setLoading] = useState(false);
 
 	const orgCustomDomain = activeOrganization?.organization.customDomain;
 
-	const handleRemoveDomain = async () => {
-		if (!isSubscribed) {
-			setShowUpgradeModal(true);
-			return;
-		}
-		setLoading(true);
-		try {
-			await removeOrganizationDomain(
-				activeOrganization?.organization.id as string,
-			);
-
+	const removeDomainMutation = useMutation({
+		mutationFn: (organizationId: string) =>
+			removeOrganizationDomain(organizationId),
+		onSuccess: () => {
 			setIsVerified(false);
 			toast.success("Custom domain removed");
 			router.refresh();
-		} catch (error) {
+			setConfirmOpen(false);
+		},
+		onError: () => {
 			toast.error("Failed to remove domain");
-		} finally {
-			setLoading(false);
 			setConfirmOpen(false);
+		},
+	});
+
+	const handleRemoveDomain = () => {
+		if (!isSubscribed) {
+			setShowUpgradeModal(true);
+			return;
+		}
+
+		if (activeOrganization?.organization.id) {
+			removeDomainMutation.mutate(activeOrganization.organization.id);
 		}
 	};
 
@@ -70,7 +74,7 @@ export function CustomDomain() {
 				onConfirm={handleRemoveDomain}
 				confirmLabel="Remove"
 				cancelLabel="Cancel"
-				loading={loading}
+				loading={removeDomainMutation.isPending}
 				onCancel={() => setConfirmOpen(false)}
 			/>
 			<div className="flex gap-3 justify-between items-center w-full h-fit">
@@ -141,8 +145,8 @@ export function CustomDomain() {
 					type="submit"
 					size="sm"
 					className="min-w-fit"
-					spinner={loading}
-					disabled={loading}
+					spinner={removeDomainMutation.isPending}
+					disabled={removeDomainMutation.isPending}
 					variant="dark"
 					onClick={async (e) => {
 						e.preventDefault();
diff --git a/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomainDialog/CustomDomainDialog.tsx b/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomainDialog/CustomDomainDialog.tsx
index 63461843a5..d8457aee6e 100644
--- a/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomainDialog/CustomDomainDialog.tsx
+++ b/apps/web/app/(org)/dashboard/settings/organization/components/CustomDomainDialog/CustomDomainDialog.tsx
@@ -8,6 +8,7 @@ import {
 } from "@cap/ui";
 import { faGlobe, faRefresh } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useMutation } from "@tanstack/react-query";
 import { useRouter } from "next/navigation";
 import { useEffect, useReducer, useRef, useState } from "react";
 import { toast } from "sonner";
@@ -133,16 +134,85 @@ const CustomDomainDialog = ({
 	const [domain, setDomain] = useState(
 		activeOrganization?.organization.customDomain || "",
 	);
-	const [verifying, setVerifying] = useState(false);
 	const [domainConfig, setDomainConfig] = useState<DomainConfig | null>(null);
-	const [initialConfigLoading, setInitialConfigLoading] = useState(false);
-	const [loading, setLoading] = useState(false);
 	const router = useRouter();
 	const dialogRef = useRef<HTMLDivElement | null>(null);
 	const confettiRef = useRef<ConfettiRef>(null);
 
 	const pollInterval = useRef<NodeJS.Timeout>();
 
+	// Mutation for updating domain
+	const updateDomainMutation = useMutation({
+		mutationFn: async ({
+			domain,
+			orgId,
+		}: {
+			domain: string;
+			orgId: string;
+		}) => {
+			if (activeOrganization?.organization.customDomain) {
+				await removeOrganizationDomain(orgId);
+			}
+			return await updateDomain(domain, orgId);
+		},
+		onSuccess: (data) => {
+			handleNext();
+			toast.success("Domain settings updated");
+			router.refresh();
+			if (data) {
+				setIsVerified(data.verified);
+			}
+		},
+		onError: (error) => {
+			toast.error(
+				error instanceof Error
+					? error.message
+					: "Failed to update domain settings",
+			);
+		},
+	});
+
+	// Mutation for checking domain verification
+	const checkDomainMutation = useMutation({
+		mutationFn: async ({
+			orgId,
+			showToasts,
+		}: {
+			orgId: string;
+			showToasts: boolean;
+		}) => {
+			return { data: await checkOrganizationDomain(orgId), showToasts };
+		},
+		onSuccess: ({ data, showToasts }) => {
+			setIsVerified(data.verified);
+			setDomainConfig(data.config);
+
+			if (data.verified) {
+				handleNext();
+			}
+
+			// Only show toasts if explicitly requested
+			if (showToasts) {
+				if (data.verified) {
+					toast.success("Domain is verified!");
+					if (pollInterval.current) {
+						clearInterval(pollInterval.current);
+						pollInterval.current = undefined;
+					}
+				} else {
+					toast.error(
+						"Domain is not verified. Please check your DNS settings.",
+					);
+				}
+			}
+		},
+		onError: (error, { showToasts }) => {
+			if (showToasts) {
+				toast.error("Failed to check domain verification");
+			}
+		},
+	});
+
 	const [stepState, dispatch] = useReducer(stepReducer, {
 		currentIndex: 0,
 		totalSteps: STEP_CONFIGS.length,
@@ -233,39 +303,12 @@ const CustomDomainDialog = ({
 		}
 
 		dispatch({ type: "CLEAR_ERROR", payload: "domain" });
-
-		setLoading(true);
 		setDomain(cleanedDomain);
 
-		try {
-			if (activeOrganization?.organization.customDomain) {
-				await removeOrganizationDomain(
-					activeOrganization?.organization.id as string,
-				);
-			}
-
-			const data = await updateDomain(
-				cleanedDomain,
-				activeOrganization?.organization.id as string,
-			);
-
-			handleNext();
-
-			toast.success("Domain settings updated");
-			router.refresh();
-
-			if (data) {
-				setIsVerified(data.verified);
-			}
-		} catch (error) {
-			toast.error(
-				error instanceof Error
-					? error.message
-					: "Failed to update domain settings",
-			);
-		} finally {
-			setLoading(false);
-		}
+		updateDomainMutation.mutate({
+			domain: cleanedDomain,
+			orgId: activeOrganization?.organization.id as string,
+		});
 	};
 
 	const checkVerification = async (showToasts = true) => {
@@ -275,46 +318,10 @@ const CustomDomainDialog = ({
 		)
 			return;
 
-		setVerifying(true);
-
-		try {
-			if (domainConfig === null) {
-				setInitialConfigLoading(true);
-			}
-
-			const data = await checkOrganizationDomain(
-				activeOrganization.organization.id,
-			);
-
-			setIsVerified(data.verified);
-			setDomainConfig(data.config);
-
-			if (data.verified) {
-				handleNext();
-			}
-
-			if (showToasts) {
-				if (data.verified) {
-					toast.success("Domain is verified!");
-
-					if (pollInterval.current) {
-						clearInterval(pollInterval.current);
-						pollInterval.current = undefined;
-					}
-				} else {
-					toast.error(
-						"Domain is not verified. Please check your DNS settings.",
-					);
-				}
-			}
-		} catch (error) {
-			if (showToasts) {
-				toast.error("Failed to check domain verification");
-			}
-		} finally {
-			setVerifying(false);
-			setInitialConfigLoading(false);
-		}
+		checkDomainMutation.mutate({
+			orgId: activeOrganization.organization.id,
+			showToasts,
+		});
 	};
 
 	const handleClose = () => {
@@ -371,7 +378,7 @@ const CustomDomainDialog = ({
 								<DomainStep
 									domain={domain}
 									setDomain={setDomain}
-									submitLoading={loading}
+									submitLoading={updateDomainMutation.isPending}
 									onSubmit={handleDomainSubmit}
 									error={stepState.errors.domain}
 									onClearError={() =>
@@ -384,7 +391,9 @@ const CustomDomainDialog = ({
 							{currentStep.id === "verify" && (
 								<VerifyStep
 									domain={domain}
-									initialConfigLoading={initialConfigLoading}
+									initialConfigLoading={
+										checkDomainMutation.isPending && domainConfig === null
+									}
 									domainConfig={domainConfig}
 									checkVerification={checkVerification}
 									isVerified={isVerified}
@@ -404,10 +413,10 @@ const CustomDomainDialog = ({
 									variant="gray"
 									size="sm"
 									onClick={() => checkVerification(false)}
-									disabled={verifying}
+									disabled={checkDomainMutation.isPending}
 									className="min-w-[100px]"
 								>
-									{verifying ? (
+									{checkDomainMutation.isPending ? (
 										<FontAwesomeIcon
 											className="mr-1 opacity-70 animate-spin size-3.5"
 											icon={faRefresh}
@@ -428,8 +437,10 @@ const CustomDomainDialog = ({
 										<Button
 											onClick={handleDomainSubmit}
 											size="sm"
-											spinner={loading}
-											disabled={loading || !domain.trim()}
+											spinner={updateDomainMutation.isPending}
+											disabled={
+												updateDomainMutation.isPending || !domain.trim()
+											}
 											variant="dark"
 											className="min-w-[100px]"
 										>
diff --git a/apps/web/app/(org)/login/form.tsx b/apps/web/app/(org)/login/form.tsx
index 1ee6e6a40e..f174300b0a 100644
--- a/apps/web/app/(org)/login/form.tsx
+++ b/apps/web/app/(org)/login/form.tsx
@@ -8,6 +8,7 @@ import {
 	faExclamationCircle,
 } from "@fortawesome/free-solid-svg-icons";
 import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useMutation } from "@tanstack/react-query";
 import { AnimatePresence, motion } from "framer-motion";
 import Cookies from "js-cookie";
 import { LucideArrowUpRight } from "lucide-react";
@@ -29,14 +30,44 @@ export function LoginForm() {
 	const searchParams = useSearchParams();
 	const next = searchParams?.get("next");
 	const [email, setEmail] = useState("");
-	const [loading, setLoading] = useState(false);
-	const [emailSent, setEmailSent] = useState(false);
 	const [oauthError, setOauthError] = useState(false);
 	const [showOrgInput, setShowOrgInput] = useState(false);
 	const [organizationId, setOrganizationId] = useState("");
 	const [organizationName, setOrganizationName] = useState<string | null>(null);
 	const theme = Cookies.get("theme") || "light";
 
+	const emailSignInMutation = useMutation({
+		mutationFn: async (email: string) => {
+			trackEvent("auth_started", {
+				method: "email",
+				is_signup: !oauthError,
+			});
+
+			const result = await signIn("email", {
+				email,
+				redirect: false,
+				...(next && next.length > 0 ? { callbackUrl: next } : {}),
+			});
+
+			if (!result?.ok || result?.error) {
+				throw new Error("Failed to send email");
+			}
+
+			return result;
+		},
+		onSuccess: () => {
+			trackEvent("auth_email_sent", {
+				email_domain: email.split("@")[1],
+			});
+			toast.success("Email sent - check your inbox!");
+		},
+		onError: () => {
+			toast.error("Error sending email - try again?");
+		},
+	});
+
+	const emailSent = emailSignInMutation.isSuccess;
+
 	useEffect(() => {
 		theme === "dark"
 			? (document.body.className = "dark")
@@ -243,35 +274,7 @@ export function LoginForm() {
 											e.preventDefault();
 											if (!email) return;
 
-											setLoading(true);
-											trackEvent("auth_started", {
-												method: "email",
-												is_signup: !oauthError,
-											});
-											signIn("email", {
-												email,
-												redirect: false,
-												...(next && next.length > 0
-													? { callbackUrl: next }
-													: {}),
-											})
-												.then((res) => {
-													setLoading(false);
-													if (res?.ok && !res?.error) {
-														setEmailSent(true);
-														trackEvent("auth_email_sent", {
-															email_domain: email.split("@")[1],
-														});
-														toast.success("Email sent - check your inbox!");
-													} else {
-														toast.error("Error sending email - try again?");
-													}
-												})
-												.catch(() => {
-													setEmailSent(false);
-													setLoading(false);
-													toast.error("Error sending email - try again?");
-												});
+											emailSignInMutation.mutate(email);
 										}}
 										className="flex flex-col space-y-3"
 									>
@@ -280,7 +283,7 @@ export function LoginForm() {
 											email={email}
 											emailSent={emailSent}
 											setEmail={setEmail}
-											loading={loading}
+											loading={emailSignInMutation.isPending}
 											oauthError={oauthError}
 											handleGoogleSignIn={handleGoogleSignIn}
 										/>
@@ -317,9 +320,8 @@ export function LoginForm() {
 							layout
 							className="pt-3 mx-auto text-sm underline text-gray-10 hover:text-gray-8"
 							onClick={() => {
-								setEmailSent(false);
 								setEmail("");
-								setLoading(false);
+								emailSignInMutation.reset();
 							}}
 						>
 							Click to restart sign in process
diff --git a/apps/web/lib/effect-react-query.ts b/apps/web/lib/effect-react-query.ts
index 8b511d90f0..9c47937840 100644
--- a/apps/web/lib/effect-react-query.ts
+++ b/apps/web/lib/effect-react-query.ts
@@ -191,25 +191,25 @@ export function makeUseEffectMutation<R>(
 			>,
 			{
 				mutationFn?: (variables: TVariables) => Effect.Effect<TData, TError, R>;
-				onMutate?: (
-					variables: TVariables,
-				) => Effect.Effect<TContext, unknown, R>;
-				onSuccess?: (
-					data: TData,
-					variables: TVariables,
-					context: TContext,
-				) => Effect.Effect<unknown, unknown, R>;
-				onError?: (
-					error: TExposedError,
-					variables: TVariables,
-					context: TContext | undefined,
-				) => Effect.Effect<unknown, unknown, R>;
-				onSettled?: (
-					data: TData | undefined,
-					error: TExposedError | null,
-					variables: TVariables,
-					context: TContext | undefined,
-				) => Effect.Effect<unknown, unknown, R>;
+				// onMutate?: (
+				//   variables: TVariables
+				// ) => Effect.Effect<TContext, unknown, R>;
+				// onSuccess?: (
+				//   data: TData,
+				//   variables: TVariables,
+				//   context: TContext
+				// ) => Effect.Effect<unknown, unknown, R>;
+				// onError?: (
+				//   error: TExposedError,
+				//   variables: TVariables,
+				//   context: TContext | undefined
+				// ) => Effect.Effect<unknown, unknown, R>;
+				// onSettled?: (
+				//   data: TData | undefined,
+				//   error: TExposedError | null,
+				//   variables: TVariables,
+				//   context: TContext | undefined
+				// ) => Effect.Effect<unknown, unknown, R>;
 			}
 		>,
 	): Override<
@@ -310,90 +310,90 @@ export function makeUseEffectMutation<R>(
 							}
 						}
 					: throwOnError,
-			onMutate:
-				typeof onMutate === "function"
-					? async (...args) => {
-							return await runtime.runPromise(
-								onMutate(...args),
-								// .pipe(
-								//   Effect.withSpan("useEffectMutation.onMutate", {
-								//     attributes: {
-								//       mutationFn: mutationFn?.toString(),
-								//     },
-								//   })
-								// )
-							);
-						}
-					: undefined,
-			onSuccess:
-				typeof onSuccess === "function"
-					? async (...args) => {
-							return await runtime.runPromise(
-								onSuccess(...args),
-								// .pipe(
-								//   Effect.withSpan("useEffectMutation.onSuccess", {
-								//     attributes: {
-								//       mutationFn: mutationFn?.toString(),
-								//     },
-								//   })
-								// )
-							);
-						}
-					: undefined,
-			onError:
-				typeof onError === "function"
-					? async (baseError, ...args) => {
-							const error = throwOnDefect
-								? Either.match(Cause.failureOrCause(baseError), {
-										onLeft: (error) => error as unknown as TExposedError, // if throwOnDefect is true then TExposedError is TError
-										onRight: (_cause) => {
-											throw new Error(
-												"non fail cause with throwOnDefect: true should have thrown already",
-											);
-										},
-									})
-								: (baseError as unknown as TExposedError);
+			// onMutate:
+			//   typeof onMutate === "function"
+			//     ? async (...args) => {
+			//         return await runtime.runPromise(
+			//           onMutate(...args)
+			//           // .pipe(
+			//           //   Effect.withSpan("useEffectMutation.onMutate", {
+			//           //     attributes: {
+			//           //       mutationFn: mutationFn?.toString(),
+			//           //     },
+			//           //   })
+			//           // )
+			//         );
+			//       }
+			//     : undefined,
+			// onSuccess:
+			//   typeof onSuccess === "function"
+			//     ? async (...args) => {
+			//         return await runtime.runPromise(
+			//           onSuccess(...args)
+			//           // .pipe(
+			//           //   Effect.withSpan("useEffectMutation.onSuccess", {
+			//           //     attributes: {
+			//           //       mutationFn: mutationFn?.toString(),
+			//           //     },
+			//           //   })
+			//           // )
+			//         );
+			//       }
+			//     : undefined,
+			// onError:
+			//   typeof onError === "function"
+			//     ? async (baseError, ...args) => {
+			//         const error = throwOnDefect
+			//           ? Either.match(Cause.failureOrCause(baseError), {
+			//               onLeft: (error) => error as unknown as TExposedError, // if throwOnDefect is true then TExposedError is TError
+			//               onRight: (_cause) => {
+			//                 throw new Error(
+			//                   "non fail cause with throwOnDefect: true should have thrown already"
+			//                 );
+			//               },
+			//             })
+			//           : (baseError as unknown as TExposedError);
 
-							return await runtime.runPromise(
-								onError(error, ...args),
-								// .pipe(
-								//   Effect.withSpan("useEffectMutation.onError", {
-								//     attributes: {
-								//       mutationFn: mutationFn?.toString(),
-								//     },
-								//   })
-								// )
-							);
-						}
-					: undefined,
-			onSettled:
-				typeof onSettled === "function"
-					? async (data, baseError, ...args) => {
-							const error = baseError
-								? throwOnDefect
-									? Either.match(Cause.failureOrCause(baseError), {
-											onLeft: (error) => error as unknown as TExposedError, // if throwOnDefect is true then TExposedError is TError
-											onRight: (_cause) => {
-												throw new Error(
-													"non fail cause with throwOnDefect: true should have thrown already",
-												);
-											},
-										})
-									: (baseError as unknown as TExposedError)
-								: null;
+			//         return await runtime.runPromise(
+			//           onError(error, ...args)
+			//           // .pipe(
+			//           //   Effect.withSpan("useEffectMutation.onError", {
+			//           //     attributes: {
+			//           //       mutationFn: mutationFn?.toString(),
+			//           //     },
+			//           //   })
+			//           // )
+			//         );
+			//       }
+			//     : undefined,
+			// onSettled:
+			//   typeof onSettled === "function"
+			//     ? async (data, baseError, ...args) => {
+			//         const error = baseError
+			//           ? throwOnDefect
+			//             ? Either.match(Cause.failureOrCause(baseError), {
+			//                 onLeft: (error) => error as unknown as TExposedError, // if throwOnDefect is true then TExposedError is TError
+			//                 onRight: (_cause) => {
+			//                   throw new Error(
+			//                     "non fail cause with throwOnDefect: true should have thrown already"
+			//                   );
+			//                 },
+			//               })
+			//             : (baseError as unknown as TExposedError)
+			//           : null;
 
-							return await runtime.runPromise(
-								onSettled(data, error, ...args),
-								// .pipe(
-								//   Effect.withSpan("useEffectMutation.onSettled", {
-								//     attributes: {
-								//       mutationFn: mutationFn?.toString(),
-								//     },
-								//   })
-								// )
-							);
-						}
-					: undefined,
+			//         return await runtime.runPromise(
+			//           onSettled(data, error, ...args)
+			//           // .pipe(
+			//           //   Effect.withSpan("useEffectMutation.onSettled", {
+			//           //     attributes: {
+			//           //       mutationFn: mutationFn?.toString(),
+			//           //     },
+			//           //   })
+			//           // )
+			//         );
+			//       }
+			//     : undefined,
 		});
 
 		//  the results from react query all have getters which trigger fine grained tracking, we need to replicate this when we wrap the results
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5330c2bf93..8c271f453a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -85,7 +85,7 @@ importers:
         version: 1.4.2(solid-js@1.9.6)
       '@solid-primitives/mouse':
         specifier: ^2.1.2
-        version: 2.1.2(solid-js@1.9.6)
+        version: 2.1.4(solid-js@1.9.6)
       '@solid-primitives/refs':
         specifier: ^1.0.8
         version: 1.1.1(solid-js@1.9.6)
@@ -470,13 +470,13 @@ importers:
         version: 0.0.27
       '@effect/opentelemetry':
         specifier: ^0.56.1
-        version: 0.56.1(@effect/platform@0.90.1(effect@3.17.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.7)
+        version: 0.56.1(@effect/platform@0.90.2(effect@3.17.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.7)
       '@effect/platform':
         specifier: ^0.90.1
-        version: 0.90.1(effect@3.17.7)
+        version: 0.90.2(effect@3.17.7)
       '@effect/rpc':
         specifier: ^0.68.3
-        version: 0.68.3(@effect/platform@0.90.1(effect@3.17.7))(effect@3.17.7)
+        version: 0.68.4(@effect/platform@0.90.2(effect@3.17.7))(effect@3.17.7)
       '@fortawesome/free-brands-svg-icons':
         specifier: ^6.7.2
         version: 6.7.2
@@ -1184,7 +1184,7 @@ importers:
     dependencies:
       '@effect/platform':
         specifier: ^0.90.1
-        version: 0.90.1(effect@3.17.7)
+        version: 0.90.2(effect@3.17.7)
       effect:
         specifier: ^3.17.7
         version: 3.17.7
@@ -1214,10 +1214,10 @@ importers:
         version: link:../web-domain
       '@effect/platform':
         specifier: ^0.90.1
-        version: 0.90.1(effect@3.17.7)
+        version: 0.90.2(effect@3.17.7)
       '@effect/rpc':
         specifier: ^0.68.3
-        version: 0.68.3(@effect/platform@0.90.1(effect@3.17.7))(effect@3.17.7)
+        version: 0.68.4(@effect/platform@0.90.2(effect@3.17.7))(effect@3.17.7)
       '@smithy/types':
         specifier: ^4.3.1
         version: 4.3.1
@@ -1238,10 +1238,10 @@ importers:
     dependencies:
       '@effect/platform':
         specifier: ^0.90.1
-        version: 0.90.1(effect@3.17.7)
+        version: 0.90.2(effect@3.17.7)
       '@effect/rpc':
         specifier: ^0.68.3
-        version: 0.68.3(@effect/platform@0.90.1(effect@3.17.7))(effect@3.17.7)
+        version: 0.68.4(@effect/platform@0.90.2(effect@3.17.7))(effect@3.17.7)
       effect:
         specifier: ^3.17.7
         version: 3.17.7
@@ -1975,16 +1975,16 @@ packages:
       '@opentelemetry/sdk-trace-web':
         optional: true
 
-  '@effect/platform@0.90.1':
-    resolution: {integrity: sha512-PpYq+ws+mmQG07jUhvUM49/+gZBEN3MVB1+71UpML+9t67ljn64hBaqd4qAhQHs4gJWdXw4Tobo5/vE/ZJkS6g==}
+  '@effect/platform@0.90.2':
+    resolution: {integrity: sha512-xf8odJ7vsHITlOJIragdwqu14jla9+FLefPIHbtwAXt+8ZEknbNmo8YXvmudLjLgK4mewqNuwPd6ktjBboaNXQ==}
     peerDependencies:
       effect: ^3.17.7
 
-  '@effect/rpc@0.68.3':
-    resolution: {integrity: sha512-vTMfXvvzPTdWwytCLPWg36KOCLcDaytXgma338uH0DmvNaYhdiseqX6G6Rqfxu1m2541GF4D0x6ByRgY0UIKSA==}
+  '@effect/rpc@0.68.4':
+    resolution: {integrity: sha512-iFGqBtZjjatNWwgDCCajYZvQSHc55XyZEdmHGqrKS6UfdRsV7qUSPgnplMf++tIIyGme7IbAjD/3VJdbHI5Gzg==}
     peerDependencies:
-      '@effect/platform': ^0.90.0
-      effect: ^3.17.6
+      '@effect/platform': ^0.90.2
+      effect: ^3.17.7
 
   '@emnapi/core@1.4.3':
     resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==}
@@ -5602,6 +5602,11 @@ packages:
     peerDependencies:
       solid-js: ^1.6.12
 
+  '@solid-primitives/event-listener@2.4.3':
+    resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
   '@solid-primitives/history@0.1.5':
     resolution: {integrity: sha512-Hu6WiA6KBdNIpczUMNOHiBNVnuMrNqOjW98M7X9GSIPoHG2W0A1CwGyNJa838QVWbnoXmo8QI1Za2bAc83/BEA==}
     peerDependencies:
@@ -5627,8 +5632,8 @@ packages:
     peerDependencies:
       solid-js: ^1.6.12
 
-  '@solid-primitives/mouse@2.1.2':
-    resolution: {integrity: sha512-ov4K3eQCybN0bN4ZzBA3mFGuj2AJmgP9kOJaGZtTtjJ6uvI6LYd8pfv+Tm6gb3BlaIlVurLMuOU30mapSaJjhA==}
+  '@solid-primitives/mouse@2.1.4':
+    resolution: {integrity: sha512-qZNh7FedzJMSrUX/BSd5Pjkv+Ct7vDr9TXVbXSdAKa4xMri0mwNi1eCbNbcEsq/FOsPVQLyt2d5oR7cQHBOg0A==}
     peerDependencies:
       solid-js: ^1.6.12
 
@@ -5652,6 +5657,11 @@ packages:
     peerDependencies:
       solid-js: ^1.6.12
 
+  '@solid-primitives/rootless@1.5.2':
+    resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
   '@solid-primitives/scheduled@1.5.1':
     resolution: {integrity: sha512-WKg/zvAyDIgQ/Xo48YaUY7ISaPyWTZNDzIVWP2R84CuLH+nZN/2O0aFn/gQlWY6y/Bfi/LdDt6Og2/PRzPY7mA==}
     peerDependencies:
@@ -5667,6 +5677,11 @@ packages:
     peerDependencies:
       solid-js: ^1.6.12
 
+  '@solid-primitives/static-store@0.1.2':
+    resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
   '@solid-primitives/storage@4.3.2':
     resolution: {integrity: sha512-Vkuk/AqgUOjz6k7Mo5yDFQBQg8KMQcZfaac/bxLApaza3e5c/iNllNvxZWPM9Vf+Gf4m5SgRbvgsm6dSLJ27Jw==}
     peerDependencies:
@@ -5699,6 +5714,11 @@ packages:
     peerDependencies:
       solid-js: ^1.6.12
 
+  '@solid-primitives/utils@6.3.2':
+    resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==}
+    peerDependencies:
+      solid-js: ^1.6.12
+
   '@solid-primitives/websocket@1.3.1':
     resolution: {integrity: sha512-F06tA2FKa5VsnS4E4WEc3jHpsJfXRlMTGOtolugTzCqV3JmJTyvk9UVg1oz6PgGHKGi1CQ91OP8iW34myyJgaQ==}
     peerDependencies:
@@ -8879,7 +8899,6 @@ packages:
   fluent-ffmpeg@2.1.3:
     resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==}
     engines: {node: '>=18'}
-    deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
 
   fn.name@1.1.0:
     resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
@@ -10651,8 +10670,8 @@ packages:
     resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==}
     hasBin: true
 
-  msgpackr@1.11.5:
-    resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==}
+  msgpackr@1.11.4:
+    resolution: {integrity: sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==}
 
   multipasta@0.2.7:
     resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==}
@@ -10824,7 +10843,6 @@ packages:
   node-domexception@1.0.0:
     resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
     engines: {node: '>=10.5.0'}
-    deprecated: Use your platform's native DOMException instead
 
   node-fetch-native@1.6.6:
     resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==}
@@ -12376,7 +12394,6 @@ packages:
   storybook-solidjs@1.0.0-beta.7:
     resolution: {integrity: sha512-PgquZC4FiNPCDOIXuXYOco01vMHCXBBAr3Y/a9ylF4+0vOTcL2RAqieUmTbZhBxVWZIm+nPIyOlz8UqhwcgLtQ==}
     engines: {node: '>=18.0.0'}
-    deprecated: 'This package is deprecated. Use storybook-solidjs-vite instead: https://www.npmjs.com/package/storybook-solidjs-vite'
     peerDependencies:
       '@storybook/test': '*'
       solid-js: ~1.9.0
@@ -12544,12 +12561,11 @@ packages:
   superagent@8.1.2:
     resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==}
     engines: {node: '>=6.4.0 <13 || >=14'}
-    deprecated: Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net
+    deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net
 
   supertest@6.3.4:
     resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==}
     engines: {node: '>=6.4.0'}
-    deprecated: Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net
 
   supports-color@10.0.0:
     resolution: {integrity: sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==}
@@ -15008,9 +15024,9 @@ snapshots:
 
   '@effect/language-service@0.34.0': {}
 
-  '@effect/opentelemetry@0.56.1(@effect/platform@0.90.1(effect@3.17.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.7)':
+  '@effect/opentelemetry@0.56.1(@effect/platform@0.90.2(effect@3.17.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.36.0)(effect@3.17.7)':
     dependencies:
-      '@effect/platform': 0.90.1(effect@3.17.7)
+      '@effect/platform': 0.90.2(effect@3.17.7)
       '@opentelemetry/semantic-conventions': 1.36.0
       effect: 3.17.7
     optionalDependencies:
@@ -15022,17 +15038,17 @@ snapshots:
       '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0)
       '@opentelemetry/sdk-trace-web': 2.0.1(@opentelemetry/api@1.9.0)
 
-  '@effect/platform@0.90.1(effect@3.17.7)':
+  '@effect/platform@0.90.2(effect@3.17.7)':
     dependencies:
       '@opentelemetry/semantic-conventions': 1.36.0
       effect: 3.17.7
       find-my-way-ts: 0.1.6
-      msgpackr: 1.11.5
+      msgpackr: 1.11.4
       multipasta: 0.2.7
 
-  '@effect/rpc@0.68.3(@effect/platform@0.90.1(effect@3.17.7))(effect@3.17.7)':
+  '@effect/rpc@0.68.4(@effect/platform@0.90.2(effect@3.17.7))(effect@3.17.7)':
     dependencies:
-      '@effect/platform': 0.90.1(effect@3.17.7)
+      '@effect/platform': 0.90.2(effect@3.17.7)
       effect: 3.17.7
 
   '@emnapi/core@1.4.3':
@@ -16176,7 +16192,7 @@ snapshots:
       nopt: 5.0.0
       npmlog: 5.0.1
       rimraf: 3.0.2
-      semver: 7.7.2
+      semver: 7.7.1
       tar: 6.2.1
     transitivePeerDependencies:
       - encoding
@@ -18918,6 +18934,11 @@ snapshots:
       '@solid-primitives/utils': 6.3.1(solid-js@1.9.6)
       solid-js: 1.9.6
 
+  '@solid-primitives/event-listener@2.4.3(solid-js@1.9.6)':
+    dependencies:
+      '@solid-primitives/utils': 6.3.2(solid-js@1.9.6)
+      solid-js: 1.9.6
+
   '@solid-primitives/history@0.1.5(solid-js@1.9.6)':
     dependencies:
       '@solid-primitives/utils': 6.3.1(solid-js@1.9.6)
@@ -18946,12 +18967,12 @@ snapshots:
       '@solid-primitives/utils': 6.3.1(solid-js@1.9.6)
       solid-js: 1.9.6
 
-  '@solid-primitives/mouse@2.1.2(solid-js@1.9.6)':
+  '@solid-primitives/mouse@2.1.4(solid-js@1.9.6)':
     dependencies:
-      '@solid-primitives/event-listener': 2.4.1(solid-js@1.9.6)
-      '@solid-primitives/rootless': 1.5.1(solid-js@1.9.6)
-      '@solid-primitives/static-store': 0.1.1(solid-js@1.9.6)
-      '@solid-primitives/utils': 6.3.1(solid-js@1.9.6)
+      '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.6)
+      '@solid-primitives/rootless': 1.5.2(solid-js@1.9.6)
+      '@solid-primitives/static-store': 0.1.2(solid-js@1.9.6)
+      '@solid-primitives/utils': 6.3.2(solid-js@1.9.6)
       solid-js: 1.9.6
 
   '@solid-primitives/props@3.2.1(solid-js@1.9.6)':
@@ -18977,6 +18998,11 @@ snapshots:
       '@solid-primitives/utils': 6.3.1(solid-js@1.9.6)
       solid-js: 1.9.6
 
+  '@solid-primitives/rootless@1.5.2(solid-js@1.9.6)':
+    dependencies:
+      '@solid-primitives/utils': 6.3.2(solid-js@1.9.6)
+      solid-js: 1.9.6
+
   '@solid-primitives/scheduled@1.5.1(solid-js@1.9.6)':
     dependencies:
       solid-js: 1.9.6
@@ -18991,6 +19017,11 @@ snapshots:
       '@solid-primitives/utils': 6.3.1(solid-js@1.9.6)
       solid-js: 1.9.6
 
+  '@solid-primitives/static-store@0.1.2(solid-js@1.9.6)':
+    dependencies:
+      '@solid-primitives/utils': 6.3.2(solid-js@1.9.6)
+      solid-js: 1.9.6
+
   '@solid-primitives/storage@4.3.2(@tauri-apps/plugin-store@2.1.0)(solid-js@1.9.6)':
     dependencies:
       '@solid-primitives/utils': 6.3.1(solid-js@1.9.6)
@@ -19015,6 +19046,10 @@ snapshots:
     dependencies:
       solid-js: 1.9.6
 
+  '@solid-primitives/utils@6.3.2(solid-js@1.9.6)':
+    dependencies:
+      solid-js: 1.9.6
+
   '@solid-primitives/websocket@1.3.1(solid-js@1.9.6)':
     dependencies:
       solid-js: 1.9.6
@@ -25238,7 +25273,7 @@ snapshots:
       '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3
     optional: true
 
-  msgpackr@1.11.5:
+  msgpackr@1.11.4:
     optionalDependencies:
       msgpackr-extract: 3.0.3
 
@@ -25365,7 +25400,7 @@ snapshots:
       '@next/env': 14.2.3
       '@swc/helpers': 0.5.5
       busboy: 1.6.0
-      caniuse-lite: 1.0.30001723
+      caniuse-lite: 1.0.30001717
       graceful-fs: 4.2.11
       postcss: 8.4.31
       react: 19.1.0
@@ -26914,7 +26949,8 @@ snapshots:
 
   semver@7.7.1: {}
 
-  semver@7.7.2: {}
+  semver@7.7.2:
+    optional: true
 
   send@0.19.0:
     dependencies:
