diff --git a/docs/app/layout.tsx b/docs/app/layout.tsx index ac3ce6f..258f562 100644 --- a/docs/app/layout.tsx +++ b/docs/app/layout.tsx @@ -1,4 +1,4 @@ -import type { Metadata } from "next" +import type { Metadata, Viewport } from "next" import { Poppins } from "next/font/google" import { GoogleTagManager } from "@next/third-parties/google" @@ -13,7 +13,7 @@ import "@/styles/globals.css" const inter = Poppins({ variable: "--font-inter", subsets: ["latin"], - weight: "500" + weight: ["300", "400", "500", "600", "700"], }) const baseUrl = Settings.metadataBase @@ -49,6 +49,11 @@ export const metadata: Metadata = { }, } +export const viewport: Viewport = { + width: "device-width", + initialScale: 1, +} + export default function RootLayout({ children, }: Readonly<{ diff --git a/docs/app/page.tsx b/docs/app/page.tsx index 2e59210..6ca37c5 100644 --- a/docs/app/page.tsx +++ b/docs/app/page.tsx @@ -1,602 +1,606 @@ "use client" -import React, { useMemo, useState } from "react"; -import Image from "next/image"; -import { useTheme } from "next-themes"; -import { Check, Clipboard, ClipboardCheck, CircleDollarSign, Shield, Zap, Eye, Server, Activity, Cloud, Lock, Database, Network, Gauge, ArrowRight, Rocket, FileText, Globe, Book, Info, IdCard, Bot, X } from "lucide-react"; -import FeatureAccordion from "@/components/FeatureAccordion"; -import { Tabs, TabsList, TabsContent, TabsTrigger } from "@/components/ui/tabs"; -import { PrimaryButton, GhostButton } from "@/components/navigation/buttons"; -import { VideoPlayer } from "@/components/navigation/video"; -import { SectionHeader, ContactModal, CopyField, Container } from "@/components/navigation/core-ui"; -import { InvestorSection } from "@/components/homepage/InvestorSection"; -import { UFOAnimation } from "@/components/homepage/UFOAnimation"; -import { InstallSection } from "@/components/homepage/InstallSection"; -import { SupportedLogoWall } from "@/components/homepage/LogoWall"; -import { BigOctopus } from "@/components/homepage/BigOctopus"; -import { FeatureGridSection } from "@/components/homepage/FeatureGrid"; - - - - -function FeatureDoublePane() { +import Image from "next/image" +import { useState } from "react" +import { + ArrowRight, + Bot, + Braces, + Check, + Clipboard, + Cloud, + Database, + FileText, + Fingerprint, + Globe2, + Layers3, + ShieldCheck, + UserRound, + Wrench, +} from "lucide-react" + +import { ContactModal } from "@/components/navigation/core-ui" + +type CustomerLogo = { + name: string + src?: string + text?: string + className?: string +} + +const customers: CustomerLogo[] = [ + { name: "Smallest.ai", text: "smallest.ai", className: "font-light" }, + { name: "WisdomAI", text: "WisdomAI", className: "font-semibold" }, + { name: "Yubi", text: "Yubi", className: "font-semibold" }, + { name: "Meesho", src: "/customer-logos/meesho.svg" }, + { name: "slice", src: "/customer-logos/slice.png" }, + { name: "Razorpay", src: "/customer-logos/razorpay.png" }, + { name: "Nykaa", src: "/aiostack-logos/nykaa.svg" }, + { name: "Rapyuta Robotics", src: "/aiostack-logos/rapyuta.svg" }, + { name: "Cyware", text: "CYWARE", className: "font-semibold tracking-[0.02em]" }, + { name: "R Systems", text: "R Systems", className: "font-semibold" }, + { name: "CansoAI", src: "/customer-logos/canso.svg" }, + { name: "Yugen AI", src: "/aiostack-logos/yugen.svg" }, + { name: "Instacart", src: "/customer-logos/instacart.svg" }, +] + +function cn(...classes: Array) { + return classes.filter(Boolean).join(" ") +} + +function Shell({ children, className = "" }: { children: React.ReactNode; className?: string }) { + return
{children}
+} + +function Eyebrow({ children, dark = false }: { children: React.ReactNode; dark?: boolean }) { return ( -
- - - - -
+
+ + {children} +
) } -function UsedByWall() { - return (
- -
-

- Used by developers from -

+function Button({ + children, + href, + onClick, + variant = "primary", + dark = false, +}: { + children: React.ReactNode + href?: string + onClick?: () => void + variant?: "primary" | "secondary" + dark?: boolean +}) { + const className = cn( + "group inline-flex w-full items-center justify-center gap-2 rounded-[10px] px-5 py-3 text-sm font-medium transition sm:w-auto", + variant === "primary" + ? "bg-[#80CB51] text-[#07100B] shadow-[0_12px_30px_rgba(128,203,81,0.22)] hover:brightness-105" + : dark + ? "border border-white/[0.16] bg-white/[0.035] text-white hover:bg-white/[0.07]" + : "border border-[#C9C6BC] bg-white/70 text-[#171A18] hover:bg-white" + ) + + const content = ( + <> + {children} + + + ) + + return href ? ( + + {content} + + ) : ( + + ) +} + +function RuntimeMatrix() { + const rows = [ + { label: "Actor", value: "claims_ops", icon: UserRound, states: [1, 1, 0, 0, 0] }, + { label: "Agent", value: "claims assistant", icon: Bot, states: [0, 1, 1, 0, 0] }, + { label: "Identity", value: "svc_claims", icon: Fingerprint, states: [0, 1, 1, 1, 0] }, + { label: "Data", value: "KYC + balance", icon: Database, states: [0, 0, 1, 1, 1] }, + { label: "Destination", value: "external API", icon: Globe2, states: [0, 0, 0, 1, 2] }, + ] + + return ( +
+
+
+
AIOStack
+
Runtime view
-
-
-
- {[ - { name: "6sense", file: "6sense.svg" }, - { name: "AskWisdom", file: "askwisdom.svg" }, - { name: "Nykaa", file: "nykaa.svg" }, - { name: "R Systems", file: "rsystems.svg" }, - { name: "Yugen", file: "yugen.svg" }, - { name: "Aurva", file: "aurva-mono.svg" }, - { name: "Rapyuta", file: "rapyuta.svg" }, - { name: "PB", file: "pb.svg" }, - - - ].map((company, index) => ( -
- {company.name} -
- ))} +
+ {rows.map(({ label, value, icon: Icon, states }) => ( +
+
+
{label}
+
{value}
+
+
+ +
+
+ {states.map((state, idx) => ( +
+
+
+
+ ))} +
+ ))} +
- {/* Duplicate set for seamless loop */} -
- {[ - { name: "6sense", file: "6sense.svg" }, - { name: "AskWisdom", file: "askwisdom.svg" }, - { name: "Nykaa", file: "nykaa.svg" }, - { name: "R Systems", file: "rsystems.svg" }, - { name: "Yugen", file: "yugen.svg" }, - { name: "Aurva", file: "aurva-mono.svg" }, - { name: "Rapyuta", file: "rapyuta.svg" }, - { name: "PB", file: "pb.svg" }, - - - ].map((company, index) => ( -
- {company.name} -
- ))} -
+
+
+
Context break
+
Sensitive data exits the expected workflow.
+
- - - -
) -} +function TrustRail() { + const rail = [...customers, ...customers] -function HeroCard() { - - // Pool of possible services for rotation - const servicePool = React.useMemo(() => [ - { service: "invoice-ai", provider: "OpenAI", ns: "billing", calls: 1200, time: 2, shadow: false, type: "AI App" }, - { service: "new_frontend", provider: "Anthropic", ns: "preprod", calls: 847, time: 4, shadow: true, type: "MCP Client" }, - { service: "sherlock-svc", provider: "GeminiFlash", ns: "prod-core", calls: 340, time: 9, shadow: false, type: "AI Agent" }, - { service: "customerbot", provider: "Bedrock", ns: "dev-test", calls: 2100, time: 12, shadow: true, type: "MCP Server" }, - { service: "analytics", provider: "OpenAI", ns: "prod-data", calls: 980, time: 3, shadow: false, type: "AI App" }, - { service: "coderabbit", provider: "Claude", ns: "dev-tools", calls: 520, time: 5, shadow: true, type: "AI Agent" }, - { service: "content-gen", provider: "Gemini", ns: "marketing", calls: 1450, time: 7, shadow: false, type: "AI App" }, - { service: "support-chat", provider: "Cohere", ns: "support", calls: 2800, time: 1, shadow: false, type: "MCP Client" }, - { service: "doc-parser", provider: "OpenAI", ns: "stage-doc", calls: 670, time: 6, shadow: true, type: "AI Agent" }, - { service: "sentimentapi", provider: "HuggingFace", ns: "prod-ml", calls: 1100, time: 8, shadow: false, type: "AI App" }, - { service: "query-asst", provider: "Anthropic", ns: "prod-db", calls: 890, time: 4, shadow: false, type: "AI Agent" }, - { service: "ocr-model", provider: "Vertex AI", ns: "prod-cv", calls: 1650, time: 11, shadow: true, type: "MCP Server" }, - ], []); - - // Dynamic activity feed state - const [activityItems, setActivityItems] = useState([ - servicePool[0], - servicePool[1], - servicePool[2], - servicePool[3], - ]); - - const [totalAgents, setTotalAgents] = React.useState(14); - const [newlyDetected, setNewlyDetected] = React.useState>(new Set()); - - - - // Update activity feed periodically - React.useEffect(() => { - let updateCount = 0; - - const interval = setInterval(() => { - updateCount++; - - setActivityItems(prev => { - if (updateCount % 1 === 0) { - const randomIndex = Math.floor(Math.random() * prev.length); - const availableServices = servicePool.filter(poolItem => !prev.some(item => item.service === poolItem.service)); - - if (availableServices.length > 0) { - const newService = availableServices[Math.floor(Math.random() * availableServices.length)]; - const updated = [...prev]; - updated[randomIndex] = { - ...newService, - calls: Math.floor(Math.random() * 1000) + 500, - time: Math.floor(Math.random() * 5) + 1, - }; - - // Mark the new item as newly detected - setNewlyDetected(prev => new Set([...prev, newService.service])); - - // Remove "newly detected" badge after 6 seconds - setTimeout(() => { - setNewlyDetected(prev => { - const updated = new Set(prev); - updated.delete(newService.service); - return updated; - }); - }, 6000); - - return updated; + return ( +
+
Trusted by teams building with AI, data, and automation
+
+ {customers.slice(0, 6).map((customer) => ( + + ))} +
+
+
+
+
+ {rail.map((customer, index) => ( + + ))} +
+
+ +
+ ) +} - // Otherwise just update the call counts and times - const updated = prev.map(item => ({ - ...item, - calls: item.calls + Math.floor(Math.random() * 10) + 1, - time: Math.max(1, item.time + (Math.random() > 0.7 ? 1 : 0)), - })); - - return updated; - }); - - // Occasionally update total agents count - if (Math.random() > 0.5) { - setTotalAgents(prev => prev + (Math.random() > 0.5 ? 1 : 0)); - } - }, 3000); // Update every 3 seconds - - return () => clearInterval(interval); - }, [servicePool]); - - +function RailStep({ + icon: Icon, + title, + meta, + status, + risk = false, + isLast = false, +}: { + icon: React.ComponentType<{ className?: string; strokeWidth?: number }> + title: string + meta: string + status: string + risk?: boolean + isLast?: boolean +}) { return ( -
- {/* Animated border glow */} -
- -
- {/* Header */} -
-
-
- - -
- Live Detection +
+
+
+
+
+ {status} +
+
{title}
+
{meta}
+
+ {!isLast && ( +
+
+ )} +
+ ) +} - {/* Activity Feed */} -
- {activityItems.map((item, idx) => ( -
- {/* Subtle pulse overlay for first item */} - {idx === 0 && ( -
- )} - -
-
-
- {item.service} - - - {item.ns} - - {newlyDetected.has(item.service) && ( - - - NEW - - )} - {item.shadow && ( - - - shadow - - )} -
-
- {item.type} - - {item.provider} - - {item.calls >= 1000 ? `${(item.calls / 1000).toFixed(1)}k` : item.calls} calls -
-
-
{item.time}m ago
-
-
- ))} +function RuntimeChain() { + const nodes = [ + { icon: UserRound, title: "User", meta: "claims_ops", status: "Authorized" }, + { icon: Bot, title: "Agent", meta: "claims assistant", status: "Authorized" }, + { icon: Wrench, title: "Tool", meta: "MCP lookup", status: "Authorized" }, + { icon: Database, title: "DB principal", meta: "customer_ro", status: "Authorized" }, + { icon: FileText, title: "Sensitive data", meta: "KYC + balance", status: "Observed" }, + { icon: Globe2, title: "New destination", meta: "external API", status: "Context break", risk: true }, + ] + + return ( +
+ +
+ Trusted evidence chain +

+ Every hop is authorized. The break is where data leaves context. +

+

+ A single runtime path showing who acted, which identity and DB principal were used, what sensitive data was touched, and where it moved. +

- {/* Summary Footer */} -
-
-
- - {totalAgents} agents - - - 5 providers - - - {activityItems.filter(item => item.shadow).length} shadow AI - +
+
+
+ {nodes.map((node, index) => ( + + ))} +
+
+
+
+
Expected path
+
Every individual hop is authorized by policy.
+
+
+
Context break
+
The final movement is wrong.
- last 30d
-
-
+ +
) } -function InventoryCard() { - const inventoryRows = [ - { - service: "invoice-ai", - ns: "prod-finance", - role: "sa-invoice-ai", - exposure: "external", - endpoint: "OpenAI", - calls7d: 4812, - bytes7d: "1.2 GB", - lastSeen: "2m ago", - owner: "finance-ml", - confidence: 0.92, - egress: "third-party", - vectors: "PSQL,MySQL", - }, - { - service: "webapp-next", - ns: "prod-app", - role: "sa-frontend", - exposure: "external", - endpoint: "Anthropic", - calls7d: 3821, - bytes7d: "860 MB", - lastSeen: "6m ago", - owner: "unknown", - confidence: 0.88, - egress: "third-party", - vectors: "Oracle(x2)", - }, - { - service: "auth-mgr", - ns: "dev-ai", - role: "sa-recon", - exposure: "internal", - endpoint: "Vertex AI", - calls7d: 1210, - bytes7d: "340 MB", - lastSeen: "13m ago", - owner: "platform-ai", - confidence: 0.86, - egress: "private/VPC", - vectors: "PSQL (x3)", - }, - { - service: "content-moderator", - ns: "prod-safety", - role: "sa-moderation", - exposure: "internal", - endpoint: "OpenAI", - calls7d: 2156, - bytes7d: "520 MB", - lastSeen: "18m ago", - owner: "trust-safety", - confidence: 0.94, - egress: "third-party", - vectors: "MongoDB", - }, - { - service: "recommendation-api", - ns: "prod-ml", - role: "sa-ml-service", - exposure: "external", - endpoint: "Bedrock", - calls7d: 6240, - bytes7d: "2.8 GB", - lastSeen: "5m ago", - owner: "ml-platform", - confidence: 0.91, - egress: "third-party", - vectors: "Redis,PSQL", - }, - { - service: "data-pipeline", - ns: "staging-analytics", - role: "sa-etl-worker", - exposure: "internal", - endpoint: "Cohere", - calls7d: 892, - bytes7d: "180 MB", - lastSeen: "31m ago", - owner: "unknown", - confidence: 0.79, - egress: "third-party", - vectors: "Snowflake", - }, - ]; - +function EvidenceArtifact() { + const rows = [ + ["Start", "User prompt to resolve customer ticket", "Sets the intent and model context for the chain.", "text-[#2B2E2A]"], + ["Identity", "jon.doe@co.com -> svc-gpt-pipeline -> db-principal-prod", "Shows the trust path behind the action.", "text-[#7A3F8C]"], + ["Access behavior", "230K rows returned from customer records", "High-volume access outside normal scope.", "text-[#7A3F8C]"], + ["Data touched", "PII: customer email, NPS score", "Sensitive data was accessed in this flow.", "text-[#7A3F8C]"], + ["Destination", "External endpoint: api.openai.com", "Flag: data left the trusted boundary.", "text-[#9A6A12]"], + ["Behavior", "Volume spike above baseline", "Behavior drifted.", "text-[#B42318]"], + ] return ( -
- - +
+ +
+ Runtime proof +

See what Aurva captures in one runtime pass.

+

+ Aurva reconstructs the full chain from prompt to identity to DB principal to access behavior to sensitive data to destination, without relying on app proxies or code changes. +

+
- {/* App Mockup */} -
- {/* App Header with macOS Traffic Lights */} -
-
- {/* macOS Traffic Lights */} -
-
-
-
+
+
+ + +
+
+
+
Layer
+
Evidence
+
Why it matters
+ {rows.map(([layer, evidence, why, color]) => ( +
+
{layer}
+
{evidence}
+
{why}
+
+ ))}
-
- -
-
- - {/* Table Content with Horizontal Scroll on Mobile */} -
- - - - - - - - - - - - - - - - - {inventoryRows.map((r) => ( - - - - - - - - - - - - - ))} - -
ServiceNamespaceSA / IAM RoleExposureEndpointCalls (7d)Bytes (7d)Last seenOwner (lite)Databases
{r.service}{r.ns}{r.role} - {r.exposure} - {r.endpoint}{r.calls7d.toLocaleString()}{r.bytes7d}{r.lastSeen}{r.owner}{r.vectors}
+ +
+ ) +} +function Differentiation() { + const rows = [ + { icon: Layers3, label: "IAM / NHI posture", title: "What access exists?", text: "You see who could access, not what actually happened." }, + { icon: Cloud, label: "Cloud activity", title: "What control-plane events were logged?", text: "You see activity, not the full runtime story." }, + { icon: Database, label: "Aurva runtime layer", title: "What actually happened to sensitive data?", text: "You see actor, identity, DB principal, query behavior, data touched, destination, and drift.", aurva: true }, + ] - {/* Scroll hint for mobile */} -
- ← Scroll horizontally to see all columns → + return ( +
+ +
+ Why posture is not enough +

+ Access graphs show what can happen. Aurva shows what did happen. +

+

+ IAM and NHI tools are essential. But agentic risk appears when trusted access moves beyond permission into DB use, query behavior, sensitive data, and downstream movement. +

- - - +
+ {rows.map(({ icon: Icon, label, title, text, aurva }) => ( +
+
+ +
+
+
{label}
+
{title}
+

{text}

+
+
+ ))} +
+
) } -export default function Home() { - const [isContactModalOpen, setIsContactModalOpen] = useState(false); - const { setTheme, theme: currentTheme } = useTheme(); - - // Force dark mode on home page only - React.useEffect(() => { - const previousTheme = currentTheme; - setTheme('dark'); - - return () => { - if (previousTheme) { - setTheme(previousTheme); - } - }; - }, [setTheme]); - - +function CategoryBand() { + const layers = [ + ["IAM / NHI", "Who has access", "What they did with sensitive data"], + ["Cloud logs", "Control-plane events", "DB principal, query behavior, data touched"], + ["Agent gateways", "Traffic that passes through them", "Runtime access outside the gateway path"], + ["AIOStack", "Runtime data access chain", "Actor, identity, DB principal, query, data, destination, drift"], + ] return ( -
- -
- - -
-
-

- Secure every AI service in your cloud in 10 minutes -

-

- You can't secure AI you don't know exists. AIOStack automatically discovers every AI app, agent, LLM, and self-hosted model across your cloud, then maps their access to sensitive databases and APIs. Get complete visibility into your AI attack surface and secure it—before it becomes your next security incident.

- -
- - Try AIOStack Free - - { e.preventDefault(); setIsContactModalOpen(true); }}> - Talk to an Engineer - -
+
+ +
+
+ Category boundary +

+ Built for the runtime layer others do not see. +

+

+ IAM stops at permission. NHI stops at identity. Cloud logs stop at control-plane activity. Gateways see only traffic that passes through them. +

+
+
+
+
Layer
+
Sees
+
Misses
- - + {layers.map(([layer, sees, misses]) => { + const isAurva = layer === "AIOStack" + return ( +
+
{layer}
+
{sees}
+
{misses}
+
+ ) + })}
+
+
+
+ ) +} - -
- - - - - - - - - - - -
- - - - +function Mechanism() { + const capabilities = [ + { icon: Layers3, num: "01", title: "Runtime evidence layer", text: "Connect agents, identities, DB principals, data touched, destinations, and behavior into one explainable chain.", dark: true }, + { icon: Bot, num: "02", title: "Agent discovery", text: "See agents, MCP servers, tools, vector DBs, and unmanaged deployments." }, + { icon: Fingerprint, num: "03", title: "Identity chain mapping", text: "Trace user to agent to service account to DB principal." }, + { icon: Braces, num: "04", title: "Multi-agent lineage", text: "Reconstruct tool calls, data touched, and downstream actions." }, + { icon: Globe2, num: "05", title: "Sensitive data movement", text: "Understand what data was touched, where it moved, and whether the destination was expected." }, + { icon: ShieldCheck, num: "06", title: "Governance from behavior", text: "Right-size permissions and reduce drift using observed runtime evidence." }, + ] - -
+ return ( +
+ +
+ What AIOStack does +

Full agentic security in one runtime layer.

+

AIOStack turns fragmented agent activity into an evidence-backed map of identities, tools, data, behavior, and risk.

+
- +
+ {capabilities.map(({ icon: Icon, num, title, text, dark }) => ( +
+ {dark &&
} +
+
+
{num}
+
+
+
+ +
+

{title}

+

{text}

+
+
+ ))} +
+ +
+ ) +} - - +function InstallSection({ onDemo }: { onDemo: () => void }) { + const [activeCommand, setActiveCommand] = useState<"install" | "uninstall">("install") + const [copied, setCopied] = useState(false) + const command = activeCommand === "install" ? "curl -fsSL https://aurva.ai/install.sh | bash" : "curl -fsSL https://aurva.ai/uninstall.sh | bash" + + async function copyCommand() { + try { + await navigator.clipboard.writeText(command) + setCopied(true) + window.setTimeout(() => setCopied(false), 1600) + } catch { + // clipboard unavailable — silently ignore or show fallback + } + } + return ( +
+
+ + Install AIOStack +

+ Get started in minutes, not weeks +

+

+ Start with runtime visibility for local and cloud deployments. Install when you are ready, or talk to an engineer for a guided rollout. +

+
+
+ {[ + ["install", "Install"], + ["uninstall", "Uninstall"], + ].map(([value, label]) => { + const active = activeCommand === value + return ( + + ) + })} +
- +
+ + {command} + + +
+
+
+ +
+
+
+ ) +} - +export default function Home() { + const [isContactModalOpen, setIsContactModalOpen] = useState(false) + return ( +
+ setIsContactModalOpen(true)} /> + + + + + + setIsContactModalOpen(true)} /> setIsContactModalOpen(false)} /> -
- ); + ) } - - - - diff --git a/docs/app/platform/page.tsx b/docs/app/platform/page.tsx new file mode 100644 index 0000000..0f93ce7 --- /dev/null +++ b/docs/app/platform/page.tsx @@ -0,0 +1,62 @@ +import Link from "next/link" +import { ArrowRight, Binoculars, Fingerprint, GitBranch, Radar, ShieldCheck, SlidersHorizontal } from "lucide-react" + +const capabilities = [ + ["Discover", "Inventory", "Find agents, AI apps, MCP servers, tools, vector stores, LLM calls, service accounts, and unmanaged deployments.", Binoculars], + ["Map", "Identity chain", "Connect human initiators, agents, orchestrators, sub-agents, service accounts, APIs, databases, and destinations.", GitBranch], + ["Observe", "Runtime access", "See what agents and NHIs actually do with data: queries, operations, sensitive fields, movement, and timing.", Radar], + ["Detect", "Appropriateness", "Surface behavior that is authorized but contextually wrong for workflow, data sensitivity, timing, or destination.", ShieldCheck], + ["Govern", "Least privilege", "Compare allowed access with actual usage and right-size permissions using runtime evidence.", SlidersHorizontal], + ["Investigate", "Triage", "Group identity, data, workflow, anomaly, and movement signals into investigation bundles.", Fingerprint], +] as const + +export default function PlatformPage() { + return ( +
+
+
+

Platform

+

+ Runtime security for agentic data access. +

+

+ Aurva keeps agents, identities, data access, and downstream movement in one runtime context so teams can decide what matters. +

+
+
+ +
+
+ {capabilities.map(([title, eyebrow, text, Icon]) => ( +
+
+
{eyebrow}
+ +
+

{title}

+

{text}

+
+ ))} +
+
+ +
+
+

Built around one question.

+

+ Was this data access appropriate for the agent, identity, workflow, data sensitivity, timing, and destination? +

+
+
+ +
+
+ + Explore solutions + + +
+
+
+ ) +} diff --git a/docs/app/solutions/page.tsx b/docs/app/solutions/page.tsx new file mode 100644 index 0000000..614d446 --- /dev/null +++ b/docs/app/solutions/page.tsx @@ -0,0 +1,43 @@ +import { ArrowRight, Database, FileSearch, KeyRound, ShieldAlert } from "lucide-react" + +const solutionGroups = [ + ["Agentic Security", "Discover agents, map identity chains, monitor runtime data access, and detect inappropriate use in context.", ["Agentic Access Monitoring", "MCP and Tool Security", "Prompt Injection Data Access"], ShieldAlert], + ["Runtime Data Security", "See which identities, applications, and agents touch sensitive data across databases, APIs, and downstream destinations.", ["Data Detection and Response", "Database Activity Monitoring", "Data Flow Monitoring"], Database], + ["Identity Security", "Use runtime evidence to govern service accounts, NHIs, excessive permissions, and agent access paths.", ["NHI Least Privilege", "Identity Chaining", "Permission Review"], KeyRound], + ["Privacy and Compliance", "Prove what sensitive data was accessed, by whom, through which workflow, and where it moved.", ["AI Privacy Manager", "Compliance Readiness", "Investigation Evidence"], FileSearch], +] as const + +export default function SolutionsPage() { + return ( +
+
+
+

Solutions

+

+ Secure sensitive data use across AI, identities, and runtime workflows. +

+
+
+ +
+
+ {solutionGroups.map(([title, text, links, Icon]) => ( +
+ +

{title}

+

{text}

+
+ {links.map((link) => ( + + {link} + + + ))} +
+
+ ))} +
+
+
+ ) +} diff --git a/docs/app/use-cases/page.tsx b/docs/app/use-cases/page.tsx new file mode 100644 index 0000000..b360d9a --- /dev/null +++ b/docs/app/use-cases/page.tsx @@ -0,0 +1,47 @@ +import { Activity, ArrowRight, Bot, Database, GitBranch, KeyRound } from "lucide-react" + +const useCases = [ + ["Agentic Access Monitoring", "See which agents exist, what identities they use, what data they touch, and whether behavior matches the intended workflow.", Bot], + ["AI Data Exposure", "Detect when sensitive data is retrieved by an agent and sent to an LLM, external API, third-party tool, or unexpected destination.", Database], + ["Identity Chaining", "Trace user-to-agent-to-service-account-to-database activity so approved credentials no longer hide agentic risk.", GitBranch], + ["NHI Least Privilege", "Compare what non-human identities can access with what they actually use, then reduce excessive permissions with runtime evidence.", KeyRound], + ["Runtime Appropriateness", "Prioritize the changes that matter: first-time sensitive data access, new destinations, unusual volumes, and purpose drift.", Activity], +] as const + +export default function UseCasesPage() { + return ( +
+
+
+

Use cases

+

+ Start with the risk your security team needs to answer. +

+
+
+ +
+
+
+ {useCases.map(([title, text, Icon]) => ( + + ))} +
+
+
+
+ ) +} diff --git a/docs/components/navigation/footer.tsx b/docs/components/navigation/footer.tsx index 148a5a4..25182cc 100644 --- a/docs/components/navigation/footer.tsx +++ b/docs/components/navigation/footer.tsx @@ -7,7 +7,7 @@ import { GitHubLink } from "@/settings/navigation" export function Footer() { return ( -