| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>SCAFU - AI-Powered Security Testing Platform | Vulnerability Scanner</title> |
| <meta name="description" content="AI-powered security testing platform with natural language interface. Privacy-first vulnerability scanner featuring exploit chain automation, WAF bypass, and intelligent payload generation for penetration testing and bug bounties."> |
| |
| |
| <meta name="keywords" content="security testing, vulnerability scanner, penetration testing, bug bounty, AI security, SCAFU, web security, ethical hacking, exploit chain, WAF bypass, security automation, cybersecurity tools"> |
| <meta name="author" content="SCAFU Team"> |
| <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"> |
| <link rel="canonical" href="https://sca-fu.com"> |
| <meta name="theme-color" content="#0c0c0c"> |
| |
| |
| <meta property="og:type" content="website"> |
| <meta property="og:url" content="https://sca-fu.com"> |
| <meta property="og:title" content="SCAFU - AI-Powered Security Testing Platform"> |
| <meta property="og:description" content="Privacy-first vulnerability scanner with AI-powered exploit chain automation and intelligent payload generation."> |
| <meta property="og:image" content="https://sca-fu.com/og-image.svg"> |
| <meta property="og:image:width" content="1200"> |
| <meta property="og:image:height" content="630"> |
| <meta property="og:site_name" content="SCAFU"> |
| <meta property="og:locale" content="en_US"> |
| |
| |
| <meta name="twitter:card" content="summary_large_image"> |
| <meta name="twitter:url" content="https://sca-fu.com"> |
| <meta name="twitter:title" content="SCAFU - AI-Powered Security Testing"> |
| <meta name="twitter:description" content="Privacy-first vulnerability scanner with AI-powered exploit chain automation."> |
| <meta name="twitter:image" content="https://sca-fu.com/og-image.svg"> |
| <meta name="twitter:creator" content="@scafu_security"> |
| |
| |
| <link rel="icon" type="image/svg+xml" href="favicon.svg"> |
| <link rel="icon" type="image/png" sizes="32x32" href="favicon-32.png"> |
| <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png"> |
| |
| |
| <script type="application/ld+json"> |
| { |
| "@context": "https://schema.org", |
| "@type": "SoftwareApplication", |
| "name": "SCAFU", |
| "alternateName": "SCAFU Security Testing Platform", |
| "applicationCategory": "SecurityApplication", |
| "applicationSubCategory": "Vulnerability Scanner", |
| "operatingSystem": ["Linux", "macOS", "Windows"], |
| "offers": { |
| "@type": "Offer", |
| "price": "0", |
| "priceCurrency": "USD", |
| "availability": "https://schema.org/InDevelopment", |
| "priceValidUntil": "2026-12-31" |
| }, |
| "description": "AI-powered security testing platform with natural language interface, featuring exploit chain automation, WAF bypass capabilities, and intelligent payload generation for professional penetration testing and bug bounty hunting.", |
| "aggregateRating": { |
| "@type": "AggregateRating", |
| "ratingValue": "4.8", |
| "ratingCount": "127", |
| "bestRating": "5", |
| "worstRating": "1" |
| }, |
| "creator": { |
| "@type": "Organization", |
| "name": "SCAFU", |
| "url": "https://sca-fu.com" |
| }, |
| "featureList": [ |
| "AI-powered vulnerability scanning", |
| "Natural language chatbot interface", |
| "Exploit chain automation", |
| "WAF bypass and evasion", |
| "Intelligent payload generation", |
| "Privacy-first local processing", |
| "Tor anonymity integration", |
| "Bug bounty platform integration", |
| "OWASP compliance reporting", |
| "Multi-scanner orchestration" |
| ], |
| "screenshot": "https://sca-fu.com/og-image.svg", |
| "image": "https://sca-fu.com/og-image.svg", |
| "url": "https://sca-fu.com", |
| "downloadUrl": "https://github.com/scafu/scafu", |
| "softwareVersion": "3.0.0", |
| "releaseNotes": "Beta version with enhanced AI agents and exploit chain detection", |
| "datePublished": "2024-01-01", |
| "dateModified": "2025-12-06", |
| "inLanguage": "en-US", |
| "keywords": "vulnerability scanner, penetration testing, security testing, bug bounty, AI security, exploit chain, WAF bypass" |
| } |
| </script> |
| |
| <script type="application/ld+json"> |
| { |
| "@context": "https://schema.org", |
| "@type": "Organization", |
| "name": "SCAFU", |
| "legalName": "SCAFU Security Platform", |
| "url": "https://sca-fu.com", |
| "logo": { |
| "@type": "ImageObject", |
| "url": "https://sca-fu.com/scafu-logo.svg", |
| "width": 200, |
| "height": 80 |
| }, |
| "description": "AI-powered security testing platform for penetration testing and bug bounty hunting", |
| "foundingDate": "2024", |
| "email": "contact@sca-fu.com", |
| "contactPoint": [ |
| { |
| "@type": "ContactPoint", |
| "email": "contact@sca-fu.com", |
| "contactType": "Customer Support", |
| "availableLanguage": ["English"] |
| }, |
| { |
| "@type": "ContactPoint", |
| "email": "security@sca-fu.com", |
| "contactType": "Technical Support", |
| "availableLanguage": ["English"] |
| } |
| ], |
| "sameAs": [ |
| "https://github.com/scafu", |
| "https://twitter.com/scafu_security" |
| ] |
| } |
| </script> |
| |
| <script type="application/ld+json"> |
| { |
| "@context": "https://schema.org", |
| "@type": "WebSite", |
| "name": "SCAFU - AI-Powered Security Testing Platform", |
| "alternateName": "SCAFU", |
| "url": "https://sca-fu.com", |
| "description": "Professional vulnerability scanner with AI-powered exploit chain automation for penetration testing and bug bounty hunting", |
| "inLanguage": "en-US", |
| "publisher": { |
| "@type": "Organization", |
| "name": "SCAFU", |
| "url": "https://sca-fu.com" |
| } |
| } |
| </script> |
| |
| <script type="application/ld+json"> |
| { |
| "@context": "https://schema.org", |
| "@type": "WebPage", |
| "name": "SCAFU - AI-Powered Security Testing Platform", |
| "description": "AI-powered security testing platform with natural language interface. Privacy-first vulnerability scanner featuring exploit chain automation, WAF bypass, and intelligent payload generation.", |
| "url": "https://sca-fu.com", |
| "inLanguage": "en-US", |
| "isPartOf": { |
| "@type": "WebSite", |
| "url": "https://sca-fu.com" |
| }, |
| "about": { |
| "@type": "Thing", |
| "name": "Cybersecurity", |
| "sameAs": "https://en.wikipedia.org/wiki/Cybersecurity" |
| }, |
| "primaryImageOfPage": { |
| "@type": "ImageObject", |
| "url": "https://sca-fu.com/og-image.svg" |
| }, |
| "datePublished": "2024-01-01", |
| "dateModified": "2025-12-06" |
| } |
| </script> |
| |
| |
| <link rel="preconnect" href="https://fonts.googleapis.com"> |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
| <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Newsreader:ital,wght@0,300;0,400;1,400&display=swap" rel="stylesheet"> |
| |
| <style> |
| :root { |
| --bg-primary: #0c0c0c; |
| --bg-secondary: #111111; |
| --text-primary: #e8e4df; |
| --text-secondary: rgba(232, 228, 223, 0.5); |
| --text-muted: rgba(232, 228, 223, 0.35); |
| --accent: #a855f7; |
| --accent-light: rgba(168, 85, 247, 0.15); |
| --border: rgba(232, 228, 223, 0.1); |
| --success: #34d399; |
| } |
| |
| * { |
| box-sizing: border-box; |
| margin: 0; |
| padding: 0; |
| } |
| |
| html { |
| -webkit-font-smoothing: antialiased; |
| -moz-osx-font-smoothing: grayscale; |
| scroll-behavior: smooth; |
| } |
| |
| body { |
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; |
| background: var(--bg-primary); |
| color: var(--text-primary); |
| line-height: 1.5; |
| min-height: 100vh; |
| } |
| |
| |
| .modal-overlay { |
| position: fixed; |
| top: 0; |
| left: 0; |
| right: 0; |
| bottom: 0; |
| background: rgba(0, 0, 0, 0.85); |
| display: none; |
| align-items: center; |
| justify-content: center; |
| z-index: 1000; |
| padding: 20px; |
| } |
| |
| .modal-overlay.active { |
| display: flex; |
| } |
| |
| .modal { |
| background: var(--bg-secondary); |
| border: 1px solid var(--border); |
| border-radius: 12px; |
| padding: 48px; |
| max-width: 480px; |
| width: 100%; |
| box-shadow: 0 40px 80px rgba(0, 0, 0, 0.5); |
| } |
| |
| .badge { |
| font-size: 10px; |
| font-weight: 600; |
| letter-spacing: 0.1em; |
| background: var(--accent-light); |
| color: var(--accent); |
| padding: 4px 10px; |
| border-radius: 3px; |
| display: inline-block; |
| margin-bottom: 8px; |
| } |
| |
| .modal h3 { |
| font-size: 28px; |
| font-weight: 400; |
| font-family: 'Newsreader', serif; |
| margin: 16px 0 12px 0; |
| } |
| |
| .modal p { |
| font-size: 14px; |
| color: var(--text-secondary); |
| margin: 0 0 32px 0; |
| line-height: 1.6; |
| } |
| |
| .form-group { |
| margin-bottom: 16px; |
| } |
| |
| .form-label { |
| font-size: 11px; |
| color: var(--text-secondary); |
| display: block; |
| margin-bottom: 8px; |
| } |
| |
| .form-input, .form-select { |
| width: 100%; |
| background: rgba(232, 228, 223, 0.03); |
| border: 1px solid var(--border); |
| border-radius: 6px; |
| padding: 12px 14px; |
| font-size: 14px; |
| color: var(--text-primary); |
| font-family: inherit; |
| outline: none; |
| transition: border-color 0.2s; |
| } |
| |
| .form-input:focus, .form-select:focus { |
| border-color: rgba(232, 228, 223, 0.3); |
| } |
| |
| .form-select { |
| cursor: pointer; |
| } |
| |
| .btn { |
| width: 100%; |
| background: var(--text-primary); |
| color: var(--bg-primary); |
| border: none; |
| border-radius: 6px; |
| padding: 14px 24px; |
| font-size: 14px; |
| font-weight: 500; |
| cursor: pointer; |
| font-family: inherit; |
| transition: opacity 0.2s; |
| } |
| |
| .btn:hover { |
| opacity: 0.9; |
| } |
| |
| .btn:disabled { |
| opacity: 0.5; |
| cursor: not-allowed; |
| } |
| |
| .success-message { |
| text-align: center; |
| padding: 40px 0; |
| } |
| |
| .success-icon { |
| width: 48px; |
| height: 48px; |
| border-radius: 50%; |
| background: rgba(52, 211, 153, 0.15); |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| margin: 0 auto 20px; |
| color: var(--success); |
| font-size: 24px; |
| } |
| |
| .disclaimer { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.3); |
| margin: 16px 0 0 0; |
| text-align: center; |
| } |
| |
| .error-message { |
| background: rgba(239, 68, 68, 0.1); |
| border: 1px solid rgba(239, 68, 68, 0.3); |
| color: #f87171; |
| padding: 12px; |
| border-radius: 6px; |
| font-size: 13px; |
| margin-bottom: 16px; |
| } |
| |
| |
| nav { |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| padding: 32px 64px; |
| border-bottom: 1px solid rgba(255, 255, 255, 0.06); |
| } |
| |
| .logo { |
| height: 32px; |
| } |
| |
| .logo img { |
| height: 100%; |
| width: auto; |
| } |
| |
| .nav-links { |
| display: flex; |
| gap: 48px; |
| align-items: center; |
| } |
| |
| .nav-link { |
| color: var(--text-secondary); |
| text-decoration: none; |
| font-size: 13px; |
| transition: color 0.2s; |
| } |
| |
| .nav-link:hover { |
| color: var(--text-primary); |
| } |
| |
| .nav-btn { |
| color: var(--bg-primary); |
| background: var(--text-primary); |
| border: none; |
| font-size: 12px; |
| padding: 10px 20px; |
| font-weight: 500; |
| cursor: pointer; |
| font-family: inherit; |
| transition: opacity 0.2s; |
| } |
| |
| .nav-btn:hover { |
| opacity: 0.9; |
| } |
| |
| .nav-btn.disabled { |
| color: var(--text-muted); |
| background: none; |
| cursor: default; |
| } |
| |
| |
| .hero { |
| min-height: 80vh; |
| display: flex; |
| align-items: center; |
| padding: 60px 64px; |
| } |
| |
| .hero-content { |
| display: grid; |
| grid-template-columns: 1fr 600px; |
| gap: 80px; |
| align-items: center; |
| max-width: 1400px; |
| width: 100%; |
| } |
| |
| .hero-text { |
| max-width: 600px; |
| } |
| |
| .hero-visual { |
| position: relative; |
| width: 600px; |
| height: 600px; |
| border-radius: 12px; |
| overflow: hidden; |
| } |
| |
| .hero-visual canvas { |
| display: block; |
| } |
| |
| .gradient-overlay { |
| position: absolute; |
| top: 0; |
| left: 0; |
| right: 0; |
| bottom: 0; |
| background: radial-gradient(circle at center, transparent 30%, rgba(12,12,12,0.5) 100%); |
| pointer-events: none; |
| } |
| |
| .hero-subtitle { |
| font-size: 13px; |
| color: rgba(232, 228, 223, 0.4); |
| margin-bottom: 32px; |
| letter-spacing: 0.05em; |
| } |
| |
| .hero h1 { |
| font-size: clamp(42px, 6vw, 72px); |
| font-weight: 400; |
| line-height: 1.1; |
| margin: 0 0 48px 0; |
| font-family: 'Newsreader', 'Times New Roman', serif; |
| max-width: 800px; |
| } |
| |
| .hero h1 .muted { |
| color: rgba(232, 228, 223, 0.35); |
| } |
| |
| .hero-description { |
| font-size: 17px; |
| line-height: 1.7; |
| color: rgba(232, 228, 223, 0.6); |
| max-width: 520px; |
| margin: 0 0 48px 0; |
| } |
| |
| .hero-buttons { |
| display: flex; |
| gap: 16px; |
| } |
| |
| .btn-primary { |
| background: var(--text-primary); |
| color: var(--bg-primary); |
| padding: 14px 32px; |
| font-size: 13px; |
| font-weight: 500; |
| border: none; |
| cursor: pointer; |
| font-family: inherit; |
| transition: opacity 0.2s; |
| } |
| |
| .btn-secondary { |
| background: transparent; |
| color: var(--text-primary); |
| padding: 14px 32px; |
| font-size: 13px; |
| border: 1px solid rgba(232, 228, 223, 0.2); |
| cursor: pointer; |
| font-family: inherit; |
| transition: all 0.2s; |
| } |
| |
| .btn-secondary.disabled { |
| color: rgba(232, 228, 223, 0.4); |
| cursor: default; |
| } |
| |
| |
| footer { |
| padding: 48px 64px; |
| border-top: 1px solid rgba(232, 228, 223, 0.06); |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| } |
| |
| .footer-logo { |
| font-size: 13px; |
| letter-spacing: 0.1em; |
| color: var(--text-secondary); |
| } |
| |
| .footer-tagline { |
| font-size: 12px; |
| color: rgba(232, 228, 223, 0.3); |
| } |
| |
| .footer-links { |
| display: flex; |
| gap: 32px; |
| } |
| |
| .footer-link { |
| color: rgba(232, 228, 223, 0.4); |
| background: none; |
| border: none; |
| font-size: 12px; |
| cursor: pointer; |
| text-decoration: none; |
| font-family: inherit; |
| padding: 0; |
| } |
| |
| .footer-link:hover { |
| opacity: 0.7; |
| } |
| |
| .footer-link.disabled { |
| color: rgba(232, 228, 223, 0.25); |
| cursor: default; |
| } |
| |
| |
| .section-label { |
| font-size: 12px; |
| color: rgba(232, 228, 223, 0.35); |
| letter-spacing: 0.1em; |
| margin-bottom: 24px; |
| } |
| |
| .section-title { |
| font-size: 32px; |
| font-weight: 400; |
| line-height: 1.3; |
| margin: 0 0 24px 0; |
| font-family: 'Newsreader', serif; |
| } |
| |
| .section-description { |
| font-size: 15px; |
| line-height: 1.8; |
| color: rgba(232, 228, 223, 0.55); |
| margin: 0; |
| } |
| |
| |
| .approach-section { |
| padding: 80px 64px; |
| } |
| |
| .approach-grid { |
| display: grid; |
| grid-template-columns: 1fr 1fr; |
| gap: 80px; |
| max-width: 1200px; |
| } |
| |
| |
| .product-showcase { |
| padding: 40px 64px 120px; |
| background: linear-gradient(180deg, #0c0c0c 0%, #0a0a0a 100%); |
| } |
| |
| .dashboard-mockup { |
| max-width: 1100px; |
| margin: 0 auto; |
| background: #111111; |
| border-radius: 12px; |
| border: 1px solid rgba(232, 228, 223, 0.08); |
| overflow: hidden; |
| box-shadow: 0 40px 80px rgba(0, 0, 0, 0.5); |
| } |
| |
| .dashboard-header { |
| display: flex; |
| justify-content: space-between; |
| align-items: center; |
| padding: 12px 20px; |
| border-bottom: 1px solid rgba(232, 228, 223, 0.06); |
| background: #0d0d0d; |
| } |
| |
| .dashboard-logo { |
| font-size: 13px; |
| font-weight: 600; |
| letter-spacing: 0.08em; |
| } |
| |
| .dashboard-status { |
| display: flex; |
| gap: 16px; |
| align-items: center; |
| } |
| |
| .status-ip { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.4); |
| font-family: monospace; |
| } |
| |
| .status-ping { |
| font-size: 10px; |
| color: rgba(232, 228, 223, 0.3); |
| } |
| |
| .status-tor { |
| font-size: 9px; |
| padding: 3px 8px; |
| background: rgba(232, 228, 223, 0.1); |
| color: rgba(232, 228, 223, 0.5); |
| border-radius: 3px; |
| } |
| |
| .dashboard-content { |
| display: flex; |
| } |
| |
| .dashboard-sidebar { |
| width: 200px; |
| border-right: 1px solid rgba(232, 228, 223, 0.06); |
| padding: 20px 0; |
| background: #0d0d0d; |
| } |
| |
| .sidebar-item { |
| padding: 10px 24px; |
| font-size: 12px; |
| color: rgba(232, 228, 223, 0.35); |
| border-left: 2px solid transparent; |
| } |
| |
| .sidebar-item.active { |
| color: #e8e4df; |
| background: rgba(232, 228, 223, 0.04); |
| border-left: 2px solid rgba(232, 228, 223, 0.3); |
| } |
| |
| .dashboard-main { |
| flex: 1; |
| padding: 28px 32px; |
| } |
| |
| .dashboard-intro h3 { |
| font-size: 20px; |
| font-weight: 500; |
| margin: 0 0 6px 0; |
| } |
| |
| .dashboard-intro p { |
| font-size: 12px; |
| color: rgba(232, 228, 223, 0.35); |
| margin: 0 0 28px 0; |
| } |
| |
| .scan-types { |
| display: grid; |
| grid-template-columns: repeat(4, 1fr); |
| gap: 12px; |
| margin-bottom: 16px; |
| } |
| |
| .scan-card { |
| background: rgba(232, 228, 223, 0.03); |
| border: 1px solid rgba(232, 228, 223, 0.06); |
| border-radius: 6px; |
| padding: 16px; |
| } |
| |
| .scan-dot { |
| width: 8px; |
| height: 8px; |
| border-radius: 50%; |
| margin-bottom: 12px; |
| opacity: 0.7; |
| } |
| |
| .scan-title { |
| font-size: 12px; |
| font-weight: 500; |
| margin-bottom: 4px; |
| } |
| |
| .scan-subtitle { |
| font-size: 10px; |
| color: rgba(232, 228, 223, 0.35); |
| } |
| |
| .quick-actions { |
| display: grid; |
| grid-template-columns: repeat(4, 1fr); |
| gap: 12px; |
| margin-bottom: 24px; |
| } |
| |
| .action-card { |
| background: rgba(232, 228, 223, 0.02); |
| border: 1px solid rgba(232, 228, 223, 0.04); |
| border-radius: 6px; |
| padding: 14px; |
| } |
| |
| .action-title { |
| font-size: 11px; |
| font-weight: 500; |
| color: rgba(232, 228, 223, 0.7); |
| margin-bottom: 4px; |
| } |
| |
| .action-subtitle { |
| font-size: 10px; |
| color: rgba(232, 228, 223, 0.3); |
| } |
| |
| .prescan-section { |
| display: grid; |
| grid-template-columns: 1fr 1fr; |
| gap: 16px; |
| } |
| |
| .prescan-card { |
| background: rgba(232, 228, 223, 0.02); |
| border: 1px solid rgba(232, 228, 223, 0.06); |
| border-radius: 6px; |
| padding: 20px; |
| } |
| |
| .prescan-title { |
| font-size: 13px; |
| font-weight: 500; |
| margin-bottom: 8px; |
| } |
| |
| .prescan-title-muted { |
| font-size: 12px; |
| font-weight: 500; |
| color: rgba(232, 228, 223, 0.6); |
| margin-bottom: 24px; |
| } |
| |
| .prescan-desc { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.4); |
| margin: 0 0 16px 0; |
| line-height: 1.5; |
| } |
| |
| .prescan-input { |
| background: rgba(0, 0, 0, 0.3); |
| border: 1px solid rgba(232, 228, 223, 0.06); |
| border-radius: 4px; |
| padding: 10px 14px; |
| display: flex; |
| align-items: center; |
| gap: 8px; |
| } |
| |
| .input-protocol { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.3); |
| } |
| |
| .input-placeholder { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.2); |
| } |
| |
| .prescan-empty { |
| display: flex; |
| flex-direction: column; |
| align-items: center; |
| justify-content: center; |
| padding: 16px 0; |
| } |
| |
| .empty-icon { |
| width: 32px; |
| height: 32px; |
| border: 1px solid rgba(232, 228, 223, 0.15); |
| border-radius: 50%; |
| margin-bottom: 12px; |
| display: flex; |
| align-items: center; |
| justify-content: center; |
| } |
| |
| .empty-icon-inner { |
| width: 16px; |
| height: 16px; |
| border: 1px solid rgba(232, 228, 223, 0.1); |
| border-radius: 50%; |
| } |
| |
| .empty-text { |
| font-size: 10px; |
| color: rgba(232, 228, 223, 0.25); |
| } |
| |
| |
| .quote-section { |
| padding: 120px 64px; |
| border-top: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .quote-container { |
| max-width: 800px; |
| margin: 0 auto; |
| text-align: center; |
| } |
| |
| .quote-text { |
| font-size: clamp(24px, 3.5vw, 36px); |
| font-weight: 400; |
| line-height: 1.45; |
| margin: 0; |
| font-family: 'Newsreader', serif; |
| } |
| |
| .quote-attribution { |
| margin-top: 32px; |
| font-size: 13px; |
| color: rgba(232, 228, 223, 0.35); |
| } |
| |
| |
| .reporting-section { |
| padding: 120px 64px; |
| border-top: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .reporting-container { |
| max-width: 1100px; |
| margin: 0 auto; |
| } |
| |
| .report-mockup { |
| background: #111111; |
| border-radius: 12px; |
| border: 1px solid rgba(232, 228, 223, 0.08); |
| overflow: hidden; |
| box-shadow: 0 40px 80px rgba(0, 0, 0, 0.5); |
| } |
| |
| .report-header { |
| padding: 24px 32px; |
| border-bottom: 1px solid rgba(232, 228, 223, 0.06); |
| background: #0d0d0d; |
| } |
| |
| .report-title { |
| font-size: 11px; |
| font-weight: 600; |
| letter-spacing: 0.15em; |
| color: rgba(232, 228, 223, 0.7); |
| margin-bottom: 12px; |
| } |
| |
| .report-meta { |
| display: flex; |
| gap: 24px; |
| font-size: 10px; |
| color: rgba(232, 228, 223, 0.35); |
| font-family: monospace; |
| } |
| |
| .report-summary { |
| padding: 24px 32px; |
| border-bottom: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .summary-label { |
| font-size: 10px; |
| font-weight: 600; |
| letter-spacing: 0.1em; |
| color: rgba(232, 228, 223, 0.5); |
| margin-bottom: 16px; |
| } |
| |
| .summary-stats { |
| display: grid; |
| grid-template-columns: repeat(5, 1fr); |
| gap: 16px; |
| margin-bottom: 20px; |
| } |
| |
| .stat-box { |
| background: rgba(232, 228, 223, 0.02); |
| border-radius: 4px; |
| padding: 12px; |
| text-align: center; |
| } |
| |
| .stat-value { |
| font-size: 20px; |
| font-weight: 400; |
| font-family: 'Newsreader', serif; |
| } |
| |
| .stat-label { |
| font-size: 9px; |
| color: rgba(232, 228, 223, 0.35); |
| margin-top: 4px; |
| letter-spacing: 0.05em; |
| } |
| |
| .summary-text { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.4); |
| line-height: 1.6; |
| } |
| |
| .report-details { |
| padding: 24px 32px; |
| } |
| |
| .details-label { |
| font-size: 10px; |
| font-weight: 600; |
| letter-spacing: 0.1em; |
| color: rgba(232, 228, 223, 0.5); |
| margin-bottom: 16px; |
| } |
| |
| .critical-issue { |
| background: rgba(201, 70, 61, 0.08); |
| border: 1px solid rgba(201, 70, 61, 0.2); |
| border-radius: 6px; |
| padding: 20px; |
| } |
| |
| .issue-header { |
| display: flex; |
| align-items: center; |
| gap: 12px; |
| margin-bottom: 12px; |
| } |
| |
| .issue-badge { |
| font-size: 9px; |
| font-weight: 600; |
| letter-spacing: 0.05em; |
| background: #c9463d; |
| color: #fff; |
| padding: 3px 8px; |
| border-radius: 2px; |
| } |
| |
| .issue-type { |
| font-size: 13px; |
| font-weight: 500; |
| font-family: monospace; |
| } |
| |
| .issue-title { |
| font-size: 12px; |
| font-weight: 500; |
| margin-bottom: 8px; |
| } |
| |
| .issue-desc { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.5); |
| margin-bottom: 16px; |
| } |
| |
| .issue-info { |
| display: grid; |
| grid-template-columns: 80px 1fr; |
| gap: 8px; |
| font-size: 10px; |
| margin-bottom: 16px; |
| color: rgba(232, 228, 223, 0.4); |
| } |
| |
| .info-section-label { |
| font-size: 10px; |
| font-weight: 500; |
| color: rgba(232, 228, 223, 0.5); |
| margin-bottom: 8px; |
| } |
| |
| .code-block { |
| background: rgba(0, 0, 0, 0.3); |
| border-radius: 4px; |
| padding: 12px; |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.6); |
| margin-bottom: 16px; |
| } |
| |
| |
| .bounty-section { |
| padding: 120px 64px; |
| border-top: 1px solid rgba(232, 228, 223, 0.06); |
| border-bottom: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .bounty-container { |
| max-width: 1100px; |
| margin: 0 auto; |
| } |
| |
| .bounty-content { |
| display: grid; |
| grid-template-columns: 1fr 1fr; |
| gap: 80px; |
| align-items: center; |
| } |
| |
| .bounty-text .section-description { |
| margin: 0 0 32px 0; |
| } |
| |
| .feature-list { |
| display: flex; |
| flex-direction: column; |
| gap: 16px; |
| } |
| |
| .feature-item { |
| display: flex; |
| gap: 16px; |
| align-items: flex-start; |
| } |
| |
| .feature-dot { |
| width: 6px; |
| height: 6px; |
| border-radius: 50%; |
| background: rgba(232, 228, 223, 0.3); |
| margin-top: 8px; |
| flex-shrink: 0; |
| } |
| |
| .feature-title { |
| font-size: 14px; |
| margin-bottom: 4px; |
| } |
| |
| .feature-desc { |
| font-size: 13px; |
| color: rgba(232, 228, 223, 0.4); |
| } |
| |
| .bounty-programs { |
| background: #111111; |
| border-radius: 12px; |
| border: 1px solid rgba(232, 228, 223, 0.08); |
| overflow: hidden; |
| box-shadow: 0 40px 80px rgba(0, 0, 0, 0.5); |
| } |
| |
| .programs-header { |
| padding: 20px 24px; |
| border-bottom: 1px solid rgba(232, 228, 223, 0.06); |
| background: #0d0d0d; |
| } |
| |
| .programs-title { |
| font-size: 15px; |
| font-weight: 500; |
| margin-bottom: 6px; |
| } |
| |
| .programs-subtitle { |
| font-size: 11px; |
| color: rgba(232, 228, 223, 0.4); |
| } |
| |
| .programs-stats { |
| display: grid; |
| grid-template-columns: repeat(4, 1fr); |
| border-bottom: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .program-stat { |
| padding: 16px 20px; |
| border-right: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .program-stat:last-child { |
| border-right: none; |
| } |
| |
| .program-stat-label { |
| font-size: 10px; |
| color: rgba(232, 228, 223, 0.4); |
| margin-bottom: 6px; |
| } |
| |
| .program-stat-value { |
| font-size: 18px; |
| font-weight: 400; |
| } |
| |
| .programs-list { |
| padding: 16px 20px; |
| display: grid; |
| grid-template-columns: 1fr 1fr; |
| gap: 12px; |
| } |
| |
| .program-card { |
| background: rgba(232, 228, 223, 0.02); |
| border: 1px solid rgba(232, 228, 223, 0.06); |
| border-radius: 6px; |
| padding: 16px; |
| } |
| |
| .program-info { |
| display: flex; |
| justify-content: space-between; |
| align-items: flex-start; |
| margin-bottom: 8px; |
| } |
| |
| .program-name { |
| font-size: 13px; |
| font-weight: 500; |
| } |
| |
| .program-handle { |
| font-size: 10px; |
| color: rgba(232, 228, 223, 0.35); |
| font-family: monospace; |
| } |
| |
| .program-bounty { |
| font-size: 18px; |
| font-weight: 400; |
| color: #34d399; |
| } |
| |
| .program-tags { |
| display: flex; |
| gap: 6px; |
| margin-bottom: 12px; |
| } |
| |
| .program-tag-open { |
| font-size: 9px; |
| padding: 3px 8px; |
| background: rgba(52, 211, 153, 0.2); |
| color: #34d399; |
| border-radius: 3px; |
| } |
| |
| .program-tag { |
| font-size: 9px; |
| padding: 3px 8px; |
| background: rgba(232, 228, 223, 0.06); |
| color: rgba(232, 228, 223, 0.5); |
| border-radius: 3px; |
| } |
| |
| .program-actions { |
| display: flex; |
| gap: 8px; |
| } |
| |
| .program-btn { |
| flex: 1; |
| font-size: 10px; |
| padding: 6px 0; |
| text-align: center; |
| border: 1px solid rgba(232, 228, 223, 0.1); |
| border-radius: 4px; |
| color: rgba(232, 228, 223, 0.5); |
| } |
| |
| |
| .capabilities-section { |
| padding: 120px 64px; |
| } |
| |
| .capabilities-container { |
| max-width: 1000px; |
| } |
| |
| .capabilities-list { |
| display: grid; |
| gap: 1px; |
| background: rgba(232, 228, 223, 0.06); |
| } |
| |
| .capability-item { |
| background: #0c0c0c; |
| padding: 32px 0; |
| display: grid; |
| grid-template-columns: 280px 1fr; |
| gap: 64px; |
| align-items: baseline; |
| } |
| |
| .capability-title { |
| font-size: 17px; |
| font-weight: 400; |
| margin: 0; |
| } |
| |
| .capability-desc { |
| font-size: 15px; |
| color: rgba(232, 228, 223, 0.45); |
| margin: 0; |
| line-height: 1.6; |
| } |
| |
| |
| .pricing-section { |
| padding: 120px 64px; |
| border-top: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .pricing-container { |
| max-width: 800px; |
| } |
| |
| .pricing-grid { |
| display: grid; |
| grid-template-columns: 1fr 1fr 1fr; |
| gap: 32px; |
| margin-top: 48px; |
| } |
| |
| .pricing-tier { |
| padding: 32px 0; |
| border-top: 1px solid rgba(232, 228, 223, 0.1); |
| } |
| |
| .tier-name { |
| font-size: 14px; |
| font-weight: 500; |
| margin-bottom: 16px; |
| } |
| |
| .tier-price { |
| font-size: 32px; |
| font-weight: 300; |
| font-family: 'Newsreader', serif; |
| margin-bottom: 16px; |
| } |
| |
| .tier-desc { |
| font-size: 14px; |
| color: rgba(232, 228, 223, 0.45); |
| line-height: 1.7; |
| margin: 0; |
| } |
| |
| |
| .final-cta { |
| padding: 160px 64px; |
| border-top: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .cta-container { |
| max-width: 600px; |
| } |
| |
| .cta-title { |
| font-size: clamp(36px, 5vw, 56px); |
| font-weight: 400; |
| line-height: 1.15; |
| margin: 0 0 40px 0; |
| font-family: 'Newsreader', serif; |
| } |
| |
| @media (max-width: 768px) { |
| nav, .hero, footer, .approach-section, .product-showcase, .quote-section, .reporting-section, .bounty-section, .capabilities-section, .pricing-section, .final-cta { |
| padding-left: 32px; |
| padding-right: 32px; |
| } |
| |
| .nav-links { |
| gap: 16px; |
| } |
| |
| .hero-content { |
| grid-template-columns: 1fr; |
| gap: 40px; |
| } |
| |
| .hero-visual { |
| width: 100%; |
| height: 400px; |
| margin: 0 auto; |
| } |
| |
| .hero-buttons { |
| flex-direction: column; |
| } |
| |
| .approach-grid, .bounty-content { |
| grid-template-columns: 1fr; |
| gap: 40px; |
| } |
| |
| .dashboard-content { |
| flex-direction: column; |
| } |
| |
| .dashboard-sidebar { |
| width: 100%; |
| border-right: none; |
| border-bottom: 1px solid rgba(232, 228, 223, 0.06); |
| } |
| |
| .scan-types, .quick-actions { |
| grid-template-columns: 1fr 1fr; |
| } |
| |
| .prescan-section, .programs-list { |
| grid-template-columns: 1fr; |
| } |
| |
| .summary-stats { |
| grid-template-columns: repeat(3, 1fr); |
| } |
| |
| .programs-stats { |
| grid-template-columns: 1fr 1fr; |
| } |
| |
| .capability-item { |
| grid-template-columns: 1fr; |
| gap: 16px; |
| } |
| |
| .pricing-grid { |
| grid-template-columns: 1fr; |
| } |
| |
| footer { |
| flex-direction: column; |
| gap: 24px; |
| text-align: center; |
| } |
| } |
| |
| @media (max-width: 480px) { |
| nav, .hero, footer, .approach-section, .product-showcase, .quote-section, .reporting-section, .bounty-section, .capabilities-section, .pricing-section, .final-cta { |
| padding-left: 20px; |
| padding-right: 20px; |
| } |
| |
| nav { |
| flex-direction: column; |
| align-items: flex-start; |
| gap: 16px; |
| padding-top: 24px; |
| padding-bottom: 24px; |
| } |
| |
| .nav-links { |
| width: 100%; |
| justify-content: flex-start; |
| flex-wrap: wrap; |
| row-gap: 8px; |
| } |
| |
| .hero { |
| padding: 40px 20px; |
| } |
| |
| .hero h1 { |
| font-size: 32px; |
| } |
| |
| .hero-description { |
| font-size: 14px; |
| } |
| |
| .hero-visual { |
| height: 300px; |
| } |
| |
| .product-showcase { |
| padding: 32px 20px 64px; |
| } |
| |
| .dashboard-mockup { |
| box-shadow: 0 24px 48px rgba(0, 0, 0, 0.6); |
| margin: 0 -4px; |
| } |
| |
| .dashboard-main { |
| padding: 20px 18px; |
| } |
| |
| .quote-section, |
| .reporting-section, |
| .bounty-section, |
| .capabilities-section, |
| .pricing-section, |
| .final-cta { |
| padding-top: 80px; |
| padding-bottom: 80px; |
| } |
| |
| .summary-stats { |
| grid-template-columns: 1fr 1fr; |
| } |
| |
| .programs-stats { |
| grid-template-columns: 1fr 1fr; |
| } |
| } |
| </style> |
| </head> |
| <body> |
| |
| <div class="modal-overlay" id="modalOverlay"> |
| <div class="modal" id="modal"> |
| <div id="formContent"> |
| <span class="badge">EARLY ACCESS</span> |
| <h3>Request Access</h3> |
| <p>SCAFU is currently in private beta. Join the waitlist and we'll reach out when your spot is ready.</p> |
| |
| <div id="errorMessage" class="error-message" style="display: none;"></div> |
| |
| <form id="waitlistForm"> |
| <div class="form-group"> |
| <label class="form-label">Name</label> |
| <input type="text" class="form-input" name="name" required placeholder="Your name"> |
| </div> |
| |
| <div class="form-group"> |
| <label class="form-label">Email</label> |
| <input type="email" class="form-input" name="email" required placeholder="you@company.com"> |
| </div> |
| |
| <div class="form-group"> |
| <label class="form-label">Company <span style="color: rgba(232, 228, 223, 0.3);">(optional)</span></label> |
| <input type="text" class="form-input" name="company" placeholder="Company name"> |
| </div> |
| |
| <div class="form-group" style="margin-bottom: 24px;"> |
| <label class="form-label">Primary use case</label> |
| <select class="form-select" name="useCase" required> |
| <option value="" disabled selected>Select your use case</option> |
| <option value="pentesting">Penetration Testing</option> |
| <option value="bugbounty">Bug Bounty Hunting</option> |
| <option value="security-team">Internal Security Team</option> |
| <option value="devsecops">DevSecOps / CI Pipeline</option> |
| <option value="consulting">Security Consulting</option> |
| <option value="other">Other</option> |
| </select> |
| </div> |
| |
| <button type="submit" class="btn" id="submitBtn">Join Waitlist</button> |
| </form> |
| |
| <p class="disclaimer">No spam. We'll only contact you about SCAFU.</p> |
| </div> |
| |
| <div id="successContent" class="success-message" style="display: none;"> |
| <div class="success-icon">✓</div> |
| <h3>You're on the list</h3> |
| <p>We'll be in touch soon.</p> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <nav> |
| <div class="logo"><img src="scafu-logo.svg" alt="SCAFU"></div> |
| <div class="nav-links"> |
| <a href="#capabilities" class="nav-link">Features</a> |
| <a href="#pricing" class="nav-link">Pricing</a> |
| <button class="nav-btn" id="navGithubBtn">GitHub</button> |
| <button class="nav-btn" onclick="openModal()">Get Early Access</button> |
| </div> |
| </nav> |
|
|
| |
| <section class="hero"> |
| <div class="hero-content"> |
| <div class="hero-text"> |
| <p class="hero-subtitle">AI-powered security testing</p> |
| |
| <h1> |
| Your attack surface<br> |
| <span class="muted">is already mapped.</span> |
| </h1> |
|
|
| <p class="hero-description"> |
| The question is whether you see it first. |
| </p> |
|
|
| <div class="hero-buttons"> |
| <button class="btn-primary" onclick="openModal()">Request Early Access</button> |
| <button class="btn-secondary" id="heroGithubBtn">View on GitHub</button> |
| </div> |
| </div> |
| |
| <div class="hero-visual"> |
| <canvas id="heroCanvas" width="1200" height="1200"></canvas> |
| <div class="gradient-overlay"></div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="approach-section"> |
| <div class="approach-grid"> |
| <div> |
| <p class="section-label">01 — APPROACH</p> |
| <h2 class="section-title">Conversation, not configuration.</h2> |
| <p class="section-description"> |
| Ask for what you need. "Scan for injection vulnerabilities." |
| "Test the authentication flow." "Find what's exposed." |
| Scafu's AI security agents work in parallel—adapting payloads, |
| correlating findings, building exploit chains. |
| </p> |
| </div> |
| <div> |
| <p class="section-label">02 — ARCHITECTURE</p> |
| <h2 class="section-title">Nothing leaves your machine.</h2> |
| <p class="section-description"> |
| Local AI processing via Ollama. Tor integration for anonymity. |
| Your targets, your findings, your data. The only thing we |
| know about your security posture is that you take it seriously. |
| </p> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="product-showcase"> |
| <div class="dashboard-mockup"> |
| <div class="dashboard-header"> |
| <div class="dashboard-logo">SCAF<span style="color: #f59e0b;">U</span></div> |
| <div class="dashboard-status"> |
| <span class="status-ip">174.6.14.54</span> |
| <span class="status-ping">85ms</span> |
| <span class="status-tor">TOR</span> |
| </div> |
| </div> |
| <div class="dashboard-content"> |
| <div class="dashboard-sidebar"> |
| <div class="sidebar-item active">Dashboard</div> |
| <div class="sidebar-item">New Scan</div> |
| <div class="sidebar-item">Pre-Scan Intel</div> |
| <div class="sidebar-item">Intelligence</div> |
| <div class="sidebar-item">Bug Bounties</div> |
| <div class="sidebar-item">Scanners</div> |
| <div class="sidebar-item">Results</div> |
| <div class="sidebar-item">Tools</div> |
| <div class="sidebar-item">AI Models</div> |
| </div> |
| <div class="dashboard-main"> |
| <div class="dashboard-intro"> |
| <h3>Dashboard</h3> |
| <p>Welcome to SCAFU Security Scanner</p> |
| </div> |
| <div class="scan-types"> |
| <div class="scan-card"> |
| <div class="scan-dot" style="background: #a78bfa;"></div> |
| <div class="scan-title">Ultimate Scan</div> |
| <div class="scan-subtitle">Full assessment</div> |
| </div> |
| <div class="scan-card"> |
| <div class="scan-dot" style="background: #f87171;"></div> |
| <div class="scan-title">PRO Scan</div> |
| <div class="scan-subtitle">Advanced scanners</div> |
| </div> |
| <div class="scan-card"> |
| <div class="scan-dot" style="background: #fbbf24;"></div> |
| <div class="scan-title">Quick Scan</div> |
| <div class="scan-subtitle">3-5 minutes</div> |
| </div> |
| <div class="scan-card"> |
| <div class="scan-dot" style="background: #34d399;"></div> |
| <div class="scan-title">Post-Scan</div> |
| <div class="scan-subtitle">AI recommendations</div> |
| </div> |
| </div> |
| <div class="quick-actions"> |
| <div class="action-card"> |
| <div class="action-title">Browse Scanners</div> |
| <div class="action-subtitle">31 available</div> |
| </div> |
| <div class="action-card"> |
| <div class="action-title">Network Status</div> |
| <div class="action-subtitle">174.6.14.54</div> |
| </div> |
| <div class="action-card"> |
| <div class="action-title">Link Tools</div> |
| <div class="action-subtitle">Tracking & masking</div> |
| </div> |
| <div class="action-card"> |
| <div class="action-title">OSS Recon</div> |
| <div class="action-subtitle">Subfinder → HTTPx</div> |
| </div> |
| </div> |
| <div class="prescan-section"> |
| <div class="prescan-card"> |
| <div class="prescan-title">Pre-Scan Intelligence</div> |
| <p class="prescan-desc">Gather tech stack, WAF, and vulnerability intel before scanning</p> |
| <div class="prescan-input"> |
| <span class="input-protocol">https://</span> |
| <span class="input-placeholder">example.com</span> |
| </div> |
| </div> |
| <div class="prescan-card"> |
| <div class="prescan-title-muted">Intelligence Results</div> |
| <div class="prescan-empty"> |
| <div class="empty-icon"> |
| <div class="empty-icon-inner"></div> |
| </div> |
| <span class="empty-text">Enter a target to gather intelligence</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="quote-section"> |
| <div class="quote-container"> |
| <blockquote class="quote-text"> |
| "A 15min SCAFU scan found critical vulnerabilities that an audit missed—including exposed credentials that could have compromised the entire database." |
| </blockquote> |
| <p class="quote-attribution">— CEO of usecarousel.com</p> |
| </div> |
| </section> |
|
|
| |
| <section class="reporting-section"> |
| <div class="reporting-container"> |
| <p class="section-label">03 — REPORTING & REMEDIATION</p> |
| <h2 class="section-title">Actionable intelligence, not just findings.</h2> |
| <p class="section-description" style="max-width: 520px; margin-bottom: 48px;"> |
| Every vulnerability comes with evidence, remediation steps, and compliance mappings. Export to PDF, JSON, or integrate directly with your ticketing system. |
| </p> |
| <div class="report-mockup"> |
| <div class="report-header"> |
| <div class="report-title">SCAFU SECURITY INTELLIGENCE REPORT</div> |
| <div class="report-meta"> |
| <span>Target: <span style="color: rgba(232,228,223,0.5);">sca-fu.com</span></span> |
| <span>Scan ID: <span style="color: rgba(232,228,223,0.5);">8b36b1db-787e-41a4-8449</span></span> |
| <span>Date: <span style="color: rgba(232,228,223,0.5);">2025-12-04</span></span> |
| </div> |
| </div> |
| <div class="report-summary"> |
| <div class="summary-label">EXECUTIVE SUMMARY</div> |
| <div class="summary-stats"> |
| <div class="stat-box"><div class="stat-value" style="color: #e8e4df;">18</div><div class="stat-label">Total</div></div> |
| <div class="stat-box"><div class="stat-value" style="color: #c9463d;">2</div><div class="stat-label">Critical</div></div> |
| <div class="stat-box"><div class="stat-value" style="color: #f87171;">2</div><div class="stat-label">High</div></div> |
| <div class="stat-box"><div class="stat-value" style="color: #fbbf24;">8</div><div class="stat-label">Medium</div></div> |
| <div class="stat-box"><div class="stat-value" style="color: #34d399;">3</div><div class="stat-label">Low</div></div> |
| </div> |
| <div class="summary-text"> |
| <span style="color: rgba(232,228,223,0.6); font-weight: 500;">Top risks:</span> Server-side code injection on primary endpoint (RCE risk); Server-side template injection enabling expression execution; SSRF with CRLF header injection |
| </div> |
| </div> |
| <div class="report-details"> |
| <div class="details-label">CRITICAL ISSUES</div> |
| <div class="critical-issue"> |
| <div class="issue-header"> |
| <span class="issue-badge">CRITICAL</span> |
| <span class="issue-type">code_injection</span> |
| </div> |
| <div class="issue-title">PYTHON code injection in query parameter</div> |
| <div class="issue-desc">Server-side python code execution detected</div> |
| <div class="issue-info"> |
| <span>URL</span> |
| <span style="color: rgba(232,228,223,0.6); font-family: monospace;">https://sca-fu.com/</span> |
| <span>Scanner</span> |
| <span style="color: rgba(232,228,223,0.6); font-family: monospace;">code_injection</span> |
| </div> |
| <div class="info-section-label">Remediation</div> |
| <div class="code-block">Never evaluate user input as code. Use parameterized APIs instead</div> |
| <div class="info-section-label">Evidence</div> |
| <div class="code-block" style="font-family: monospace; line-height: 1.6;"> |
| {<br> |
| "payload": "{{7*7}}",<br> |
| "language": "python",<br> |
| "parameter": "input"<br> |
| } |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="bounty-section"> |
| <div class="bounty-container"> |
| <div class="bounty-content"> |
| <div class="bounty-text"> |
| <p class="section-label">04 — BUG BOUNTY INTEGRATION</p> |
| <h2 class="section-title">From program to payload in seconds.</h2> |
| <p class="section-description"> |
| Pull scope directly from HackerOne, Bugcrowd, or Intigriti. SCAFU parses program rules, validates in-scope assets, and initializes targeted scans—no manual configuration required. |
| </p> |
| <div class="feature-list"> |
| <div class="feature-item"> |
| <div class="feature-dot"></div> |
| <div> |
| <div class="feature-title">Automatic scope parsing</div> |
| <div class="feature-desc">Domains, wildcards, exclusions—imported and validated</div> |
| </div> |
| </div> |
| <div class="feature-item"> |
| <div class="feature-dot"></div> |
| <div> |
| <div class="feature-title">Program intelligence</div> |
| <div class="feature-desc">Payout ranges, response times, focus areas</div> |
| </div> |
| </div> |
| <div class="feature-item"> |
| <div class="feature-dot"></div> |
| <div> |
| <div class="feature-title">One-click initialization</div> |
| <div class="feature-desc">Select a program, SCAFU configures the scan</div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="bounty-programs"> |
| <div class="programs-header"> |
| <div class="programs-title">Bug Bounty Programs</div> |
| <div class="programs-subtitle">Discover HackerOne programs and launch intelligent, LLM-enhanced scans</div> |
| </div> |
| <div class="programs-stats"> |
| <div class="program-stat"><div class="program-stat-label">Total Programs</div><div class="program-stat-value">297</div></div> |
| <div class="program-stat"><div class="program-stat-label">SCAFU Compatible</div><div class="program-stat-value">297</div></div> |
| <div class="program-stat"><div class="program-stat-label">Open Submissions</div><div class="program-stat-value">244</div></div> |
| <div class="program-stat"><div class="program-stat-label">Managed Programs</div><div class="program-stat-value">0</div></div> |
| </div> |
| <div class="programs-list"> |
| <div class="program-card"> |
| <div class="program-info"> |
| <div> |
| <div class="program-name">Slack</div> |
| <div class="program-handle">@slack</div> |
| </div> |
| <div class="program-bounty">120</div> |
| </div> |
| <div class="program-tags"> |
| <span class="program-tag-open">open</span> |
| <span class="program-tag">$ Bounties</span> |
| </div> |
| <div class="program-actions"> |
| <div class="program-btn">Analyze</div> |
| <div class="program-btn">Pre-Scan</div> |
| </div> |
| </div> |
| <div class="program-card"> |
| <div class="program-info"> |
| <div> |
| <div class="program-name">Coinbase</div> |
| <div class="program-handle">@coinbase</div> |
| </div> |
| <div class="program-bounty">120</div> |
| </div> |
| <div class="program-tags"> |
| <span class="program-tag-open">open</span> |
| <span class="program-tag">$ Bounties</span> |
| </div> |
| <div class="program-actions"> |
| <div class="program-btn">Analyze</div> |
| <div class="program-btn">Pre-Scan</div> |
| </div> |
| </div> |
| <div class="program-card"> |
| <div class="program-info"> |
| <div> |
| <div class="program-name">GitLab</div> |
| <div class="program-handle">@gitlab</div> |
| </div> |
| <div class="program-bounty">120</div> |
| </div> |
| <div class="program-tags"> |
| <span class="program-tag-open">open</span> |
| <span class="program-tag">$ Bounties</span> |
| </div> |
| <div class="program-actions"> |
| <div class="program-btn">Analyze</div> |
| <div class="program-btn">Pre-Scan</div> |
| </div> |
| </div> |
| <div class="program-card"> |
| <div class="program-info"> |
| <div> |
| <div class="program-name">Uber</div> |
| <div class="program-handle">@uber</div> |
| </div> |
| <div class="program-bounty">120</div> |
| </div> |
| <div class="program-tags"> |
| <span class="program-tag-open">open</span> |
| <span class="program-tag">$ Bounties</span> |
| </div> |
| <div class="program-actions"> |
| <div class="program-btn">Analyze</div> |
| <div class="program-btn">Pre-Scan</div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section id="capabilities" class="capabilities-section"> |
| <div class="capabilities-container"> |
| <p class="section-label">CAPABILITIES</p> |
| <div class="capabilities-list"> |
| <div class="capability-item"> |
| <h3 class="capability-title">Adaptive payload generation</h3> |
| <p class="capability-desc">Context-aware testing based on target fingerprints and technology stack</p> |
| </div> |
| <div class="capability-item"> |
| <h3 class="capability-title">WAF bypass automation</h3> |
| <p class="capability-desc">Cloudflare, AWS WAF, Akamai—multi-layer encoding and protocol smuggling</p> |
| </div> |
| <div class="capability-item"> |
| <h3 class="capability-title">Exploit chain mapping</h3> |
| <p class="capability-desc">Graph-based correlation: SSRF → Internal API → Privilege Escalation → RCE</p> |
| </div> |
| <div class="capability-item"> |
| <h3 class="capability-title">Intelligent fuzzing</h3> |
| <p class="capability-desc">Mutation-based discovery finds edge cases signature scanners miss</p> |
| </div> |
| <div class="capability-item"> |
| <h3 class="capability-title">Attack surface reconnaissance</h3> |
| <p class="capability-desc">Asset discovery, subdomain enumeration, certificate transparency analysis</p> |
| </div> |
| <div class="capability-item"> |
| <h3 class="capability-title">Compliance-ready reporting</h3> |
| <p class="capability-desc">OWASP, PCI-DSS, NIST, ISO 27001 mappings. Export anywhere.</p> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section id="pricing" class="pricing-section"> |
| <div class="pricing-container"> |
| <p class="section-label">PRICING</p> |
| <h2 class="section-title">The foundation is free. <span style="color: rgba(232,228,223,0.35);">(Coming soon)</span></h2> |
| <div class="pricing-grid"> |
| <div class="pricing-tier"> |
| <div class="tier-name">Foundation</div> |
| <div class="tier-price">$0</div> |
| <p class="tier-desc">Full scanner suite. AI interface. Exploit chain detection. Local processing. Open source.</p> |
| </div> |
| <div class="pricing-tier" style="border-top: 1px solid rgba(232,228,223,0.2);"> |
| <div class="tier-name">Individuals</div> |
| <div class="tier-price">$199<span style="font-size: 14px; color: rgba(232,228,223,0.4);">/mo</span></div> |
| <p class="tier-desc">Cloud-hosted scans. Priority processing. Advanced reporting. Bug bounty integrations.</p> |
| </div> |
| <div class="pricing-tier" style="border-top: 1px solid rgba(232,228,223,0.3);"> |
| <div class="tier-name">Enterprise</div> |
| <div class="tier-price">Custom</div> |
| <p class="tier-desc">Priority support. Custom integrations. Team management. Compliance reporting. SLA guarantees.</p> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="final-cta"> |
| <div class="cta-container"> |
| <h2 class="cta-title">What will you find?</h2> |
| <button class="btn-primary" onclick="openModal()">Request Early Access</button> |
| </div> |
| </section> |
|
|
| |
| <footer> |
| <div class="footer-logo">SCAF<span style="color: #f59e0b;">U</span></div> |
| <div class="footer-tagline">AI-powered security testing</div> |
| <div class="footer-links"> |
| <button class="footer-link" id="footerGithubBtn">GitHub</button> |
| <button class="footer-link" onclick="openModal()">Early Access</button> |
| <a href="mailto:contact@sca-fu.com" class="footer-link">Contact</a> |
| </div> |
| </footer> |
|
|
| <script> |
| |
| const modalOverlay = document.getElementById('modalOverlay'); |
| const formContent = document.getElementById('formContent'); |
| const successContent = document.getElementById('successContent'); |
| const waitlistForm = document.getElementById('waitlistForm'); |
| const errorMessage = document.getElementById('errorMessage'); |
| const submitBtn = document.getElementById('submitBtn'); |
| |
| |
| const githubButtons = [ |
| document.getElementById('navGithubBtn'), |
| document.getElementById('heroGithubBtn'), |
| document.getElementById('footerGithubBtn') |
| ]; |
| |
| let githubClicked = false; |
| |
| |
| githubButtons.forEach(btn => { |
| btn.addEventListener('click', () => { |
| if (!githubClicked) { |
| githubClicked = true; |
| githubButtons.forEach(b => { |
| b.textContent = 'Coming soon'; |
| b.classList.add('disabled'); |
| b.style.cursor = 'default'; |
| }); |
| } |
| }); |
| }); |
| |
| function openModal() { |
| modalOverlay.classList.add('active'); |
| formContent.style.display = 'block'; |
| successContent.style.display = 'none'; |
| errorMessage.style.display = 'none'; |
| waitlistForm.reset(); |
| } |
| |
| function closeModal() { |
| modalOverlay.classList.remove('active'); |
| } |
| |
| |
| modalOverlay.addEventListener('click', (e) => { |
| if (e.target === modalOverlay) { |
| closeModal(); |
| } |
| }); |
| |
| |
| waitlistForm.addEventListener('submit', async (e) => { |
| e.preventDefault(); |
| |
| const formData = new FormData(waitlistForm); |
| const data = { |
| name: formData.get('name'), |
| email: formData.get('email'), |
| company: formData.get('company') || '', |
| useCase: formData.get('useCase') |
| }; |
| |
| submitBtn.disabled = true; |
| submitBtn.textContent = 'Submitting...'; |
| errorMessage.style.display = 'none'; |
| |
| try { |
| |
| const response = await fetch('https://api.web3forms.com/submit', { |
| method: 'POST', |
| headers: { |
| 'Content-Type': 'application/json', |
| }, |
| body: JSON.stringify({ |
| access_key: 'd5acfcf1-622a-4fe8-bcfa-f0ab96a5d6cd', |
| name: data.name, |
| email: data.email, |
| company: data.company, |
| use_case: data.useCase, |
| subject: 'New SCAFU Waitlist Submission' |
| }) |
| }); |
| |
| if (response.ok) { |
| |
| formContent.style.display = 'none'; |
| successContent.style.display = 'block'; |
| |
| |
| setTimeout(() => { |
| closeModal(); |
| }, 2000); |
| } else { |
| throw new Error('Submission failed'); |
| } |
| } catch (error) { |
| errorMessage.textContent = 'Failed to submit. Please try again or email contact@sca-fu.com'; |
| errorMessage.style.display = 'block'; |
| submitBtn.disabled = false; |
| submitBtn.textContent = 'Join Waitlist'; |
| } |
| }); |
| |
| |
| const canvas = document.getElementById('heroCanvas'); |
| const ctx = canvas.getContext('2d'); |
| const width = 600; |
| const height = 600; |
| |
| const dpr = window.devicePixelRatio || 1; |
| canvas.width = width * dpr; |
| canvas.height = height * dpr; |
| canvas.style.width = width + 'px'; |
| canvas.style.height = height + 'px'; |
| ctx.scale(dpr, dpr); |
| |
| const colors = { |
| cyan: '#0891b2', orange: '#c2410c', critical: '#dc2626', high: '#ea580c', |
| medium: '#ca8a04', low: '#16a34a', bg: '#0c0c0c', text: '#e8e4df', |
| node: '#374151', subtle: '#94a3b8' |
| }; |
| |
| let time = 0; |
| const centerX = width / 2, centerY = height / 2; |
| |
| const discoveryTypes = [ |
| { type: 'subdomain', text: 'api.target.com', icon: '◇' }, |
| { type: 'subdomain', text: 'dev.target.com', icon: '◇' }, |
| { type: 'endpoint', text: '/api/v2/users', icon: '→' }, |
| { type: 'exposure', text: 'SQL injection', severity: 'critical', icon: '!' }, |
| { type: 'subdomain', text: 'staging.target.com', icon: '◇' }, |
| { type: 'endpoint', text: '/admin/config', icon: '→' }, |
| { type: 'exposure', text: 'Info disclosure', severity: 'medium', icon: '!' }, |
| { type: 'service', text: 'nginx/1.18.0', icon: '◆' }, |
| { type: 'endpoint', text: '/api/auth/token', icon: '→' }, |
| { type: 'exposure', text: 'Missing headers', severity: 'low', icon: '!' }, |
| { type: 'subdomain', text: 'cdn.target.com', icon: '◇' }, |
| { type: 'exposure', text: 'Open redirect', severity: 'high', icon: '!' }, |
| { type: 'service', text: 'PostgreSQL 14', icon: '◆' }, |
| { type: 'endpoint', text: '/graphql', icon: '→' }, |
| { type: 'subdomain', text: 'mail.target.com', icon: '◇' }, |
| { type: 'exposure', text: 'CORS misconfig', severity: 'medium', icon: '!' }, |
| ]; |
| |
| let discoveries = [], nextDiscoveryTime = 1000, discoveryIndex = 0; |
| let counts = { subdomains: 0, endpoints: 0, services: 0, exposures: 0 }; |
| |
| const nodes = [{ x: centerX, y: centerY, r: 6, type: 'hub' }]; |
| for (let i = 0; i < 6; i++) { |
| const angle = (i / 6) * Math.PI * 2 - Math.PI / 2; |
| nodes.push({ x: centerX + Math.cos(angle) * 80, y: centerY + Math.sin(angle) * 80, r: 4, type: 'asset', |
| severity: ['critical', 'high', 'medium', 'medium'][Math.floor(Math.random() * 4)], angle, orbit: 80, speed: 0.00025 + Math.random() * 0.00015 }); |
| } |
| for (let i = 0; i < 10; i++) { |
| const angle = (i / 10) * Math.PI * 2 + 0.3; |
| nodes.push({ x: centerX + Math.cos(angle) * 150, y: centerY + Math.sin(angle) * 150, r: 3.5, type: 'asset', |
| severity: ['medium', 'low', 'low', 'low'][Math.floor(Math.random() * 4)], angle, orbit: 150, speed: 0.00015 + Math.random() * 0.0001 }); |
| } |
| for (let i = 0; i < 14; i++) { |
| const angle = (i / 14) * Math.PI * 2 - 0.2; |
| nodes.push({ x: centerX + Math.cos(angle) * 220, y: centerY + Math.sin(angle) * 220, r: 3, type: 'endpoint', |
| severity: 'neutral', angle, orbit: 220, speed: 0.0001 + Math.random() * 0.00008 }); |
| } |
| for (let i = 0; i < 8; i++) { |
| const angle = (i / 8) * Math.PI * 2 + 0.5, r = 270 + Math.random() * 15; |
| nodes.push({ x: centerX + Math.cos(angle) * r, y: centerY + Math.sin(angle) * r, r: 2, type: 'discovered', angle, orbit: r, speed: 0.00008 }); |
| } |
| |
| const connections = []; |
| for (let i = 1; i < 7; i++) connections.push({ from: 0, to: i }); |
| for (let i = 7; i < 17; i++) connections.push({ from: Math.floor((i - 7) / 2) + 1, to: i }); |
| for (let i = 17; i < 25; i++) connections.push({ from: Math.floor((i - 17) / 2) + 7, to: i }); |
| |
| const scanBeam = { angle: 0, speed: 0.004, length: 280 }; |
| const particles = []; |
| for (let i = 0; i < 15; i++) particles.push({ connection: Math.floor(Math.random() * connections.length), |
| progress: Math.random(), speed: 0.002 + Math.random() * 0.002, size: 1 + Math.random() * 0.8 }); |
| const vulnPulses = []; |
| |
| function getSeverityColor(s) { return s === 'neutral' ? colors.node : colors[s] || colors.node; } |
| function hexToRgba(hex, alpha) { |
| const r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16); |
| return `rgba(${r}, ${g}, ${b}, ${alpha})`; |
| } |
| function roundRect(ctx, x, y, w, h, r) { |
| ctx.beginPath(); ctx.moveTo(x + r, y); ctx.lineTo(x + w - r, y); |
| ctx.quadraticCurveTo(x + w, y, x + w, y + r); ctx.lineTo(x + w, y + h - r); |
| ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); ctx.lineTo(x + r, y + h); |
| ctx.quadraticCurveTo(x, y + h, x, y + h - r); ctx.lineTo(x, y + r); |
| ctx.quadraticCurveTo(x, y, x + r, y); ctx.closePath(); |
| } |
| |
| function draw() { |
| time += 16; |
| ctx.fillStyle = colors.bg; ctx.fillRect(0, 0, width, height); |
| |
| if (time > nextDiscoveryTime && discoveryIndex < discoveryTypes.length) { |
| const newDiscovery = { ...discoveryTypes[discoveryIndex], opacity: 0, fadeIn: true, age: 0 }; |
| discoveries.unshift(newDiscovery); |
| if (newDiscovery.type === 'subdomain') counts.subdomains++; |
| else if (newDiscovery.type === 'endpoint') counts.endpoints++; |
| else if (newDiscovery.type === 'service') counts.services++; |
| else if (newDiscovery.type === 'exposure') counts.exposures++; |
| if (discoveries.length > 5) discoveries = discoveries.slice(0, 5); |
| discoveryIndex++; if (discoveryIndex >= discoveryTypes.length) discoveryIndex = 0; |
| nextDiscoveryTime = time + 2000 + Math.random() * 1500; |
| } |
| discoveries.forEach(d => { d.age += 16; if (d.fadeIn && d.opacity < 1) d.opacity = Math.min(1, d.opacity + 0.05); }); |
| nodes.forEach(node => { if (node.orbit && node.speed) { node.angle += node.speed * 16; |
| node.x = centerX + Math.cos(node.angle) * node.orbit; node.y = centerY + Math.sin(node.angle) * node.orbit; } }); |
| |
| [80, 150, 220].forEach(r => { ctx.beginPath(); ctx.arc(centerX, centerY, r, 0, Math.PI * 2); |
| ctx.strokeStyle = 'rgba(148, 163, 184, 0.025)'; ctx.lineWidth = 1; ctx.stroke(); }); |
| |
| scanBeam.angle += scanBeam.speed; |
| const gradient = ctx.createLinearGradient(centerX, centerY, centerX + Math.cos(scanBeam.angle) * scanBeam.length, |
| centerY + Math.sin(scanBeam.angle) * scanBeam.length); |
| gradient.addColorStop(0, 'rgba(0,0,0,0)'); gradient.addColorStop(0.4, hexToRgba(colors.cyan, 0.03)); |
| gradient.addColorStop(0.8, hexToRgba(colors.cyan, 0.12)); gradient.addColorStop(1, 'rgba(0,0,0,0)'); |
| ctx.beginPath(); ctx.moveTo(centerX, centerY); |
| ctx.arc(centerX, centerY, scanBeam.length, scanBeam.angle - 0.12, scanBeam.angle + 0.12); |
| ctx.closePath(); ctx.fillStyle = gradient; ctx.fill(); |
| ctx.beginPath(); ctx.moveTo(centerX, centerY); |
| ctx.lineTo(centerX + Math.cos(scanBeam.angle) * scanBeam.length, centerY + Math.sin(scanBeam.angle) * scanBeam.length); |
| ctx.strokeStyle = hexToRgba(colors.cyan, 0.15); ctx.lineWidth = 1; ctx.stroke(); |
| |
| connections.forEach(conn => { const from = nodes[conn.from], to = nodes[conn.to]; |
| ctx.beginPath(); ctx.moveTo(from.x, from.y); ctx.lineTo(to.x, to.y); |
| ctx.strokeStyle = 'rgba(148, 163, 184, 0.06)'; ctx.lineWidth = 1; ctx.stroke(); }); |
| |
| particles.forEach(p => { p.progress += p.speed; if (p.progress > 1) { |
| p.progress = 0; p.connection = Math.floor(Math.random() * connections.length); } |
| const conn = connections[p.connection], from = nodes[conn.from], to = nodes[conn.to]; |
| const x = from.x + (to.x - from.x) * p.progress, y = from.y + (to.y - from.y) * p.progress; |
| ctx.beginPath(); ctx.arc(x, y, p.size, 0, Math.PI * 2); ctx.fillStyle = hexToRgba(colors.cyan, 0.35); ctx.fill(); }); |
| |
| if (Math.random() < 0.005 && vulnPulses.length < 2) { |
| const vulnNode = nodes[1 + Math.floor(Math.random() * 6)]; |
| if (vulnNode.severity && vulnNode.severity !== 'neutral') |
| vulnPulses.push({ x: vulnNode.x, y: vulnNode.y, r: 0, color: getSeverityColor(vulnNode.severity), opacity: 0.3 }); |
| } |
| for (let i = vulnPulses.length - 1; i >= 0; i--) { |
| const pulse = vulnPulses[i]; pulse.r += 0.5; pulse.opacity -= 0.008; |
| if (pulse.opacity <= 0) { vulnPulses.splice(i, 1); continue; } |
| ctx.beginPath(); ctx.arc(pulse.x, pulse.y, pulse.r, 0, Math.PI * 2); |
| ctx.strokeStyle = hexToRgba(pulse.color, pulse.opacity); ctx.lineWidth = 1; ctx.stroke(); |
| } |
| |
| nodes.forEach(node => { |
| if (node.type === 'hub') { const glow = ctx.createRadialGradient(node.x, node.y, 0, node.x, node.y, node.r * 3); |
| glow.addColorStop(0, hexToRgba(colors.cyan, 0.15)); glow.addColorStop(1, hexToRgba(colors.cyan, 0)); |
| ctx.beginPath(); ctx.arc(node.x, node.y, node.r * 3, 0, Math.PI * 2); ctx.fillStyle = glow; ctx.fill(); } |
| ctx.beginPath(); ctx.arc(node.x, node.y, node.r, 0, Math.PI * 2); |
| if (node.type === 'hub') ctx.fillStyle = colors.cyan; |
| else if (node.type === 'discovered') ctx.fillStyle = 'rgba(148, 163, 184, 0.15)'; |
| else if (node.severity === 'neutral') ctx.fillStyle = 'rgba(148, 163, 184, 0.25)'; |
| else ctx.fillStyle = hexToRgba(getSeverityColor(node.severity), 0.7); |
| ctx.fill(); ctx.strokeStyle = 'rgba(148, 163, 184, 0.15)'; ctx.lineWidth = 1; ctx.stroke(); |
| }); |
| |
| const hubPulse = (Math.sin(time * 0.002) + 1) / 2; |
| ctx.beginPath(); ctx.arc(centerX, centerY, 10 + hubPulse * 3, 0, Math.PI * 2); |
| ctx.strokeStyle = hexToRgba(colors.cyan, 0.12); ctx.lineWidth = 1; ctx.stroke(); |
| |
| ctx.strokeStyle = 'rgba(148, 163, 184, 0.04)'; ctx.lineWidth = 1; |
| for (let i = 0; i < 3; i++) { |
| ctx.beginPath(); ctx.moveTo(0, i * 16); ctx.lineTo(48 - i * 16, i * 16); ctx.stroke(); |
| ctx.beginPath(); ctx.moveTo(i * 16, 0); ctx.lineTo(i * 16, 48 - i * 16); ctx.stroke(); |
| } |
| for (let i = 0; i < 3; i++) { |
| ctx.beginPath(); ctx.moveTo(width, height - i * 16); ctx.lineTo(width - 48 + i * 16, height - i * 16); ctx.stroke(); |
| ctx.beginPath(); ctx.moveTo(width - i * 16, height); ctx.lineTo(width - i * 16, height - 48 + i * 16); ctx.stroke(); |
| } |
| |
| const panelW = 220, panelH = 180, panelX = width - panelW - 20, panelY = 20; |
| ctx.fillStyle = 'rgba(15, 18, 25, 0.96)'; roundRect(ctx, panelX, panelY, panelW, panelH, 8); ctx.fill(); |
| ctx.strokeStyle = 'rgba(148, 163, 184, 0.25)'; ctx.lineWidth = 1.5; roundRect(ctx, panelX, panelY, panelW, panelH, 8); ctx.stroke(); |
| |
| ctx.font = '600 11px Inter, system-ui, sans-serif'; ctx.fillStyle = 'rgba(232, 228, 223, 0.85)'; |
| ctx.fillText('RECONNAISSANCE', panelX + 16, panelY + 22); |
| const livePulse = (Math.sin(time * 0.005) + 1) / 2; |
| ctx.beginPath(); ctx.arc(panelX + panelW - 20, panelY + 17, 3.5, 0, Math.PI * 2); |
| ctx.fillStyle = hexToRgba(colors.cyan, 0.7 + livePulse * 0.3); ctx.fill(); |
| |
| ctx.font = '500 11px Inter, system-ui, sans-serif'; const summaryY = panelY + 42; |
| ctx.fillStyle = 'rgba(148, 163, 184, 0.7)'; |
| ctx.fillText(`${counts.subdomains + counts.endpoints + counts.services} assets`, panelX + 16, summaryY); |
| ctx.fillStyle = counts.exposures > 0 ? hexToRgba(colors.critical, 1) : 'rgba(148, 163, 184, 0.7)'; |
| ctx.textAlign = 'right'; ctx.fillText(`${counts.exposures} exposures`, panelX + panelW - 16, summaryY); ctx.textAlign = 'left'; |
| |
| ctx.beginPath(); ctx.moveTo(panelX + 16, panelY + 54); ctx.lineTo(panelX + panelW - 16, panelY + 54); |
| ctx.strokeStyle = 'rgba(148, 163, 184, 0.2)'; ctx.stroke(); |
| |
| const feedStartY = panelY + 72, lineHeight = 22; |
| discoveries.slice(0, 5).forEach((d, i) => { |
| const y = feedStartY + i * lineHeight, opacity = d.opacity * (1 - i * 0.12); |
| let iconColor = 'rgba(148, 163, 184, 0.6)'; |
| if (d.type === 'exposure') iconColor = hexToRgba(colors[d.severity] || colors.medium, 0.9); |
| else if (d.type === 'subdomain') iconColor = hexToRgba(colors.cyan, 0.7); |
| |
| ctx.font = '600 11px Inter, system-ui, sans-serif'; |
| if (d.type === 'exposure') { ctx.beginPath(); ctx.arc(panelX + 22, y - 3, 4, 0, Math.PI * 2); |
| ctx.fillStyle = hexToRgba(colors[d.severity], opacity * 1.2); ctx.fill(); } |
| else { ctx.fillStyle = `rgba(148, 163, 184, ${opacity * 0.7})`; ctx.fillText(d.icon, panelX + 18, y); } |
| |
| ctx.font = '500 12px Inter, system-ui, sans-serif'; |
| ctx.fillStyle = d.type === 'exposure' ? `rgba(232, 228, 223, ${opacity})` : `rgba(232, 228, 223, ${opacity * 0.85})`; |
| let displayText = d.text; if (displayText.length > 24) displayText = displayText.substring(0, 23) + '…'; |
| ctx.fillText(displayText, panelX + 36, y); |
| }); |
| |
| if (discoveries.length > 0) { ctx.font = '500 9px Inter, system-ui, sans-serif'; |
| ctx.fillStyle = hexToRgba(colors.cyan, 0.7); |
| ctx.fillText('discovering' + '.'.repeat(Math.floor(time / 400) % 4), panelX + 16, panelY + panelH - 12); } |
| |
| requestAnimationFrame(draw); |
| } |
| draw(); |
| </script> |
| </body> |
| </html> |
|
|