diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index b58b603..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 03d9549..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index b0c240b..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/personalwebsite.iml b/.idea/personalwebsite.iml deleted file mode 100644 index 24643cc..0000000 --- a/.idea/personalwebsite.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/globals.css b/app/globals.css index 9b1ed9f..c385993 100644 --- a/app/globals.css +++ b/app/globals.css @@ -127,84 +127,79 @@ nav.nav-open .nav-burger span:nth-child(3){transform:translateY(-5.5px) rotate(- /* ---------- HERO ---------- */ .hero-row{ position:relative; - display:flex;flex-wrap:wrap;gap:48px; + display:grid;grid-template-columns:1fr 260px;gap:60px; max-width:var(--container);margin:0 auto; padding:80px var(--pad) 76px; - overflow:hidden; + border-bottom:2px solid var(--navy); } -.hero-glow{ - position:absolute;top:-220px;left:50%; - width:900px;height:600px;transform:translateX(-50%); - background:radial-gradient(closest-side,rgba(193,18,31,.06),transparent 70%); - filter:blur(20px);pointer-events:none;z-index:0; -} -.hero-main{flex:1 1 480px;position:relative;z-index:1} +.hero-main{position:relative;z-index:1} .status-row{ display:inline-flex;align-items:center;gap:8px; - font-size:11.5px;color:var(--mid);font-weight:500; - letter-spacing:.04em;margin-bottom:26px; + font-size:12px;color:var(--navy2);font-weight:500; + letter-spacing:.08em;margin-bottom:24px; font-family:var(--f-mono);text-transform:uppercase; + border:1px solid var(--line);padding:6px 12px; } .green-dot{width:6px;height:6px;background:var(--navy2);position:relative;flex-shrink:0} .green-dot::after{content:'';position:absolute;inset:-3px;background:rgba(193,18,31,.18);animation:gpulse 2.2s ease-in-out infinite} @keyframes gpulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.7);opacity:0}} .hero-name{ font-family:var(--f-head); - font-size:clamp(42px,6vw,72px); + font-size:clamp(40px,5.4vw,58px); font-weight:700; - line-height:1.0; - letter-spacing:-.03em; + line-height:1.02; + letter-spacing:-.02em; color:var(--navy); - margin-bottom:10px; } -.hero-name::after{content:'';display:block;width:64px;height:3px;background:var(--navy2);margin-top:18px} .hero-role{ font-family:var(--f-mono); - font-size:clamp(12px,1.5vw,13.5px); + font-size:clamp(12px,1.4vw,14px); color:var(--mid); font-weight:400; letter-spacing:.04em;text-transform:uppercase; - margin-top:18px; - margin-bottom:26px; -} -.hero-lead{ - font-size:14.5px;color:var(--mid);line-height:1.7; - max-width:520px;margin-bottom:16px;font-weight:400; + margin:18px 0 28px; } .hero-thesis{ - font-size:14.5px;color:var(--navy);line-height:1.6; - max-width:520px;margin-bottom:18px;font-weight:500; - padding-left:14px;border-left:2px solid var(--navy2); + font-family:var(--f-head);font-weight:500; + font-size:17px;color:var(--navy);line-height:1.5; + max-width:520px;margin-bottom:24px; + padding-left:18px;border-left:2px solid var(--navy2); } -.btns{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px} +.hero-lead{ + font-size:15px;color:var(--mid);line-height:1.7; + max-width:520px;margin-bottom:32px;font-weight:400; +} +.btns{display:flex;gap:12px;flex-wrap:wrap;} .btn{ - display:inline-flex;align-items:center;gap:7px; - padding:11px 22px; - font-size:12.5px;font-weight:600;font-family:var(--f-mono); - text-decoration:none;cursor:pointer;border:1px solid transparent; - transition:all .15s ease;letter-spacing:.05em;text-transform:uppercase; + display:inline-block; + padding:14px 20px; + font-size:12px;font-weight:600;font-family:var(--f-mono); + text-decoration:none;cursor:pointer;border:1px solid var(--navy); + transition:all .15s ease;letter-spacing:.06em;text-transform:uppercase; + color:var(--navy); } -.btn-d{background:var(--navy2);color:#F7F6F1} -.btn-d:hover{background:#96090F;transform:translateY(-1px)} -.btn-o{background:transparent;color:var(--navy);border:1px solid var(--navy)} -.btn-o:hover{background:var(--navy);color:#F7F6F1} +.btn-d{background:var(--navy);color:var(--stone);border-color:var(--navy)} +.btn-d::after{content:' \2192';color:var(--navy2)} +.btn-d:hover{background:var(--navy2);border-color:var(--navy2);transform:translateY(-1px)} +.btn-o{background:transparent;color:var(--navy)} +.btn-o:hover{background:var(--navy);color:var(--stone)} .hero-stats{ - flex:0 1 300px;position:relative;z-index:1; + position:relative;z-index:1; display:flex;flex-direction:column; - align-self:flex-start; + align-self:start; border-top:1px solid var(--navy); } .stat{ - padding:13px 2px; + padding:16px 2px; border-bottom:1px solid var(--line); display:flex;align-items:baseline;justify-content:space-between;gap:12px; } -.stat-val{font-size:13.5px;font-weight:600;color:var(--navy);letter-spacing:-.01em;font-family:var(--f-head)} +.stat-val{font-size:14px;font-weight:600;color:var(--navy);letter-spacing:-.01em;font-family:var(--f-head)} .stat-lbl{font-size:10px;color:var(--muted);font-family:var(--f-mono);text-transform:uppercase;letter-spacing:.05em;text-align:right} /* ---------- SECTIONS ---------- */ .sec{border-bottom:1px solid var(--line)} -.sec-body{padding:64px var(--pad);max-width:var(--container);margin:0 auto} +.sec-body{padding:96px var(--pad);max-width:var(--container);margin:0 auto} .section-label{display:flex;align-items:baseline;gap:14px;margin:0 0 32px} .section-label .num{font-family:var(--f-mono);font-size:13px;color:var(--navy2);flex-shrink:0} @@ -222,7 +217,7 @@ nav.nav-open .nav-burger span:nth-child(3){transform:translateY(-5.5px) rotate(- .about-split{ border-bottom:1px solid var(--line); max-width:var(--container);margin:0 auto; - padding:64px var(--pad); + padding:96px var(--pad); display:grid;grid-template-columns:1.3fr 1fr;gap:56px; } .about-text p{font-size:14.5px;color:var(--mid);line-height:1.75;font-weight:400;margin-bottom:16px} @@ -349,21 +344,25 @@ nav.nav-open .nav-burger span:nth-child(3){transform:translateY(-5.5px) rotate(- .note-t{font-size:13px;font-weight:600;color:var(--navy);margin-bottom:4px;font-family:var(--f-head)} .note-d{font-size:12.5px;color:var(--mid);line-height:1.6;font-weight:400} -.gh-list{border-top:1px solid var(--navy)} -.gh-item{ - display:flex;align-items:center;justify-content:space-between; - padding:18px 2px; - border-bottom:1px solid var(--line); - transition:background .15s;gap:16px; +.row-index{border-top:1px solid var(--navy)} +.repo-row{ + display:grid;grid-template-columns:1fr 220px;gap:24px; + padding:22px 2px;border-bottom:1px solid var(--line);align-items:start; + transition:background .15s; } -.gh-item:hover{background:var(--stone3)} -.gh-n{font-size:13px;font-weight:500;color:var(--navy);margin-bottom:3px;font-family:var(--f-mono)} -.gh-d{font-size:12px;color:var(--mid);font-weight:400;font-family:var(--f-body)} -.gh-r{display:flex;align-items:center;gap:14px;flex-shrink:0} -.gh-lang,.gh-stars{font-size:10px;font-family:var(--f-mono);color:var(--mid);text-transform:uppercase;letter-spacing:.04em} -.gh-stars{color:#8A6416} -.gh-lnk{color:var(--navy2);text-decoration:none;font-size:11px;font-family:var(--f-mono);text-transform:uppercase;letter-spacing:.04em;transition:opacity .14s} -.gh-lnk:hover{opacity:.6} +.repo-row:hover{background:var(--stone3)} +.repo-row h3{font-family:var(--f-mono);font-weight:500;font-size:15px;margin-bottom:8px;color:var(--navy)} +.repo-row p{font-size:13px;color:var(--mid);line-height:1.6;max-width:560px;font-family:var(--f-body);font-weight:400} +.repo-meta{display:flex;justify-content:flex-end;align-items:baseline;gap:14px;flex-wrap:wrap;white-space:nowrap} +.repo-meta .lang{font-family:var(--f-mono);font-size:11px;color:var(--mid);text-transform:uppercase;letter-spacing:.05em} +.repo-meta .kind{font-family:var(--f-mono);font-size:11px;color:var(--mid);text-transform:lowercase;letter-spacing:.02em;font-style:italic} +.repo-meta .kind::before{content:'type: ';color:var(--line)} +.repo-meta .star{font-family:var(--f-mono);font-size:11px;color:var(--mid)} +.repo-meta .star::before{content:'\2605 ';color:var(--navy2)} +.repo-meta .action{color:var(--navy2);text-decoration:none;font-size:12px;font-family:var(--f-mono);text-transform:uppercase;letter-spacing:.05em;transition:opacity .14s} +.repo-meta .action::after{content:' \2197'} +.repo-meta .action:hover{opacity:.6} +.repo-meta .action.issue{color:var(--mid)} /* ---------- ACCORDION ---------- */ .acc{display:flex;flex-direction:column} @@ -421,7 +420,7 @@ nav.nav-open .nav-burger span:nth-child(3){transform:translateY(-5.5px) rotate(- } /* ---------- CONTACT ---------- */ -.contact{border-bottom:1px solid var(--line);padding:64px var(--pad)} +.contact{border-bottom:1px solid var(--line);padding:96px var(--pad)} .contact-body{ max-width:var(--container);margin:0 auto; background:var(--navy); @@ -547,6 +546,7 @@ footer a:hover{color:var(--navy2)} /* ---------- RESPONSIVE ---------- */ @media(max-width:1100px){ :root{--pad:28px} + .hero-row{grid-template-columns:1fr;gap:32px} .about-split{grid-template-columns:1fr;gap:36px} .about-card{max-width:440px} } @@ -563,7 +563,8 @@ footer a:hover{color:var(--navy2)} .nav-links a{padding:14px 16px;font-size:14px} .nav-socials{margin:10px 0 0;padding:14px 16px 0;border-left:none;border-top:1px solid var(--line);justify-content:flex-start} .nav-burger{display:flex} - .category-row,.detail-row{grid-template-columns:1fr;gap:8px} + .category-row,.detail-row,.repo-row{grid-template-columns:1fr;gap:8px} + .repo-meta{justify-content:flex-start} .core-band{grid-template-columns:1fr;gap:10px} .quant-grid{grid-template-columns:1fr} .quant-cell:nth-child(odd){border-right:none} @@ -572,7 +573,7 @@ footer a:hover{color:var(--navy2)} } @media(max-width:700px){ :root{--pad:18px} - .hero-row{padding:56px var(--pad) 48px;flex-direction:column} + .hero-row{padding:56px var(--pad) 48px} .sec-body,.about-split,.contact{padding:40px var(--pad)} .contact-body{padding:40px 24px} } diff --git a/app/page.tsx b/app/page.tsx index 9c4d24d..ebd7372 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -115,7 +115,6 @@ export default function Home() { {/* HERO */}
-
Lugano · Switzerland · USI Economics student
Pietro
Quintavalle
@@ -124,7 +123,7 @@ export default function Home() {

5+ years building production-grade infrastructure from the ground up. I design resilient systems and write the software that runs on top of them then secure and monitor all of it myself.

- Get in touch → + Get in touch Explore homelab View projects
@@ -371,7 +370,6 @@ export default function Home() { MotherboardGigabyte X870E AORUS PRO X3D ICE OSCachyOS RoleDev · Gaming · 3D Modelling · 3D Printing · Daily Driver - KeyboardWeikav Stars 75 · Huano Sakura switches (hand-lubed, custom assembly) @@ -400,14 +398,6 @@ export default function Home() {
X870EPCIe 5.0USB4DDR5 6000WiFi 7
-
-
04
-
Weikav Stars 75
-
-
Fully custom 75% aluminium keyboard hand-lubed Huano Sakura tactile switches, gasket mount, per-key RGB, 1000Hz polling. Full assembly and switch tuning done from scratch.
-
75% layoutHuano SakuraTactileHand-lubedGasket mountAluminium1000Hz
-
-
@@ -527,10 +517,29 @@ export default function Home() {

Open Source Contributions

-
-
libratbag/libratbag
Reverse-engineered the full USB HID protocol (via Wireshark/USBPcap capture analysis) for an unsupported gaming mouse and wrote a complete libratbag driver from scratch DPI, polling rate, debounce, and button remapping, with persistence verified on real hardware.
CPR #1873 ↗
-
libratbag/piper
Companion contribution to the driver above custom device artwork and Piper GUI integration so the new mouse is recognised and configurable in the Piper front-end.
SVGPR #1121 ↗
-
ValveSoftware/steam-for-linux
Diagnosed and fixed a Steam Linux Runtime install bug via config.vdf and appmanifest inspection after all standard recovery paths (integrity verification, manifest wipes, steamcmd re-install) failed; workaround adopted by other affected users.
DebuggingIssue #13248 ↗
+

External pull requests and issues resolved in other maintainers’ codebases work landed in repos I don’t own.

+
+
+
+

libratbag/libratbag

+

Reverse-engineered the full USB HID protocol (via Wireshark/USBPcap capture analysis) for an unsupported gaming mouse and wrote a complete libratbag driver from scratch DPI, polling rate, debounce, and button remapping, with persistence verified on real hardware.

+
+ +
+
+
+

libratbag/piper

+

Companion contribution to the driver above custom device artwork and Piper GUI integration so the new mouse is recognised and configurable in the Piper front-end.

+
+ +
+
+
+

ValveSoftware/steam-for-linux

+

Diagnosed and fixed a Steam Linux Runtime install bug via config.vdf and appmanifest inspection after all standard recovery paths (integrity verification, manifest wipes, steamcmd re-install) failed; workaround adopted by other affected users.

+
+
debuggingIssue #13248
+
@@ -539,12 +548,43 @@ export default function Home() {

My Projects on GitHub

-
-
Quinta0/re-soulcommand
Music recommendation downloader ListenBrainz & Last.fm playlists into Navidrome via slskd. Author & maintainer.
PythonRepo ↗
-
Quinta0/Ainulindale
Self-hosted music discovery & streaming stack auto-discovery, Soulseek P2P download via VPN, Navidrome streaming. Author & maintainer.
-
Quinta0/Nargothrond
Documentation for full homelab provisioning.
HardwareRepo ↗
-
Quinta0/ObsidianSetup
Cross-platform Obsidian + plugin installer, driven by a shared plugins.json manifest. Author & maintainer.
★ 26PowerShellRepo ↗
-
Quinta0/BostonHousing
Probability & Statistics coursework at USI regression models predicting Boston-area housing prices.
JupyterRepo ↗
+

The complete repository list including the projects featured above, plus the smaller tools and documentation that support them.

+
+
+
+

Quinta0/re-soulcommand

+

Music recommendation downloader ListenBrainz & Last.fm playlists into Navidrome via slskd. Author & maintainer.

+
+
PythonRepo
+
+
+
+

Quinta0/Ainulindale

+

Self-hosted music discovery & streaming stack auto-discovery, Soulseek P2P download via VPN, Navidrome streaming. Author & maintainer.

+
+
ShellRepo
+
+
+
+

Quinta0/Nargothrond

+

Documentation for full homelab provisioning.

+
+
docsRepo
+
+
+
+

Quinta0/ObsidianSetup

+

Cross-platform Obsidian + plugin installer, driven by a shared plugins.json manifest. Author & maintainer.

+
+
26PowerShellRepo
+
+
+
+

Quinta0/BostonHousing

+

Probability & Statistics coursework at USI regression models predicting Boston-area housing prices.

+
+
JupyterRepo
+
diff --git a/switzerland.svg b/switzerland.svg deleted file mode 100644 index cf92cec..0000000 --- a/switzerland.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -