// Comparison.jsx — VAPT firm vs typical pentest vendors const Comparison = () => { const rows = [ { trait: 'Experienced tester on every engagement', us: true, mssp: false, boutique: 'partial' }, { trait: 'Every finding manually exploited and confirmed', us: true, mssp: false, boutique: true }, { trait: 'Documented coverage of every test case', us: true, mssp: false, boutique: 'partial' }, { trait: 'Reproducible proofs of concept with payloads and screenshots', us: true, mssp: 'partial', boutique: true }, { trait: 'Two reports: executive and technical', us: true, mssp: false, boutique: 'partial' }, { trait: 'Free retest within 90 days', us: true, mssp: false, boutique: 'partial' }, { trait: 'Shared channel through remediation', us: true, mssp: false, boutique: false }, { trait: 'Single accountable contact throughout', us: true, mssp: false, boutique: true }, { trait: 'OWASP, OSSTMM, NIST, and MITRE alignment', us: true, mssp: 'partial', boutique: true }, { trait: 'Fixed-fee, transparent scoping', us: true, mssp: false, boutique: 'partial' }, ]; const Cell = ({ v }) => { if (v === true) return ; if (v === 'partial') return partial; return ; }; return (

Comparison

How we compare

A pentest is only as good as the people doing it. This is what you can expect from us compared with other common options.

{/* Header */}
GreySurface
Operator-led
Large consultancies
Volume-led
Boutique firms
Project-led
{/* Rows */} {rows.map((r, i) => ( ))}
); }; function ComparisonRow({ r, i, last, Cell }) { const ref = React.useRef(null); const [shown, setShown] = React.useState(false); React.useEffect(() => { const el = ref.current; if (!el) return; const obs = new IntersectionObserver(([e]) => { if (e.isIntersecting) { setTimeout(() => setShown(true), i * 60); obs.disconnect(); } }, { threshold: 0.4 }); obs.observe(el); return () => obs.disconnect(); }, []); return (
e.currentTarget.style.background = 'linear-gradient(90deg, rgba(94,105,210,0.10), rgba(94,105,210,0.02) 60%)'} onMouseLeave={e => e.currentTarget.style.background = 'transparent'} >
{r.trait}
); } Object.assign(window, { Comparison, ComparisonRow });