diff --git a/app/globals.css b/app/globals.css index 2f9b131..ba839b1 100644 --- a/app/globals.css +++ b/app/globals.css @@ -164,6 +164,28 @@ nav{ font-size:14.5px;color:var(--mid);line-height:1.68; max-width:500px;margin-bottom:36px;font-weight:300; } +.hero-thesis{ + font-size:13.5px;color:var(--navy);line-height:1.55; + max-width:480px;margin-bottom:16px;font-weight:500; + font-style:italic; +} +.now-line{ + display:inline-flex;align-items:flex-start;gap:7px; + font-size:12px;color:var(--mid);line-height:1.5; + max-width:480px;margin-bottom:20px; + padding:8px 12px;background:var(--stone2); + border:1px solid var(--line3);border-radius:4px; +} +.now-line strong{color:var(--navy);font-weight:600} +.now-dot{color:#4CAF7D;font-size:8px;flex-shrink:0;margin-top:4px} +.status-badge{ + display:inline-flex;align-items:center;gap:7px; + margin-bottom:22px;text-decoration:none; + font-size:12px;color:var(--mid);font-family:'DM Mono',monospace; +} +.status-badge img{height:20px;display:block;border-radius:2px} +.status-badge span{border-bottom:1px solid var(--line3)} +.status-badge:hover span{color:var(--navy);border-color:var(--line2)} .btns{display:flex;gap:9px;flex-wrap:wrap} .btn{ display:inline-flex;align-items:center;gap:7px; @@ -227,6 +249,38 @@ nav{ .t-k{color:#82B4D0}.t-v{color:rgba(232,229,223,.8)} .cur{display:inline-block;width:7px;height:12px;background:rgba(232,229,223,.5);vertical-align:middle;animation:bl 1s step-end infinite} @keyframes bl{0%,100%{opacity:1}50%{opacity:0}} + +.t-stage{position:relative;min-height:400px} +.t-pane{position:absolute;inset:0;opacity:1;transition:opacity .55s ease} +.t-pane.t-hidden{opacity:0;pointer-events:none} +.t-cmd-row{display:flex;align-items:center;gap:6px;margin-top:2px} +.t-input{background:transparent;border:none;outline:none;color:rgba(232,229,223,.85);font:inherit;flex:1;caret-color:#5FCE8A} +.t-hint{color:rgba(232,229,223,.28);font-size:11px;margin-top:10px} +.t-pane.t-egg-pane{ + display:flex;flex-direction:column;align-items:center;justify-content:center; + text-align:center;gap:12px;padding:18px 20px; + opacity:0;pointer-events:none; +} +.t-pane.t-egg-pane.t-egg-show{opacity:1;pointer-events:auto} +.t-ascii-scroll{max-width:100%;overflow-x:auto} +.t-ascii{white-space:pre;margin:0;line-height:1.05;font-family:'DM Mono',monospace} +.t-ascii-moria{ + font-size:clamp(5px,2.1vw,8.5px); + color:#7ee7ff; + text-shadow:0 0 4px #7ee7ff,0 0 14px rgba(126,231,255,.55),0 0 28px rgba(126,231,255,.3); + animation:t-pulse-cyan 2.2s ease-in-out infinite; +} +.t-ascii-balrog{ + font-size:clamp(3px,1vw,4.8px); + color:#ff7a3d; + text-shadow:0 0 4px #ff7a3d,0 0 14px rgba(255,122,61,.6),0 0 30px rgba(255,80,20,.35); + animation:t-pulse-fire 1.4s ease-in-out infinite; +} +@keyframes t-pulse-cyan{0%,100%{filter:brightness(1)}50%{filter:brightness(1.35)}} +@keyframes t-pulse-fire{0%,100%{filter:brightness(1) hue-rotate(0deg)}50%{filter:brightness(1.4) hue-rotate(-6deg)}} +.t-egg-cap{font-size:11px;letter-spacing:.02em;font-family:'DM Mono',monospace;color:rgba(232,229,223,.45)} +.t-egg-cap-moria{color:#a9e9f7} +.t-egg-cap-balrog{color:#ffb08a} .about-right p{font-size:14px;color:var(--mid);line-height:1.72;font-weight:300;margin-bottom:14px} .about-right strong{color:var(--navy);font-weight:500} @@ -321,6 +375,7 @@ nav{ .gh-d{font-size:12px;color:var(--mid);font-weight:300} .gh-r{display:flex;align-items:center;gap:8px;flex-shrink:0} .gh-lang{font-size:10.5px;font-family:'DM Mono',monospace;color:var(--muted);padding:2px 7px;border:1px solid var(--line);border-radius:2px} +.gh-stars{font-size:10.5px;font-family:'DM Mono',monospace;color:#B08A2E;padding:2px 7px;border:1px solid var(--line);border-radius:2px} .gh-lnk{color:var(--mid);text-decoration:none;font-size:12px;font-family:'DM Mono',monospace;transition:color .14s} .gh-lnk:hover{color:var(--navy)} @@ -406,4 +461,4 @@ footer p,footer a{font-size:12px;color:rgba(232,229,223,.24);text-decoration:non .sk4,.hl3,.pr3{grid-template-columns:1fr} .langs{grid-template-columns:repeat(2,1fr)} .sec-body,.about-right,.contact-body,.hero-main{padding:32px 20px} -} +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 93c3245..875bc9f 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -2,6 +2,98 @@ import { useState } from 'react' +const DURIN_ART = ` ______________ _ _,-----------._ ___ +| | (_,.- _,-'_,-----------._\`-._ _)_) +| THE _ _ _ | | ,'_,-' ___________ \`-._\`. +| | / \\|_)| \\ | \`' ,',' _,-'___________\`-._ \`.\`. +| |__\\_/| \\|_/ | ,',' ,'_,-' . \`-._\`. \`.\`. +| | /,' ,',' >|< \`.\`. \`.\\ +| OF THE _ _ | // ,',' >< ,^. >< \`.\`. \\\\ +| |_)||\\|/_(_ | // /,' >< / | \\ >< \`.\\ \\\\ +| | \\|| |\\_|_) | // // >< \\/\\^/\\/ >< \\\\ \\\\ +|______________| ;; ;; \`---' :: :: + || || (____ || || + DOORS OF DURIN _||__||_ ,'----. _||__||_ + (o.____.o)____ \`---' ____(o.____.o) + | | /,--.) (,--.\\ | | + | |(( -\`___ ___\` ))| | + | | \\\\,'', \`. .' .\`\`.// | | + | | // (___,'. .'.___) \\\\ | | + /| | ;;)) ____) . . (____ ((\\\\ | |\\ + \\|.__ | ||/ .'.--.\\/ \`/,--.\`. \\;: | __,|; + |\`-,\`;.| :/ /,' \`)-' \`-(' \`.\\ \\: |.;',-'| + | \`.. ' / \\__.' \`.__/ \\ \` ,.' | + | |,\\ /, ,\\ /,| | + | ||: : ) . ( : :|| | + /| |:; |/ . ./|\\, , \\| :;| |\\ + \\|.__ |/ : ,/- <--:--> ,\\. ; \\| __,|; + |\`-.\`\`: \`'/-. '\\|/\` ,-\\\`; ;'',-'| + | \`.. ,' \`' ' \` \`. ,.' | + | || : : || | + | || | | || | + | || | | || | + | |' | _ | \`| | + | | | '|)) | | | + ;____: \`._ \`' _,' ;____: + {______} \\___________________/ {______} + SSt |______|_______________________________|______|` + +const BALROG_ART = `############################+##++++++########+++++-----. ------------ . - --.--- --.--.------...---------------..--- +###############################+++++++####+++++----- --- - ---- -- -. ..- - - ------------------------------- +##########################+++++++++++++#####+++---. . -- - - - - .--.----------------------------- +########################+++#+++++++++######++++-. ..--++++++------..----- - ------------.- --------- +###########################+##+++++++++++##++- -++++++++--+--------.- .. ...-.. - ----------------.--------- +############################+++++++++++++#++-+ - -++++++++++++------+++---++-------------. -.----------.-------- +#############################++++++++++++#++++- --- ++++++++++++++++--+++++++------------------------- -------------.--- +#############################++++++++++++++++--- .+##+++++++++++++++++++++++++---------------------------.---------------- +############++#+###+#+++#####++++++++++++++-- --- -- -+###+++++++++++++++++++++++++----+--------------------------------------- +###########++++++++++++#++++++++++++++--..---- . .-- .. -+#####++++++++++++++++++++++++-+--++++------------------------------------- +############+++++++++++++++++++++++++++++++++.+ ..--.- +#########+++++++++++++++++++++++++++----+------------------------.----------- +############++++++++++++++++++++++-+++++++++++++.. + .++#####++#++++#++++++++++++++++++++++++++-------+--------------------- --------- +########+#+++++++++++++++++++++---++++-+++++++++.. -+#########-+ .+++++++++++++++++++++++-++++-+++++----+-------------------+-------- ++######+#+++++++++++++++++++++-+++++++-++++++++++##+-.+++++++#+ +++++++++++++++++++++++-----+++++++++++-----+--------+------------- +++##+++++++++++++++++++++++++++++++++++++-+++.++++-+ .+++++-++++++++++++++++++++++----+---------------+++++++-----+---------------- +++++++++++++++++++++++++++##+++++++++++++++. ++# ++ +-.++++++++++++++++#++++---+------------------------+-+++---+++-+---+-----.---- ++++++++++++++++++++++++###++++++++++++++++++-+++- +++ ++++++++++++++#++++-++----+-+----------------------+---++++++++----+--++++---- ++++++++++++++++++++++###++++++++++++++++++++++++ +#+#+#+#+++#######+++#----------------------------------+-++----++-+++--+++++++----. ++++++++++++++++++++++++#++++++++++++-++++++++++##++++#++#+++#+++#+#+++++++++--+----------+------------------+-++--++-+--++++++-++-.--- +++++++++++++++++++++++++++++++++++++++++++#+++++-++++##+#++##++####+++++++++++-+-----------+------------------+---++++++++++++++-++--- ++++++++++++++++++++++++++++++++++++++++--++++++#++++###+#++#+#++++++++++++++++++++---+---------------------------+++++++++++++++++++-- ++++++++++++++++++++++++++++++-------++--+++++#++++#+#######+#++++#+#-++-+++++++++++------------------------------+--++++++++++++++++-- ++++++++++++++++++++++++++++-------+-----+#+++#+++# #.# #+####+###++--+++++++++++++--------------.-------------+-++--++++++++++++++-- ++++++++++++++++++++++++-----------------+++#+--# . - - .+####+##++-----++++++++--+----+-+--------.--------------+-----+++++++++++++-- ++++++++++++++++++++++-------++----------#++++# - #. ####+-+-.+--+++++++---+++++++----------------------------.--++++++++++++-- ++++++++++++++--+++++-+-------+----------+++##. . + +#+- -++---+ ++++----+++++++++---------------------------..+++++++++++++-- ++++++++++++++-++++++---------------------#++ ---. +#- +++-. -++----++-+-+-+++++--------------------------..-+++++++++++++-- +++++++++++++++-----+--------------++++++++#+ +...-- + . - ----+-+++--++-+++-----------------------.---++++++++++++++-- +++++++++----++--+++----------+++++++++++-++#++. . . ----+----++---+--++-------------------------+ +++++++++++++--- ++++++++++---+--------------++++++++++++++++...-. . -----------+---++++------------------------++++++++++++++++--- ++++++++---+-++-+++-+-----+++++++++++++++++------ .. ---------+-----+++++-+-----------------++++++++++++++++++---- ++++++++-+++-+----++------+++++++++++++++++++++--- ....----+--+------++++-++------------.+.+++++++++++##+++++++---- +++++++++++++++++------+++++++++++++++++++++++++--. . ... ++---+--+----++++---++-------.+-.+++++++++++++#######+------ +++++---++++------+---++++++++++++++++++++++++++---. ...-.--+--+---++--+------+-+--.-.++.+#+++#+++++###++++++#--------- +-++++.--+++++---+----+++++++++++++++++++++++++++-+-... ......---+++-++----++-----+--.---++####+++++###--++####++-----.---- +++++-----+----------++++++++++++++++++++++++++++++--.... ..------++++--------------.+- ############+++##+###+--------------- ++++-+++------------++++++++++++++++++++++++++++++----..... ..----+. -+---------- ---..+###+####+###-#####++-+--.--------------- ++++++++++--.------+++++++++++++++++++++++++++++. -----.... . . ..-++-+--+----------- .#++++#++##+--++++---+-----------.----------- +-----+-+++--------++++++++++++++++++++++++++++++---.--.... . .. ---++-.+------------ .+-++##--#+--++--.----------------------------- +-------+++--------++++#++++++++++++++++++++++-+-------..-. .---+--+++---------. +#-#+#+--+------.---.---.----- ----------------.. +-------++++++-+------.+++++++++++++++++-++++++++-- ----..... ..----+--+.++-------- +--#++-------------------------....-.---------..-- +------++++++++++++---+--##++++++++++++++++++++---------......-.--+++-.-++---.---. -##++----------------------- ---.....---------...... +-++---++++++#+++++##++...+#++++++++ +++++++++---------...-.---.++++...--.-+-----..+#+-----------.---------------.... ......-......... +-------+++-+++#+# ++#+....+##+#++++#+++++++++----++++---...----++++-..+.--++---.+#+-------------------------..... . ....... . ... +++----+++++++-+---###+-+..-##+##+##+++++++++-.--------.--------+-+--------++---.#-----------..----------...... .. . .. +++++-+++++++++++++++##++-..##++++##+++++++++-+----..----+---+--++---------++-------------------------...-. . . .... +++++++++++++++++++++++##-..+++++++ ++++++ +- - --------------+-.---------------- ----------.----------.... . . +-+++++++-+++++++++++++#+--++.++-----------------------. .--- --------------------------------------...--..... ...... . +-++++--++++++++++++++++-++ -++.-------.------------ ------.---------.....--------------------- .--- ....... ...... +----------++++--------+++.----------..--------.------------ ...-.-.-.----------------------..---.--. .. ........ +-----.-...-------------------------------.------ -----..----...-.........-----------------.. .-.... ....... ... . +........ .--------------------------------------- --... ---......----.. . - ----------.--...-... ......... .. + ... ..---------------.--.-------------...-.---------.. ....-...... --- --- ---.-----...... . +...... .-----.-.----------.---------------..--------.--...... . ..----------------.-.. .. + . ...--------------------------...----.--------.-..---.-. .---------------------. . ` + const ChevronDown = () => ( @@ -18,6 +110,33 @@ export default function Home() { setOpenAcc(prev => ({ ...prev, [id]: !prev[id] })) } + const [cmd, setCmd] = useState('') + const [eggView, setEggView] = useState<'main' | 'moria' | 'balrog'>('main') + const [eggBusy, setEggBusy] = useState(false) + + const triggerEgg = (view: 'moria' | 'balrog') => { + if (eggBusy) return + setEggBusy(true) + setEggView(view) + setTimeout(() => { + setEggView('main') + setCmd('') + setEggBusy(false) + }, 4200) + } + + const handleTermKey = (e: React.KeyboardEvent) => { + if (e.key !== 'Enter' || eggBusy) return + const value = cmd.trim().toLowerCase() + if (value === 'mellon') { + triggerEgg('moria') + } else if (value === 'you shall not pass') { + triggerEgg('balrog') + } else { + setCmd('') + } + } + return ( <>
@@ -67,7 +186,9 @@ export default function Home() {
Lugano · Switzerland · USI Economics student
Pietro
Quintavalle
Systems Engineer · Developer · Homelabber
-

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.

+

Economics models incentives under constraints; infrastructure models constraints under load I like sitting where those two disciplines overlap.

+

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 → Explore homelab @@ -76,7 +197,7 @@ export default function Home() {
⚡
90%+ uptime
Production servers
-
💻
6–10 servers
Under management
+
💻
4 servers
Under management
📅
5+ years
SysAdmin experience
🎓
BSc Economics
USI · Ongoing
🌐
IT · EN · DE · ES · NO
5 languages
@@ -90,32 +211,61 @@ export default function Home() {
quinta@proxmox:~
-
-
➤ ~ neofetch
-
 
-
OS Proxmox VE 8 / UNRAID 7.3.1 / TrueNAS
-
Virt LXC · Docker · KVM
-
DNS Cloudflare · AAAA · AdGuard
-
Tunnels Cloudflare Tunnel · Newt
-
Proxy Pangolin + Traefik + Auto-TLS
-
Security Fail2Ban · Crowdsec · Authelia
-
Storage UNRAID parity · ZFS RAID-Z
-
Media Jellyfin · Navidrome · *arr
-
Music Listenbrainz · Symfonium
-
Monitor Grafana · Prometheus · Kuma
-
Code Python · TypeScript · SQL
-
Status Open for work ●
-
 
-
➤ ~
+
+
+
➤ ~ neofetch
+
 
+
OS Proxmox VE 8 / UNRAID 7.3.1 / TrueNAS
+
Virt LXC · Docker · KVM
+
DNS Cloudflare · AAAA · AdGuard
+
Tunnels Cloudflare Tunnel · Newt
+
Proxy Pangolin + Traefik + Auto-TLS
+
Security Fail2Ban · Crowdsec · Authelia
+
Storage UNRAID parity · TrueNAS ZFS RAID 10
+
Media Jellyfin · Navidrome · *arr
+
Music Listenbrainz · Symfonium
+
Monitor Grafana · Prometheus · Kuma
+
Code Python · TypeScript · SQL
+
Status Open for work ●
+
 
+
+ ➤ ~ + setCmd(e.target.value)} + onKeyDown={handleTermKey} + autoComplete="off" + spellCheck={false} + aria-label="terminal command input" + /> +
+
try typing something...
+
+ +
+
+
{DURIN_ART}
+
+
the doors of durin, lord of moria speak, friend, and enter
+
+ +
+
+
{BALROG_ART}
+
+
a demon of the ancient world YOU SHALL NOT PASS
+
About me
-

Hi — friends call me Quinta. I’m an Economics student at USI Lugano and a self-taught systems engineer who’s been running homelab infrastructure since 2020.

+

Hi friends call me Quinta. I’m an Economics student at USI Lugano and a self-taught systems engineer who’s been running homelab infrastructure since 2020.

My setup spans everything from bare-metal Proxmox clusters to DNS and domain management via Cloudflare, Pangolin/Traefik reverse proxying, and a full media+music automation pipeline.

-

On the academic side I’m deepening my understanding of microeconomics, macroeconomics, game theory, and quantitative finance — and finding more overlap with systems thinking than you’d expect.

-

Daily driver — Ryzen 7 9800X3D · RTX 5080 · hand-built custom keyboard

+

On the academic side I’m deepening my understanding of microeconomics, macroeconomics, game theory, and quantitative finance and finding more overlap with systems thinking than you’d expect.

+

Daily driver Ryzen 7 9800X3D · RTX 5080 · hand-built custom keyboard

@@ -145,6 +295,7 @@ export default function Home() {
🎓 Google Data Analytics Professional Certificate
🎓 Google IT Support Professional Certificate
+
🎓 Microsoft Foundations of IT Systems, Networking & Data Protection
@@ -221,7 +372,7 @@ export default function Home() {
Personal Workstation
-

Daily driver and dev machine. Built around AMD’s 3D V-Cache architecture for a blend of high single-threaded performance and serious GPU compute — doubles as a gaming rig, 3D modelling workstation, and 3D printing controller.

+

Daily driver and dev machine. Built around AMD’s 3D V-Cache architecture for a blend of high single-threaded performance and serious GPU compute doubles as a gaming rig, 3D modelling workstation, and 3D printing controller.

@@ -254,7 +405,7 @@ export default function Home() {
⌨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.
+
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
@@ -285,7 +436,7 @@ export default function Home() {
↗ Open Source
Personal Project
-
Valgo — Algorithm Visualizer
+
Valgo Algorithm Visualizer
Step-by-step algorithm visualisation built with React and Next.js. Sorting, graph, and search algorithms with live code annotations and speed controls.
ReactNext.jsTypeScriptTailwind
@@ -300,20 +451,20 @@ export default function Home() { ● Live
Personal Homelab
Self-Hosted Stack (IaC)
-
Entire homelab reproduced from code — Ansible playbooks, Docker Compose, and Bash scripts. Idempotent provisioning; full rebuild in under 30 minutes from scratch.
+
Entire homelab reproduced from code Ansible playbooks, Docker Compose, and Bash scripts. Idempotent provisioning; full rebuild in under 30 minutes from scratch.
AnsibleComposeBashIaC
↗ Open Source
Personal Project
re-soulcommand
-
Music recommendation downloader integrating ListenBrainz and Last.fm playlists with Navidrome via slskd (Soulseek daemon). Fork rebuilt around a REST API backend — stripped of bloat, Docker-native.
+
Music recommendation downloader integrating ListenBrainz and Last.fm playlists with Navidrome via slskd (Soulseek daemon). Fork rebuilt around a REST API backend stripped of bloat, Docker-native.
PythonDockerListenBrainzLast.fmslskdNavidrome
● Live
Personal Homelab
-
Ainulindale — Music Stack
+
Ainulindale Music Stack
Fully self-hosted music discovery and streaming platform. Auto-discovers music weekly from listening habits, downloads via Soulseek P2P through a VPN gateway, streams via Navidrome. No commercial services required.
DockerNavidromeslskdGluetunListenBrainzProtonVPN
@@ -331,6 +482,20 @@ export default function Home() {
Intel Core i7-8700 node running Proxmox VE 8 for LXC containers and KVM VMs. VLAN-segmented network, Tailscale + SSH access, acts as the compute backbone for all hosted services.
Proxmox VE 8LXCKVMTailscaleVLAN32GB DDR4
+
+ ↗ Open Source · ★ 26 +
Personal Project
+
ObsidianSetup
+
Cross-platform utility script that makes installing Obsidian and its plugins consistent across devices PowerShell and Bash installers driven by a single plugins.json manifest.
+
PowerShellBashObsidianAutomation
+
+
+ ↗ Open Source +
Academic Project
+
Boston Housing Price Prediction
+
Probability & Statistics coursework at USI built and evaluated regression models on the classic Boston housing dataset to predict median home values from neighbourhood features.
+
Pythonscikit-learnRegressionJupyterStatistics
+

More projects at github.com/Quinta0 ↗ @@ -343,13 +508,13 @@ export default function Home() {

-
GitHub — Contributions & Issues
+
GitHub Contributions & Issues
-
Quinta0/valgo
Algorithm visualizer — step-by-step sorting, graph and search walkthroughs. Author & maintainer.
TypeScript↗ repo
-
Quinta0/finance-tracker
50/30/20 budgeting dashboard with Django and Chart.js. Author & maintainer.
Python↗ repo
-
Quinta0/re-soulcommand
Music recommendation downloader — ListenBrainz & Last.fm playlists into Navidrome via slskd. Author & maintainer.
Python↗ repo
-
Quinta0/Ainulindale
Self-hosted music discovery & streaming stack — auto-discovery, Soulseek P2P download via VPN, Navidrome streaming. Author & maintainer.
+
Quinta0/re-soulcommand
Music recommendation downloader ListenBrainz & Last.fm playlists into Navidrome via slskd. Author & maintainer.
Python↗ repo
+
Quinta0/Ainulindale
Self-hosted music discovery & streaming stack auto-discovery, Soulseek P2P download via VPN, Navidrome streaming. Author & maintainer.
Quinta0/homelab
IaC scripts, Ansible playbooks, Docker Compose stacks for full homelab provisioning.
+
Quinta0/ObsidianSetup
Cross-platform Obsidian + plugin installer, driven by a shared plugins.json manifest. Author & maintainer.
★ 26PowerShell↗ repo
+
Quinta0/BostonHousing
Probability & Statistics coursework at USI regression models predicting Boston-area housing prices.
Jupyter↗ repo
@@ -364,16 +529,16 @@ export default function Home() {

End-to-end IT infrastructure for private and business clients in Ticino.

    -
  • Delivered and maintained 6–10 production servers at 90%+ uptime using containerisation, IaC, and automated monitoring — all without managed hosting.
  • -
  • Eliminated public exposure across all client servers by routing every external entry-point through Cloudflare Tunnels and Pangolin/Traefik — zero open ports, DNSSEC enforced, split-DNS via AdGuard Home.
  • +
  • Delivered and maintained 4 production servers at 90%+ uptime using containerisation, IaC, and automated monitoring all without managed hosting.
  • +
  • Eliminated public exposure across all client servers by routing every external entry-point through Cloudflare Tunnels and Pangolin/Traefik zero open ports, DNSSEC enforced, split-DNS via AdGuard Home.
  • Pangolin + Traefik reverse proxy with Authelia SSO, automatic TLS, and Newt tunnelling.
  • Fail2Ban + Crowdsec intrusion detection; UFW + iptables firewall rules across all nodes.
  • -
  • Reduced storage recovery time to under 30 minutes by implementing ZFS RAID-Z snapshots and automated rsync offsite backups on all storage nodes.
  • +
  • Reduced storage recovery time to under 30 minutes with ZFS snapshots on the TrueNAS RAID 10 array and automated rsync offsite backups across all storage nodes.
  • Music pipeline: Lidarr → Prowlarr → Beets → Navidrome + Listenbrainz scrobbling + Symfonium/Explo mobile.
  • Windows Server: Active Directory, DNS, DHCP, Group Policy, Disaster Recovery planning.
@@ -386,15 +551,15 @@ export default function Home() {

Ongoing bachelor’s focusing on rigorous theory and quantitative methods.

    -
  • Microeconomics — consumer and producer theory, market structures (perfect competition, oligopoly, monopoly), welfare economics, externalities.
  • -
  • Macroeconomics — GDP and growth models, IS-LM, monetary and fiscal policy, open economy models, inflation and unemployment dynamics.
  • -
  • Game Theory — Nash equilibrium, dominant strategies, extensive and normal form games, mechanism design, auction theory, repeated games.
  • -
  • Quantitative Finance & Statistics — probability theory, statistical inference, regression analysis, time series, financial modelling, portfolio theory basics.
  • +
  • Microeconomics consumer and producer theory, market structures (perfect competition, oligopoly, monopoly), welfare economics, externalities.
  • +
  • Macroeconomics GDP and growth models, IS-LM, monetary and fiscal policy, open economy models, inflation and unemployment dynamics.
  • +
  • Game Theory Nash equilibrium, dominant strategies, extensive and normal form games, mechanism design, auction theory, repeated games.
  • +
  • Quantitative Finance & Statistics probability theory, statistical inference, regression analysis, time series, financial modelling, portfolio theory basics.
  • Accounting, Statistics, and Quantitative Methods for economic analysis.
@@ -404,16 +569,16 @@ export default function Home() {

Two years of rigorous computer science foundations before transitioning to Economics.

    -
  • Software Engineering — agile methodologies, requirements engineering, UML modelling, design patterns, and testing practices.
  • -
  • Data Structures & Algorithms — complexity analysis (Big-O), arrays, linked lists, trees, graphs, and sorting and searching algorithms.
  • -
  • Object-Oriented Programming — Java and C++ with inheritance, polymorphism, encapsulation, and SOLID principles.
  • -
  • Web Development — HTML, CSS, and JavaScript fundamentals with introductory full-stack concepts.
  • +
  • Software Engineering agile methodologies, requirements engineering, UML modelling, design patterns, and testing practices.
  • +
  • Data Structures & Algorithms complexity analysis (Big-O), arrays, linked lists, trees, graphs, and sorting and searching algorithms.
  • +
  • Object-Oriented Programming Java and C++ with inheritance, polymorphism, encapsulation, and SOLID principles.
  • +
  • Web Development HTML, CSS, and JavaScript fundamentals with introductory full-stack concepts.
  • Discrete mathematics, logic, and formal reasoning for computer science.
@@ -424,15 +589,15 @@ export default function Home() {

Swiss dual-track qualification combining the academic Maturità with a commercial AFC diploma. Graduated above average in both tracks.

    -
  • Economics & Business — microeconomic principles, business organisation, entrepreneurship, and market dynamics.
  • -
  • Accounting & Finance — double-entry bookkeeping, financial statements, cost accounting, and Swiss business law.
  • -
  • Mathematics & Statistics — algebra, calculus foundations, probability, and descriptive statistics.
  • -
  • Languages — Italian (native instruction), German, English, and French; professional writing and communication.
  • +
  • Economics & Business microeconomic principles, business organisation, entrepreneurship, and market dynamics.
  • +
  • Accounting & Finance double-entry bookkeeping, financial statements, cost accounting, and Swiss business law.
  • +
  • Mathematics & Statistics algebra, calculus foundations, probability, and descriptive statistics.
  • +
  • Languages Italian (native instruction), German, English, and French; professional writing and communication.
  • Maturità Cantonale: 4.5 / 6 · AFC Economics: 5 / 6. Above average in both tracks.
@@ -444,11 +609,11 @@ export default function Home() {
Languages
-
Italian
Native
-
English
Fluent
-
German
Conversational
-
Spanish
Basic
-
Norwegian
Basic
+
Italian
Native · C2
+
English
Fluent · C2
+
German
Conversational · B1–B2
+
Spanish
Basic · A1
+
Norwegian
Basic · A1
@@ -459,7 +624,7 @@ export default function Home() {

Ready to
collaborate?

-

Whether you need server infrastructure, network architecture, a self-hosted media stack, or a Junior SysAdmin — let’s build something reliable together.

+

Whether you need server infrastructure, network architecture, a self-hosted media stack, or a Junior SysAdmin let’s build something reliable together.

✉ 0pietroquintavalle0@gmail.com GitHub ↗ @@ -472,10 +637,10 @@ export default function Home() { {/* FOOTER */}
-

© 2025 Pietro Quintavalle · Lugano, Switzerland

+

© 2026 Pietro Quintavalle · Lugano, Switzerland

Back to top ↑
) -} +} \ No newline at end of file
ComponentSpec