feat(marketing): add ZeroTier Network Governance page and content
Add comprehensive marketing content for ZeroTier Network Governance feature including a dedicated landing page, navigation updates, and feature highlights across the homepage and features page. - Add new ZeroTierPage with feature documentation and use cases - Add ZeroTier to navigation in MarketingLayout header and footer - Update HomePage hero headline and add ZeroTier feature section - Add ZeroTier features section to FeaturesPage - Add ScrollToTop component for better navigation UX - Move ApiDevTools to AuthenticatedLayout (dev mode only) - Add SSR tests for marketing pages - Update SSHCertificatesPage comparison table for clarity - Add documentation link to MarketingLayout footer
This commit is contained in:
+14
-4
@@ -2,7 +2,8 @@ import { Toaster } from "@/components/ui/toaster";
|
||||
import { Toaster as Sonner } from "@/components/ui/sonner";
|
||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
||||
import { BrowserRouter, Routes, Route } from "react-router-dom";
|
||||
import { BrowserRouter, Routes, Route, useLocation } from "react-router-dom";
|
||||
import { useEffect } from "react";
|
||||
|
||||
// Layouts
|
||||
import PublicLayout from "@/components/layouts/PublicLayout";
|
||||
@@ -15,6 +16,7 @@ import FeaturesPage from "@/pages/marketing/FeaturesPage";
|
||||
import PricingPage from "@/pages/marketing/PricingPage";
|
||||
import SecurityPage from "@/pages/marketing/SecurityPage";
|
||||
import SSHCertificatesPage from "@/pages/marketing/SSHCertificatesPage";
|
||||
import ZeroTierPage from "@/pages/marketing/ZeroTierPage";
|
||||
import DemoPage from "@/pages/marketing/DemoPage";
|
||||
|
||||
// Public pages
|
||||
@@ -59,7 +61,6 @@ import OAuthProvidersPage from "@/pages/admin/OAuthProvidersPage";
|
||||
import OrgSetupPage from "@/pages/auth/OrgSetupPage";
|
||||
|
||||
import NotFound from "@/pages/NotFound";
|
||||
import ApiDevTools from "@/components/dev/ApiDevTools";
|
||||
|
||||
const queryClient = new QueryClient({
|
||||
defaultOptions: {
|
||||
@@ -82,12 +83,22 @@ const App = () => (
|
||||
<Toaster />
|
||||
<Sonner />
|
||||
<BrowserRouter>
|
||||
<ScrollToTop />
|
||||
<AppRoutes />
|
||||
</BrowserRouter>
|
||||
</TooltipProvider>
|
||||
</QueryClientProvider>
|
||||
);
|
||||
|
||||
// Scroll to top on navigation
|
||||
function ScrollToTop() {
|
||||
const location = useLocation();
|
||||
useEffect(() => {
|
||||
window.scrollTo({ top: 0, left: 0, behavior: 'instant' });
|
||||
}, [location.pathname]);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Separate component so AuthProvider can use useNavigate
|
||||
import { AuthProvider, useAuth } from "@/contexts/AuthContext";
|
||||
import { OrgProvider } from "@/contexts/OrgContext";
|
||||
@@ -148,6 +159,7 @@ function AppRoutes() {
|
||||
<Route path="/pricing" element={<PricingPage />} />
|
||||
<Route path="/security" element={<SecurityPage />} />
|
||||
<Route path="/ssh-certificates" element={<SSHCertificatesPage />} />
|
||||
<Route path="/zerotier" element={<ZeroTierPage />} />
|
||||
<Route path="/demo" element={<DemoPage />} />
|
||||
</Route>
|
||||
|
||||
@@ -208,8 +220,6 @@ function AppRoutes() {
|
||||
<Route path="*" element={<NotFound />} />
|
||||
</Routes>
|
||||
|
||||
{/* Dev tools - only shown in development */}
|
||||
<ApiDevTools />
|
||||
</OrgProvider>
|
||||
</AuthProvider>
|
||||
);
|
||||
|
||||
@@ -2,6 +2,7 @@ import { Outlet } from "react-router-dom";
|
||||
import { SidebarProvider } from "@/components/ui/sidebar";
|
||||
import { AppSidebar } from "@/components/navigation/AppSidebar";
|
||||
import { TopBar } from "@/components/navigation/TopBar";
|
||||
import ApiDevTools from "@/components/dev/ApiDevTools";
|
||||
|
||||
export default function AuthenticatedLayout() {
|
||||
return (
|
||||
@@ -15,6 +16,7 @@ export default function AuthenticatedLayout() {
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
{import.meta.env.DEV && <ApiDevTools />}
|
||||
</SidebarProvider>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -14,11 +14,12 @@ X
|
||||
import { useState } from "react";
|
||||
|
||||
const navigation = [
|
||||
{ name: "Features", href: "/features" },
|
||||
{ name: "Security", href: "/security" },
|
||||
{ name: "SSH Certificates", href: "/ssh-certificates" },
|
||||
{ name: "Pricing", href: "/pricing" },
|
||||
{ name: "Demo", href: "/demo" },
|
||||
{ name: "Features", href: "/features" },
|
||||
{ name: "Security", href: "/security" },
|
||||
{ name: "SSH Certificates", href: "/ssh-certificates" },
|
||||
{ name: "ZeroTier", href: "/zerotier" },
|
||||
{ name: "Pricing", href: "/pricing" },
|
||||
{ name: "Demo", href: "/demo" },
|
||||
];
|
||||
|
||||
export default function MarketingLayout() {
|
||||
@@ -143,6 +144,7 @@ return (
|
||||
<li><Link to="/features" className="text-sm text-muted-foreground hover:text-foreground transition-colors">Features</Link></li>
|
||||
<li><Link to="/security" className="text-sm text-muted-foreground hover:text-foreground transition-colors">Security</Link></li>
|
||||
<li><Link to="/ssh-certificates" className="text-sm text-muted-foreground hover:text-foreground transition-colors">SSH Certificates</Link></li>
|
||||
<li><Link to="/zerotier" className="text-sm text-muted-foreground hover:text-foreground transition-colors">ZeroTier</Link></li>
|
||||
<li><Link to="/pricing" className="text-sm text-muted-foreground hover:text-foreground transition-colors">Pricing</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -152,7 +154,7 @@ return (
|
||||
<h3 className="text-sm font-semibold text-foreground mb-3">Resources</h3>
|
||||
<ul className="space-y-2">
|
||||
<li><Link to="/demo" className="text-sm text-muted-foreground hover:text-foreground transition-colors">Demo</Link></li>
|
||||
<li><a href="#" className="text-sm text-muted-foreground hover:text-foreground transition-colors">Documentation</a></li>
|
||||
<li><a href="https://docs.secuird.tech/" target="_blank" rel="noopener noreferrer" className="text-sm text-muted-foreground hover:text-foreground transition-colors">Documentation</a></li>
|
||||
<li><a href="#" className="text-sm text-muted-foreground hover:text-foreground transition-colors">API Reference</a></li>
|
||||
<li><a href="#" className="text-sm text-muted-foreground hover:text-foreground transition-colors">Status</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -2,179 +2,214 @@ import { Link } from "react-router-dom";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card, CardContent } from "@/components/ui/card";
|
||||
import {
|
||||
Shield,
|
||||
Key,
|
||||
Users,
|
||||
Lock,
|
||||
Terminal,
|
||||
Building2,
|
||||
Globe,
|
||||
ShieldCheck,
|
||||
ArrowRight,
|
||||
CheckCircle2,
|
||||
Fingerprint,
|
||||
ArrowRightLeft,
|
||||
Eye,
|
||||
Settings,
|
||||
UserCheck,
|
||||
Clock,
|
||||
Server,
|
||||
UserPlus,
|
||||
FileKey,
|
||||
Activity,
|
||||
Layers,
|
||||
ShieldAlert,
|
||||
Network,
|
||||
ScanLine,
|
||||
LogIn,
|
||||
AppWindow,
|
||||
Shield,
|
||||
Key,
|
||||
Users,
|
||||
Lock,
|
||||
Terminal,
|
||||
Building2,
|
||||
Globe,
|
||||
ShieldCheck,
|
||||
ArrowRight,
|
||||
CheckCircle2,
|
||||
Fingerprint,
|
||||
ArrowRightLeft,
|
||||
Eye,
|
||||
Settings,
|
||||
UserCheck,
|
||||
Clock,
|
||||
Server,
|
||||
UserPlus,
|
||||
FileKey,
|
||||
Activity,
|
||||
Layers,
|
||||
ShieldAlert,
|
||||
Network,
|
||||
ScanLine,
|
||||
LogIn,
|
||||
AppWindow,
|
||||
Monitor,
|
||||
Zap,
|
||||
} from "lucide-react";
|
||||
|
||||
const authenticationFeatures = [
|
||||
{
|
||||
icon: Building2,
|
||||
title: "Microsoft 365 SSO",
|
||||
description: "Connect your Microsoft Entra ID (Azure AD) directory. Users authenticate with their corporate credentials instantly.",
|
||||
icon: Building2,
|
||||
title: "Microsoft 365 SSO",
|
||||
description: "Connect your Microsoft Entra ID (Azure AD) directory. Users authenticate with their corporate credentials instantly.",
|
||||
},
|
||||
{
|
||||
icon: Globe,
|
||||
title: "Google Workspace SSO",
|
||||
description: "Seamless integration with Google Workspace. Enable single sign-on for all your internal applications.",
|
||||
icon: Globe,
|
||||
title: "Google Workspace SSO",
|
||||
description: "Seamless integration with Google Workspace. Enable single sign-on for all your internal applications.",
|
||||
},
|
||||
{
|
||||
icon: Key,
|
||||
title: "GitHub Authentication",
|
||||
description: "Allow developers to authenticate using their GitHub accounts. Perfect for engineering teams.",
|
||||
icon: Key,
|
||||
title: "GitHub Authentication",
|
||||
description: "Allow developers to authenticate using their GitHub accounts. Perfect for engineering teams.",
|
||||
},
|
||||
{
|
||||
icon: Lock,
|
||||
title: "Traditional Username/Password",
|
||||
description: "Full support for traditional authentication with email verification and secure password policies.",
|
||||
icon: Lock,
|
||||
title: "Traditional Username/Password",
|
||||
description: "Full support for traditional authentication with email verification and secure password policies.",
|
||||
},
|
||||
];
|
||||
|
||||
const mfaFeatures = [
|
||||
{
|
||||
icon: Fingerprint,
|
||||
title: "WebAuthn/Passkeys",
|
||||
description: "Hardware security keys and platform authenticators (Face ID, Touch ID, Windows Hello). Phishing-resistant authentication.",
|
||||
icon: Fingerprint,
|
||||
title: "WebAuthn/Passkeys",
|
||||
description: "Hardware security keys and platform authenticators (Face ID, Touch ID, Windows Hello). Phishing-resistant authentication.",
|
||||
},
|
||||
{
|
||||
icon: Shield,
|
||||
title: "TOTP Authenticator Apps",
|
||||
description: "Support for Google Authenticator, Authy, 1Password, and any TOTP-compatible authenticator app.",
|
||||
icon: Shield,
|
||||
title: "TOTP Authenticator Apps",
|
||||
description: "Support for Google Authenticator, Authy, 1Password, and any TOTP-compatible authenticator app.",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "Grace Periods",
|
||||
description: "Configure grace periods for MFA enrollment. Give users time to set up their authenticators without blocking access.",
|
||||
icon: Clock,
|
||||
title: "Grace Periods",
|
||||
description: "Configure grace periods for MFA enrollment. Give users time to set up their authenticators without blocking access.",
|
||||
},
|
||||
{
|
||||
icon: ShieldAlert,
|
||||
title: "Policy Enforcement",
|
||||
description: "Organization-wide MFA requirements. Require specific methods (TOTP only, Passkey only, or both).",
|
||||
icon: ShieldAlert,
|
||||
title: "Policy Enforcement",
|
||||
description: "Organization-wide MFA requirements. Require specific methods (TOTP only, Passkey only, or both).",
|
||||
},
|
||||
];
|
||||
|
||||
const oidcFeatures = [
|
||||
{
|
||||
icon: ArrowRightLeft,
|
||||
title: "OIDC Provider",
|
||||
description: "Secuird acts as a standards-compliant OpenID Connect provider. Connect any OIDC-compatible application.",
|
||||
icon: ArrowRightLeft,
|
||||
title: "OIDC Provider",
|
||||
description: "Secuird acts as a standards-compliant OpenID Connect provider. Connect any OIDC-compatible application.",
|
||||
},
|
||||
{
|
||||
icon: AppWindow,
|
||||
title: "Multiple Applications",
|
||||
description: "Register unlimited client applications. Each gets unique credentials and configurable redirect URIs.",
|
||||
icon: AppWindow,
|
||||
title: "Multiple Applications",
|
||||
description: "Register unlimited client applications. Each gets unique credentials and configurable redirect URIs.",
|
||||
},
|
||||
{
|
||||
icon: UserCheck,
|
||||
title: "Consent Management",
|
||||
description: "Users see and approve what information is shared. Transparent data access with user control.",
|
||||
icon: UserCheck,
|
||||
title: "Consent Management",
|
||||
description: "Users see and approve what information is shared. Transparent data access with user control.",
|
||||
},
|
||||
{
|
||||
icon: Network,
|
||||
title: "Scopes & Claims",
|
||||
description: "Configure custom scopes and claims. Pass user roles, groups, and custom attributes to your applications.",
|
||||
icon: Network,
|
||||
title: "Scopes & Claims",
|
||||
description: "Configure custom scopes and claims. Pass user roles, groups, and custom attributes to your applications.",
|
||||
},
|
||||
];
|
||||
|
||||
const sshFeatures = [
|
||||
{
|
||||
icon: Terminal,
|
||||
title: "Native SSH Support",
|
||||
description: "Use standard OpenSSH client. No custom agents or modified binaries required. Works everywhere SSH works.",
|
||||
icon: Terminal,
|
||||
title: "Native SSH Support",
|
||||
description: "Use standard OpenSSH client. No custom agents or modified binaries required. Works everywhere SSH works.",
|
||||
},
|
||||
{
|
||||
icon: FileKey,
|
||||
title: "Short-Lived Certificates",
|
||||
description: "Certificates expire in minutes or hours. Eliminate long-lived SSH keys that persist after employees leave.",
|
||||
icon: FileKey,
|
||||
title: "Short-Lived Certificates",
|
||||
description: "Certificates expire in minutes or hours. Eliminate long-lived SSH keys that persist after employees leave.",
|
||||
},
|
||||
{
|
||||
icon: Eye,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every certificate issuance and SSH connection is logged. Full chain of custody from creation to usage.",
|
||||
icon: Eye,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every certificate issuance and SSH connection is logged. Full chain of custody from creation to usage.",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Group-Based Access",
|
||||
description: "Configure principals and policies per department or team. Automatic group membership from identity provider.",
|
||||
icon: Users,
|
||||
title: "Group-Based Access",
|
||||
description: "Configure principals and policies per department or team. Automatic group membership from identity provider.",
|
||||
},
|
||||
{
|
||||
icon: Server,
|
||||
title: "Host Certificates",
|
||||
description: "Issue certificates for servers too. Verify host identity without TOFU warnings or known_hosts management.",
|
||||
icon: Server,
|
||||
title: "Host Certificates",
|
||||
description: "Issue certificates for servers too. Verify host identity without TOFU warnings or known_hosts management.",
|
||||
},
|
||||
{
|
||||
icon: Activity,
|
||||
title: "Real-Time Monitoring",
|
||||
description: "Monitor certificate usage in real-time. Detect anomalies and suspicious access patterns.",
|
||||
icon: Activity,
|
||||
title: "Real-Time Monitoring",
|
||||
description: "Monitor certificate usage in real-time. Detect anomalies and suspicious access patterns.",
|
||||
},
|
||||
];
|
||||
|
||||
const zerotierFeatures = [
|
||||
{
|
||||
icon: Monitor,
|
||||
title: "Device Registration",
|
||||
description: "Register ZeroTier nodes by Node ID. No shared secrets — users own their devices.",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Approval Workflows",
|
||||
description: "Manager approval required before network access. Durable approvals survive across days.",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "Activation Sessions",
|
||||
description: "Time-bounded access sessions. Re-authenticate to activate for a fixed period like an 8-hour workday.",
|
||||
},
|
||||
{
|
||||
icon: Zap,
|
||||
title: "Kill Switch",
|
||||
description: "Instantly revoke all active memberships for a user across all networks. Lost laptop? Immediate response.",
|
||||
},
|
||||
{
|
||||
icon: ShieldCheck,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every network access event logged. Know who accessed what, when, and from which device.",
|
||||
},
|
||||
{
|
||||
icon: Network,
|
||||
title: "Multi-Network Support",
|
||||
description: "Manage production, staging, and lab networks separately with environment-based policies.",
|
||||
},
|
||||
];
|
||||
|
||||
const organizationFeatures = [
|
||||
{
|
||||
icon: Users,
|
||||
title: "Multi-Tenant Architecture",
|
||||
description: "Separate organizations with complete isolation. Each org has its own members, policies, and resources.",
|
||||
icon: Users,
|
||||
title: "Multi-Tenant Architecture",
|
||||
description: "Separate organizations with complete isolation. Each org has its own members, policies, and resources.",
|
||||
},
|
||||
{
|
||||
icon: UserPlus,
|
||||
title: "Invite System",
|
||||
description: "Invite users by email with role assignments. Automatic onboarding with pre-configured group memberships.",
|
||||
icon: UserPlus,
|
||||
title: "Invite System",
|
||||
description: "Invite users by email with role assignments. Automatic onboarding with pre-configured group memberships.",
|
||||
},
|
||||
{
|
||||
icon: Layers,
|
||||
title: "Department Management",
|
||||
description: "Organize users into departments. Apply policies and SSH certificate settings per department.",
|
||||
icon: Layers,
|
||||
title: "Department Management",
|
||||
description: "Organize users into departments. Apply policies and SSH certificate settings per department.",
|
||||
},
|
||||
{
|
||||
icon: ScanLine,
|
||||
title: "Registration Tracking",
|
||||
description: "Track user registration sources. UTM codes, referral links, and marketing campaigns are captured automatically.",
|
||||
icon: ScanLine,
|
||||
title: "Registration Tracking",
|
||||
description: "Track user registration sources. UTM codes, referral links, and marketing campaigns are captured automatically.",
|
||||
},
|
||||
];
|
||||
|
||||
const complianceFeatures = [
|
||||
{
|
||||
icon: Eye,
|
||||
title: "Audit Logging",
|
||||
description: "Every action is logged with user, timestamp, IP address, and details. Export logs for SIEM integration.",
|
||||
icon: Eye,
|
||||
title: "Audit Logging",
|
||||
description: "Every action is logged with user, timestamp, IP address, and details. Export logs for SIEM integration.",
|
||||
},
|
||||
{
|
||||
icon: Settings,
|
||||
title: "Security Policies",
|
||||
description: "Define organization-wide security policies. MFA requirements, password rules, and session settings.",
|
||||
icon: Settings,
|
||||
title: "Security Policies",
|
||||
description: "Define organization-wide security policies. MFA requirements, password rules, and session settings.",
|
||||
},
|
||||
{
|
||||
icon: ShieldCheck,
|
||||
title: "Compliance Reports",
|
||||
description: "Generate compliance reports for SOC 2, HIPAA, and other frameworks. Demonstrate security controls.",
|
||||
icon: ShieldCheck,
|
||||
title: "Compliance Reports",
|
||||
description: "Generate compliance reports for SOC 2, HIPAA, and other frameworks. Demonstrate security controls.",
|
||||
},
|
||||
{
|
||||
icon: Activity,
|
||||
title: "Activity Monitoring",
|
||||
description: "Real-time visibility into user activity. Login patterns, certificate usage, and security events.",
|
||||
icon: Activity,
|
||||
title: "Activity Monitoring",
|
||||
description: "Real-time visibility into user activity. Login patterns, certificate usage, and security events.",
|
||||
},
|
||||
];
|
||||
|
||||
@@ -393,8 +428,84 @@ return (
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ZeroTier Network Governance */}
|
||||
<section id="zerotier" className="py-16 lg:py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div className="order-2 lg:order-1">
|
||||
{/* Screenshot placeholder - replace with actual screenshot */}
|
||||
<Card className="bg-card shadow-xl border-2 border-dashed border-muted-foreground/20">
|
||||
<CardContent className="p-8 text-center">
|
||||
<div className="flex flex-col items-center justify-center py-12 space-y-4">
|
||||
<Network className="h-16 w-16 text-muted-foreground/40" />
|
||||
<div className="space-y-2">
|
||||
<p className="text-sm font-medium text-muted-foreground">ZeroTier Network Management</p>
|
||||
<p className="text-xs text-muted-foreground/60">Screenshot placeholder — replace with:</p>
|
||||
<ul className="text-xs text-muted-foreground/60 list-disc list-inside text-left">
|
||||
<li>Networks list with environment tags</li>
|
||||
<li>Member status and activation state</li>
|
||||
<li>Pending requests and approvals</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<div className="order-1 lg:order-2">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4">
|
||||
<Network className="h-4 w-4" />
|
||||
ZeroTier Network Governance
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Govern ZeroTier Access<br />
|
||||
<span className="text-accent block mt-2">With Your Identity Platform</span>
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground mb-6">
|
||||
Add approval workflows, time-bounded activation sessions, and complete audit trails to your
|
||||
ZeroTier networks. Stop using raw ZeroTier administration and give managers the controls they need.
|
||||
</p>
|
||||
<ul className="space-y-3 mb-8">
|
||||
{[
|
||||
"Devices registered by ZeroTier Node ID — no shared secrets",
|
||||
"Manager approval separates authorization from activation",
|
||||
"Activation sessions last hours, not days — automatic expiration",
|
||||
"Kill switch for lost devices or immediate offboarding",
|
||||
"Immutable audit trail for every network access event",
|
||||
].map((item, index) => (
|
||||
<li key={index} className="flex items-start gap-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-accent flex-shrink-0 mt-0.5" />
|
||||
<span className="text-foreground">{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
<Link to="/zerotier">
|
||||
<Button className="gap-2">
|
||||
Learn About Network Governance
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-6 mt-12">
|
||||
{zerotierFeatures.map((feature) => (
|
||||
<Card key={feature.title} className="bg-card">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center mb-3">
|
||||
<feature.icon className="h-5 w-5 text-primary" />
|
||||
</div>
|
||||
<h3 className="text-base font-semibold text-foreground mb-1">{feature.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{feature.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Organization Management */}
|
||||
<section className="py-16 lg:py-24">
|
||||
<section className="py-16 lg:py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div className="order-2 lg:order-1">
|
||||
@@ -446,7 +557,7 @@ return (
|
||||
</section>
|
||||
|
||||
{/* Compliance & Audit */}
|
||||
<section className="py-16 lg:py-24 bg-muted/30">
|
||||
<section className="py-16 lg:py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
@@ -526,4 +637,4 @@ return (
|
||||
</section>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
+470
-397
@@ -2,439 +2,512 @@ import { Link } from "react-router-dom";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card, CardContent } from "@/components/ui/card";
|
||||
import {
|
||||
Shield,
|
||||
Key,
|
||||
Users,
|
||||
Lock,
|
||||
Terminal,
|
||||
Building2,
|
||||
ShieldCheck,
|
||||
ArrowRight,
|
||||
CheckCircle2,
|
||||
Globe,
|
||||
Fingerprint,
|
||||
Clock,
|
||||
ArrowRightLeft,
|
||||
Eye,
|
||||
Settings,
|
||||
UserCheck
|
||||
Shield,
|
||||
Key,
|
||||
Users,
|
||||
Lock,
|
||||
Terminal,
|
||||
Building2,
|
||||
ShieldCheck,
|
||||
ArrowRight,
|
||||
CheckCircle2,
|
||||
Globe,
|
||||
Fingerprint,
|
||||
Clock,
|
||||
ArrowRightLeft,
|
||||
Eye,
|
||||
Settings,
|
||||
UserCheck,
|
||||
Network
|
||||
} from "lucide-react";
|
||||
|
||||
const features = [
|
||||
{
|
||||
icon: Shield,
|
||||
title: "Enterprise SSO Without Complexity",
|
||||
description:
|
||||
"Enable single sign-on with Microsoft 365, Google Workspace, and GitHub. No complex federation setups—just connect and go.",
|
||||
},
|
||||
{
|
||||
icon: Key,
|
||||
title: "SSH Certificate Authority",
|
||||
description:
|
||||
"Issue short-lived SSH certificates tied to user identities. Eliminate shared SSH keys and achieve complete auditability.",
|
||||
},
|
||||
{
|
||||
icon: Lock,
|
||||
title: "Multi-Factor Authentication",
|
||||
description:
|
||||
"Enforce MFA policies across your organization with TOTP and WebAuthn/Passkey support. Compliance made simple.",
|
||||
},
|
||||
{
|
||||
icon: ArrowRightLeft,
|
||||
title: "OIDC Provider Built-In",
|
||||
description:
|
||||
"Secuird acts as an OIDC identity provider for your internal applications. One identity, seamless access everywhere.",
|
||||
},
|
||||
{
|
||||
icon: Shield,
|
||||
title: "Enterprise SSO Without Complexity",
|
||||
description:
|
||||
"Enable single sign-on with Microsoft 365, Google Workspace, and GitHub. No complex federation setups—just connect and go.",
|
||||
},
|
||||
{
|
||||
icon: Key,
|
||||
title: "SSH Certificate Authority",
|
||||
description:
|
||||
"Issue short-lived SSH certificates tied to user identities. Eliminate shared SSH keys and achieve complete auditability.",
|
||||
},
|
||||
{
|
||||
icon: Lock,
|
||||
title: "Multi-Factor Authentication",
|
||||
description:
|
||||
"Enforce MFA policies across your organization with TOTP and WebAuthn/Passkey support. Compliance made simple.",
|
||||
},
|
||||
{
|
||||
icon: ArrowRightLeft,
|
||||
title: "OIDC Provider Built-In",
|
||||
description:
|
||||
"Secuird acts as an OIDC identity provider for your internal applications. One identity, seamless access everywhere.",
|
||||
},
|
||||
{
|
||||
icon: Network,
|
||||
title: "ZeroTier Network Governance",
|
||||
description:
|
||||
"Control access to private ZeroTier networks with approval workflows, time-bounded activation sessions, and instant kill switches.",
|
||||
},
|
||||
];
|
||||
|
||||
const sshFeatures = [
|
||||
{
|
||||
icon: Terminal,
|
||||
title: "Native SSH Integration",
|
||||
description: "Use standard SSH clients—no custom agents or modified binaries required. Works with OpenSSH out of the box.",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "Short-Lived Certificates",
|
||||
description: "Certificates expire automatically. Reduce blast radius and eliminate the headache of key rotation.",
|
||||
},
|
||||
{
|
||||
icon: Eye,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every certificate issuance and SSH connection is logged. Know exactly who accessed what, when.",
|
||||
},
|
||||
{
|
||||
icon: UserCheck,
|
||||
title: "Identity-Linked Access",
|
||||
description: "SSH access is tied to verified corporate identities. No more anonymous shared accounts.",
|
||||
},
|
||||
{
|
||||
icon: Terminal,
|
||||
title: "Native SSH Integration",
|
||||
description: "Use standard SSH clients—no custom agents or modified binaries required. Works with OpenSSH out of the box.",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "Short-Lived Certificates",
|
||||
description: "Certificates expire automatically. Reduce blast radius and eliminate the headache of key rotation.",
|
||||
},
|
||||
{
|
||||
icon: Eye,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every certificate issuance and SSH connection is logged. Know exactly who accessed what, when.",
|
||||
},
|
||||
{
|
||||
icon: UserCheck,
|
||||
title: "Identity-Linked Access",
|
||||
description: "SSH access is tied to verified corporate identities. No more anonymous shared accounts.",
|
||||
},
|
||||
];
|
||||
|
||||
const socialProviders = [
|
||||
{ name: "Microsoft 365", icon: Building2 },
|
||||
{ name: "Google Workspace", icon: Globe },
|
||||
{ name: "GitHub", icon: Key },
|
||||
{ name: "Microsoft 365", icon: Building2 },
|
||||
{ name: "Google Workspace", icon: Globe },
|
||||
{ name: "GitHub", icon: Key },
|
||||
{ name: "ZeroTier", icon: Network },
|
||||
];
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<>
|
||||
{/* Hero Section */}
|
||||
<section className="relative overflow-hidden bg-card">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-24 lg:py-32">
|
||||
<div className="text-center max-w-4xl mx-auto">
|
||||
{/* Badge */}
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6 border border-primary/20">
|
||||
<ShieldCheck className="h-4 w-4" />
|
||||
Security-first identity platform
|
||||
</div>
|
||||
|
||||
{/* Headline */}
|
||||
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-bold tracking-tight text-foreground mb-6">
|
||||
Enterprise Authentication,
|
||||
<span className="text-primary block mt-2">Without the Enterprise Complexity</span>
|
||||
</h1>
|
||||
|
||||
{/* Subheadline */}
|
||||
<p className="text-lg sm:text-xl text-muted-foreground max-w-2xl mx-auto mb-8">
|
||||
Secuird unifies social logins, MFA, and SSH certificate management in one platform.
|
||||
Your team gets seamless access. You get complete control and auditability.
|
||||
</p>
|
||||
|
||||
{/* CTA Buttons */}
|
||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
||||
<Link to="/register">
|
||||
<Button size="lg" className="gap-2">
|
||||
Start Free Trial
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
<Link to="/demo">
|
||||
<Button variant="outline" size="lg">
|
||||
Watch Demo
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
{/* Trust indicators */}
|
||||
<div className="mt-12 flex flex-col items-center">
|
||||
<p className="text-sm text-muted-foreground mb-4">Trusted authentication providers</p>
|
||||
<div className="flex items-center gap-6 sm:gap-8">
|
||||
{socialProviders.map((provider) => (
|
||||
<div key={provider.name} className="flex items-center gap-2 text-muted-foreground">
|
||||
<provider.icon className="h-5 w-5" />
|
||||
<span className="text-sm font-medium hidden sm:inline">{provider.name}</span>
|
||||
</div>
|
||||
))}
|
||||
return (
|
||||
<>
|
||||
{/* Hero Section */}
|
||||
<section className="relative overflow-hidden bg-card">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-24 lg:py-32">
|
||||
<div className="text-center max-w-4xl mx-auto">
|
||||
{/* Badge */}
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6 border border-primary/20">
|
||||
<ShieldCheck className="h-4 w-4" />
|
||||
Security-first identity platform
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Features Grid */}
|
||||
<section className="py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Everything You Need for Identity & Access
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
From user authentication to SSH certificate management, Secuird provides a complete identity platform.
|
||||
</p>
|
||||
</div>
|
||||
{/* Headline */}
|
||||
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-bold tracking-tight text-foreground mb-6">
|
||||
Every Identity. One Platform.
|
||||
<span className="text-primary block mt-2">Complete Access Control.</span>
|
||||
</h1>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{features.map((feature) => (
|
||||
<Card key={feature.title} className="bg-card hover:shadow-lg transition-shadow">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-12 w-12 rounded-lg bg-accent/10 flex items-center justify-center mb-4">
|
||||
<feature.icon className="h-6 w-6 text-accent" />
|
||||
</div>
|
||||
<h3 className="text-lg font-semibold text-foreground mb-2">{feature.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{feature.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="text-center mt-10">
|
||||
<Link to="/features">
|
||||
<Button variant="outline" className="gap-2">
|
||||
View All Features
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* SSH Certificates Feature Highlight */}
|
||||
<section className="py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4">
|
||||
<Terminal className="h-4 w-4" />
|
||||
SSH Certificate Authority
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Eliminate SSH Key Chaos
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground mb-6">
|
||||
Replace static SSH keys with short-lived certificates tied to verified identities.
|
||||
Every access is logged, every certificate is traceable.
|
||||
{/* Subheadline */}
|
||||
<p className="text-lg sm:text-xl text-muted-foreground max-w-2xl mx-auto mb-8">
|
||||
Secuird unifies Google, Microsoft, GitHub, and traditional authentication with MFA enforcement,
|
||||
SSH certificates, and ZeroTier network governance — all in one platform.
|
||||
</p>
|
||||
|
||||
<ul className="space-y-3 mb-8">
|
||||
{[
|
||||
"Works with standard OpenSSH—no custom clients needed",
|
||||
"Certificates expire automatically—no more key rotation",
|
||||
"Full audit trail from issuance to usage",
|
||||
"Group-based access policies",
|
||||
].map((item) => (
|
||||
<li key={item} className="flex items-start gap-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-accent flex-shrink-0 mt-0.5" />
|
||||
<span className="text-foreground">{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
{/* CTA Buttons */}
|
||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
||||
<Link to="/register">
|
||||
<Button size="lg" className="gap-2">
|
||||
Start Free Trial
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
<Link to="/demo">
|
||||
<Button variant="outline" size="lg">
|
||||
Watch Demo
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<Link to="/ssh-certificates">
|
||||
<Button className="gap-2">
|
||||
Learn About SSH Certificates
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
{/* Trust indicators */}
|
||||
<div className="mt-12 flex flex-col items-center">
|
||||
<p className="text-sm text-muted-foreground mb-4">Trusted authentication providers</p>
|
||||
<div className="flex items-center gap-6 sm:gap-8">
|
||||
{socialProviders.map((provider) => (
|
||||
<div key={provider.name} className="flex items-center gap-2 text-muted-foreground">
|
||||
<provider.icon className="h-5 w-5" />
|
||||
<span className="text-sm font-medium hidden sm:inline">{provider.name}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Features Grid */}
|
||||
<section className="py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Everything You Need for Identity & Access
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
From user authentication to SSH certificate management, Secuird provides a complete identity platform.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid sm:grid-cols-2 gap-4">
|
||||
{sshFeatures.map((feature) => (
|
||||
<Card key={feature.title} className="bg-muted/50">
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{features.map((feature) => (
|
||||
<Card key={feature.title} className="bg-card hover:shadow-lg transition-shadow">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center mb-3">
|
||||
<feature.icon className="h-5 w-5 text-primary" />
|
||||
<div className="h-12 w-12 rounded-lg bg-accent/10 flex items-center justify-center mb-4">
|
||||
<feature.icon className="h-6 w-6 text-accent" />
|
||||
</div>
|
||||
<h3 className="text-base font-semibold text-foreground mb-1">{feature.title}</h3>
|
||||
<h3 className="text-lg font-semibold text-foreground mb-2">{feature.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{feature.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* How It Works */}
|
||||
<section className="py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
How It Works
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Get started in minutes, not months. No complex federation required.
|
||||
</p>
|
||||
<div className="text-center mt-10">
|
||||
<Link to="/features">
|
||||
<Button variant="outline" className="gap-2">
|
||||
View All Features
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-8">
|
||||
{[
|
||||
{
|
||||
step: "01",
|
||||
title: "Connect Your Providers",
|
||||
description: "Link Microsoft 365, Google Workspace, or GitHub. Users authenticate with credentials they already have.",
|
||||
icon: Users,
|
||||
},
|
||||
{
|
||||
step: "02",
|
||||
title: "Configure Policies",
|
||||
description: "Set MFA requirements, access policies, and SSH certificate parameters. One policy, organization-wide.",
|
||||
icon: Settings,
|
||||
},
|
||||
{
|
||||
step: "03",
|
||||
title: "Connect Your Apps",
|
||||
description: "Register internal applications as OIDC clients. Users get seamless SSO access to everything.",
|
||||
icon: Fingerprint,
|
||||
},
|
||||
].map((step) => (
|
||||
<div key={step.step} className="relative">
|
||||
<div className="text-6xl font-bold text-primary/10 mb-4">{step.step}</div>
|
||||
<div className="h-12 w-12 rounded-lg bg-accent/10 flex items-center justify-center mb-4">
|
||||
<step.icon className="h-6 w-6 text-accent" />
|
||||
{/* SSH Certificates Feature Highlight */}
|
||||
<section className="py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4">
|
||||
<Terminal className="h-4 w-4" />
|
||||
SSH Certificate Authority
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold text-foreground mb-2">{step.title}</h3>
|
||||
<p className="text-muted-foreground">{step.description}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Eliminate SSH Key Chaos
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground mb-6">
|
||||
Replace static SSH keys with short-lived certificates tied to verified identities.
|
||||
Every access is logged, every certificate is traceable.
|
||||
</p>
|
||||
|
||||
{/* Marketing & Registration Tracking */}
|
||||
<section className="py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div className="order-2 lg:order-1">
|
||||
<Card className="bg-gradient-to-br from-primary/5 to-accent/5 border-0">
|
||||
<CardContent className="p-8">
|
||||
<div className="space-y-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="h-10 w-10 rounded-full bg-accent/10 flex items-center justify-center">
|
||||
<Users className="h-5 w-5 text-accent" />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm font-medium text-foreground">Marketing Campaign A</p>
|
||||
<p className="text-xs text-muted-foreground">utm_source=newsletter</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="h-10 w-10 rounded-full bg-accent/10 flex items-center justify-center">
|
||||
<Users className="h-5 w-5 text-accent" />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm font-medium text-foreground">Partner Integration</p>
|
||||
<p className="text-xs text-muted-foreground">referral_code=partner123</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="h-10 w-10 rounded-full bg-accent/10 flex items-center justify-center">
|
||||
<Users className="h-5 w-5 text-accent" />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm font-medium text-foreground">Direct Signup</p>
|
||||
<p className="text-xs text-muted-foreground">organic registration</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="pt-4 border-t">
|
||||
<p className="text-sm text-muted-foreground mb-2">Auto-applied policies:</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<span className="px-2 py-1 bg-primary/10 text-primary text-xs rounded-full">Trial Extended</span>
|
||||
<span className="px-2 py-1 bg-accent/10 text-accent text-xs rounded-full">Partner Group</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
<ul className="space-y-3 mb-8">
|
||||
{[
|
||||
"Works with standard OpenSSH—no custom clients needed",
|
||||
"Certificates expire automatically—no more key rotation",
|
||||
"Full audit trail from issuance to usage",
|
||||
"Group-based access policies",
|
||||
].map((item) => (
|
||||
<li key={item} className="flex items-start gap-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-accent flex-shrink-0 mt-0.5" />
|
||||
<span className="text-foreground">{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
<div className="order-1 lg:order-2">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent/10 text-accent text-sm font-medium mb-4">
|
||||
<Users className="h-4 w-4" />
|
||||
Registration Tracking
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Know Where Your Users Come From
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground mb-6">
|
||||
Track user registration sources through marketing codes, UTM parameters, or referral links.
|
||||
Apply policies and group memberships automatically based on origin.
|
||||
</p>
|
||||
|
||||
<ul className="space-y-3">
|
||||
{[
|
||||
"Automatic group assignment based on registration source",
|
||||
"UTM parameter tracking for marketing attribution",
|
||||
"Custom invite codes with policy presets",
|
||||
"Partner and affiliate tracking",
|
||||
].map((item) => (
|
||||
<li key={item} className="flex items-start gap-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-accent flex-shrink-0 mt-0.5" />
|
||||
<span className="text-foreground">{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Security & Compliance */}
|
||||
<section className="py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-16">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4">
|
||||
<Shield className="h-4 w-4" />
|
||||
Security First
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Built for Enterprise Security Requirements
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Every feature is designed with security and compliance in mind. From MFA enforcement to complete audit trails.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-8">
|
||||
{[
|
||||
{
|
||||
icon: Lock,
|
||||
title: "MFA Enforcement",
|
||||
description: "Organization-wide MFA policies. Require TOTP or WebAuthn for all users, with grace periods for enrollment.",
|
||||
},
|
||||
{
|
||||
icon: Eye,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every action is logged. From logins to SSH certificate usage, you have full visibility into who did what.",
|
||||
},
|
||||
{
|
||||
icon: ShieldCheck,
|
||||
title: "Compliance Ready",
|
||||
description: "Meet SOC 2, HIPAA, and other compliance requirements with documented security controls and audit logs.",
|
||||
},
|
||||
].map((item) => (
|
||||
<Card key={item.title} className="bg-card">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
||||
<item.icon className="h-6 w-6 text-primary" />
|
||||
</div>
|
||||
<h3 className="text-lg font-semibold text-foreground mb-2">{item.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{item.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="text-center mt-10">
|
||||
<Link to="/security">
|
||||
<Button variant="outline" className="gap-2">
|
||||
Learn About Security
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA Section */}
|
||||
<section className="py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<Card className="bg-gradient-to-br from-primary to-primary/80 border-0 overflow-hidden relative">
|
||||
<div className="absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMC4wNSI+PHBhdGggZD0iTTM2IDM0djItSDI0djJoMTJ6Ii8+PC9nPjwvZz48L3N2Zz4=')] opacity-50" />
|
||||
<CardContent className="p-12 text-center relative">
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-primary-foreground mb-4">
|
||||
Ready to Simplify Your Identity Stack?
|
||||
</h2>
|
||||
<p className="text-lg text-primary-foreground/80 max-w-2xl mx-auto mb-8">
|
||||
Start your free trial today. No credit card required. Set up SSO and SSH certificates in under an hour.
|
||||
</p>
|
||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
||||
<Link to="/register">
|
||||
<Button size="lg" variant="secondary" className="gap-2 bg-white text-primary hover:bg-white/90 font-semibold">
|
||||
Start Free Trial
|
||||
<Link to="/ssh-certificates">
|
||||
<Button className="gap-2">
|
||||
Learn About SSH Certificates
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
<Link to="/pricing">
|
||||
<Button size="lg" className="bg-transparent border-2 border-white text-white hover:bg-white/15 font-semibold">
|
||||
View Pricing
|
||||
</div>
|
||||
|
||||
<div className="grid sm:grid-cols-2 gap-4">
|
||||
{sshFeatures.map((feature) => (
|
||||
<Card key={feature.title} className="bg-muted/50">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center mb-3">
|
||||
<feature.icon className="h-5 w-5 text-primary" />
|
||||
</div>
|
||||
<h3 className="text-base font-semibold text-foreground mb-1">{feature.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{feature.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* ZeroTier Network Access Section */}
|
||||
<section className="py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4">
|
||||
<Network className="h-4 w-4" />
|
||||
ZeroTier Network Governance
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Govern Your ZeroTier Networks<br />
|
||||
<span className="text-primary">With Your Identity Platform</span>
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground mb-6">
|
||||
Stop managing ZeroTier access through raw administration interfaces. Secuird adds
|
||||
approval workflows, time-bounded activation sessions, and complete audit trails
|
||||
to your ZeroTier networks.
|
||||
</p>
|
||||
|
||||
<ul className="space-y-3 mb-8">
|
||||
{[
|
||||
"Register devices by ZeroTier Node ID — no shared secrets",
|
||||
"Manager approval before any network access is granted",
|
||||
"Time-bounded activation sessions (e.g., 8-hour workday)",
|
||||
"Instant kill switch to revoke all active memberships",
|
||||
"Full audit trail of who accessed what network when",
|
||||
].map((item) => (
|
||||
<li key={item} className="flex items-start gap-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-accent flex-shrink-0 mt-0.5" />
|
||||
<span className="text-foreground">{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
|
||||
<Link to="/zerotier">
|
||||
<Button className="gap-2">
|
||||
Learn About Network Governance
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</section>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
<div className="relative">
|
||||
{/* Screenshot placeholder - replace with actual screenshot */}
|
||||
<Card className="bg-card shadow-xl border-2 border-dashed border-muted-foreground/20">
|
||||
<CardContent className="p-8 text-center">
|
||||
<div className="flex flex-col items-center justify-center py-12 space-y-4">
|
||||
<Network className="h-16 w-16 text-muted-foreground/40" />
|
||||
<div className="space-y-2">
|
||||
<p className="text-sm font-medium text-muted-foreground">ZeroTier Networks Dashboard</p>
|
||||
<p className="text-xs text-muted-foreground/60">Screenshot placeholder — replace with:</p>
|
||||
<ul className="text-xs text-muted-foreground/60 list-disc list-inside">
|
||||
<li>Networks list view</li>
|
||||
<li>Device activation status</li>
|
||||
<li>Member management panel</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* How It Works */}
|
||||
<section className="py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
How It Works
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Get started in minutes, not months. No complex federation required.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-8">
|
||||
{[
|
||||
{
|
||||
step: "01",
|
||||
title: "Connect Your Providers",
|
||||
description: "Link Microsoft 365, Google Workspace, or GitHub. Users authenticate with credentials they already have.",
|
||||
icon: Users,
|
||||
},
|
||||
{
|
||||
step: "02",
|
||||
title: "Configure Policies",
|
||||
description: "Set MFA requirements, access policies, and SSH certificate parameters. One policy, organization-wide.",
|
||||
icon: Settings,
|
||||
},
|
||||
{
|
||||
step: "03",
|
||||
title: "Connect Your Apps",
|
||||
description: "Register internal applications as OIDC clients. Users get seamless SSO access to everything.",
|
||||
icon: Fingerprint,
|
||||
},
|
||||
].map((step) => (
|
||||
<div key={step.step} className="relative">
|
||||
<div className="text-6xl font-bold text-primary/10 mb-4">{step.step}</div>
|
||||
<div className="h-12 w-12 rounded-lg bg-accent/10 flex items-center justify-center mb-4">
|
||||
<step.icon className="h-6 w-6 text-accent" />
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold text-foreground mb-2">{step.title}</h3>
|
||||
<p className="text-muted-foreground">{step.description}</p>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Marketing & Registration Tracking */}
|
||||
<section className="py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div className="order-2 lg:order-1">
|
||||
<Card className="bg-gradient-to-br from-primary/5 to-accent/5 border-0">
|
||||
<CardContent className="p-8">
|
||||
<div className="space-y-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="h-10 w-10 rounded-full bg-accent/10 flex items-center justify-center">
|
||||
<Users className="h-5 w-5 text-accent" />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm font-medium text-foreground">Marketing Campaign A</p>
|
||||
<p className="text-xs text-muted-foreground">utm_source=newsletter</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="h-10 w-10 rounded-full bg-accent/10 flex items-center justify-center">
|
||||
<Users className="h-5 w-5 text-accent" />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm font-medium text-foreground">Partner Integration</p>
|
||||
<p className="text-xs text-muted-foreground">referral_code=partner123</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="h-10 w-10 rounded-full bg-accent/10 flex items-center justify-center">
|
||||
<Users className="h-5 w-5 text-accent" />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm font-medium text-foreground">Direct Signup</p>
|
||||
<p className="text-xs text-muted-foreground">organic registration</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="pt-4 border-t">
|
||||
<p className="text-sm text-muted-foreground mb-2">Auto-applied policies:</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<span className="px-2 py-1 bg-primary/10 text-primary text-xs rounded-full">Trial Extended</span>
|
||||
<span className="px-2 py-1 bg-accent/10 text-accent text-xs rounded-full">Partner Group</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<div className="order-1 lg:order-2">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent/10 text-accent text-sm font-medium mb-4">
|
||||
<Users className="h-4 w-4" />
|
||||
Registration Tracking
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Know Where Your Users Come From
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground mb-6">
|
||||
Track user registration sources through marketing codes, UTM parameters, or referral links.
|
||||
Apply policies and group memberships automatically based on origin.
|
||||
</p>
|
||||
|
||||
<ul className="space-y-3">
|
||||
{[
|
||||
"Automatic group assignment based on registration source",
|
||||
"UTM parameter tracking for marketing attribution",
|
||||
"Custom invite codes with policy presets",
|
||||
"Partner and affiliate tracking",
|
||||
].map((item) => (
|
||||
<li key={item} className="flex items-start gap-3">
|
||||
<CheckCircle2 className="h-5 w-5 text-accent flex-shrink-0 mt-0.5" />
|
||||
<span className="text-foreground">{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Security & Compliance */}
|
||||
<section className="py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-16">
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-4">
|
||||
<Shield className="h-4 w-4" />
|
||||
Security First
|
||||
</div>
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-foreground mb-4">
|
||||
Built for Enterprise Security Requirements
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Every feature is designed with security and compliance in mind. From MFA enforcement to complete audit trails.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-8">
|
||||
{[
|
||||
{
|
||||
icon: Lock,
|
||||
title: "MFA Enforcement",
|
||||
description: "Organization-wide MFA policies. Require TOTP or WebAuthn for all users, with grace periods for enrollment.",
|
||||
},
|
||||
{
|
||||
icon: Eye,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every action is logged. From logins to SSH certificate usage, you have full visibility into who did what.",
|
||||
},
|
||||
{
|
||||
icon: ShieldCheck,
|
||||
title: "Compliance Ready",
|
||||
description: "Meet SOC 2, HIPAA, and other compliance requirements with documented security controls and audit logs.",
|
||||
},
|
||||
].map((item) => (
|
||||
<Card key={item.title} className="bg-card">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
||||
<item.icon className="h-6 w-6 text-primary" />
|
||||
</div>
|
||||
<h3 className="text-lg font-semibold text-foreground mb-2">{item.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{item.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="text-center mt-10">
|
||||
<Link to="/security">
|
||||
<Button variant="outline" className="gap-2">
|
||||
Learn About Security
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA Section */}
|
||||
<section className="py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<Card className="bg-gradient-to-br from-primary to-primary/80 border-0 overflow-hidden relative">
|
||||
<div className="absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMC4wNSI+PHBhdGggZD0iTTM2IDM0djItSDI0djJoMTJ6Ii8+PC9nPjwvZz48L3N2Zz4=')] opacity-50" />
|
||||
<CardContent className="p-12 text-center relative">
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-primary-foreground mb-4">
|
||||
Ready to Simplify Your Identity Stack?
|
||||
</h2>
|
||||
<p className="text-lg text-primary-foreground/80 max-w-2xl mx-auto mb-8">
|
||||
Start your free trial today. No credit card required. Set up SSO and SSH certificates in under an hour.
|
||||
</p>
|
||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
||||
<Link to="/register">
|
||||
<Button size="lg" variant="secondary" className="gap-2 bg-white text-primary hover:bg-white/90 font-semibold">
|
||||
Start Free Trial
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
<Link to="/pricing">
|
||||
<Button size="lg" className="bg-transparent border-2 border-white text-white hover:bg-white/15 font-semibold">
|
||||
View Pricing
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</section>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -68,14 +68,14 @@ code: "# Certificate auto-expires",
|
||||
];
|
||||
|
||||
const comparisonFeatures = [
|
||||
{ feature: "Lifetime", static: "Permanent", cert: "Minutes to hours" },
|
||||
{ feature: "Rotation", static: "Manual, error-prone", cert: "Automatic" },
|
||||
{ feature: "Auditability", static: "None", cert: "Full chain of custody" },
|
||||
{ feature: "Revocation", static: "Distribute to all servers", cert: "Disable user" },
|
||||
{ feature: "Access Control", static: "Manual key distribution", cert: "Group-based policies" },
|
||||
{ feature: "Identity Link", static: "Anonymous", cert: "Verified identity" },
|
||||
{ feature: "Onboarding", static: "Copy keys manually", cert: "Self-service" },
|
||||
{ feature: "Offboarding", static: "Hunt and remove keys", cert: "Instant revocation" },
|
||||
{ feature: "Key Lifetime", static: "Permanent — keys never expire", cert: "Minutes to hours — auto-expiration" },
|
||||
{ feature: "Key Rotation", static: "Manual process, error-prone", cert: "Automatic with each certificate" },
|
||||
{ feature: "Audit Trail", static: "No visibility into usage", cert: "Full chain of custody logged" },
|
||||
{ feature: "Revocation", static: "Must reach all servers manually", cert: "Disable user — instant globally" },
|
||||
{ feature: "Access Control", static: "Manual key distribution to servers", cert: "Group-based policies, self-service" },
|
||||
{ feature: "Identity Link", static: "Anonymous — no user verification", cert: "Tied to verified corporate identity" },
|
||||
{ feature: "Onboarding", static: "Admin copies keys to every server", cert: "User registers key once, self-service" },
|
||||
{ feature: "Offboarding", static: "Hunt and remove keys from servers", cert: "Disable user — all certs invalidated" },
|
||||
];
|
||||
|
||||
const useCases = [
|
||||
|
||||
@@ -0,0 +1,466 @@
|
||||
import { Link } from "react-router-dom";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card, CardContent } from "@/components/ui/card";
|
||||
import {
|
||||
Network,
|
||||
Monitor,
|
||||
Users,
|
||||
Clock,
|
||||
Zap,
|
||||
ShieldCheck,
|
||||
ArrowRight,
|
||||
CheckCircle2,
|
||||
ShieldAlert,
|
||||
Globe,
|
||||
Lock,
|
||||
Key,
|
||||
} from "lucide-react";
|
||||
|
||||
const benefits = [
|
||||
{
|
||||
icon: Monitor,
|
||||
title: "Node ID Registration",
|
||||
description: "Register ZeroTier nodes by their unique Node ID. No shared secrets — users own their devices, not the network.",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Approval Workflows",
|
||||
description: "Manager approval required before network access. Durable approvals survive across days while maintaining security.",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "Time-Bounded Sessions",
|
||||
description: "Activation sessions last hours, not days. Re-authenticate to activate for a fixed period like an 8-hour workday.",
|
||||
},
|
||||
{
|
||||
icon: Zap,
|
||||
title: "Instant Kill Switch",
|
||||
description: "Revoke all active memberships for a user across all networks. Lost laptop? Immediate response.",
|
||||
},
|
||||
];
|
||||
|
||||
const howItWorks = [
|
||||
{
|
||||
step: "01",
|
||||
title: "Register ZeroTier Node",
|
||||
description: "Users register their ZeroTier Node ID in Secuird. This is a one-time setup — no shared secrets required.",
|
||||
code: "zerotier-cli info",
|
||||
},
|
||||
{
|
||||
step: "02",
|
||||
title: "Request Network Access",
|
||||
description: "When users need access to a ZeroTier network, they request access through Secuird.",
|
||||
code: "Request via Secuird dashboard",
|
||||
},
|
||||
{
|
||||
step: "03",
|
||||
title: "Manager Approval",
|
||||
description: "A manager reviews and approves the request. Approval is durable — it persists until explicitly revoked.",
|
||||
code: "Approved in Secuird portal",
|
||||
},
|
||||
{
|
||||
step: "04",
|
||||
title: "Activate for a Session",
|
||||
description: "User activates their access for a time-bounded session. When the session expires, they re-authenticate.",
|
||||
code: "Session expires automatically",
|
||||
},
|
||||
];
|
||||
|
||||
const comparisonFeatures = [
|
||||
{
|
||||
feature: "Access Control",
|
||||
traditional: "Shared secrets or public lists",
|
||||
secuird: "Identity-based, approval workflows",
|
||||
},
|
||||
{
|
||||
feature: "Session Duration",
|
||||
traditional: "Permanent until manually removed",
|
||||
secuird: "Hours — automatic expiration",
|
||||
},
|
||||
{
|
||||
feature: "Revocation",
|
||||
traditional: "Remove from every network manually",
|
||||
secuird: "Disable user — instant global revoke",
|
||||
},
|
||||
{
|
||||
feature: "Audit Trail",
|
||||
traditional: "None",
|
||||
secuird: "Complete log of all access events",
|
||||
},
|
||||
{
|
||||
feature: "Manager Control",
|
||||
traditional: "No approval workflow",
|
||||
secuird: "Explicit approval before access granted",
|
||||
},
|
||||
{
|
||||
feature: "Contractor Access",
|
||||
traditional: "Share credentials, revoke later",
|
||||
secuird: "Time-limited, self-service, audited",
|
||||
},
|
||||
];
|
||||
|
||||
const useCases = [
|
||||
{
|
||||
title: "Managed Service Providers (MSPs)",
|
||||
description: "Manage access for multiple client networks without sharing credentials. Contractors come and go — maintain control with time-bounded sessions.",
|
||||
features: [
|
||||
"Isolate each client's network access",
|
||||
"Time-limited access for contractors",
|
||||
"Complete audit trail for compliance",
|
||||
"Instant revocation when contracts end",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Cloud Service Providers (CSPs)",
|
||||
description: "Offer ZeroTier-based private networking to your customers with enterprise-grade access controls.",
|
||||
features: [
|
||||
"Multi-tenant network isolation",
|
||||
"Approval workflows for sensitive networks",
|
||||
"Usage auditing for billing",
|
||||
"White-label options",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Hyperscalers",
|
||||
description: "Provide secure ZeroTier connectivity across distributed infrastructure with identity-based access control.",
|
||||
features: [
|
||||
"Scale to thousands of nodes",
|
||||
"Identity-linked access everywhere",
|
||||
"Automated compliance reporting",
|
||||
"API-driven provisioning",
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Short-Term Contractors",
|
||||
description: "Give contractors access to specific networks for specific periods. When the contract ends, access ends — automatically.",
|
||||
features: [
|
||||
"Hours-long activation sessions",
|
||||
"No shared credentials",
|
||||
"Full audit of what they accessed",
|
||||
"One-click revocation",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
const features = [
|
||||
{
|
||||
icon: Monitor,
|
||||
title: "Node ID Registration",
|
||||
description: "Register ZeroTier nodes by their unique Node ID. No shared secrets — users own their devices.",
|
||||
},
|
||||
{
|
||||
icon: Users,
|
||||
title: "Approval Workflows",
|
||||
description: "Manager approval required before network access. Durable approvals survive across days.",
|
||||
},
|
||||
{
|
||||
icon: Clock,
|
||||
title: "Activation Sessions",
|
||||
description: "Time-bounded access sessions. Re-authenticate to activate for a fixed period like an 8-hour workday.",
|
||||
},
|
||||
{
|
||||
icon: Zap,
|
||||
title: "Kill Switch",
|
||||
description: "Instantly revoke all active memberships for a user across all networks. Lost laptop? Immediate response.",
|
||||
},
|
||||
{
|
||||
icon: ShieldCheck,
|
||||
title: "Complete Audit Trail",
|
||||
description: "Every network access event logged. Know who accessed what, when, and from which device.",
|
||||
},
|
||||
{
|
||||
icon: Network,
|
||||
title: "Multi-Network Support",
|
||||
description: "Manage production, staging, and lab networks separately with environment-based policies.",
|
||||
},
|
||||
];
|
||||
|
||||
export default function ZeroTierPage() {
|
||||
return (
|
||||
<>
|
||||
{/* Hero */}
|
||||
<section className="py-16 lg:py-24 bg-gradient-to-b from-background to-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="grid lg:grid-cols-2 gap-12 items-center">
|
||||
<div>
|
||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-accent/10 text-accent text-sm font-medium mb-6">
|
||||
<Network className="h-4 w-4" />
|
||||
ZeroTier Network Governance
|
||||
</div>
|
||||
<h1 className="text-4xl sm:text-5xl font-bold tracking-tight text-foreground mb-6">
|
||||
Identity-Based Access Control
|
||||
<span className="text-accent block mt-2">For ZeroTier Networks</span>
|
||||
</h1>
|
||||
<p className="text-lg text-muted-foreground mb-8">
|
||||
Stop managing ZeroTier access through raw administration interfaces. Secuird adds
|
||||
approval workflows, time-bounded activation sessions, and complete audit trails
|
||||
to your ZeroTier networks — without requiring SSH certificates.
|
||||
</p>
|
||||
<div className="flex flex-col sm:flex-row gap-4">
|
||||
<Link to="/register">
|
||||
<Button size="lg" className="gap-2">
|
||||
Start Free Trial
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
<Link to="/demo">
|
||||
<Button variant="outline" size="lg">
|
||||
Watch Demo
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="relative">
|
||||
<Card className="bg-card shadow-xl">
|
||||
<CardContent className="p-8">
|
||||
<div className="space-y-4">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="h-10 w-10 rounded-lg bg-accent/10 flex items-center justify-center">
|
||||
<Network className="h-5 w-5 text-accent" />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm font-medium text-foreground">Production Network</p>
|
||||
<p className="text-xs text-muted-foreground">zt1abc...def</p>
|
||||
</div>
|
||||
<span className="ml-auto px-2 py-1 bg-success/10 text-success text-xs rounded-full">Active</span>
|
||||
</div>
|
||||
<div className="border-t pt-4">
|
||||
<p className="text-sm text-muted-foreground mb-2">Pending Requests</p>
|
||||
<div className="space-y-2">
|
||||
<div className="flex items-center justify-between text-sm">
|
||||
<span>jane@contractor.io</span>
|
||||
<span className="text-xs text-muted-foreground">2 hours ago</span>
|
||||
</div>
|
||||
<div className="flex items-center justify-between text-sm">
|
||||
<span>build-server-03</span>
|
||||
<span className="text-xs text-muted-foreground">5 hours ago</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="border-t pt-4">
|
||||
<p className="text-sm text-muted-foreground mb-2">Active Sessions</p>
|
||||
<div className="space-y-2">
|
||||
<div className="flex items-center justify-between text-sm">
|
||||
<span>john@company.com</span>
|
||||
<span className="text-xs text-accent">Expires in 4h 23m</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Not Tied to SSH */}
|
||||
<section className="py-12 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="bg-accent/5 border border-accent/20 rounded-lg p-6">
|
||||
<div className="flex items-start gap-4">
|
||||
<ShieldAlert className="h-6 w-6 text-accent flex-shrink-0 mt-1" />
|
||||
<div>
|
||||
<h3 className="font-semibold text-foreground mb-1">Independent of SSH Certificates</h3>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
ZeroTier Network Governance works completely independently of SSH Certificate Authority.
|
||||
Use it on its own to control ZeroTier network access, or combine it with SSH certificates
|
||||
for comprehensive infrastructure access control. Two powerful features, one unified platform.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Benefits */}
|
||||
<section className="py-16 lg:py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-12">
|
||||
<h2 className="text-3xl font-bold text-foreground mb-4">
|
||||
Why ZeroTier Governance?
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Traditional ZeroTier management relies on shared secrets and manual administration.
|
||||
Secuird brings identity-based access control to ZeroTier.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{benefits.map((benefit) => (
|
||||
<Card key={benefit.title} className="bg-card">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-12 w-12 rounded-lg bg-accent/10 flex items-center justify-center mb-4">
|
||||
<benefit.icon className="h-6 w-6 text-accent" />
|
||||
</div>
|
||||
<h3 className="text-lg font-semibold text-foreground mb-2">{benefit.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{benefit.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* How It Works */}
|
||||
<section className="py-16 lg:py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-12">
|
||||
<h2 className="text-3xl font-bold text-foreground mb-4">
|
||||
How It Works
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Simple four-step process from registration to time-bounded access.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{howItWorks.map((step) => (
|
||||
<Card key={step.step} className="bg-card">
|
||||
<CardContent className="pt-6">
|
||||
<div className="text-5xl font-bold text-primary/10 mb-2">{step.step}</div>
|
||||
<h3 className="text-lg font-semibold text-foreground mb-2">{step.title}</h3>
|
||||
<p className="text-sm text-muted-foreground mb-4">{step.description}</p>
|
||||
<pre className="p-2 bg-muted rounded text-xs font-mono text-muted-foreground overflow-x-auto">
|
||||
<code>{step.code}</code>
|
||||
</pre>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Traditional vs Secuird */}
|
||||
<section className="py-16 lg:py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-12">
|
||||
<h2 className="text-3xl font-bold text-foreground mb-4">
|
||||
Traditional vs. Secuird-Governed ZeroTier
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
See the difference identity-based access control makes.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<Card className="overflow-hidden">
|
||||
<CardContent className="p-0">
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full">
|
||||
<thead>
|
||||
<tr className="border-b bg-muted/50">
|
||||
<th className="px-6 py-4 text-left text-sm font-semibold text-foreground">Feature</th>
|
||||
<th className="px-6 py-4 text-center text-sm font-semibold text-destructive">Traditional ZeroTier</th>
|
||||
<th className="px-6 py-4 text-center text-sm font-semibold text-accent bg-accent/5">Secuird-Governed</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody className="divide-y">
|
||||
{comparisonFeatures.map((row) => (
|
||||
<tr key={row.feature} className="hover:bg-muted/30">
|
||||
<td className="px-6 py-4 text-sm font-medium text-foreground">{row.feature}</td>
|
||||
<td className="px-6 py-4 text-sm text-center text-destructive/80">{row.traditional}</td>
|
||||
<td className="px-6 py-4 text-sm text-center text-accent bg-accent/5 font-medium">{row.secuird}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Use Cases */}
|
||||
<section className="py-16 lg:py-24 bg-muted/30">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-12">
|
||||
<h2 className="text-3xl font-bold text-foreground mb-4">
|
||||
Use Cases
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Perfect for organizations managing access to ZeroTier networks at scale.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-6">
|
||||
{useCases.map((useCase) => (
|
||||
<Card key={useCase.title} className="bg-card">
|
||||
<CardContent className="pt-6">
|
||||
<h3 className="text-lg font-semibold text-foreground mb-2">{useCase.title}</h3>
|
||||
<p className="text-sm text-muted-foreground mb-4">{useCase.description}</p>
|
||||
<ul className="space-y-2">
|
||||
{useCase.features.map((feature) => (
|
||||
<li key={feature} className="flex items-center gap-2 text-sm text-foreground">
|
||||
<CheckCircle2 className="h-4 w-4 text-accent" />
|
||||
{feature}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Features Deep Dive */}
|
||||
<section className="py-16 lg:py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="text-center mb-12">
|
||||
<h2 className="text-3xl font-bold text-foreground mb-4">
|
||||
Powerful Features
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
||||
Everything you need to manage ZeroTier network access at scale.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
{features.map((feature) => (
|
||||
<Card key={feature.title} className="bg-card">
|
||||
<CardContent className="pt-6">
|
||||
<div className="h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center mb-3">
|
||||
<feature.icon className="h-5 w-5 text-primary" />
|
||||
</div>
|
||||
<h3 className="text-base font-semibold text-foreground mb-1">{feature.title}</h3>
|
||||
<p className="text-sm text-muted-foreground">{feature.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA */}
|
||||
<section className="py-16 lg:py-24">
|
||||
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
||||
<Card className="bg-gradient-to-br from-primary to-primary/80 border-0 overflow-hidden relative">
|
||||
<div className="absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIGZpbGw9IiNmZmYiIGZpbGwtb3BhY2l0eT0iMC4wNSI+PHBhdGggZD0iTTM2IDM0djItSDI0djJoMTJ6Ii8+PC9nPjwvZz48L3N2Zz4=')] opacity-50" />
|
||||
<CardContent className="p-12 text-center relative">
|
||||
<h2 className="text-3xl sm:text-4xl font-bold text-primary-foreground mb-4">
|
||||
Ready to Govern Your ZeroTier Networks?
|
||||
</h2>
|
||||
<p className="text-lg text-primary-foreground/80 max-w-2xl mx-auto mb-8">
|
||||
Start your free trial today. No credit card required. Set up your first network governance policy in minutes.
|
||||
</p>
|
||||
<div className="flex flex-col sm:flex-row items-center justify-center gap-4">
|
||||
<Link to="/register">
|
||||
<Button size="lg" variant="secondary" className="gap-2 bg-white text-primary hover:bg-white/90 font-semibold">
|
||||
Start Free Trial
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
</Button>
|
||||
</Link>
|
||||
<Link to="/demo">
|
||||
<Button size="lg" className="bg-transparent border-2 border-white text-white hover:bg-white/15 font-semibold">
|
||||
Watch Demo
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
</section>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
import React from "react";
|
||||
import { renderToString } from "react-dom/server";
|
||||
import { MemoryRouter } from "react-router-dom";
|
||||
import HomePage from "../HomePage";
|
||||
import FeaturesPage from "../FeaturesPage";
|
||||
|
||||
// Basic SSR tests to verify marketing page content renders as expected.
|
||||
// We SSR the components to a string and assert presence of key headlines/texts.
|
||||
|
||||
describe("Marketing Pages SSR", () => {
|
||||
test("HomePage renders main hero headline", () => {
|
||||
const html = renderToString(
|
||||
React.createElement(MemoryRouter, null, React.createElement(HomePage))
|
||||
);
|
||||
expect(html).toContain("Every Identity. One Platform.");
|
||||
// Ensure subheading is also present
|
||||
expect(html).toContain("Secuird unifies Google, Microsoft, GitHub");
|
||||
});
|
||||
|
||||
test("FeaturesPage renders hero section title", () => {
|
||||
const html = renderToString(
|
||||
React.createElement(MemoryRouter, null, React.createElement(FeaturesPage))
|
||||
);
|
||||
// The hero section uses a combined heading with a span; test for the main line.
|
||||
expect(html).toContain("Everything You Need for Enterprise Identity");
|
||||
// Also verify the badge text is present
|
||||
expect(html).toContain("Complete Feature Set");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user