Help
RSS
API
Feed
Maltego
Contact
Domain > byjake.co.uk
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-12-08
172.67.206.5
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyDate: Mon, 08 Dec 2025 20:19:49 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveServer: cloudflareNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Location: https://byjake.co.uk/cf-cache-status: DYNAMICReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sQ3q6SeWFnETX3epWwTQxDt1UNynBy3Hmr2dgIkI1gp2Lausa2gRXsyRtMte%2F29zEPy4MGhxUJUq0QleWbxnRfWkLZYWE6aU18tEWeg%3D%3D}}CF-RAY: 9aaef5b6be71aee3-PDXalt-svc: h3:443; ma86400 html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>nginx/1.26.3 (Ubuntu)/center>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Mon, 08 Dec 2025 20:19:49 GMTContent-Type: text/html; charsetUTF-8Transfer-Encoding: chunkedConnection: keep-aliveServer: cloudflarevary: Accept-EncodingCache-Control: no-cache, privateSet-Cookie: XSRF-TOKENeyJpdiI6IlpvdlNlZzlJT2FLSUZBZEk0ZE9tenc9PSIsInZhbHVlIjoiSVRJcWFFZUpLSlZXOXBSU3VsamFTZ2xsVzFuMjZ5d2Q4QUI1ME0zc05GR01waWlLVjR5QlFoYUx2N01xakV3V3hINXFwcWt2b3Qza3F6SlJnamlmV250b2RESTNKdUlUQmxncXBnN2FjS21CaEEyL2NhRk4yNFF4THFlamI5R3MiLCJtYWMiOiI2YzMxYzM1NmI1OGNkNjA5YmY2NmNkY2Y0OTRmZmVhODdhNWZhNDk1MzUyMjJkZmQ2ZjY4MWI3NzRmNzE0ZTUzIiwidGFnIjoiIn0%3D; expiresMon, 08 Dec 2025 22:19:49 GMT; Max-Age7200; path/; secure; samesitelaxSet-Cookie: jake-w-portfolio-sessioneyJpdiI6Inh4L0xyeFNHRUJoTGErbDJ1dmM2aFE9PSIsInZhbHVlIjoiWnpETk9DTFM1eVFwUk9NM1ExOStNUGdkcjhSZmZlYUc2NEM5bE1wbEI1WDhLbS9HOVZMbGJ6bWNCK1VDeHZQK3ZtdTZOMXh6QkFoN08yUnpTVkdNRG5yTWhTZ3czTlNFdFVlZWYxc1JFM284VGJUdDZFanBhaFRjeTkzVnpEcGkiLCJtYWMiOiI3NzNiZjUxMWNlZjVhMmM1NTUwMTAzNWI4YjY4ZjJkYzYyMTA2NGQyOTVlNTg4NTEzMjA2YWY1MDg2Y2JjMGY2IiwidGFnIjoiIn0%3D; expiresMon, 08 Dec 2025 22:19:49 GMT; Max-Age7200; path/; secure; httponly; samesitelaxReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sUJAjahnBgpaOYqdCDwgKNVTNTtTrkEdnmzXsM5q2ar5XFpYvx0krNbOKHtZMv54Dou3r%2BqsSEDz1%2BNpx%2Fn31CqhFiHmg7C5ZRcU%3D}}cf-cache-status: DYNAMICNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}CF-RAY: 9aaef5b8effb9976-PDXalt-svc: h3:443; ma86400 !doctype html>html langen>head> meta charsetutf-8> meta nameviewport contentwidthdevice-width, initial-scale1, maximum-scale1, user-scalableno> title>Jake Whalley - Web and Software Development/title> !-- Bootstrap CSS --> link hrefhttps://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css relstylesheet> link relstylesheet hrefhttps://byjake.co.uk/css/app.css> link relicon typeimage/x-icon hrefhttps://byjake.co.uk/favicon/favicon.ico> link relapple-touch-icon sizes180x180 hrefhttps://byjake.co.uk/favicon/apple-touch-icon.png> link relicon typeimage/png sizes32x32 hrefhttps://byjake.co.uk/favicon/favicon-32x32.png> link relicon typeimage/png sizes16x16 hrefhttps://byjake.co.uk/favicon/favicon-16x16.png> link relmanifest hrefhttps://byjake.co.uk/favicon/site.webmanifest> style> * { margin: 0; padding: 0; box-sizing: border-box; } html, body { height: 100%; overflow: hidden; background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%); } .snap-container { height: 100vh; overflow-y: scroll; scroll-snap-type: y mandatory; scroll-behavior: smooth; position: relative; } /* Global starfield backdrop */ .snap-container::before { content: ; position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: -1; background: /* Large stars */ radial-gradient(2px 2px at 20px 30px, #fff, transparent), radial-gradient(2px 2px at 40px 70px, rgba(255,255,255,.9), transparent), radial-gradient(1px 1px at 90px 40px, #fff, transparent), radial-gradient(1px 1px at 130px 80px, rgba(255,255,255,.8), transparent), radial-gradient(2px 2px at 160px 30px, rgba(255,255,255,.7), transparent), radial-gradient(1px 1px at 180px 10px, rgba(255,255,255,.9), transparent), radial-gradient(2px 2px at 60px 120px, rgba(255,255,255,.6), transparent), radial-gradient(1px 1px at 10px 90px, rgba(255,255,255,.8), transparent), radial-gradient(1px 1px at 190px 60px, rgba(255,255,255,.5), transparent), radial-gradient(2px 1px at 120px 10px, rgba(255,255,255,.7), transparent), /* Medium stars */ radial-gradient(1px 1px at 50px 50px, rgba(255,255,255,.6), transparent), radial-gradient(1px 1px at 80px 20px, rgba(255,255,255,.4), transparent), radial-gradient(1px 1px at 30px 150px, rgba(255,255,255,.5), transparent), radial-gradient(1px 1px at 170px 100px, rgba(255,255,255,.6), transparent), radial-gradient(1px 1px at 100px 180px, rgba(255,255,255,.4), transparent), radial-gradient(1px 1px at 15px 170px, rgba(255,255,255,.7), transparent), radial-gradient(1px 1px at 140px 140px, rgba(255,255,255,.5), transparent), radial-gradient(1px 1px at 70px 190px, rgba(255,255,255,.6), transparent), /* Small stars */ radial-gradient(0.5px 0.5px at 25px 60px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 75px 15px, rgba(255,255,255,.4), transparent), radial-gradient(0.5px 0.5px at 110px 75px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 35px 110px, rgba(255,255,255,.5), transparent), radial-gradient(0.5px 0.5px at 155px 45px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 185px 130px, rgba(255,255,255,.4), transparent), radial-gradient(0.5px 0.5px at 65px 165px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 125px 195px, rgba(255,255,255,.4), transparent), radial-gradient(0.5px 0.5px at 5px 45px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 195px 85px, rgba(255,255,255,.4), transparent); background-repeat: repeat; background-size: 200px 200px; animation: stars 25s linear infinite, twinkle 3s ease-in-out infinite alternate; } .snap-section { height: 100vh; scroll-snap-align: start; display: flex; align-items: center; justify-content: center; position: relative; padding: 40px; } .section-intro { position: relative; color: white; overflow: hidden; background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%); } .section-intro::after { content: ; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: /* Large stars */ radial-gradient(2px 2px at 20px 30px, #fff, transparent), radial-gradient(2px 2px at 40px 70px, rgba(255,255,255,.9), transparent), radial-gradient(1px 1px at 90px 40px, #fff, transparent), radial-gradient(1px 1px at 130px 80px, rgba(255,255,255,.8), transparent), radial-gradient(2px 2px at 160px 30px, rgba(255,255,255,.7), transparent), radial-gradient(1px 1px at 180px 10px, rgba(255,255,255,.9), transparent), radial-gradient(2px 2px at 60px 120px, rgba(255,255,255,.6), transparent), radial-gradient(1px 1px at 10px 90px, rgba(255,255,255,.8), transparent), radial-gradient(1px 1px at 190px 60px, rgba(255,255,255,.5), transparent), radial-gradient(2px 1px at 120px 10px, rgba(255,255,255,.7), transparent), /* Medium stars */ radial-gradient(1px 1px at 50px 50px, rgba(255,255,255,.6), transparent), radial-gradient(1px 1px at 80px 20px, rgba(255,255,255,.4), transparent), radial-gradient(1px 1px at 30px 150px, rgba(255,255,255,.5), transparent), radial-gradient(1px 1px at 170px 100px, rgba(255,255,255,.6), transparent), radial-gradient(1px 1px at 100px 180px, rgba(255,255,255,.4), transparent), radial-gradient(1px 1px at 15px 170px, rgba(255,255,255,.7), transparent), radial-gradient(1px 1px at 140px 140px, rgba(255,255,255,.5), transparent), radial-gradient(1px 1px at 70px 190px, rgba(255,255,255,.6), transparent), /* Small stars */ radial-gradient(0.5px 0.5px at 25px 60px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 75px 15px, rgba(255,255,255,.4), transparent), radial-gradient(0.5px 0.5px at 110px 75px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 35px 110px, rgba(255,255,255,.5), transparent), radial-gradient(0.5px 0.5px at 155px 45px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 185px 130px, rgba(255,255,255,.4), transparent), radial-gradient(0.5px 0.5px at 65px 165px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 125px 195px, rgba(255,255,255,.4), transparent), radial-gradient(0.5px 0.5px at 5px 45px, rgba(255,255,255,.3), transparent), radial-gradient(0.5px 0.5px at 195px 85px, rgba(255,255,255,.4), transparent); background-repeat: repeat; background-size: 200px 200px; animation: stars 25s linear infinite, twinkle 3s ease-in-out infinite alternate; } @keyframes shooting-star { 0% { transform: translateX(-100px) translateY(-100px) rotate(-45deg); opacity: 0; } 50% { opacity: 1; } 100% { transform: translateX(100vw) translateY(100vh) rotate(-45deg); opacity: 0; } } @keyframes stars { 0% { transform: translateY(0px); } 100% { transform: translateY(-200px); } } @keyframes twinkle { 0% { opacity: 0.3; } 50% { opacity: 1; } 100% { opacity: 0.6; } } .shooting-star { position: absolute; width: 2px; height: 2px; background: white; border-radius: 50%; box-shadow: 0 0 6px 2px rgba(255, 255, 255, 0.8), 0 0 20px rgba(255, 255, 255, 0.4); animation: shooting-star-move 8s ease-in-out infinite; } .shooting-star:nth-child(1) { top: 20%; left: 5%; animation-delay: 0s; animation-duration: 8s; } .shooting-star:nth-child(2) { top: 60%; left: 85%; animation-delay: 3s; animation-duration: 7s; } .shooting-star:nth-child(3) { top: 30%; left: 75%; animation-delay: 6s; animation-duration: 9s; } .shooting-star:nth-child(4) { top: 80%; left: 15%; animation-delay: 1.5s; animation-duration: 8.5s; } @keyframes shooting-star-move { 0% { transform: translateX(-100px) translateY(-100px) rotate(-45deg); opacity: 0; } 5% { opacity: 1; } 95% { opacity: 1; } 100% { transform: translateX(calc(100vw + 100px)) translateY(calc(100vh + 100px)) rotate(-45deg); opacity: 0; } } .section-intro .content-panel { position: relative; z-index: 1; background: rgba(255,255,255,0.06); backdrop-filter: blur(6px); color: white; box-shadow: 0 10px 40px rgba(0,0,0,0.25); } .section-footer .content-panel { position: relative; z-index: 1; background: rgba(255,255,255,0.06); backdrop-filter: blur(6px); color: white; box-shadow: 0 10px 40px rgba(0,0,0,0.25); } .section-project:nth-child(odd) { background: linear-gradient(135deg, #2b2f33 0%, #141618 100%); color: #141618; } .section-project:nth-child(even) { background: linear-gradient(135deg, #252728 0%, #0f1011 100%); color: #141618; } .section-footer { position: relative; color: white; overflow: hidden; background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%); } .content-panel { max-width: 1100px; width: 100%; background: rgba(31, 30, 30, 0.95); backdrop-filter: blur(10px); border-radius: 1rem; padding: 3rem; box-shadow: 0 20px 60px rgba(0,0,0,0.3); color: white; position: relative; border: 0.1px solid transparent; /* subtle transparent fallback */ background: linear-gradient(rgba(31,30,30,0.95), rgba(31,30,30,0.95)) padding-box, conic-gradient(from 0deg, #a82c9a, #ff7eb3, #764ba2, #667eea) border-box; background-origin: padding-box, border-box; background-clip: padding-box, border-box; background-size: 100% 100%, 200% 200%; animation: introGradient 8s linear infinite; box-shadow: 0 20px 60px rgba(0,0,0,0.3), 0 0 30px rgba(168,44,154,0.06); } .project-image { width: 100%; height: 400px; object-fit: cover; border-radius: 0.5rem; margin-bottom: 1.5rem; } .nav-controls { position: fixed; right: 20px; top: 50%; transform: translateY(-50%); z-index: 1000; display: flex; flex-direction: column; gap: 10px; } .nav-dot { width: 12px; height: 12px; border-radius: 50%; background: rgba(255,255,255,0.5); border: 2px solid rgba(255,255,255,0.8); cursor: pointer; transition: all 0.3s ease; } .nav-dot.active { background: white; transform: scale(1.3); } .scroll-hint { position: absolute; bottom: 30px; left: 50%; transform: translateX(-50%); color: white; font-size: 0.875rem; animation: bounce 2s infinite; } .bg-primary { background-color: #a82c9a !important; color: white; } .btn-primary { background-color: #a82c9a; border-color: #a82c9a; } .btn-primary:hover { background-color: #922b8e; border-color: #922b8e; } .page-count { position: absolute; right: 0; bottom: 0; color: #e0e2e3; padding: 0.9rem; } @keyframes bounce { 0%, 20%, 50%, 80%, 100% { transform: translateX(-50%) translateY(0); } 40% { transform: translateX(-50%) translateY(-10px); } 60% { transform: translateX(-50%) translateY(-5px); } } /* Tablet styles */ @media (max-width: 1024px) { .content-panel { padding: 2.5rem; margin: 0 1rem; } .nav-controls { right: 10px; } .nav-dot { width: 10px; height: 10px; } } /* Mobile styles */ @media (max-width: 768px) { .snap-section { padding: 20px; } .content-panel { padding: 1.5rem; margin: 0 0.5rem; border-radius: 0.75rem; } .project-image { height: 200px; border-radius: 0.5rem; } .display-4 { font-size: 2rem !important; } .lead { font-size: 1rem; } .badge { font-size: 0.7rem; padding: 0.25rem 0.5rem; margin: 0.1rem; } .nav-controls { right: 5px; gap: 8px; } .nav-dot { width: 8px; height: 8px; } .scroll-hint { font-size: 0.75rem; bottom: 20px; } .btn { font-size: 0.85rem; padding: 0.5rem 1rem; } .page-count { font-size: 0.75rem; padding: 0.5rem; } } /* Small mobile styles */ @media (max-width: 480px) { .content-panel { padding: 1rem; margin: 0 0.25rem; } .project-image { height: 160px; } .display-4 { font-size: 1.75rem !important; } img.rounded-circle { width: 100px !important; height: 100px !important; } .badge { font-size: 0.65rem; padding: 0.2rem 0.4rem; margin: 0.05rem; } .d-flex.gap-2 { flex-direction: column; gap: 0.5rem !important; } .d-flex.gap-2.justify-content-center { align-items: center; } .btn { width: 100%; max-width: 200px; } .text-small, .small { font-size: 0.8rem; } /* Reduce shooting star effects on mobile for performance */ .shooting-star { display: none; } /* Simplify starfield on mobile */ .snap-container::before { background-size: 150px 150px; animation-duration: 30s; } } /* Extra small mobile styles */ @media (max-width: 320px) { .content-panel { padding: 0.75rem; } .display-4 { font-size: 1.5rem !important; } img.rounded-circle { width: 80px !important; height: 80px !important; } .project-image { height: 140px; } .badge { font-size: 0.6rem; padding: 0.15rem 0.3rem; } } /style>/head>body>div classsnap-container idsnapContainer> !-- Intro Section --> section classsnap-section section-intro data-section0> div classshooting-star>/div> div classshooting-star>/div> div classshooting-star>/div> div classshooting-star>/div> div classcontent-panel text-center> img srchttps://byjake.co.uk/images/me.png altProfile Photo classrounded-circle border-2 border-dark shadow-lg mb-3 stylewidth:140px;height:140px;object-fit:cover;> h1 classdisplay-4 fw-bold mb-3 text-white>Hiya! Im Jake!/h1> div classposition-relative mb-3> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>PHP/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>SQL/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>CSS/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>Liquid/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>Blade/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>Hardware Infrastructure/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>Swift/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>iOS Development/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>Networking/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>SwiftUI/span> span classbadge bg-dark bg-opacity-50 p-2 rounded mb-2>Systems Administration/span> /div> p classlead mb-3 text-white>Builder of web experiences, creator of digital solutions, master of various technologies/p> p classtext-white text-small>Some of my projects cannot be listed here due to their nature! Sorry about that, feel free to ask me about them!/p> div classd-flex gap-2 justify-content-center> button onclickscrollToSection(1) classbtn btn-dark btn-sm rounded>View Projects/button> /div> /div> div classscroll-hint>↓ Scroll or click dots to navigate/div> /section> !-- Project Sections --> section classsnap-section section-project data-section1> div classcontent-panel> img srchttps://byjake.co.uk/images/macstore-1.png altMacStoreUK classproject-image> div classd-flex justify-content-between align-items-start mb-3> h2 classh3 mb-0>MacStoreUK/h2> span classbadge bg-primary>2025/span> /div> p classtext-white mb-4>A stunning website designed by Rockhopper Digital, developed by myself. Built from the Skeleton theme by Shopify, customized heavily to meet client needs with regular updates and maintenance./p> div classd-flex gap-2> a hrefhttps://byjake.co.uk/macstore classbtn btn-outline-secondary>Full Details/a> /div> div classmt-4 small page-count> Project 1 of 7 /div> /div> /section> section classsnap-section section-project data-section2> div classcontent-panel> img srchttps://byjake.co.uk/images/bevly-1.png altBevly classproject-image> div classd-flex justify-content-between align-items-start mb-3> h2 classh3 mb-0>Bevly/h2> span classbadge bg-primary>2024/span> /div> p classtext-white mb-4>A loyalty, PoS, rewards and hospitality management platform. Built in PHP (Laravel framework), CSS, Alpine.js, MySQL, and more./p> div classd-flex gap-2> a hrefhttps://bevly.co.uk/ target_blank classbtn btn-primary>View Live/a> a hrefhttps://byjake.co.uk/bevly classbtn btn-outline-secondary>Full Details/a> /div> div classmt-4 small page-count> Project 2 of 7 /div> /div> /section> section classsnap-section section-project data-section3> div classcontent-panel> img srchttps://byjake.co.uk/images/return-generator-1.png altMac Store UK Productivity Tools classproject-image> div classd-flex justify-content-between align-items-start mb-3> h2 classh3 mb-0>Mac Store UK Productivity Tools/h2> span classbadge bg-primary>2025/span> /div> p classtext-white mb-4>Custom productivity suite built for Mac Store UK to streamline business operations. Includes returns management, order processing automation, and task time reduction features. Reduced manual processes by 80% and improved data accuracy across multiple departments./p> div classd-flex gap-2> a hrefhttps://byjake.co.uk/macstore-tools classbtn btn-outline-secondary>Full Details/a> /div> div classmt-4 small page-count> Project 3 of 7 /div> /div> /section> section classsnap-section section-project data-section4> div classcontent-panel> img srchttps://byjake.co.uk/images/mactrack-1.png altMacTrack classproject-image> div classd-flex justify-content-between align-items-start mb-3> h2 classh3 mb-0>MacTrack/h2> span classbadge bg-primary>2025/span> /div> p classtext-white mb-4>Swift iOS app for internal use at Mac Store UK to manage Apple product inventory. Built in Swift, integrates with existing inventory systems via API./p> div classd-flex gap-2> a hrefhttps://byjake.co.uk/mactrack classbtn btn-outline-secondary>Full Details/a> /div> div classmt-4 small page-count> Project 4 of 7 /div> /div> /section> section classsnap-section section-project data-section5> div classcontent-panel> img srchttps://byjake.co.uk/images/macscan-1.png altMacScan classproject-image> div classd-flex justify-content-between align-items-start mb-3> h2 classh3 mb-0>MacScan/h2> span classbadge bg-primary>2025/span> /div> p classtext-white mb-4>Swift macOS app to receive scanned barcodes from connected iOS devices. Built in Swift, integrates with macOS systems./p> div classd-flex gap-2> a hrefhttps://byjake.co.uk/macscan classbtn btn-outline-secondary>Full Details/a> /div> div classmt-4 small page-count> Project 5 of 7 /div> /div> /section> section classsnap-section section-project data-section6> div classcontent-panel> img srchttps://byjake.co.uk/images/macreturns-1.png altMacReturns classproject-image> div classd-flex justify-content-between align-items-start mb-3> h2 classh3 mb-0>MacReturns/h2> span classbadge bg-primary>2025/span> /div> p classtext-white mb-4>Swift iOS app and Laravel frontend and backend to streamline MacStoreUK's return processes./p> div classd-flex gap-2> a hrefhttps://byjake.co.uk/macreturns classbtn btn-outline-secondary>Full Details/a> /div> div classmt-4 small page-count> Project 6 of 7 /div> /div> /section> section classsnap-section section-project data-section7> div classcontent-panel> img srchttps://byjake.co.uk/images/offly-1.png altOffly classproject-image> div classd-flex justify-content-between align-items-start mb-3> h2 classh3 mb-0>Offly/h2> span classbadge bg-primary>COMING SOON/span> /div> p classtext-white mb-4>Web application to help users find and apply discount codes when shopping online. Built in PHP (Laravel framework), SQL and Bootstrap (with custom design elements)./p> div classd-flex gap-2> a hrefhttps://offly.co.uk/ target_blank classbtn btn-primary>View Live/a> a hrefhttps://byjake.co.uk/offly classbtn btn-outline-secondary>Full Details/a> /div> div classmt-4 small page-count> Project 7 of 7 /div> /div> /section> !-- Footer Section --> section classsnap-section section-footer data-section8> div classshooting-star>/div> div classshooting-star>/div> div classshooting-star>/div> div classshooting-star>/div> div classcontent-panel text-center> h2 classh3 mb-3 text-white>Sounds like we could create something great together?/h2> p classlead mb-4 text-white>Get in touch./p> div classd-flex gap-2 justify-content-center> a href/cdn-cgi/l/email-protection#e08d85a082998a818b85ce838fce958b classbtn btn-primary btn-sm rounded>Contact Me/a> /div> /div> div classtext-white styletext-align:center; font-size:0.9rem; position:absolute; left:0; right:0; bottom:0; padding:0.9rem 1rem; opacity: 0.8;> © Jake Whalley 2025 — Built with Laravel, Bootstrap & lots of img srchttps://upload.wikimedia.org/wikipedia/en/f/f5/RedBullEnergyDrink.svg altcoffee stylewidth:2em;height:2em;vertical-align:-0.8em;>span stylefont-size: 0.4rem; margin-left: 12px;>(Red Bull gives you wings! Red Bull is not a sponsor, but it should be.)/span> /div> /section>/div>!-- Navigation Dots -->div classnav-controls idnavControls> !-- Dots generated by JS -->/div> !-- Bootstrap JS --> script data-cfasyncfalse src/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js>/script>script srchttps://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js>/script> script> const container document.getElementById(snapContainer); const sections document.querySelectorAll(.snap-section); const navControls document.getElementById(navControls); sections.forEach((section, index) > { const dot document.createElement(div); dot.className nav-dot; dot.dataset.section index; if (index 0) dot.classList.add(active); dot.addEventListener(click, () > scrollToSection(index)); navControls.appendChild(dot); }); function scrollToSection(index) { sectionsindex.scrollIntoView({ behavior: smooth }); } let scrollTimeout; container.addEventListener(scroll, () > { clearTimeout(scrollTimeout); scrollTimeout setTimeout(() > { const scrollPos container.scrollTop; const windowHeight window.innerHeight; sections.forEach((section, index) > { const sectionTop section.offsetTop; const sectionBottom sectionTop + section.offsetHeight; if (scrollPos > sectionTop - windowHeight/2 && scrollPos sectionBottom - windowHeight/2) { document.querySelectorAll(.nav-dot).forEach(dot > dot.classList.remove(active)); document.querySelector(`.nav-dotdata-section${index}`).classList.add(active); } }); }, 100); }); document.addEventListener(keydown, (e) > { const activeDot document.querySelector(.nav-dot.active); const currentIndex parseInt(activeDot.dataset.section); if (e.key ArrowDown && currentIndex sections.length - 1) { e.preventDefault(); scrollToSection(currentIndex + 1); } else if (e.key ArrowUp && currentIndex > 0) { e.preventDefault(); scrollToSection(currentIndex - 1); } }); // Enhanced touch handling for mobile let touchStartY 0; let touchStartTime 0; let isScrolling false; container.addEventListener(touchstart, (e) > { touchStartY e.touches0.clientY; touchStartTime Date.now(); isScrolling false; }, { passive: true }); container.addEventListener(touchmove, (e) > { isScrolling true; }, { passive: true }); container.addEventListener(touchend, (e) > { if (isScrolling) return; // Dont trigger snap if user was scrolling const touchEndY e.changedTouches0.clientY; const diff touchStartY - touchEndY; const touchDuration Date.now() - touchStartTime; // Only trigger on quick swipes ( 300ms) with sufficient distance if (Math.abs(diff) > 30 && touchDuration 300) { const activeDot document.querySelector(.nav-dot.active); const currentIndex parseInt(activeDot.dataset.section); if (diff > 0 && currentIndex sections.length - 1) { e.preventDefault(); scrollToSection(currentIndex + 1); } else if (diff 0 && currentIndex > 0) { e.preventDefault(); scrollToSection(currentIndex - 1); } } }, { passive: false }); // Prevent double-tap zoom on mobile let lastTouchEnd 0; document.addEventListener(touchend, (e) > { const now (new Date()).getTime(); if (now - lastTouchEnd 300) { e.preventDefault(); } lastTouchEnd now; }, false); /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]