diff --git a/apps/web/package.json b/apps/web/package.json
index e72f4898a..4f6617d1e 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -22,7 +22,10 @@
"@documenso/trpc": "*",
"@documenso/ui": "*",
"@hookform/resolvers": "^3.1.0",
+ "@simplewebauthn/browser": "^9.0.1",
+ "@simplewebauthn/server": "^9.0.3",
"@tanstack/react-query": "^4.29.5",
+ "cookie-es": "^1.0.0",
"formidable": "^2.1.1",
"framer-motion": "^10.12.8",
"lucide-react": "^0.279.0",
@@ -51,6 +54,7 @@
},
"devDependencies": {
"@documenso/tailwind-config": "*",
+ "@simplewebauthn/types": "^9.0.1",
"@types/formidable": "^2.0.6",
"@types/luxon": "^3.3.1",
"@types/node": "20.1.0",
diff --git a/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx b/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx
index 2b5906177..a2b850412 100644
--- a/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx
+++ b/apps/web/src/app/(dashboard)/settings/security/activity/page.tsx
@@ -15,15 +15,14 @@ export default function SettingsSecurityActivityPage() {
-
+
-
-
-
+
+
+
);
}
diff --git a/apps/web/src/app/(dashboard)/settings/security/page.tsx b/apps/web/src/app/(dashboard)/settings/security/page.tsx
index ba5d9846c..4bfd37aff 100644
--- a/apps/web/src/app/(dashboard)/settings/security/page.tsx
+++ b/apps/web/src/app/(dashboard)/settings/security/page.tsx
@@ -2,6 +2,7 @@ import type { Metadata } from 'next';
import Link from 'next/link';
import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
+import { getServerComponentFlag } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag';
import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert';
import { Button } from '@documenso/ui/primitives/button';
@@ -18,6 +19,8 @@ export const metadata: Metadata = {
export default async function SecuritySettingsPage() {
const { user } = await getRequiredServerComponentSession();
+ const isPasskeyEnabled = await getServerComponentFlag('app_passkey');
+
return (
)}
+ {isPasskeyEnabled && (
+
+
+
Passkeys
+
+
+ Allows authenticating using biometrics, password managers, hardware keys, etc.
+
+
+
+
+
+ )}
+
-
- >
- )}
+ )}
+
+ {isPasskeyEnabled && (
+
+ {!isPasskeyLoading && }
+ Passkey
+
+ )}
+