diff --git a/.well-known/lnurlp/william b/.well-known/lnurlp/william deleted file mode 100644 index bfe841f..0000000 --- a/.well-known/lnurlp/william +++ /dev/null @@ -1 +0,0 @@ -{"status":"OK","tag":"payRequest","commentAllowed":255,"callback":"https://getalby.com/lnurlp/williamsantiago/callback","metadata":"[[\"text/identifier\",\"williamsantiago@getalby.com\"],[\"text/plain\",\"Sats for williamsantiago\"]]","minSendable":1000,"maxSendable":11000000000,"payerData":{"name":{"mandatory":false},"email":{"mandatory":false}},"nostrPubkey":"79f00d3f5a19ec806189fcab03c1be4ff81d18ee4f653c88fac41fe03570f432","allowsNostr":true} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..acefb8a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 PrivKey LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..98c98b7 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,7 @@ +# Security Policy + +## Reporting a Vulnerability + +If you discover a security vulnerability, please report it to **security@privkey.io**. + +Do not open a public issue. diff --git a/_headers b/_headers new file mode 100644 index 0000000..8c49601 --- /dev/null +++ b/_headers @@ -0,0 +1,8 @@ +/* + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + X-Content-Type-Options: nosniff + X-Frame-Options: DENY + X-XSS-Protection: 1; mode=block + Cross-Origin-Opener-Policy: same-origin + Cross-Origin-Embedder-Policy: credentialless + Permissions-Policy: geolocation=(), microphone=(), camera=(), payment=(), usb=() diff --git a/assets/css/colors/green.css b/assets/css/colors/green.css index 5c9b1c5..0063df9 100644 --- a/assets/css/colors/green.css +++ b/assets/css/colors/green.css @@ -4,7 +4,6 @@ File Description: Main CSS file of the template */ - .text-primary,.read-btn, .navbar-custom.navbar-white .navbar-nav li.active a, .navbar-custom.navbar-white .navbar-nav li a:hover, @@ -14,14 +13,11 @@ color: #27ae60 !important; } - .section-title-border, .services-box:hover i,.bg-primary,.btn-primary,.features-item-list li:before,.process-left-icon-1 i, .process-left-icon-2 i, .account-card .form-check-input:checked { background-color: #27ae60 !important; } - - .btn-primary,.play-btn,.account-card .form-check-input:checked { border-color:#27ae60 !important; } @@ -31,25 +27,7 @@ .btn-primary:active, .btn-primary.active, .btn-primary.focus, -.btn-primary:active, -.btn-primary:focus, -.btn-primary:hover, -.open > .dropdown-toggle.btn-primary{ +.open > .dropdown-toggle.btn-primary { background-color: #27ae60; -} - - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.btn-primary.focus, -.btn-primary:active, -.btn-primary:focus, -.btn-primary:hover, -.open > .dropdown-toggle.btn-primary{ border-color: #27ae60 !important; } - - - diff --git a/assets/css/essential-only.css b/assets/css/essential-only.css index d0a98ac..48cd2c2 100644 --- a/assets/css/essential-only.css +++ b/assets/css/essential-only.css @@ -89,25 +89,6 @@ section[id] { } } -/* Hero section particle animation */ -@keyframes float { - 0%, 100% { - transform: translateY(0px) translateX(0px); - opacity: 0.7; - } - 25% { - transform: translateY(-10px) translateX(5px); - opacity: 1; - } - 50% { - transform: translateY(-5px) translateX(-5px); - opacity: 0.8; - } - 75% { - transform: translateY(-15px) translateX(3px); - opacity: 0.9; - } -} /* =========================================== MINIMAL TEAM PHOTO HOVER EFFECTS @@ -353,13 +334,7 @@ section[id] { filter: blur(0); } -/* Accessibility Improvements */ -/* Focus Indicators */ -*:focus { - outline: 2px solid #27ae60 !important; - outline-offset: 2px !important; -} - +/* Focus Indicators for buttons and links (higher specificity than generic *:focus) */ button:focus, a:focus { outline: 2px solid #27ae60 !important; @@ -367,20 +342,6 @@ a:focus { box-shadow: 0 0 0 3px rgba(39, 174, 96, 0.3) !important; } -/* Skip Link Focus */ -.skip-nav:focus { - position: fixed !important; - top: 20px !important; - left: 20px !important; - z-index: 10000 !important; - padding: 12px 20px !important; - background: #27ae60 !important; - color: white !important; - text-decoration: none !important; - border-radius: 4px !important; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3) !important; -} - /* Screen Reader Only Text */ .sr-only { position: absolute !important; diff --git a/assets/css/mobile-responsive-fixes.css b/assets/css/mobile-responsive-fixes.css index c393599..7bae31f 100644 --- a/assets/css/mobile-responsive-fixes.css +++ b/assets/css/mobile-responsive-fixes.css @@ -76,6 +76,18 @@ .mobile-menu-close-btn { flex: 0 0 auto !important; margin-left: auto !important; + width: 44px !important; + height: 44px !important; + border-radius: 50% !important; + border: 2px solid rgba(255, 255, 255, 0.3) !important; + background: rgba(255, 255, 255, 0.1) !important; + color: #fff !important; + font-size: 1.5rem !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + cursor: pointer !important; + transition: all 0.2s ease !important; } .mobile-menu-close-btn:hover { @@ -322,38 +334,66 @@ } } -/* Fix 3: Hero buttons spacing on mobile */ @media (max-width: 768px) { + .display-table { + min-height: 50vh !important; + } + + #home .btn-primary { + padding: 12px 24px !important; + font-size: 1rem !important; + max-width: 220px !important; + display: block !important; + margin: 0 auto !important; + } + .mt-5[role="group"] { display: flex !important; - flex-direction: column !important; - gap: 1rem !important; - align-items: stretch !important; + flex-wrap: wrap !important; + gap: 0.75rem !important; + justify-content: center !important; padding: 0 1rem !important; } - + .mt-5[role="group"] .btn { margin: 0 !important; - width: 100% !important; - padding: 16px 30px !important; - font-size: 1.1rem !important; + width: auto !important; + padding: 12px 20px !important; + font-size: 0.95rem !important; } - + .mt-5[role="group"] .me-3 { margin-right: 0 !important; } + + .hero-tagline { + font-size: 1.2rem !important; + } + + .mt-4[role="group"] .btn-outline-light { + display: none !important; + } } /* Additional mobile improvements */ @media (max-width: 768px) { - /* Hero section text container */ .hero-text-container { padding: 12px 18px !important; margin: 0 1rem !important; max-width: calc(100% - 2rem) !important; - min-height: 80px !important; + min-height: 100px !important; + height: 100px !important; + line-height: 1.6 !important; + white-space: normal !important; + word-wrap: break-word !important; + overflow-wrap: break-word !important; + transition: none !important; + overflow: hidden !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; } - + .hero-text-container > div { font-size: 1.1rem !important; white-space: normal !important; @@ -361,21 +401,32 @@ overflow-wrap: break-word !important; hyphens: auto !important; } - - /* Hero title */ + + .custom-typing-wrapper { + min-height: 3em !important; + display: block !important; + } + .home-title { - font-size: 1.75rem !important; - line-height: 1.3 !important; - margin-bottom: 1rem !important; + font-size: 2.2rem !important; + line-height: 1.2 !important; + margin-bottom: 1.5rem !important; } - - /* Container padding */ + + .typing-container { + font-size: 0.95rem !important; + } + + .static-text, + .typed-text { + font-size: 0.95rem !important; + } + .container { padding-left: 15px !important; padding-right: 15px !important; } - - /* Section padding */ + .section { padding-top: 60px !important; padding-bottom: 60px !important; @@ -383,25 +434,26 @@ } @media (max-width: 480px) { - /* Even smaller screens - increase padding significantly */ .home-title { - font-size: 1.5rem !important; + font-size: 1.6rem !important; } - - .hero-text-container { + + .hero-tagline { + font-size: 1.1rem !important; + } + + .mt-5[role="group"] .btn { padding: 10px 16px !important; - font-size: 1rem !important; - min-height: 90px !important; - height: 90px !important; + font-size: 0.85rem !important; } - + .section.bg-home { min-height: auto !important; padding: 100px 0 40px 0 !important; } - + .hero-section-enhanced { - padding-top: 200px !important; + padding-top: 160px !important; } } @@ -439,34 +491,16 @@ z-index: 1; } -/* Mobile text container adjustments */ -@media (max-width: 768px) { - /* Fixed height container to prevent layout shift */ - .hero-text-container { - min-height: 100px !important; - height: 100px !important; - line-height: 1.6 !important; - white-space: normal !important; - word-wrap: break-word !important; - overflow-wrap: break-word !important; - transition: none !important; - overflow: hidden !important; - display: flex !important; - align-items: center !important; - justify-content: center !important; - } - - /* Prevent layout shift during typing animation */ - .custom-typing-wrapper { - min-height: 3em !important; - display: block !important; - } -} -/* Fix for very small screens */ @media (max-width: 375px) { .home-title { - font-size: 1.3rem !important; + font-size: 1.5rem !important; + } + + .typing-container, + .static-text, + .typed-text { + font-size: 0.8rem !important; } .hero-text-container { @@ -647,6 +681,44 @@ display: none !important; } } +/* Fix: Social icons in footer Follow Us box */ +.social-icons-list { + display: flex; + justify-content: center; + align-items: center; + gap: 0.15rem; + list-style: none; + padding: 0; + margin: 0 0 1rem 0; +} + +.social-icons-list .list-inline-item { + margin: 0; +} + +.social-icons-list .social-icon { + width: 32px; + height: 32px; + background: none !important; + border: none !important; +} + +.social-icons-list .social-icon:hover { + background: none !important; + border: none !important; +} + +.social-icons-list .social-icon svg { + width: 20px; + height: 20px; + min-width: 20px; + min-height: 20px; +} + +.social-icons-list .social-icon i { + font-size: 20px; +} + /* Ensure smooth scrolling behavior */ html { scroll-behavior: smooth; @@ -678,19 +750,15 @@ html { @media (max-width: 768px) { .team-bio-overlay.team-bio-mobile { display: flex !important; + padding: 1rem 1.25rem !important; + align-items: center !important; + justify-content: center !important; } .team-bio-overlay.team-bio-desktop { display: none !important; } - .team-bio-overlay.team-bio-mobile { - padding: 1rem 1.25rem !important; - display: flex !important; - align-items: center !important; - justify-content: center !important; - } - .team-bio-content { width: 100% !important; display: flex !important; diff --git a/assets/css/plain-html.css b/assets/css/plain-html.css index 73ddfa7..1069ceb 100644 --- a/assets/css/plain-html.css +++ b/assets/css/plain-html.css @@ -1,5 +1,4 @@ .skip-nav{position:absolute;left:-9999px;z-index:999;padding:8px 16px;background:#28a745;color:#fff;text-decoration:none;border-radius:4px} -.skip-nav:focus{left:20px;top:20px} .hero-particles,.footer-particles{position:absolute;top:0;left:0;right:0;bottom:0;background:radial-gradient(2px 2px at 20% 30%,rgba(39,174,96,.3),transparent),radial-gradient(1px 1px at 60% 70%,rgba(39,174,96,.2),transparent),radial-gradient(1px 1px at 90% 40%,rgba(39,174,96,.1),transparent),radial-gradient(2px 2px at 10% 80%,rgba(39,174,96,.2),transparent);animation:float 6s ease-in-out infinite;pointer-events:none;z-index:1} @keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}} .hero-stats{display:flex;justify-content:center;gap:2rem;flex-wrap:nowrap;margin-top:2rem;margin-bottom:3rem;align-items:center;padding:1rem 0} @@ -13,7 +12,7 @@ .stats-bar{display:flex;justify-content:center;gap:4rem;padding:3rem 0;flex-wrap:nowrap} .stats-bar .stat-item{text-align:center;min-width:120px;white-space:nowrap} .footer-card{background-color:rgba(0,0,0,.6);padding:1.25rem;border-radius:12px;border:1px solid rgba(39,174,96,.3);backdrop-filter:blur(15px);width:100%;min-height:120px;display:flex;flex-direction:column;justify-content:flex-start} -.social-icon{color:#fff!important;font-size:24px!important;transition:all .3s ease;display:inline-flex!important;align-items:center!important;justify-content:center!important;width:44px!important;height:44px!important;border-radius:50%!important;background:rgba(255,255,255,.1)!important;border:1px solid rgba(255,255,255,.2)!important;padding:0!important} +.social-icon{color:#fff!important;font-size:24px!important;transition:all .3s ease;display:inline-flex!important;align-items:center!important;justify-content:center!important;width:44px;height:44px;border-radius:50%!important;background:rgba(255,255,255,.1)!important;border:1px solid rgba(255,255,255,.2)!important;padding:0!important} .social-icon:hover{color:#27ae60!important;transform:translateY(-3px) scale(1.1);background:rgba(39,174,96,.2)!important;border-color:rgba(39,174,96,.4)!important} .social-icon svg{display:block!important;flex-shrink:0!important;width:24px!important;height:24px!important;min-width:24px!important;min-height:24px!important} .mail-cellphone{display:inline-flex;align-items:center;justify-content:flex-start;color:#fff;font-size:1.1rem;text-decoration:none;transition:color .3s ease} @@ -21,6 +20,14 @@ .project-card{background-color:rgba(255,255,255,.1);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.1);cursor:pointer;transition:all .3s ease} .project-card:hover{transform:translateY(-5px);border-color:rgba(39,174,96,.5)!important;background-color:rgba(255,255,255,.15)!important} .language-badge{background-color:rgba(39,174,96,.2);color:#27ae60;padding:4px 12px;border-radius:12px;font-size:.8rem;font-weight:600} +.opensource-list{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem} +.opensource-item{display:flex;flex-direction:column;padding:1rem 1.25rem;background-color:rgba(255,255,255,.05);border:1px solid rgba(39,174,96,.2);border-radius:8px;text-decoration:none;transition:all .2s ease;gap:.5rem} +.opensource-item:hover{background-color:rgba(39,174,96,.1);border-color:rgba(39,174,96,.4);transform:translateY(-2px);box-shadow:0 4px 12px rgba(39,174,96,.15)} +.opensource-item-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem} +.opensource-name{color:#27ae60;font-weight:600;display:flex;align-items:center;gap:.5rem} +.opensource-desc{color:rgba(255,255,255,.5);font-size:.85rem;line-height:1.4} +.opensource-lang{background-color:rgba(39,174,96,.2);color:#27ae60;padding:2px 10px;border-radius:10px;font-size:.7rem;font-weight:600;white-space:nowrap} +@media(max-width:768px){.opensource-list{grid-template-columns:1fr}} .contribution-header{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;background-color:rgba(39,174,96,.1);border:1px solid rgba(39,174,96,.3);border-radius:8px;cursor:pointer;transition:all .3s ease} .contribution-header:hover{background-color:rgba(39,174,96,.15)!important;border-color:rgba(39,174,96,.5)!important} .contribution-items{background-color:rgba(255,255,255,.05);border:1px solid rgba(39,174,96,.2);border-top:none;border-bottom-left-radius:8px;border-bottom-right-radius:8px;padding:1rem 1.5rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:.75rem} diff --git a/assets/js/main.js b/assets/js/main.js index fdc8dff..a51e4f1 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -1,30 +1,36 @@ (function() { 'use strict'; + const CONFIG = Object.freeze({ + FORM_ENDPOINT: 'https://formspree.io/f/mwkwqwkl', + RATE_LIMIT_MS: 60000, + MAX_SUBMISSIONS: 3 + }); + + const formState = { submissions: [], blocked: false, rateLimited: false, retryAfter: null }; + const DATA = { services: [ - { icon: "pe-7s-rocket", title: "Custom Software Development", desc: "Full-cycle software development from ideation to production. Since 2018, we've been building custom enterprise solutions tailored to your unique business needs.", features: ["End-to-End Development", "Agile Methodology", "Cloud-Native Architecture", "Continuous Integration/Deployment"], expandedContent: "With years of experience since 2018, we've delivered custom software solutions for various companies across industries.", useCases: ["Enterprise application development", "SaaS platform creation", "Mobile and web application development", "Legacy system modernization"] }, - { icon: "pe-7s-lock", title: "Cybersecurity Services", desc: "Comprehensive cybersecurity solutions including threat intelligence, penetration testing, incident response, and security consulting.", features: ["24/7 Security Operations Center", "AI-Powered Threat Detection", "Incident Response Team", "Vulnerability Management"], expandedContent: "Our cybersecurity services leverage 30+ years of combined expertise to deliver enterprise-grade protection.", useCases: ["Enterprise network security hardening", "Regulatory compliance implementation", "Security incident investigation", "Employee security awareness training"] }, - { icon: "pe-7s-gleam", title: "Lightning Security", desc: "Enterprise security solutions for Bitcoin Lightning Network including node management, channel security, and payment routing protection.", features: ["CCSS-Compliant Infrastructure", "Automated Channel Management", "Multi-Signature Protection", "Real-time Transaction Monitoring"], expandedContent: "PrivKey pioneered the industry's first comprehensive Lightning security framework.", useCases: ["Institutional Lightning node deployment", "Payment channel security optimization", "High-volume transaction processing", "Cross-border payment infrastructure"] }, - { icon: "pe-7s-safe", title: "Blockchain & Digital Asset Consulting", desc: "Strategic consulting for blockchain implementation, digital asset security, and regulatory compliance.", features: ["Custody Solution Architecture", "Regulatory Compliance Guidance", "Security Best Practices", "Technology Stack Selection"], expandedContent: "Our blockchain consulting services help enterprises navigate the complexities of digital asset adoption.", useCases: ["Enterprise blockchain strategy development", "Digital asset custody implementation", "DeFi protocol security assessment", "Nostr protocol implementation"] }, - { icon: "pe-7s-note2", title: "Security Auditing & Certification", desc: "Professional security audits and compliance certification services for enterprises.", features: ["Security Assessment", "Smart Contract Auditing", "Compliance Assessments", "Security Gap Analysis"], expandedContent: "Our audit services combine automated scanning tools with manual expert review.", useCases: ["Pre-deployment smart contract audits", "Annual security compliance reviews", "Regulatory readiness assessments", "Third-party vendor security audits"] }, - { icon: "pe-7s-plugin", title: "Smart Contract Development", desc: "Secure smart contract development and auditing across multiple blockchain platforms.", features: ["Multi-Chain Development", "Security-First Architecture", "Gas Optimization", "Formal Verification"], expandedContent: "We develop smart contracts with security as the primary focus.", useCases: ["DeFi protocol development", "NFT marketplace contracts", "Enterprise tokenization solutions", "Cross-chain bridge implementation"] } + { icon: "pe-7s-rocket", title: "Software Development", desc: "Full-cycle development from ideation to production. We build secure, scalable applications for enterprises: web, mobile, and infrastructure.", features: ["Full-Stack Development", "Security-First Architecture", "Open Source Contributions", "API & Protocol Implementation"], expandedContent: "Since 2018, we've delivered custom software for enterprises across industries, from high-throughput systems to user-facing applications.", useCases: ["Enterprise applications", "Bitcoin & Lightning tooling", "Web & mobile development", "Custom integrations"] }, + { icon: "pe-7s-lock", title: "Key Management & Custody", desc: "Self-sovereign key infrastructure with FROST threshold signing, TEE enclave protection, and hidden volumes for plausible deniability.", features: ["FROST Threshold Signatures", "TEE Enclave Security", "Hidden Volumes", "NIP-46 Remote Signing"], expandedContent: "Our Keep signing stack is the only open-source solution combining FROST + Enclave + Nostr + Hidden Volumes.", useCases: ["Enterprise self-custody setup", "Multi-party signing infrastructure", "AI agent key constraints", "Institutional wallet architecture"] }, + { icon: "pe-7s-gleam", title: "Lightning Infrastructure", desc: "Enterprise Lightning Network deployment, node security, channel management, and payment routing optimization.", features: ["Node Deployment & Hardening", "Channel Security", "Liquidity Management", "Payment Routing"], expandedContent: "We help enterprises run Lightning infrastructure that scales, securely and reliably.", useCases: ["Institutional Lightning nodes", "Payment processing infrastructure", "Cross-border settlement", "Liquidity provisioning"] }, + { icon: "pe-7s-note2", title: "Security Auditing", desc: "Comprehensive audits for Bitcoin infrastructure, key management systems, Lightning nodes, and custody operations.", features: ["Key Management Audits", "Node Security Assessment", "Penetration Testing", "Compliance Review"], expandedContent: "We audit what matters: keys, signing infrastructure, and custody operations. 30+ years combined experience.", useCases: ["Custody infrastructure audits", "Lightning node security review", "Key management assessment", "Pre-deployment security review"] }, + { icon: "pe-7s-plugin", title: "Nostr Infrastructure", desc: "High-performance relay deployment, NIP implementations, and decentralized identity solutions built on Nostr.", features: ["Relay Deployment (Wisp)", "NIP Implementation", "Blossom Media Storage", "Decentralized Identity"], expandedContent: "Wisp is 4x faster than competitors. We build and deploy Nostr infrastructure that scales.", useCases: ["Enterprise relay deployment", "Private communication infrastructure", "Decentralized identity systems", "Lightning-integrated Nostr apps"] }, + { icon: "pe-7s-safe", title: "Consulting", desc: "Strategic guidance for Bitcoin adoption, self-custody implementation, and sovereign infrastructure planning.", features: ["Self-Custody Strategy", "Infrastructure Architecture", "Regulatory Guidance", "Technology Selection"], expandedContent: "We help enterprises own their infrastructure, from treasury strategy to full-stack deployment.", useCases: ["Bitcoin treasury planning", "Self-custody roadmap", "Infrastructure architecture", "Vendor-free sovereignty"] } ], highlights: [ - { icon: "pe-7s-medal", title: "30+ Years Experience", description: "Decades of expertise in networking, cybersecurity, and blockchain technology" }, - { icon: "pe-7s-lock", title: "Enterprise Security", description: "Protecting networks, systems, and digital assets from evolving cyber threats" }, - { icon: "pe-7s-network", title: "Blockchain Specialists", description: "Expert consulting, smart contracts, and cryptocurrency wallet security solutions" }, - { icon: "pe-7s-check", title: "Compliance Ready", description: "AML/KYC guidance and regulatory compliance for all digital asset operations" } + { icon: "pe-7s-medal", title: "30+ Years Experience", description: "Decades of expertise in networking, cybersecurity, and Bitcoin infrastructure." }, + { icon: "pe-7s-lock", title: "Open Source First", description: "Trust through transparency. Core infrastructure you can audit and self-host." }, + { icon: "pe-7s-science", title: "Performance + Security", description: "Zig for speed, Rust for security. We don't compromise on either." }, + { icon: "pe-7s-rocket", title: "Self-Sovereign", description: "Own your data, identity, and money without third-party custody." } ], - techModules: [ - { icon: "https://cdn-icons-png.flaticon.com/512/159/159478.png", alt: "Security Lock", title: "FROST Lightning Multisig", desc: "Industry-first 2-of-3 threshold signatures for Lightning channels", features: ["MuSig2/FROST protocols", "No single point of failure", "Sub-2 second signing"] }, - { icon: "https://cdn-icons-png.flaticon.com/512/15552/15552192.png", alt: "Attestation", title: "TAP Authorization Layer", desc: "Advanced transaction policies beyond basic velocity limits", features: ["Risk scoring engine", "Multi-tier approvals", "Miniscript-aware rules"] }, - { icon: "https://cdn-icons-png.flaticon.com/512/5172/5172584.png", alt: "Tokens", title: "Taproot Assets Module", desc: "Issue and manage stablecoins on Bitcoin's Lightning Network", features: ["Stablecoin issuance", "Lightning-fast transfers", "EVM bridge ready"] }, - { icon: "https://cdn-icons-png.flaticon.com/512/4252/4252491.png", alt: "Compliant", title: "Compliance Suite", desc: "Full Version 8.1 compliance with audit trails", features: ["Automated compliance", "Audit trail generation", "Regulatory reporting"] } - ], - openSourceProjects: [ - { name: "Taproot Assets REST Gateway", description: "A lightweight REST proxy that makes Lightning Labs' Taproot Assets daemon accessible to web applications.", language: "Rust", url: "https://github.com/privkeyio/taproot-assets-rest-gateway" }, - { name: "libnostr-c", description: "A lightweight, portable C library for the Nostr protocol with native Lightning Network integration.", language: "C", url: "https://github.com/privkeyio/libnostr-c" } + products: [ + { name: "Keep", description: "Self-custodial key management for Nostr and Bitcoin.", language: "Rust", url: "https://github.com/privkeyio/keep" }, + { name: "Warden", description: "Policy engine for Bitcoin custody operations.", language: "Rust", url: "https://github.com/privkeyio/warden" }, + { name: "Wisp", description: "Fast, lightweight Nostr relay.", language: "Zig", url: "https://github.com/privkeyio/wisp" }, + { name: "Taproot Assets Gateway", description: "REST proxy for Lightning Labs' Taproot Assets daemon with CORS support.", language: "Rust", url: "https://github.com/privkeyio/taproot-assets-rest-gateway" }, + { name: "libnostr-z", description: "Zig library for the Nostr protocol.", language: "Zig", url: "https://github.com/privkeyio/libnostr-z" }, + { name: "libnostr-c", description: "Lightweight, portable C library for Nostr with native Lightning Network integration.", language: "C", url: "https://github.com/privkeyio/libnostr-c" } ], contributions: { "Bitcoin & Lightning Network": [ @@ -33,13 +39,26 @@ { name: "Core Lightning - Handle NULL Short Channel ID", url: "https://github.com/ElementsProject/lightning/pull/8435" }, { name: "Lightning BOLTs - Add Security Policy", url: "https://github.com/lightning/bolts/pull/1278" }, { name: "Liana - User-Agent Header Support", url: "https://github.com/wizardsardine/liana/pull/1902" }, - { name: "Bitcoin Knots - Export GUI Policy Options", url: "https://github.com/bitcoinknots/bitcoin/pull/154" } + { name: "Bitcoin Knots - Export GUI Policy Options", url: "https://github.com/bitcoinknots/bitcoin/pull/154" }, + { name: "Bitcoin Knots - Windows Taskbar Progress", url: "https://github.com/bitcoinknots/bitcoin/pull/215" }, + { name: "Bitcoin Knots - Clear History Command", url: "https://github.com/bitcoinknots/bitcoin/pull/214" }, + { name: "Greenlight - Switch to uv Package Manager", url: "https://github.com/Blockstream/greenlight/pull/612" }, + { name: "OCEAN - Job Coordination for Fallback Shares", url: "https://github.com/OCEAN-xyz/datum_gateway/pull/156" }, + { name: "DTails - Add Knots Support", url: "https://github.com/DesobedienteTecnologico/dtails/pull/52" }, + { name: "Alby Hub - Spelling Fix", url: "https://github.com/getAlby/hub/pull/1847" } ], "Nostr Protocol": [ { name: "Amber - Export All Accounts Feature", url: "https://github.com/greenart7c3/Amber/pull/255" }, { name: "Routstr Core - Integration Tests", url: "https://github.com/Routstr/routstr-core/pull/78" }, { name: "Routstr Core - Fix USD Pricing Fees", url: "https://github.com/Routstr/routstr-core/pull/189" }, - { name: "Orly - Relay Performance Benchmark", url: "https://github.com/mleku/orly/pull/4" } + { name: "Routstr Chat - AI Extended Reasoning Display", url: "https://github.com/Routstr/routstr-chat/pull/46" }, + { name: "Routstr Chat - Invoice History & Persistence", url: "https://github.com/Routstr/routstr-chat/pull/67" }, + { name: "Routstr Chat - Test Suite Infrastructure", url: "https://github.com/Routstr/routstr-chat/pull/72" }, + { name: "Sixty Nuts - NIP-60 State Transitions", url: "https://github.com/Routstr/sixty-nuts/pull/32" }, + { name: "Orly - Relay Performance Benchmark", url: "https://github.com/mleku/orly/pull/4" }, + { name: "Orly - Public Relay Blacklist Support", url: "https://github.com/mleku/orly/pull/5" }, + { name: "Orly - Nostr Relay Benchmark Suite", url: "https://github.com/mleku/orly/pull/8" }, + { name: "Orly - Dockerize Benchmark Suite", url: "https://github.com/mleku/orly/pull/10" } ], "Developer Tools & AI": [ { name: "Goose - Enable Zero-Config Providers in GUI", url: "https://github.com/block/goose/pull/3378" }, @@ -61,15 +80,10 @@ ] }, team: [ - { image: "assets/images/william_profile.png", title: "William K. Santiago", desc: "FOUNDER & CEO", bio: "30-year cybersecurity veteran who pioneered institutional Bitcoin infrastructure since 2011. Led enterprise blockchain implementations for Fortune 500 clients. BS in Management Information Systems from the University of South Florida.", mobileBio: ["30-year cybersecurity veteran", "Bitcoin infrastructure since 2011", "Fortune 500 blockchain leader"], linkedIn: "https://linkedin.com/in/wksantiago", twitter: "https://x.com/williamsantiago" }, + { image: "assets/images/william_profile.png", title: "William K. Santiago", desc: "FOUNDER & CEO", bio: "30-year cybersecurity veteran who pioneered institutional Bitcoin infrastructure since 2011. Led enterprise Bitcoin implementations for Fortune 500 clients. BS in Management Information Systems from the University of South Florida.", mobileBio: ["30-year cybersecurity veteran", "Bitcoin infrastructure since 2011", "Fortune 500 enterprise security"], linkedIn: "https://linkedin.com/in/wksantiago", twitter: "https://x.com/williamsantiago" }, { image: "assets/images/kyle_profile.png", title: "Kyle W. Santiago", desc: "FOUNDER & CTO", bio: "Over a decade of cryptocurrency, software engineering, and cybersecurity expertise since 2011. BS & MS in Cybersecurity from the University of South Florida. Led integrations for Chainlink Labs and scaled institutional digital asset platforms.", mobileBio: ["10+ years crypto & cybersecurity", "BS & MS in Cybersecurity, USF", "Full stack development for 7+ years"], linkedIn: "https://linkedin.com/in/kwsantiago", twitter: "https://x.com/kwsantiago" } ], - resources: [ - { title: "Stablecoins on Bitcoin: A New Era", readTime: "15 min read", description: "Exploring the revolutionary potential of stablecoins built on the Bitcoin network.", link: "https://privkey.substack.com/p/stablecoins-on-bitcoin-a-new-era" }, - { title: "Building a Bridge to Taproot Assets", readTime: "12 min read", description: "Understanding how Taproot Assets are creating new possibilities for Bitcoin-based applications.", link: "https://privkey.substack.com/p/building-a-bridge-to-taproot-assets" }, - { title: "PrivKey LLC: Pioneering Cybersecurity", readTime: "10 min read", description: "An in-depth look at PrivKey's approach to cybersecurity and blockchain technology solutions.", link: "https://privkey.substack.com/p/privkey-llc-pioneering-cybersecurity" } - ], - typingTexts: ["enterprise cybersecurity and Lightning Network solutions", "robust security for Lightning Network operations", "blockchain and digital asset protection expertise", "30+ years of cybersecurity experience"] + resources: [] }; let state = { activeSection: 'home', isNavigating: false, isSticky: false, mobileMenuOpen: false }; @@ -77,13 +91,11 @@ function init() { renderServices(); renderHighlights(); - renderTechModules(); - renderOpenSourceProjects(); + renderProducts(); renderContributions(); renderTeam(); renderResources(); initNavbar(); - initTypingEffect(); initCounters(); initContactForm(); initMobileMenu(); @@ -98,7 +110,7 @@
${s.title}

