Help
RSS
API
Feed
Maltego
Contact
Domain > lsnq.net
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2019-06-09
103.71.236.165
(
ClassC
)
2026-02-28
52.52.192.191
(
ClassC
)
Port 443
HTTP/1.1 200 OKAge: 1Cache-Control: no-cacheCache-Status: Netlify Durable; fwdbypassCache-Status: Netlify Edge; fwdmissContent-Type: text/htmlDate: Sat, 28 Feb 2026 13:09:21 GMTEtag: u5v213Link: ./_app/immutable/entry/start.Unlz-Ja2.js>; relmodulepreload; nopush, ./_app/immutable/chunks/1b8QzJ_x.js>; relmodulepreload; nopush, ./_app/immutable/chunks/CqCEo6VU.js>; relmodulepreload; nopush, ./_app/immutable/chunks/DIeogL5L.js>; relmodulepreload; nopush, ./_app/immutable/chunks/Bnt7bT5J.js>; relmodulepreload; nopush, ./_app/immutable/entry/app.CBXtv7Co.js>; relmodulepreload; nopush, ./_app/immutable/chunks/CwiJzRcj.js>; relmodulepreload; nopush, ./_app/immutable/chunks/DZKJQHSj.js>; relmodulepreload; nopush, ./_app/immutable/chunks/CWj6FrbW.js>; relmodulepreload; nopush, ./_app/immutable/nodes/0.f827pPXQ.js>; relmodulepreload; nopush, ./_app/immutable/nodes/2.D4G_-AZk.js>; relmodulepreload; nopush, ./_app/immutable/chunks/69_IOA4Y.js>; relmodulepreload; nopushNetlify-Vary: queryServer: NetlifyStrict-Transport-Security: max-age31536000X-Nf-Request-Id: 01KJJ5WAEGN201YGFESAN306D5X-Sveltekit-Page: trueTransfer-Encoding: chunked !doctype html>html langen> head> meta charsetutf-8 /> link relicon href./favicon.png /> meta nameviewport contentwidthdevice-width, initial-scale1 /> title>lsnq@portfolio:~$/title> style> @import url(https://fonts.googleapis.com/css2?familyIBM+Plex+Mono:wght@400;700&displayswap); * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: IBM Plex Mono, monospace; background-color: #1a0f00; color: #ff8c00; overflow-x: hidden; min-height: 100vh; line-height: 1.4; } .terminal-container { max-width: 900px; margin: 0 auto; padding: 0; background-color: #000000; border: 4px solid #332200; box-shadow: inset 0 0 100px rgba(255, 140, 0, 0.1); margin-top: 20px; margin-bottom: 20px; min-height: 600px; position: relative; animation: crt-glow 4s ease-in-out infinite; } .terminal-header { background-color: #1a0f00; padding: 8px 15px; border-bottom: 2px solid #ff8c00; display: flex; align-items: center; justify-content: space-between; gap: 10px; } .terminal-title { color: #ff8c00; font-size: 13px; letter-spacing: 2px; text-transform: uppercase; } .mode-toggle { background-color: transparent; border: 1px solid #ff8c00; color: #ff8c00; padding: 4px 12px; font-family: IBM Plex Mono, monospace; font-size: 11px; cursor: pointer; transition: all 0.2s ease; text-transform: uppercase; } .mode-toggle:hover { background-color: #ff8c00; color: #000000; } .terminal-content { padding: 20px; min-height: 500px; animation: crt-flicker 8s infinite; } .terminal-output { margin-bottom: 20px; } /* GUI Mode Styles */ .gui-mode { display: none; padding: 30px; } .gui-mode.active { display: block; } .terminal-content.hidden { display: none; } .gui-section { margin-bottom: 40px; } .gui-section-title { color: #ff8c00; font-size: 20px; font-weight: bold; margin-bottom: 20px; border-bottom: 2px solid #ff8c00; padding-bottom: 8px; } .gui-intro { color: #cc7000; font-size: 14px; line-height: 1.6; margin-bottom: 30px; } .project-card { background-color: #0a0500; border: 1px solid #ff8c00; padding: 15px; margin-bottom: 15px; } .project-card-title { color: #ff8c00; font-size: 16px; font-weight: bold; margin-bottom: 8px; } .project-card-tech { color: #996600; font-size: 11px; margin-bottom: 8px; } .project-card-desc { color: #cc7000; font-size: 13px; line-height: 1.4; margin-bottom: 10px; } .project-card-link { color: #ffaa33; text-decoration: none; font-size: 12px; border: 1px solid #ffaa33; padding: 4px 10px; display: inline-block; transition: all 0.2s ease; } .project-card-link:hover { background-color: #ffaa33; color: #000000; } .experience-card { background-color: #0a0500; border-left: 3px solid #ff8c00; padding: 15px; margin-bottom: 15px; } .experience-card-title { color: #ff8c00; font-size: 15px; font-weight: bold; } .experience-card-company { color: #ffaa33; font-size: 14px; margin-top: 4px; } .experience-card-date { color: #996600; font-size: 11px; margin-top: 4px; } .experience-card-desc { color: #cc7000; font-size: 13px; margin-top: 8px; line-height: 1.4; } .skills-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; } .skill-card { background-color: #0a0500; border: 1px solid #ff8c00; padding: 15px; } .skill-card-title { color: #ff8c00; font-size: 14px; font-weight: bold; margin-bottom: 10px; } .skill-card-content { color: #cc7000; font-size: 12px; line-height: 1.4; } .contact-card { background-color: #0a0500; border: 1px solid #ff8c00; padding: 20px; } .contact-link { color: #ffaa33; text-decoration: underline; font-size: 14px; } .contact-link:hover { color: #ffc266; } /* Game Styles */ .game-container { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.95); z-index: 1000; justify-content: center; align-items: center; flex-direction: column; } .game-container.active { display: flex; } #game-canvas { border: 4px solid #ff8c00; background-color: #000000; box-shadow: 0 0 30px rgba(255, 140, 0, 0.3); } .game-ui { color: #ff8c00; font-family: IBM Plex Mono, monospace; margin-top: 20px; text-align: center; } .game-ui h2 { font-size: 24px; margin-bottom: 10px; } .game-ui p { font-size: 14px; color: #cc7000; margin: 5px 0; } .game-controls { margin-top: 15px; font-size: 12px; color: #996600; } .game-over-screen { display: none; position: absolute; text-align: center; color: #ff8c00; font-family: IBM Plex Mono, monospace; } .game-over-screen.active { display: block; } .game-over-screen h2 { font-size: 48px; margin-bottom: 20px; } .game-over-screen p { font-size: 18px; margin: 10px 0; } .prompt { color: #ff8c00; font-weight: bold; font-size: 14px; } .command { color: #ffaa33; margin-left: 10px; font-size: 14px; } .output { margin: 10px 0; color: #cc7000; padding-left: 0; font-size: 14px; } .ascii-art { color: #ff8c00; font-size: 11px; line-height: 1.1; margin: 15px 0; white-space: pre; font-weight: bold; } .input-line { display: flex; align-items: center; margin-top: 10px; } #terminal-input { background: transparent; border: none; color: #ffaa33; font-family: IBM Plex Mono, monospace; font-size: 14px; outline: none; flex: 1; margin-left: 10px; caret-color: #ff8c00; } .cursor { display: inline-block; width: 8px; height: 16px; background-color: #ff8c00; animation: blink 1s infinite; margin-left: 2px; } @keyframes blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } /* CRT Glow pulse animation */ @keyframes crt-glow { 0%, 100% { box-shadow: inset 0 0 100px rgba(255, 140, 0, 0.1), 0 0 20px rgba(255, 140, 0, 0.3); } 50% { box-shadow: inset 0 0 100px rgba(255, 140, 0, 0.15), 0 0 30px rgba(255, 140, 0, 0.5); } } /* CRT Flicker animation - Moderate intensity */ @keyframes crt-flicker { 0%, 100% { opacity: 1; } 90% { opacity: 1; } 91% { opacity: 0.92; } 92% { opacity: 1; } 93% { opacity: 0.88; } 94% { opacity: 0.96; } 95% { opacity: 1; } } .section { margin: 20px 0; padding: 15px 0; } .section-title { color: #ff8c00; font-size: 16px; font-weight: bold; margin-bottom: 12px; text-decoration: underline; } .project-link { color: #ffaa33; text-decoration: underline; transition: all 0.2s ease; } .project-link:hover { color: #ffc266; background-color: #1a0f00; } .tech-stack { color: #996600; font-size: 11px; margin-top: 3px; } .experience-item { margin: 12px 0; padding: 8px 0; border-left: 2px solid #ff8c00; padding-left: 10px; } .experience-title { color: #ff8c00; font-weight: bold; font-size: 14px; } .experience-company { color: #ffaa33; font-size: 13px; } .experience-date { color: #996600; font-size: 11px; } .experience-desc { color: #cc7000; margin-top: 4px; font-size: 12px; } .contact-info { color: #ffaa33; text-decoration: underline; } .contact-info:hover { color: #ffc266; } .skills-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-top: 12px; } .skill-category { padding: 10px; border: 1px solid #ff8c00; } .skill-category h4 { color: #ff8c00; margin-bottom: 8px; font-size: 13px; } .skill-list { color: #cc7000; font-size: 11px; line-height: 1.3; } .error { color: #ff4400; } .success { color: #ffaa33; } /* Scanline effect */ .terminal-container::before { content: ; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: repeating-linear-gradient( 0deg, rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.15) 1px, transparent 1px, transparent 2px ); pointer-events: none; z-index: 1; } /* CRT Vignette effect */ .terminal-container::after { content: ; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: radial-gradient(ellipse at center, transparent 60%, rgba(0, 0, 0, 0.4) 100%); pointer-events: none; z-index: 3; } .terminal-content { position: relative; z-index: 2; } @media (max-width: 768px) { .terminal-container { margin: 10px; padding: 0; } .ascii-art { font-size: 9px; } .skills-grid { grid-template-columns: 1fr; } } /style> /head> body data-sveltekit-preload-datahover> div styledisplay: contents>!---->!---->!---->!---->!---->!---->!---->!----> !--!-->!---->!----> script> { __sveltekit_15qelw7 { base: new URL(., location).pathname.slice(0, -1) }; const element document.currentScript.parentElement; Promise.all( import(./_app/immutable/entry/start.Unlz-Ja2.js), import(./_app/immutable/entry/app.CBXtv7Co.js) ).then((kit, app) > { kit.start(app, element, { node_ids: 0, 2, data: null,null, form: null, error: null }); }); } /script> /div> div classterminal-container> div classterminal-header> div classterminal-title>lsnq@portfolio:~$/div> button classmode-toggle idmode-toggle>Switch to GUI Mode/button> /div> div classterminal-content idterminal-mode> div classascii-art> ███████ ███ ██ ██████ ██ ████ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ▄▄ ██ ███████ ██ ████ ██████ ▀▀ /div> div classoutput>SNQ Portfolio System v1.0/div> div classoutput stylemargin-top: 15px;>Type help for available commands./div> div idterminal-output>/div> div classinput-line> span classprompt>lsnq@portfolio:~$/span> input typetext idterminal-input autocompleteoff autofocus /> /div> /div> div classgui-mode idgui-mode> div classascii-art> ███████ ███ ██ ██████ ██ ████ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ▄▄ ██ ███████ ██ ████ ██████ ▀▀ /div> div classgui-section> div classgui-section-title>About Me/div> div classgui-intro> Hi. My name is SNQ. Welcome to my site.br>br> I am a programmer, modder and overall I love to tinker with things. I have been programming since I was 14 years old. What started as just making mods for a game quickly grew into an obsession with building software. /div> /div> div classgui-section> div classgui-section-title>Projects/div> div classproject-card> div classproject-card-title>Tau/div> div classproject-card-tech>Rust, GTK4, Unix Development, CLI/div> div classproject-card-desc>A Rust app launcher for Linux systems, similar to Macs spotlight search. Features custom CSS implementations for easy customization and optimized UI/UX with convenient keybinding shortcuts./div> a hrefhttps://github.com/l-snq/tau classproject-card-link target_blank>View on GitHub →/a> /div> div classproject-card> div classproject-card-title>RetroPaint Fork/div> div classproject-card-tech>Quality of Life Features/div> div classproject-card-desc>A fork of RetroPaint with additional QoL features for enhanced user experience./div> a hrefhttps://github.com/l-snq/retroPaint classproject-card-link target_blank>View on GitHub →/a> /div> div classproject-card> div classproject-card-title>Rust Game Engine/div> div classproject-card-tech>Rust, BevyRS/div> div classproject-card-desc>My prototype game engine written in Rust, exploring game development architecture and performance optimization./div> a hrefhttps://github.com/l-snq/dioxane/ classproject-card-link target_blank>View on GitHub →/a> /div> div classproject-card> div classproject-card-title>Goods & Service Trader/div> div classproject-card-tech>DevelopEd 3.0 Hackathon/div> div classproject-card-desc>A trading application developed for the DevelopEd 3.0 Hackathon, focusing on goods and service exchange./div> a hrefhttps://github.com/l-snq/servicer-web-app classproject-card-link target_blank>View on GitHub →/a> /div> div classproject-card> div classproject-card-title>Porter/div> div classproject-card-tech>JS, React, Node/div> div classproject-card-desc>A YT-DL wrapper, no ads, no pop ups./div> a hrefhttps://github.com/l-snq/porter classproject-card-link target_blank>View on GitHub →/a> /div> div classproject-card> div classproject-card-title>VEC2K/div> div classproject-card-tech>Rust, WGPU, eGui/div> div classproject-card-desc>A free form vector paint brush app, dedicated to the early 2000s of UI design./div> a hrefhttps://www.linkedin.com/posts/jayden-tweedie_rustlang-graphicsprogramming-creativecoding-activity-7405154702260228099-eIlR classproject-card-link target_blank>View on LinkedIn →/a> /div> div classproject-card> div classproject-card-title>ADX/div> div classproject-card-tech>Rust, Tauri, Tesseract, Llama/div> div classproject-card-desc>An AI Driven Doc & Spec Reviewer that summarizes and compares large document sets for you./div> a hrefhttps://www.linkedin.com/posts/jayden-tweedie_hello-everyone-today-i-am-unveiling-adx-activity-7400087380591931392-qQSK classproject-card-link target_blank>View on LinkedIn →/a> /div> div classproject-card> div classproject-card-title>mini.ascii/div> div classproject-card-tech>Web, ASCII Art/div> div classproject-card-desc>A minimalist ASCII art drawing tool with a simple grid-based canvas for creating text-based artwork in the browser./div> a hrefhttps://miniascii.netlify.app classproject-card-link target_blank>View Project →/a> /div> /div> div classgui-section> div classgui-section-title>Professional Experience/div> div classexperience-card> div classexperience-card-title>Full Stack Developer/Lead Estimator/div> div classexperience-card-company>Leading Electrical & Instrumentation Contractor/div> div classexperience-card-date>2024 - Present/div> div classexperience-card-desc>Leading Electrical and Instrumentation and Building control estimates for commercial and industrial projects, and building integrated software solutions for the transfer of meta data between Bluebeam, Accubid, and Kahua./div> /div> div classexperience-card> div classexperience-card-title>Full Stack Developer/div> div classexperience-card-company>Enterprise Testing & Analytics Platform/div> div classexperience-card-date>2020 - Present/div> div classexperience-card-desc>Lead UI development and component functionality using Vue and Flask Python. Reduced serverside compilation time by 5ms with optimizations to dependency loading and removal of redundancies./div> /div> div classexperience-card> div classexperience-card-title>Junior Full Stack Developer/div> div classexperience-card-company>Healthcare Technology Company/div> div classexperience-card-date>2022-2023/div> div classexperience-card-desc>Upgraded React web application from React 17 to 18, implemented large-scale features for mobile app, and managed database updates with React, React Native, Typescript, CSharp ASP .NET, and Azure DevOps./div> /div> div classexperience-card> div classexperience-card-title>Software Developer/div> div classexperience-card-company>Open Source Game Server Project/div> div classexperience-card-date>2021/div> div classexperience-card-desc>Contributed to a FOSS project that implements server solutions for video game protocols using C, worked on fixing bugs with packet losses, and further strengthened synchronization between server and client./div> /div> /div> div classgui-section> div classgui-section-title>Technical Skills/div> div classskills-container> div classskill-card> div classskill-card-title>Languages/div> div classskill-card-content>C#, Ruby, Rust, TypeScript, JavaScript, Python, Lua, HTML/CSS, LaTeX, C/div> /div> div classskill-card> div classskill-card-title>Tools/div> div classskill-card-content>Git/GitHub, Unix Shell, Webpack, Node.js, VS Code, Neovim, Visual Studio, CLI, Docker/div> /div> div classskill-card> div classskill-card-title>Frameworks/div> div classskill-card-content>React/React Native, Ruby On Rails, Node.js, Next.js, Angular, ASP.NET, BevyRS, AntD UI, Material-UI, Svelte, FastAPI/div> /div> div classskill-card> div classskill-card-title>Education/div> div classskill-card-content>Certificate in Software Developmentbr>Accredited Canadian Technical Institute (2021)/div> /div> /div> /div> div classgui-section> div classgui-section-title>Contact/div> div classcontact-card> strong>GitHub:/strong> a hrefhttps://github.com/l-snq classcontact-link target_blank>github.com/l-snq/a> /div> /div> /div> /div> div classgame-container idgame-container> canvas idgame-canvas width800 height600>/canvas> div classgame-ui> div idgame-stats> p>SCORE: span idgame-score>0/span> | HEALTH: span idgame-health>100/span>/p> /div> div classgame-controls> p>WASD/ARROWS: Move | SPACE: Shoot | ESC: Quit/p> /div> /div> div classgame-over-screen idgame-over-screen> h2>GAME OVER/h2> p>FINAL SCORE: span idfinal-score>0/span>/p> p>Press ENTER to return to terminal/p> /div> /div> script> document.addEventListener(DOMContentLoaded, function() { const terminalInput document.getElementById(terminal-input); const terminalOutput document.getElementById(terminal-output); const terminalMode document.getElementById(terminal-mode); const guiMode document.getElementById(gui-mode); const modeToggle document.getElementById(mode-toggle); let commandHistory ; let historyIndex -1; let isGuiMode false; let effectsEnabled true; // Global flag for effects toggle // Typewriter effect function (FAST: 20ms per character) async function typewriterEffect(element, html, speed 20) { // Skip if effects disabled if (!effectsEnabled) { element.innerHTML html; return Promise.resolve(); } return new Promise(resolve > { // Create temporary element to parse HTML const temp document.createElement(div); temp.innerHTML html; // Extract text content while preserving structure const textContent temp.textContent || temp.innerText; element.innerHTML ; let index 0; // For complex HTML, we need different approach if (html.includes(a) || html.includes(span)) { // Display HTML instantly but with reveal effect element.innerHTML html; element.style.opacity 0; requestAnimationFrame(() > { element.style.transition opacity 0.3s; element.style.opacity 1; }); setTimeout(resolve, 300); } else { // Simple text typewriter const interval setInterval(() > { if (index textContent.length) { element.textContent textContent.substring(0, index + 1); index++; } else { clearInterval(interval); element.innerHTML html; // Restore full HTML resolve(); } }, speed); } }); } // Mode toggle functionality modeToggle.addEventListener(click, function() { isGuiMode !isGuiMode; if (isGuiMode) { terminalMode.classList.add(hidden); guiMode.classList.add(active); modeToggle.textContent Switch to Terminal Mode; } else { terminalMode.classList.remove(hidden); guiMode.classList.remove(active); modeToggle.textContent Switch to GUI Mode; terminalInput.focus(); } }); // Portfolio data const portfolioData { whoami: `Hi. My name is SNQ. I notice software that should exist but doesnt, then I build it. AI-powered spec analysis for contractors. A vector editor thats actually fast. Tools for problems people have learned to tolerate.Rust, TypeScript, C#; whatever fits. Programming since 14. I like understanding the machine.`, projects: { name: Tau, url: https://github.com/l-snq/tau, tech: Rust, GTK4, Unix Development, CLI, desc: A Rust app launcher for Linux systems, similar to Mac\s spotlight search. Features custom CSS implementations for easy customization and optimized UI/UX with convenient keybinding shortcuts. }, { name: RetroPaint Fork, url: https://github.com/l-snq/retroPaint, tech: Quality of Life Features, desc: A fork of RetroPaint with additional QoL features for enhanced user experience. }, { name: Rust Game Engine, url: https://github.com/l-snq/dioxane/, tech: Rust, BevyRS, desc: My prototype game engine written in Rust, exploring game development architecture and performance optimization. }, { name: Goods & Service Trader, url: https://github.com/l-snq/servicer-web-app, tech: DevelopEd 3.0 Hackathon, desc: A trading application developed for the DevelopEd 3.0 Hackathon, focusing on goods and service exchange. }, { name: Porter, url: https://github.com/l-snq/porter, tech: JS, React, Node, desc: A YT-DL wrapper, no ads, no pop ups. }, { name: VEC2K, url: https://www.linkedin.com/posts/jayden-tweedie_rustlang-graphicsprogramming-creativecoding-activity-7405154702260228099-eIlR, tech: Rust, WGPU, eGui, desc: A free form vector paint brush app, dedicated to the early 2000s of UI design. }, { name: ADX, url: https://www.linkedin.com/posts/jayden-tweedie_hello-everyone-today-i-am-unveiling-adx-activity-7400087380591931392-qQSK, tech: Rust, Tauri, Tesseract, Llama, desc: An AI Driven Doc & Spec Reviewer that summarizes and compares large document sets for you. }, { name: mini.ascii, url: https://miniascii.netlify.app, tech: Web, ASCII Art, desc: A minimalist ASCII art drawing tool with a simple grid-based canvas for creating text-based artwork in the browser. } , experience: { title: Full Stack Developer/Lead Estimator, company: Leading Electrical & Instrumentation Contractor, date: 2024 - Present, desc: Leading Electrical and Instrumentation and Building control estimates for commercial and industrial projects, and building integrated software solutions for the transfer of meta data between Bluebeam, Accubid, and Kahua. }, { title: Full Stack Developer, company: Enterprise Testing & Analytics Platform, date: 2020 - Present, desc: Lead UI development and component functionality using Vue and Flask Python. Reduced serverside compilation time by 5ms with optimizations to dependency loading and removal of redundancies. }, { title: Junior Full Stack Developer, company: Healthcare Technology Company, date: 2022-2023, desc: Upgraded React web application from React 17 to 18, implemented large-scale features for mobile app, and managed database updates with React, React Native, Typescript, CSharp ASP .NET, and Azure DevOps. }, { title: Software Developer, company: Open Source Game Server Project, date: 2021, desc: Contributed to a FOSS project that implements server solutions for video game protocols using C, worked on fixing bugs with packet losses, and further strengthened synchronization between server and client. } , skills: { Languages: C#, Ruby, Rust, TypeScript, JavaScript, Python, Lua, HTML/CSS, LaTeX, C, Tools: Git/GitHub, Unix Shell, Webpack, Node.js, VS Code, Neovim, Visual Studio, CLI, Docker, Frameworks: React/React Native, Ruby On Rails, Node.js, Next.js, Angular, ASP.NET, BevyRS, AntD UI, Material-UI, Svelte, FastAPI, Education: Certificate in Software Development - Accredited Canadian Technical Institute (2021) }, contact: { github: https://github.com/l-snq } }; // Command handlers const commands { help: () > { return `Available commands: help - Display this help message whoami - About me ls - List projects projects - View all projects experience - View work experience skills - View technical skills contact - View contact information effects - Toggle visual effects (CRT flicker, typewriter) clear - Clear terminal screen game - Launch isometric shooter game`; }, game: () > { startGame(); return null; }, whoami: () > portfolioData.whoami, ls: () > { let output PROJECTS:\n\n; portfolioData.projects.forEach((proj, idx) > { output + ` ${idx + 1} ${proj.name}\n`; }); output + \nUse projects to see full details.; return output; }, projects: () > { let output MY PORTFOLIO:\n\n; portfolioData.projects.forEach((proj, idx) > { output + `${idx + 1} ${proj.name}\n`; output + ` URL: a href${proj.url} classproject-link target_blank>${proj.url}/a>\n`; output + ` Tech: ${proj.tech}\n`; output + ` ${proj.desc}\n\n`; }); return output; }, experience: () > { let output PROFESSIONAL EXPERIENCE:\n\n; portfolioData.experience.forEach((exp, idx) > { output + `${idx + 1} ${exp.title}\n`; output + ` Company: ${exp.company}\n`; output + ` Period: ${exp.date}\n`; output + ` ${exp.desc}\n\n`; }); return output; }, skills: () > { let output TECHNICAL SKILLS:\n\n; for (const category, items of Object.entries(portfolioData.skills)) { output + `${category}:\n ${items}\n\n`; } return output; }, contact: () > { return `CONTACT INFORMATION:GitHub: a href${portfolioData.contact.github} classcontact-info target_blank>${portfolioData.contact.github}/a>`; }, clear: () > { terminalOutput.innerHTML ; return null; }, effects: () > { effectsEnabled !effectsEnabled; const container document.querySelector(.terminal-container); const content document.querySelector(.terminal-content); if (!effectsEnabled) { // Disable CRT effects container.style.animation none; content.style.animation none; return Visual effects disabled.; } else { // Enable CRT effects container.style.animation ; content.style.animation ; return Visual effects enabled.; } } }; // Add output to terminal (async for typewriter effect) async function addOutput(command, output) { const cmdLine document.createElement(div); cmdLine.className output; cmdLine.innerHTML `span classprompt>lsnq@portfolio:~$/span> span classcommand>${escapeHtml(command)}/span>`; terminalOutput.appendChild(cmdLine); if (output ! null) { const outputDiv document.createElement(div); outputDiv.className output; outputDiv.style.whiteSpace pre-line; terminalOutput.appendChild(outputDiv); // Apply typewriter effect await typewriterEffect(outputDiv, output, 20); } // Scroll to bottom terminalOutput.scrollTop terminalOutput.scrollHeight; } // Escape HTML function escapeHtml(text) { const div document.createElement(div); div.textContent text; return div.innerHTML; } // Process command (async for typewriter effect) async function processCommand(input) { const cmd input.trim().toLowerCase(); if (cmd ) return; commandHistory.unshift(input); historyIndex -1; if (commandscmd) { const output commandscmd(); await addOutput(input, output); } else { await addOutput(input, `span classerror>Bad command or file name: ${escapeHtml(cmd)}/span>`); } } // Handle input (async for typewriter effect) terminalInput.addEventListener(keydown, async function(e) { if (e.key Enter) { e.preventDefault(); const input terminalInput.value; await processCommand(input); terminalInput.value ; } else if (e.key ArrowUp) { e.preventDefault(); if (historyIndex commandHistory.length - 1) { historyIndex++; terminalInput.value commandHistoryhistoryIndex; } } else if (e.key ArrowDown) { e.preventDefault(); if (historyIndex > 0) { historyIndex--; terminalInput.value commandHistoryhistoryIndex; } else { historyIndex -1; terminalInput.value ; } } }); // Keep input focused (only in terminal mode) document.addEventListener(click, function() { if (!isGuiMode) { terminalInput.focus(); } }); // ISOMETRIC SHOOTER GAME function startGame() { const gameContainer document.getElementById(game-container); const canvas document.getElementById(game-canvas); const ctx canvas.getContext(2d); const gameOverScreen document.getElementById(game-over-screen); const scoreDisplay document.getElementById(game-score); const healthDisplay document.getElementById(game-health); const finalScoreDisplay document.getElementById(final-score); gameContainer.classList.add(active); // Game state let gameRunning true; let score 0; let health 100; let lastTime 0; let enemySpawnTimer 0; // Reset UI displays scoreDisplay.textContent 0; healthDisplay.textContent 100; // Isometric conversion helpers function toIso(x, y) { return { x: (x - y) * 2, y: (x + y) }; } // Player const player { x: 0, y: 0, size: 20, speed: 1.5, color: #ff8c00 }; // Input state const keys {}; let shootCooldown 0; // Game objects const bullets ; const enemies ; const particles ; // Enemy class class Enemy { constructor(x, y) { this.x x; this.y y; this.size 15; this.speed 0.8; this.health 2; this.color #cc3300; } update() { const dx player.x - this.x; const dy player.y - this.y; const dist Math.sqrt(dx * dx + dy * dy); if (dist > 1) { this.x + (dx / dist) * this.speed; this.y + (dy / dist) * this.speed; } } draw() { const iso toIso(this.x, this.y); // Draw shadow ctx.fillStyle rgba(0, 0, 0, 0.3); ctx.beginPath(); ctx.ellipse(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y + 10, this.size * 0.8, this.size * 0.4, 0, 0, Math.PI * 2); ctx.fill(); // Draw enemy (cube) ctx.fillStyle this.color; const h this.size * 1.5; ctx.beginPath(); // Top face ctx.moveTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h); ctx.lineTo(canvas.width / 2 + iso.x + this.size, canvas.height / 2 + iso.y - h + this.size * 0.5); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h + this.size); ctx.lineTo(canvas.width / 2 + iso.x - this.size, canvas.height / 2 + iso.y - h + this.size * 0.5); ctx.closePath(); ctx.fill(); // Left face ctx.fillStyle #991100; ctx.beginPath(); ctx.moveTo(canvas.width / 2 + iso.x - this.size, canvas.height / 2 + iso.y - h + this.size * 0.5); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h + this.size); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y + this.size * 0.5); ctx.lineTo(canvas.width / 2 + iso.x - this.size, canvas.height / 2 + iso.y); ctx.closePath(); ctx.fill(); // Right face ctx.fillStyle #aa2200; ctx.beginPath(); ctx.moveTo(canvas.width / 2 + iso.x + this.size, canvas.height / 2 + iso.y - h + this.size * 0.5); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h + this.size); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y + this.size * 0.5); ctx.lineTo(canvas.width / 2 + iso.x + this.size, canvas.height / 2 + iso.y); ctx.closePath(); ctx.fill(); } } // Bullet class class Bullet { constructor(x, y, dirX, dirY) { this.x x; this.y y; this.dirX dirX; this.dirY dirY; this.speed 5; this.size 5; this.color #ffaa33; this.lifetime 100; } update() { this.x + this.dirX * this.speed; this.y + this.dirY * this.speed; this.lifetime--; } draw() { const iso toIso(this.x, this.y); ctx.fillStyle this.color; ctx.beginPath(); ctx.arc(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y, this.size, 0, Math.PI * 2); ctx.fill(); } } // Particle class for sparks class Particle { constructor(x, y) { this.x x; this.y y; this.z 0; this.vx (Math.random() - 0.5) * 4; this.vy (Math.random() - 0.5) * 4; this.vz Math.random() * 3 + 2; this.gravity 0.2; this.size Math.random() * 3 + 2; this.lifetime 30; this.maxLifetime 30; this.color #ff8c00, #ffaa33, #ffc266, #cc7000Math.floor(Math.random() * 4); } update() { this.x + this.vx; this.y + this.vy; this.z + this.vz; this.vz - this.gravity; this.lifetime--; // Bounce off ground if (this.z 0 && this.vz 0) { this.z 0; this.vz * -0.5; this.vx * 0.7; this.vy * 0.7; } } draw() { const iso toIso(this.x, this.y); const alpha this.lifetime / this.maxLifetime; ctx.fillStyle this.color; ctx.globalAlpha alpha; // Draw as small cube const s this.size; const h this.z; ctx.beginPath(); // Top face ctx.moveTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h); ctx.lineTo(canvas.width / 2 + iso.x + s, canvas.height / 2 + iso.y - h + s * 0.5); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h + s); ctx.lineTo(canvas.width / 2 + iso.x - s, canvas.height / 2 + iso.y - h + s * 0.5); ctx.closePath(); ctx.fill(); ctx.globalAlpha 1; } } // Draw player function drawPlayer() { const iso toIso(player.x, player.y); // Draw shadow ctx.fillStyle rgba(0, 0, 0, 0.3); ctx.beginPath(); ctx.ellipse(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y + 12, player.size, player.size * 0.5, 0, 0, Math.PI * 2); ctx.fill(); // Draw player (pyramid) ctx.fillStyle player.color; const h player.size * 2; ctx.beginPath(); // Front left face ctx.moveTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h); ctx.lineTo(canvas.width / 2 + iso.x - player.size, canvas.height / 2 + iso.y); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y + player.size * 0.5); ctx.closePath(); ctx.fill(); // Front right face ctx.fillStyle #cc7000; ctx.beginPath(); ctx.moveTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y - h); ctx.lineTo(canvas.width / 2 + iso.x + player.size, canvas.height / 2 + iso.y); ctx.lineTo(canvas.width / 2 + iso.x, canvas.height / 2 + iso.y + player.size * 0.5); ctx.closePath(); ctx.fill(); } // Draw grid function drawGrid() { ctx.strokeStyle rgba(255, 140, 0, 0.1); ctx.lineWidth 1; const gridSize 50; for (let x -400; x 400; x + gridSize) { for (let y -400; y 400; y + gridSize) { const iso1 toIso(x, y); const iso2 toIso(x + gridSize, y); const iso3 toIso(x, y + gridSize); ctx.beginPath(); ctx.moveTo(canvas.width / 2 + iso1.x, canvas.height / 2 + iso1.y); ctx.lineTo(canvas.width / 2 + iso2.x, canvas.height / 2 + iso2.y); ctx.stroke(); ctx.beginPath(); ctx.moveTo(canvas.width / 2 + iso1.x, canvas.height / 2 + iso1.y); ctx.lineTo(canvas.width / 2 + iso3.x, canvas.height / 2 + iso3.y); ctx.stroke(); } } } // Update game function update(deltaTime) { if (!gameRunning) return; // Player movement let moveX 0; let moveY 0; if (keysw || keysArrowUp) moveY - 1; if (keyss || keysArrowDown) moveY + 1; if (keysa || keysArrowLeft) moveX - 1; if (keysd || keysArrowRight) moveX + 1; // Normalize diagonal movement if (moveX ! 0 && moveY ! 0) { moveX * 0.707; moveY * 0.707; } player.x + moveX * player.speed; player.y + moveY * player.speed; // Keep player in bounds player.x Math.max(-300, Math.min(300, player.x)); player.y Math.max(-300, Math.min(300, player.y)); // Shooting shootCooldown - deltaTime; if (keys && shootCooldown 0) { // Shoot in 4 directions bullets.push(new Bullet(player.x, player.y, 0, -1)); bullets.push(new Bullet(player.x, player.y, 0, 1)); bullets.push(new Bullet(player.x, player.y, -1, 0)); bullets.push(new Bullet(player.x, player.y, 1, 0)); shootCooldown 300; } // Update bullets for (let i bullets.length - 1; i > 0; i--) { bulletsi.update(); if (bulletsi.lifetime 0) { bullets.splice(i, 1); } } // Update particles for (let i particles.length - 1; i > 0; i--) { particlesi.update(); if (particlesi.lifetime 0) { particles.splice(i, 1); } } // Spawn enemies enemySpawnTimer + deltaTime; if (enemySpawnTimer > 1000) { const angle Math.random() * Math.PI * 2; const distance 400; enemies.push(new Enemy( Math.cos(angle) * distance, Math.sin(angle) * distance )); enemySpawnTimer 0; } // Update enemies for (let i enemies.length - 1; i > 0; i--) { enemiesi.update(); // Check collision with player (smaller hitbox) const dx player.x - enemiesi.x; const dy player.y - enemiesi.y; const dist Math.sqrt(dx * dx + dy * dy); if (dist (player.size + enemiesi.size) * 0.6) { health - 10; healthDisplay.textContent health; enemies.splice(i, 1); if (health 0) { endGame(); } continue; } // Check collision with bullets (smaller hitbox) for (let j bullets.length - 1; j > 0; j--) { const bdx bulletsj.x - enemiesi.x; const bdy bulletsj.y - enemiesi.y; const bdist Math.sqrt(bdx * bdx + bdy * bdy); if (bdist enemiesi.size * 0.8) { enemiesi.health--; // Create spark particles at impact point for (let p 0; p 6; p++) { particles.push(new Particle(bulletsj.x, bulletsj.y)); } bullets.splice(j, 1); if (enemiesi.health 0) { score + 10; scoreDisplay.textContent score; enemies.splice(i, 1); break; } } } } } // Draw game function draw() { ctx.fillStyle #000000; ctx.fillRect(0, 0, canvas.width, canvas.height); drawGrid(); drawPlayer(); bullets.forEach(b > b.draw()); enemies.forEach(e > e.draw()); particles.forEach(p > p.draw()); } // Game loop function gameLoop(timestamp) { if (!gameRunning) return; const deltaTime timestamp - lastTime; lastTime timestamp; update(deltaTime); draw(); requestAnimationFrame(gameLoop); } // End game function endGame() { gameRunning false; gameOverScreen.classList.add(active); finalScoreDisplay.textContent score; } // Input handlers function handleKeyDown(e) { if (!gameRunning && e.key Enter) { gameContainer.classList.remove(active); gameOverScreen.classList.remove(active); terminalInput.focus(); document.removeEventListener(keydown, handleKeyDown); document.removeEventListener(keyup, handleKeyUp); return; } if (e.key Escape) { gameRunning false; gameContainer.classList.remove(active); terminalInput.focus(); document.removeEventListener(keydown, handleKeyDown); document.removeEventListener(keyup, handleKeyUp); return; } // Prevent default behavior for game keys if (w, a, s, d, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, .includes(e.key)) { e.preventDefault(); } keyse.key true; } function handleKeyUp(e) { // Prevent default behavior for game keys if (w, a, s, d, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, .includes(e.key)) { e.preventDefault(); } keyse.key false; } document.addEventListener(keydown, handleKeyDown); document.addEventListener(keyup, handleKeyUp); // Start game loop requestAnimationFrame(gameLoop); } }); /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
]