Initial commit: Korrith website, assessment API, PocketBase schema, Docker/Coolify deployment
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
import React from 'react';
|
||||
import { Helmet } from 'react-helmet';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { motion } from 'framer-motion';
|
||||
import {
|
||||
ArrowRight,
|
||||
BrainCircuit,
|
||||
Fingerprint,
|
||||
RefreshCcw,
|
||||
ShieldCheck,
|
||||
Crosshair,
|
||||
Sparkles
|
||||
} from 'lucide-react';
|
||||
import LayoutWrapper from '@/components/LayoutWrapper.jsx';
|
||||
import { Button } from '@/components/ui/button.jsx';
|
||||
|
||||
const fadeInUp = {
|
||||
initial: { opacity: 0, y: 30 },
|
||||
whileInView: { opacity: 1, y: 0 },
|
||||
viewport: { once: true, margin: "-50px" },
|
||||
transition: { duration: 0.7, ease: "easeOut" }
|
||||
};
|
||||
|
||||
const staggerContainer = {
|
||||
initial: { opacity: 0 },
|
||||
whileInView: { opacity: 1 },
|
||||
viewport: { once: true, margin: "-50px" },
|
||||
transition: { staggerChildren: 0.15 }
|
||||
};
|
||||
|
||||
const principles = [
|
||||
{
|
||||
title: "Grounded AI: no invented risk",
|
||||
body: "AI in security usually means a black box that produces a confident paragraph you cannot check. We built Argus the opposite way. Every insight Argus produces is tied to a specific, verifiable finding through a grounding mechanism, so each claim carries its evidence with it. If Argus cannot point to a real finding behind a statement, it does not make the statement. The practical result: you can trust the priorities, because none of them are hallucinated, and you can click any insight and land on the exact finding that produced it.",
|
||||
icon: BrainCircuit,
|
||||
color: "text-purple-400",
|
||||
bg: "bg-purple-500/10",
|
||||
border: "border-purple-500/20"
|
||||
},
|
||||
{
|
||||
title: "Provable authorization: the engine cannot act outside its scope",
|
||||
body: "The line between an assurance product and a hacking tool is authorization. Most tools treat that line as a policy in a document. Korrith treats it as code. Active testing passes through a single gate that fails closed: it runs only when a current, cryptographically signed authorization covers that exact target and test type, in an approved window, on the agreed environment, with the kill-switch up. Anything else is denied, with a reason. There is no path for the engine to act outside the authorization you grant, and a single control halts everything instantly. This is why we can offer active validation responsibly.",
|
||||
icon: Fingerprint,
|
||||
color: "text-blue-400",
|
||||
bg: "bg-blue-500/10",
|
||||
border: "border-blue-500/20"
|
||||
},
|
||||
{
|
||||
title: "The closed loop, with proof of resolution",
|
||||
body: "Finding a problem is the easy half. Proving it is gone is the half that matters at audit time. Korrith tracks every finding through its whole life: first seen, validated as real, remediated, and verified closed by a later check that actually observed its absence. A fix is not marked done because someone clicked a button. It is shown done because Korrith looked again and the exposure was no longer there. That record is continuous, so a regression that quietly reopens is caught the same week, not at the next annual review.",
|
||||
icon: RefreshCcw,
|
||||
color: "text-emerald-400",
|
||||
bg: "bg-emerald-500/10",
|
||||
border: "border-emerald-500/20"
|
||||
},
|
||||
{
|
||||
title: "Honest by design: never fake-clean",
|
||||
body: "A security tool that reports clean when it simply could not check is worse than useless, because it sells you false confidence. Korrith reports coverage exactly as it is. Where a check could not run or a data source was unavailable, the product says so. Unverified is shown as unverified. That discipline runs through the scoring, the dashboards, and the reports, and it is the reason a Korrith report is something you can put in front of an auditor or a board without flinching.",
|
||||
icon: ShieldCheck,
|
||||
color: "text-amber-400",
|
||||
bg: "bg-amber-500/10",
|
||||
border: "border-amber-500/20"
|
||||
},
|
||||
{
|
||||
title: "Built for the threat as it is now",
|
||||
body: "Attackers use AI to find and exploit faster, and they shop a dark-web economy of stolen credentials and ready footholds. Korrith is built to meet that: external first, the way an adversary maps you, with reasoning that prioritizes by what is actually being weaponized, and a clear path to quantum-safe cryptography as that threat matures.",
|
||||
icon: Crosshair,
|
||||
color: "text-rose-400",
|
||||
bg: "bg-rose-500/10",
|
||||
border: "border-rose-500/20"
|
||||
},
|
||||
{
|
||||
title: "What this means for you",
|
||||
body: "You stop drowning in findings and start working from a short, reasoned, evidence-backed list. You can prove your security on demand. And you can trust what the tool tells you, because it refuses to tell you anything it cannot back.",
|
||||
icon: Sparkles,
|
||||
color: "text-primary",
|
||||
bg: "bg-primary/10",
|
||||
border: "border-primary/20"
|
||||
}
|
||||
];
|
||||
|
||||
export default function WhyKorrithPage() {
|
||||
return (
|
||||
<LayoutWrapper>
|
||||
<Helmet>
|
||||
<title>Why Korrith | Reasoned, Proven, Honest Security</title>
|
||||
<meta
|
||||
name="description"
|
||||
content="Plenty of tools find problems. Korrith proves they are real, proves they are fixed, and shows its work. Here is exactly how, and why it matters."
|
||||
/>
|
||||
</Helmet>
|
||||
|
||||
{/* Hero Section */}
|
||||
<section className="relative pt-32 pb-24 md:pt-48 md:pb-32 overflow-hidden border-b border-border/50 min-h-[80vh] flex items-center">
|
||||
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_top_right,hsl(var(--primary)/0.15),transparent_50%)] pointer-events-none"></div>
|
||||
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_bottom_left,rgba(155,77,255,0.1),transparent_50%)] pointer-events-none"></div>
|
||||
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10 w-full text-center flex flex-col items-center">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
transition={{ duration: 0.8, ease: "easeOut" }}
|
||||
className="max-w-4xl flex flex-col items-center"
|
||||
>
|
||||
<h1 className="text-4xl md:text-6xl lg:text-7xl font-bold tracking-tight text-foreground mb-8 text-balance leading-[1.1]">
|
||||
Most tools find problems.<br />
|
||||
<span className="text-transparent bg-clip-text bg-gradient-to-r from-primary to-purple-400">
|
||||
Korrith proves them.
|
||||
</span>
|
||||
</h1>
|
||||
|
||||
<p className="text-xl md:text-2xl text-muted-foreground leading-relaxed max-w-3xl text-balance">
|
||||
Korrith was built to close the gap between a finding and the truth: is it real, and is it actually fixed. Everything below is a design decision we made on purpose, because security you cannot prove is just a feeling.
|
||||
</p>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Core Principles (Numbered List Layout) */}
|
||||
<section className="py-24 md:py-32 bg-background relative overflow-hidden">
|
||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
|
||||
<div className="flex flex-col gap-20 md:gap-32">
|
||||
{principles.map((principle, index) => {
|
||||
const Icon = principle.icon;
|
||||
return (
|
||||
<motion.div
|
||||
key={index}
|
||||
variants={fadeInUp}
|
||||
initial="initial"
|
||||
whileInView="whileInView"
|
||||
className="flex flex-col md:flex-row gap-8 lg:gap-16 items-start group"
|
||||
>
|
||||
{/* Decorative Number */}
|
||||
<div className="hidden md:block w-32 shrink-0">
|
||||
<div className="text-7xl lg:text-8xl font-black text-foreground/[0.03] select-none font-mono leading-none tracking-tighter group-hover:text-primary/10 transition-colors duration-500">
|
||||
{(index + 1).toString().padStart(2, '0')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Content Card */}
|
||||
<div className="flex-1 bg-card border border-border p-8 md:p-12 rounded-3xl hover:bg-secondary/40 transition-colors relative overflow-hidden">
|
||||
<div className="absolute top-0 right-0 w-64 h-64 bg-primary/5 rounded-full blur-3xl pointer-events-none transition-opacity group-hover:bg-primary/10"></div>
|
||||
|
||||
<div className="flex items-center gap-4 mb-8 relative z-10">
|
||||
<div className="md:hidden text-4xl font-black text-foreground/[0.05] select-none font-mono leading-none tracking-tighter mr-2">
|
||||
{(index + 1).toString().padStart(2, '0')}
|
||||
</div>
|
||||
<div className={`w-14 h-14 rounded-2xl ${principle.bg} border ${principle.border} flex items-center justify-center shrink-0`}>
|
||||
<Icon className={`w-7 h-7 ${principle.color}`} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 className="text-3xl md:text-4xl font-bold text-foreground mb-6 text-balance relative z-10">
|
||||
{principle.title}
|
||||
</h2>
|
||||
|
||||
<p className="text-xl text-muted-foreground leading-relaxed relative z-10 max-w-[65ch]">
|
||||
{principle.body}
|
||||
</p>
|
||||
</div>
|
||||
</motion.div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* CTA Section */}
|
||||
<section className="py-32 bg-secondary/20 border-t border-border/50 relative overflow-hidden">
|
||||
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,hsl(var(--primary)/0.1),transparent_50%)] pointer-events-none"></div>
|
||||
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center relative z-10">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 30 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.6 }}
|
||||
>
|
||||
<h2 className="text-4xl md:text-5xl font-bold text-foreground mb-6 text-balance">
|
||||
Stop guessing. Start proving.
|
||||
</h2>
|
||||
<p className="text-xl text-muted-foreground leading-relaxed mb-10 text-balance max-w-2xl mx-auto">
|
||||
Experience the platform built to prioritize truth over noise, and evidence over assumptions.
|
||||
</p>
|
||||
|
||||
<Button asChild size="lg" className="h-14 px-10 text-base font-semibold shadow-[0_0_30px_-5px_hsl(var(--primary)/0.4)] hover:shadow-[0_0_40px_-5px_hsl(var(--primary)/0.6)] transition-all group">
|
||||
<Link to="/assessment">
|
||||
Get a free assessment
|
||||
<ArrowRight className="ml-2 h-5 w-5 group-hover:translate-x-1 transition-transform" />
|
||||
</Link>
|
||||
</Button>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
</LayoutWrapper>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user