diff --git a/.vite/deps/_metadata.json b/.vite/deps/_metadata.json new file mode 100644 index 0000000..ff4761b --- /dev/null +++ b/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "c1692715", + "configHash": "46535a3e", + "lockfileHash": "e3b0c442", + "browserHash": "7d791f90", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/.vite/deps/package.json b/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/index.html b/index.html index 8108b0d..cb0834a 100644 --- a/index.html +++ b/index.html @@ -1,21 +1,20 @@ - + - - Pietro Quintavalle — Bare-Metal Systems & Linux Infrastructure - - + Pietro Quintavalle — Bare-metal systems and Linux infrastructure + - - + + + - + - +
diff --git a/src/App.tsx b/src/App.tsx index 88d6325..3b5b324 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,385 +1,171 @@ -import type { ReactNode } from 'react' -import ThreeViewport from './ThreeViewport' -import ContourBackground from './ContourBackground' -import { buildRackScene, buildClusterScene, buildNasScene } from './scenes' +import { useCallback, useEffect, useRef, useState } from 'react' +import ParticleScene, { SHAPE_NAMES } from './scene/ParticleScene' +import { usePageMotion } from './usePageMotion' +import * as C from './content' -const EMAIL = '0pietroquintavalle0@gmail.com' -const GITHUB = 'https://github.com/Quinta0' -const LINKEDIN = 'https://www.linkedin.com/in/pietro-quintavalle-996b96267/' +const KEYFRAMES = ['.hero', '#work', '#skills', '#contact'] -type CaseStudy = { - label: string - title: string - desc: string - tags: string[] - tint: string - headerL: string - headerR: string - footerL: string - footerR: string - diagram: ReactNode - interactive?: boolean +function Name({ lines }: { lines: string[] }) { + const minLen = Math.min(...lines.map(l => l.length)) + return ( +

+ {lines.map((ln, li) => ( + + ))} +

+ ) } -const cases: CaseStudy[] = [ - { - label: '01 / Turnkey Rack Assembly', - title: 'Turnkey Server Cabinet & ZFS Storage Pool', - desc: 'Procured and physically assembled a turnkey 19" server cabinet, structured patch panels, and storage chassis for a private client. Dressed and labeled all cable runs, deployed TrueNAS with ZFS RAID 10, automated granular user ACLs, and configured offsite snapshot synchronization for a <30 min recovery target.', - tags: ['19" EIA-310 Cabinet', 'ZFS RAID 10', 'Structured Cabling'], - tint: '#EFECE6', - headerL: 'RACK_CHASSIS // EIA-310', - headerR: '• DRAG TO ROTATE', - footerL: 'STRUCTURED HARNESS', - footerR: 'SUB-30M RTO SYNC', - diagram: , - interactive: true, - }, - { - label: '02 / Startup Infrastructure • DEC Energy', - title: 'Dual-Node Bare-Metal Kubernetes Cluster', - desc: 'Serving as freelance hardware partner for USI startup DEC Energy. Sourced parts, built, and deployed an on-premise 2-node cluster to host critical LLM inference, accounting, and Gitea source control. Tuned fan curves and conducted thermal bench stress testing to ensure quiet open-office operation under full tensor load.', - tags: ['Bare-Metal K8s', 'LLM Inference', 'Thermal Profiling'], - tint: '#EAE8E1', - headerL: 'DUAL_NODE // TOPOLOGY', - headerR: '• DRAG TO ROTATE', - footerL: 'ON-PREMISES INGESTION', - footerR: 'USI STARTUP', - diagram: , - interactive: true, - }, - { - label: '03 / Protocol Reverse Engineering', - title: 'libratbag USB HID Kernel Driver', - desc: "Sniffed and reverse-engineered an undocumented vendor's raw USB HID packets using Wireshark. Decoded byte streams for DPI profiles, polling rates, and on-board memory layouts, writing a complete C device driver merged directly into upstream libratbag.", - tags: ['Upstream PR #1873', 'Wireshark Sniffing', 'C Device Driver'], - tint: '#F2EFEB', - headerL: 'USB HID DECODER', - headerR: 'KERNEL C INTERFACE', - footerL: 'RAW BYTE INSPECTION', - footerR: 'PR #1873 MERGED', - diagram: ( - - - - - - - - 0x08 - REPORT - - 0x14 - CMD - - 0x01 02 - PROF_2 - - 0x0640 - 1600 DPI - - 00 00 ... - - - - UPSTREAM KERNEL C - - ), - }, - { - label: '04 / Self-Directed Production', - title: 'Homelab as Code: 4-Node Multi-User Fabric', - desc: 'Operating 4 bare-metal production hosts (UNRAID, Proxmox VE 8, TrueNAS, Docker, LXC) actively serving 12+ daily active users without managed third-party hosting. Zero exposed WAN ports enforced via Cloudflare Tunnels, WireGuard, SSO/2FA, and Fail2Ban. Provisioned idempotently via Ansible with <30m bare-metal disaster recovery.', - tags: ['Zero-Trust WAN', 'Ansible IaC', 'Proxmox / UNRAID'], - tint: '#EDEAE3', - headerL: 'TOPOLOGY MAP', - headerR: '• HOVER BAYS', - footerL: 'ANSIBLE PROVISIONED', - footerR: 'DAILY PRODUCTION', - diagram: , - interactive: true, - }, -] - -const ossCards = [ - { - kicker: 'RUNTIME PIPELINES', - title: 'Vysp3r/ProtonPlus • steam-for-linux', - meta: 'Issue #1232', - desc: 'Diagnosed a deployment pipeline fault in the Steam Linux Runtime installation sequence where unwritten manifest files caused execution crashes. Formulated a console depot recovery workaround and contributed code upstream to automate runtime integrity validation.', - tags: ['#SteamRuntime', '#Proton', '#LinuxGaming'], - }, - { - kicker: 'COMPATIBILITY TOOLING', - title: 'Recol/DLSS-Updater', - meta: 'PR #283, #252, #256', - desc: 'Engineered dynamic multi-vendor library detection (NVIDIA DLSS, AMD FSR, Intel XeSS). Replaced brittle static mapping tables with bounded manifest parsing to maintain driver compatibility across DLL upgrades; resolved UI state desynchronization bugs.', - tags: ['#Python', '#Qt', '#DriverInterfacing'], - }, - { - kicker: 'AUTOMATION UTILITY', - title: 'Quinta0/ObsidianSetup', - meta: '26 Stars on GitHub', - desc: 'Authored an idempotent cross-platform provisioning utility for automated workspace configuration, plugin synchronization, and environment deployment.', - tags: ['#PowerShell', '#EnvironmentProvisioning'], - }, - { - kicker: 'TEAM SYSTEMS ARCHITECTURE', - title: 'City Simulator • USI Systems Project', - meta: 'Agile / Scrum', - desc: 'Coordinated a 12-person development team using Agile/Scrum to build a full-stack city simulation. Owned backend architecture in Spring Boot while integrating JavaScript/HTML/CSS frontend components.', - tags: ['#Java', '#SpringBoot', '#ScrumTeam'], - }, -] - -const experience = [ - { - title: 'Infrastructure & Hardware Consultant (Freelance)', - period: '2026', - org: 'DEC Energy (USI Startup) • Ticino, Switzerland', - desc: 'Trusted technical partner advising on workstation hardware (custom PCs, multi-monitor ergonomics, laptop fleet selection). Designed, procured, and deployed an on-premise 2-node bare-metal Kubernetes cluster for local LLM inference, accounting, and Git source control.', - }, - { - title: 'IT Support & Hardware Technician (Freelance)', - period: 'Jan 2020 – Present', - org: 'Private Clients • Ticino, Switzerland', - desc: 'Assembled, configured, and repaired 25+ custom workstations and laptops: component sourcing, OS imaging (Windows/Linux), driver debugging, and remote/onsite diagnostics. Maintained comprehensive hardware logs to eliminate recurring component failures.', - }, - { - title: 'Bare-Metal Infrastructure Operator', - period: 'Jan 2020 – Present', - org: 'Self-Directed Production Homelab', - desc: 'Engineered and maintained 4 bare-metal production nodes serving 12+ daily active users without managed external hosting. Deployed turnkey server rack cabinets, configured ZFS RAID 10 arrays, and implemented zero exposed WAN ports via Cloudflare Tunnels and WireGuard meshes.', - }, -] - -const skillColumns = [ - { - heading: 'HARDWARE & LAB', - items: ['Desktop / Server Assembly', 'Component Fault Triage', 'Thermal Bench Stressing', 'Firmware / BIOS Flashing', 'Soldering & Harness Wiring', 'Rack Mounting & Cabling'], - }, - { - heading: 'SYSTEMS & STORAGE', - items: ['Linux Daily (5+ yrs)', 'Debian, Arch, Ubuntu, NixOS', 'Proxmox VE 8, KVM, LXC', 'TrueNAS • ZFS RAID 10', 'UNRAID • Docker / K8s', 'Windows Server (AD, GPO, DNS)'], - }, - { - heading: 'NETWORK & TELEMETRY', - items: ['VLANs • Ubiquiti UniFi', 'Zero-Trust Tunnels', 'WireGuard / Tailscale', 'UFW, iptables, Fail2Ban', 'Ansible IaC • Bash', 'Grafana, Prometheus, Kuma'], - }, -] - -const education = [ - { - date: '2022 – 2024 • USI Lugano', - title: 'Foundational Higher Education in Computer Science', - desc: 'Completed 2 full years of core CS curricula: Algorithms & data structures, OOP (Java, C++), discrete logic, and software architecture. Concluded formal coursework to transition full-time into hands-on bare-metal systems and datacenter infrastructure.', - }, - { - date: '2018 – 2022 • SCC Bellinzona', - title: 'Maturità Cantonale & Federal VET Diploma (AFC)', - desc: 'Completed Swiss dual-track qualification (Maturità: 4.5/6, AFC: 5/6).', - }, -] - -const certifications = ['Google IT Support Professional', 'Google Data Analytics Professional', 'Microsoft Foundations of IT Systems'] - -const languages = [ - { name: 'Italian', level: 'Native (C2)' }, - { name: 'English', level: 'Full Professional (C2)' }, - { name: 'German', level: 'Working Proficiency (B1–B2)' }, - { name: 'Spanish / Norwegian', level: 'Basic (A1)' }, -] +function Marquee({ items, reverse }: { items: string[]; reverse?: boolean }) { + const row = [...items, ...items] + return +} export default function App() { + usePageMotion() + const [label, setLabel] = useState(SHAPE_NAMES[0]) + const [swap, setSwap] = useState(false) + const barRef = useRef(null) + + // label swaps with a short fade + const pending = useRef(null) + const onLabel = useCallback((text: string) => { + setSwap(true) + if (pending.current) clearTimeout(pending.current) + pending.current = window.setTimeout(() => { setLabel(text); setSwap(false) }, 400) + }, []) + useEffect(() => () => { if (pending.current) clearTimeout(pending.current) }, []) + const onProgress = useCallback((f: number) => { if (barRef.current) barRef.current.style.transform = `scaleX(${f.toFixed(4)})` }, []) + return ( <> -
- -
+ +