') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); gorlix (Alessandro Gorla) · GitHub
Skip to content
View gorlix's full-sized avatar

Organizations

@RustMinder

Block or report gorlix

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
gorlix/README.md
 db 88888888.dP"Y8.dP"Y8 db 88b 888888b.88""Yb dP"Yb dPYb 8888__ `Ybo." `Ybo." dPYb 88Yb888IYb88__dP dP Yb
dP__Yb 88.o 88"" o.`Y8bo.`Y8b dP__Yb 88Y888I dY 88"YbYb dP
dP""""Yb88ood8 8888888bodP'8bodP' dP""""Yb88Y88888Y" 88YbYbodP dP""b8 dP"Yb88""Yb88 db dP `" dP Yb88__dP 88 dPYb Yb "88Yb dP 88"Yb88.o dP__Yb YboodPYbodP88Yb88ood8 dP""""Yb

Smanetto, rompo cose e poi le rimetto insieme meglio di prima.
Ho la fissa della precisione (non su tutto, eh) e dei dettagli: a volte mi perdo pure su quelli inutili, solo perché non vengono come li ho in testa.
Il mio playground preferito è un homelab che cresce ogni settimana, ma finisco sempre
per scrivere qualche tool che risolve un mio problema (e già che ci sono, anche quello di qualcun altro).
Quando chiudo il terminale scambio dritti a tennis, cerco la curva perfetta sugli sci e ogni tanto
rispolvero il mio passato da pallavolista; per il resto ascolto la stampante 3D che ronza e vado a
caccia di posti dove si mangia bene — questa la lascio qui, poi vedi tu che farci.
Il tempo che avanza lo do al Rotaract Abbiategrasso, dove sono il papà del sito del primo multidistretto italiano.

LinkedInEmaildev.toTwitter


🏗️ Progetto in evidenza — Homelab

Il mio progetto più grande e ambizioso: un homelab autogestito, pensato come palestra di apprendimento continuo. Networking, container, self-hosting, automazione e, soprattutto, documentazione seria, messa giù nero su bianco passo dopo passo. Così che chiunque possa capirci qualcosa (me compreso, tra sei mesi).

➡️ gorlix/homelab — dacci un'occhiata, è documentatissimo

🏠 Super fan della domotica come me? Fai un salto nella sezione Home Assistant del repo per approfondire.


🚀 Progetti

🤖 Vibecoded

Qui il codice l'ha scritto l'AI: mie le scelte infrastrutturali e le decisioni di design ingegneristico, l'architettura e la direzione. Piccoli, utili, e risolvono un problema vero. Quasi tutti ruotano attorno al mio ebook reader Supernote Manta.

RepoCosa fa
sn_make_spacePlugin per Supernote che libera spazio sul dispositivo.
sn-tcp-tunnelIl mio preferito 😎 — attiva socat per incapsulare il flusso video TCP via cavo, così fai streaming anche con reti restrittive o senza connessione.
SuperFlowPlugin di automazione ambizioso, con un sistema di Add-on scrivibili dalla community. (WIP)

🧠 Con supporto AI (ma non solo vibecoding)

Progettati da me, con l'AI come copilota. La testa e l'infrastruttura sono mie, qui sul codice ci ho messo le mani anch'io, l'abbiamo scritto insieme.

RepoCosa fa
MorgenCalendar-Telegram-BotGestisci il tuo calendario Morgen direttamente da Telegram.
AuleLiberePoliMiTrova le aule libere al PoliMi. Nato come PR sul repo originale, adottato quando l'autore ha mollato — ora gira sul mio homelab.
focus-mode-app-linux + ha-focus-mode-linuxProgetto DnD: blocca le app distraenti su Linux sincronizzandosi con lo stato Non Disturbare di Android via Home Assistant (o in standalone). 🦀 In migrazione da Python a Rust / Tauri — per imparare Rust e Tauri sul campo.

⌨️ Fatto a mano

Zero vibecoding: qui il codice l'ho scritto io, riga per riga (sono progetti più vecchi o particolarmente piacevoli).

RepoCosa fa
my-adeptFirmware del mio trackball Ploopy Adept customizzato, con comandi e integrazioni per KDE. (La doc l'ha aiutata l'AI, il codice no.)

⌨️ Una cosa di cui vado fiero — il mio layout ZSA Moonlander

Ho passato troppe ore a limare il layout della mia tastiera split ergonomica, e ne è uscito qualcosa cucito addosso a me:

  • un layer da gaming che mi lascia le dita nella posizione corretta di scrittura, senza rinunciare ai comandi che mi servono;
  • un layout ibrido che sulla fila dei numeri tiene i simboli shiftati della tastiera americana ma conserva gli accenti di quella italiana.

Piccoli dettagli, certo — ma è esattamente lì che mi diverto. Ed è una delle cose di cui vado più fiero.


🌱 In questo periodo mi sto divertendo con Rust.

Pinned Loading

  1. MorgenCalendar-Telegram-BotMorgenCalendar-Telegram-BotPublic

    A high-performance Telegram bot built for power users of the Morgen Calendar

    Python 1

  2. AuleLiberePoliMiAuleLiberePoliMiPublic

    Forked from feDann/AuleLiberePoliMi

    Telegram bot that search for free classrooms at PoliMi!

    Python 5

  3. focus-mode-app-linuxfocus-mode-app-linuxPublic

    🎯 Modalità Studio - Blocca automaticamente app e webapp distraenti durante le sessioni di studio o lavoro. Design Material 3, ottimizzato per KDE Plasma.

    Python 2

  4. SuperFlowSuperFlowPublic

    Automation Plugin for Supernote devices

    Java 9 1

  5. sn-tcp-tunnelsn-tcp-tunnelPublic

    socat-based ADB TCP tunnel plugin for Supernote devices

    PowerShell 7