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}
- Learn More
+ Learn More
`).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 => `
-
-
-
+ function renderProducts() {
+ document.getElementById('products-grid').innerHTML = `
+
+
-
${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 ? `
` : ''}
-
+
+ ${t.linkedIn ? ` ` : ''}
+ ${t.twitter ? ` ` : ''}
+
`).join('');
}
- function renderResources() {
- document.getElementById('resources-grid').innerHTML = DATA.resources.map(r => `
-
-
-
-
-
${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 = '';
+ 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 `
+
+
+
+
+
${safeTitle}
+
${safeDesc}
+
+
+
`;
+ }).join('');
+ grid.querySelectorAll('.resource-card').forEach(card => card.addEventListener('click', () => window.open(card.dataset.url, '_blank', 'noopener,noreferrer')));
+ }
+ } catch (e) {
+ grid.innerHTML = '';
+ }
}
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 @@
Home
Services
About
+ Products
Team
Resources
Contact
@@ -82,16 +86,18 @@
-
+
@@ -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 |
-
-
-
-
-
@@ -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.
-
-
-
-
-
-
-
+
-
Open Source Contributions
-
- We value open source development and contribute back to the Bitcoin, Lightning Network, and Nostr communities.
-
-
+
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
Stay Updated with PrivKey's Blog
-
Get expert insights on cybersecurity, blockchain, and privacy delivered to your inbox.
+
Get expert insights on Bitcoin security, Lightning Network, and Nostr delivered to your inbox.
Subscribe to PrivKey's Blog
@@ -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