${s.desc}

-
+
`).join(''); grid.querySelectorAll('.service-learn-more-btn').forEach(btn => btn.addEventListener('click', () => openServiceModal(parseInt(btn.dataset.service)))); @@ -128,28 +140,20 @@ `).join(''); } - function renderTechModules() { - document.getElementById('tech-modules-grid').innerHTML = DATA.techModules.map(m => ` -
-
- ${m.alt} + function renderProducts() { + document.getElementById('products-grid').innerHTML = ` +
+
+ ${DATA.products.map(p => ` + +
+ ${p.name} + ${p.language} +
+ ${p.description} +
`).join('')}
-

${m.title}

-

${m.desc}

-
    ${m.features.map(f => `
  • ${f}
  • `).join('')}
-
`).join(''); - } - - function renderOpenSourceProjects() { - document.getElementById('opensource-projects').innerHTML = DATA.openSourceProjects.map(p => ` -
-
-
-
${p.name}
-

${p.description}

- ${p.language} -
-
`).join(''); +
`; } function renderContributions() { @@ -188,25 +192,58 @@

${t.title}

${t.desc}
-
- ${t.linkedIn ? `` : ''} - ${t.twitter ? `` : ''} -
+ `).join(''); } - function renderResources() { - document.getElementById('resources-grid').innerHTML = DATA.resources.map(r => ` -
-
-
-
${r.readTime}
-
${r.title}
-

${r.description}

-
-
-
`).join(''); + function escapeHtml(str) { + const div = document.createElement('div'); + div.textContent = str; + return div.innerHTML; + } + + function sanitizeUrl(url) { + try { + const parsed = new URL(url); + if (parsed.protocol === 'https:' || parsed.protocol === 'http:') return parsed.href; + } catch {} + return '#'; + } + + async function renderResources() { + const grid = document.getElementById('resources-grid'); + grid.innerHTML = '

Loading articles...

'; + try { + const res = await fetch('https://api.rss2json.com/v1/api.json?rss_url=https://privkey.substack.com/feed'); + const data = await res.json(); + if (data.status === 'ok' && data.items) { + const articles = data.items.slice(0, 6); + grid.innerHTML = articles.map((r, i) => { + const date = new Date(r.pubDate).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }); + const rawDesc = r.description.replace(/<[^>]*>/g, '').substring(0, 120) + '...'; + const safeTitle = escapeHtml(r.title); + const safeDesc = escapeHtml(rawDesc); + const safeUrl = sanitizeUrl(r.link); + return ` +
+
+
+
${date}
+
${safeTitle}
+

${safeDesc}

+
+
+
`; + }).join(''); + grid.querySelectorAll('.resource-card').forEach(card => card.addEventListener('click', () => window.open(card.dataset.url, '_blank', 'noopener,noreferrer'))); + } + } catch (e) { + grid.innerHTML = '
View Articles on Substack
'; + } } function initNavbar() { @@ -261,23 +298,6 @@ function closeMobileMenu() { state.mobileMenuOpen = false; document.getElementById('navbarCollapse').classList.remove('show'); document.querySelector('.navbar-toggler').setAttribute('aria-expanded', 'false'); } - function initTypingEffect() { - const typedEl = document.querySelector('.typed-text'); - const cursor = document.querySelector('.cursor'); - const texts = DATA.typingTexts; - let textIndex = 0, charIndex = 0, isDeleting = false; - function type() { - const current = texts[textIndex]; - typedEl.textContent = current.substring(0, isDeleting ? --charIndex : ++charIndex); - let delay = isDeleting ? 30 : 50; - if (!isDeleting && charIndex === current.length) { delay = 3000; isDeleting = true; } - else if (isDeleting && charIndex === 0) { isDeleting = false; textIndex = (textIndex + 1) % texts.length; delay = 500; } - setTimeout(type, delay); - } - setInterval(() => cursor.style.opacity = cursor.style.opacity === '0' ? '1' : '0', 500); - setTimeout(type, 1000); - } - function initCounters() { const observer = new IntersectionObserver(entries => { entries.forEach(entry => { @@ -308,8 +328,19 @@ }); return Object.keys(errors).length === 0; } + function checkRateLimit() { + const now = Date.now(); + formState.submissions = formState.submissions.filter(t => now - t < CONFIG.RATE_LIMIT_MS); + if (formState.submissions.length >= CONFIG.MAX_SUBMISSIONS) { formState.blocked = true; return false; } + formState.submissions.push(now); + return true; + } + form.addEventListener('submit', async e => { e.preventDefault(); + const honeypot = form.querySelector('input[name="_gotcha"]'); + if (honeypot && honeypot.value) return; + if (!checkRateLimit()) { status.innerHTML = '
Too many requests. Please wait a moment.
'; status.style.display = 'block'; return; } if (!validate()) return; submitBtn.disabled = true; submitBtn.innerHTML = 'Sending...'; const formData = new FormData(); @@ -318,11 +349,21 @@ formData.append('Referral', sanitize(form.referral.value.trim())); formData.append('comments', sanitize(form.comments.value.trim())); try { - const response = await fetch('https://formspree.io/f/mwkwqwkl', { method: 'POST', body: formData, headers: { 'Accept': 'application/json' } }); + const response = await fetch(CONFIG.FORM_ENDPOINT, { method: 'POST', body: formData, headers: { 'Accept': 'application/json' } }); if (response.ok) { status.innerHTML = '
Thank you! Your message has been sent.
'; status.style.display = 'block'; form.reset(); setTimeout(() => status.style.display = 'none', 5000); } + else if (response.status === 429) { + formState.rateLimited = true; + const retryAfter = parseInt(response.headers.get('Retry-After'), 10) || 60; + formState.retryAfter = Date.now() + retryAfter * 1000; + submitBtn.disabled = true; + status.innerHTML = `
Server rate limit reached. Please wait ${retryAfter} seconds.
`; + status.style.display = 'block'; + setTimeout(() => { formState.rateLimited = false; formState.retryAfter = null; submitBtn.disabled = false; submitBtn.innerHTML = 'Send Message'; }, retryAfter * 1000); + return; + } else throw new Error('Network error'); } catch { status.innerHTML = '
Sorry, there was an error. Please try again.
'; status.style.display = 'block'; } - finally { submitBtn.disabled = false; submitBtn.innerHTML = 'Send Message'; } + finally { if (!formState.rateLimited) { submitBtn.disabled = false; submitBtn.innerHTML = 'Send Message'; } } }); } diff --git a/index.html b/index.html index f26df90..fb225bc 100644 --- a/index.html +++ b/index.html @@ -3,13 +3,16 @@ - PrivKey - Enterprise Cybersecurity & Blockchain Solutions - - + + + + PrivKey - Self-Sovereign Bitcoin & Nostr Infrastructure + + - - + + @@ -17,8 +20,8 @@ - - + + @@ -33,20 +36,20 @@ "@context": "https://schema.org", "@type": "Organization", "name": "PrivKey LLC", - "description": "Leading cybersecurity and blockchain consulting firm with 30+ years experience.", + "description": "Self-sovereign Bitcoin and Nostr infrastructure. Your keys, your stack.", "url": "https://privkey.io", "logo": "https://privkey.io/assets/images/LOGO_Green_new_transparent.png", - "foundingDate": "2020", + "foundingDate": "2018", "founder": [ {"@type": "Person", "name": "William Santiago"}, {"@type": "Person", "name": "Kyle Santiago"} ], "address": {"@type": "PostalAddress", "addressCountry": "US"}, - "sameAs": ["https://linkedin.com/company/privkey", "https://github.com/privkey"] + "sameAs": ["https://linkedin.com/company/privkeyllc", "https://github.com/privkeyio", "https://x.com/privkey_io"] } - + @@ -73,6 +76,7 @@ + @@ -82,16 +86,18 @@ - +
Home Services - Resources About + Products + Team + Resources Contact
- Book a Consultation + Book a Consultation
@@ -101,48 +107,24 @@
-
+
-
-
+

- Enterprise Cybersecurity & - Lightning Network Solutions + Protect Your Bitcoin.
+ Own Your Infrastructure.

-
-
-
0/7
-
Security Monitoring
-
-
-
0+
-
Years Experience
-
-
-
99.9%
-
Security Uptime
-
-
-
-
-
- PrivKey delivers | -
-
-
-
- Schedule a Consultation - Book a Demo - Learn More +

Self-sovereign security for enterprises. Your keys, your stack.

+
-
@@ -151,10 +133,10 @@

-

Our Services

+

Our Services

- Since 2018, PrivKey has been building custom software solutions from ideation to production. We combine our extensive software development expertise with institutional-grade cybersecurity and advanced blockchain security infrastructure. + Software development, key management, auditing, and infrastructure since 2018.
@@ -168,54 +150,27 @@

Our Services

-
+

Who We Are

-
-

- Founded by cybersecurity veterans with 30+ years of combined experience, PrivKey specializes in enterprise-grade security solutions for digital assets, Bitcoin, Lightning Network, and blockchain infrastructure. +

+

+ Founded by cybersecurity veterans with 30+ years of combined experience. We build privacy-first, high-performance infrastructure for Bitcoin, Lightning, and Nostr. Open source. Self-hostable. No vendor lock-in.

-
-
-
-

Our Mission

-

- We craft customized cybersecurity and blockchain solutions that meet your specific goals while ensuring compliance with all relevant laws and regulations. -

-
-
-
-
-
-
-

Our Technology

-

PrivKey's Enterprise Security Platform for Bitcoin & Lightning Network

-
-
-
-
- -
+
-

Open Source Contributions

-

- We value open source development and contribute back to the Bitcoin, Lightning Network, and Nostr communities. -

-
-
2+
Active Projects
-
100%
Open Source
-
MIT/LGPL
Licensed
-
+

Our Products

+
-
+

Community Contributions

@@ -229,11 +184,8 @@

Community Contributions

-

Meet Our Team

+

Meet Our Team

-
- We lead the industry through continuous R&D, backed by a team of top cybersecurity experts and advisors. -
@@ -245,8 +197,9 @@

Meet Our Team

-

Resources & Insights

-

+

Resources & Insights

+
+

Stay ahead with our latest research, white papers, and industry insights.

@@ -259,7 +212,7 @@

Resources & Insights

@@ -271,10 +224,10 @@

Stay Updated with PrivKey's Blog

-

Get In Touch

+

Get In Touch

- Schedule a confidential consultation to discuss your enterprise cybersecurity and blockchain infrastructure requirements. + Schedule a consultation to discuss your security requirements.
@@ -311,16 +264,13 @@

Get In Touch

Schedule a Demo
-

Book a 30-minute consultation with our security experts

-
- - Book Now - - Available Monday-Friday, 9AM-4PM EST -
+ + Book Now +
+
@@ -374,14 +324,14 @@
Schedule
-

Leading the way in cybersecurity and Lightning Network innovation

+

Your keys, your stack