Website for Linux day toscana 2026 https://day.linux.prato.it
  • SCSS 48.6%
  • HTML 39.5%
  • JavaScript 9.2%
  • Shell 2.7%
Find a file
Bojacco e47c5e01fd
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Add gulp as partner
2026-09-15 21:22:33 +02:00
archetypes First public version 2026-07-06 22:44:58 +02:00
assets Add gulp as partner 2026-09-15 21:22:33 +02:00
content Lastmod script, accessibility fixes, no-js fixes 2026-08-30 20:35:50 +02:00
data Add gulp as partner 2026-09-15 21:22:33 +02:00
layouts Add gulp as partner 2026-09-15 21:22:33 +02:00
scripts Show the program section behind a flag 2026-09-15 18:39:45 +02:00
static Add proper og:image, thanks Laura! 2026-07-14 00:07:39 +02:00
.gitignore First public version 2026-07-06 22:44:58 +02:00
.woodpecker.yml Lastmod script, accessibility fixes, no-js fixes 2026-08-30 20:35:50 +02:00
hugo.toml Add gulp as partner 2026-09-15 21:22:33 +02:00
README.md Add gulp as partner 2026-09-15 21:22:33 +02:00

Linux Day Prato 2026 website

Sito ufficiale del Linux Day Prato 2026, generato con Hugo. Stile neobrutalista: colorato, ad alto contrasto, con ombre nette e bordi marcati.

Requisiti

  • Hugo extended 0.165 (versione pinnata in CI, .woodpecker.yml) (la versione extended serve per compilare lo SCSS). Verifica con hugo version: deve contenere +extended.
  • Git, con la cronologia completa del repository, per calcolare le date di ultima modifica delle pagine.

Comandi

./scripts/build.sh server  # anteprima live su http://localhost:1313
./scripts/build.sh         # build di produzione in public/ (HTML già minificato via config)

Struttura

.
├── hugo.toml                 # configurazione + parametri evento (DATA, contatti, CFP…)
├── content/_index.md         # front matter della home (titolo/descrizione)
├── content/cfp.md            # front matter della pagina /cfp/ (SEO)
├── data/                     # ← TUTTI I CONTENUTI MODIFICABILI (YAML)
│   ├── navigation.yaml       #   voci di menu
│   ├── stats.yaml            #   numeri dell'hero
│   ├── marquee.yaml          #   parole della striscia scorrevole
│   ├── about.yaml            #   testo "Cos'è" + card
│   ├── schedule.yaml         #   programma + sale
│   ├── speakers.yaml         #   speaker
│   ├── cfp.yaml              #   testi della pagina Call for Papers
│   ├── partners.yaml         #   partner e comunità
│   ├── location.yaml         #   sede, mappa, indicazioni
│   ├── footer.yaml           #   colonne e testi del footer
│   └── social.yaml           #   link social
├── assets/
│   ├── scss/                 # stili (compilati da Hugo Pipes)
│   │   ├── main.scss         #   entrypoint con gli @import
│   │   ├── _variables.scss   #   colori, ombre, breakpoint
│   │   ├── _fonts.scss       #   @font-face dei font self-hostati
│   │   ├── _base.scss _animations.scss _utilities.scss
│   │   └── components/       #   uno SCSS per sezione/pagina
│   ├── icons/lucide/         # icone SVG vendorizzate (inline via partial icon.html)
│   ├── touch-icon.svg        # sorgente di apple-touch-icon.png / favicon-96x96.png
│   └── js/main.js            # menu mobile, countdown, filtri, pausa marquee, scroll reveal
├── layouts/
│   ├── _default/baseof.html  # scheletro HTML
│   ├── _default/cfp.html     # pagina Call for Papers
│   ├── index.html            # home: assembla le sezioni
│   ├── 404.html
│   └── partials/             # head, header, footer, countdown, schema, scripts, icone
│       └── sections/         # hero, about, schedule, speakers, …
├── scripts/build.sh          # build + lastmod automatici dalla cronologia Git
└── static/
    ├── favicon.svg apple-touch-icon.png favicon-96x96.png
    └── fonts/                # woff2 self-hostati (Space Grotesk, Space Mono)

CI/CD

Pipeline Woodpecker in .woodpecker.yml: ogni push/PR compila il sito; sul push in main fa anche il deploy con rsync sul VPS. Secret da configurare in Woodpecker (repo → SettingsSecrets, evento push):

Secret Valore
deploy_ssh_key chiave privata SSH dedicata, senza passphrase (ssh-keygen -t ed25519 -f deploy_key -N ''; la .pub va in authorized_keys sul VPS)
deploy_known_hosts output di ssh-keyscan -H <host>
deploy_host hostname o IP del VPS
deploy_user utente SSH (non root, con scrittura sul path)
deploy_path directory servita dal webserver, es. /var/www/day.linux.prato.it

Fasi del sito

Il sito cambia faccia da solo, in base a tre flag booleani indipendenti in hugo.toml. Sono indipendenti apposta: la sede può confermarsi a proposte ancora aperte, e fra la chiusura della CFP e la scelta dei talk esiste una fase intermedia in cui non c'è né una CFP da proporre né un programma da mostrare.

Flag Cosa accende
params.cfp.open pagina /cfp/ attiva, CTA "Proponi un talk" in navbar e hero, invito "il palco è libero" al posto degli speaker, link /cfp/ negli slot liberi del programma
params.programPublished sezione "Programma" in home, voce Programma in menu e footer, numeri di talk e speaker nell'hero, griglia speaker, performer nei dati strutturati
params.locationConfirmed sezione "Dove", voce Dove in menu e footer, sede completa (via, coordinate) nei dati strutturati

Le tre combinazioni che il sito attraversa in un anno:

  1. CFP aperta (cfp.open = true, programPublished = false) — si raccolgono le proposte, programma e speaker non esistono ancora.
  2. CFP chiusa, programma da decidere (entrambi false) — le proposte sono in valutazione: niente più CTA, la sezione Speaker annuncia che il programma arriva, il Programma resta fuori pagina.
  3. Programma pubblicato (cfp.open = false, programPublished = true) — versione finale: programma e speaker online.

Gli elementi che seguono uno di questi flag sono marcati nei rispettivi YAML con programHide: true (voci di menu e footer, numeri dell'hero) o locationHide: true, e la regola di visibilità sta tutta in layouts/partials/nav-hidden.html.

Il resto della Call for Papers:

  • email, deadlineDisplay → destinatario della mail precompilata e data mostrata; formUrl (opzionale) → se valorizzato, i bottoni aprono il form al posto della mail.
  • Testi della paginadata/cfp.yaml (hero, formati, passi, blocco d'invio col modello proposta.md). Il lead della CFP chiusa ha due versioni: closed (programma non ancora deciso) e closedProgram (programma online).

Come aggiornare i contenuti

Quasi tutto si modifica nei file data/*.yaml senza toccare l'HTML:

  • Data dell'evento e countdownhugo.toml (eventStart, eventEnd, eventDateDisplay).
  • Call for Papers → apertura/chiusura in hugo.toml, testi in data/cfp.yaml (vedi sezione sopra)
  • Programmadata/schedule.yaml; le descrizioni accettano Markdown. Usa desc: |- e una riga vuota tra i paragrafi; **testo** aggiunge enfasi. La sezione va online solo con params.programPublished = true: finché è false il file si lavora come bozza, senza che nulla finisca in pagina.
  • Speakerdata/speakers.yaml; le foto ottimizzate sono in static/img/speakers/. Nelle schede compare role, la qualifica professionale confermata per l'evento (eventuale fonte in roleSource); se manca, la riga è omessa. topic conserva il titolo del talk per llms.txt.
  • Partnerdata/partners.yaml
  • Mappa / indicazionidata/location.yaml

Il lastmod è completamente automatico: non va aggiunto né aggiornato nel front matter. scripts/build.sh trova l'ultimo commit che ha modificato una dipendenza effettiva della pagina (contenuto, dati, configurazione, template, CSS, JavaScript o asset) e inietta la stessa data in <lastmod> del sitemap, WebPage.dateModified e og:updated_time. Home e CFP hanno insiemi di dipendenze separati, per evitare aggiornamenti fittizi. Le modifiche locali non committate non cambiano la data: in produzione la fonte di verità è il commit distribuito dalla CI, che usa sempre la cronologia Git completa.

Prima di trasformare il sito nell'edizione successiva, conserva il 2026 a un URL permanente e aggiorna params.eventUrl, params.eventId, date, immagini e testi. eventId identifica una singola edizione e non deve essere riciclato: evita che motori di ricerca e knowledge graph fondano eventi di anni diversi.

Note tecniche

  • CSS/JS: compilati, minificati (in produzione) e fingerprinted con Subresource Integrity tramite Hugo Pipes.
  • Font: self-hostati in static/fonts/ (woff2, subset latin), nessuna richiesta a Google Fonts. @font-face in assets/scss/_fonts.scss.
  • Icone: set Lucide vendorizzato in assets/icons/lucide/ e inserito inline dal partial icon.html, nessun CDN a runtime. Per aggiungerne una: curl -o assets/icons/lucide/<nome>.svg "https://api.iconify.design/lucide/<nome>.svg?height=1em"
  • SEO: meta description, Open Graph, Twitter Card, dati strutturati schema.org/Event (JSON-LD, sede letta da data/location.yaml, organizzatori effettivi da data/organizers.yaml), sitemap.xml e robots.txt generati da Hugo.
  • Accessibilità: skip-link, aria-* su menu e filtri, focus visibile, pulsante pausa per la striscia scorrevole (preferenza ricordata in localStorage), supporto a prefers-reduced-motion.
  • Social card: static/img/social-card.png è la card CFP; static/img/social-card-event.png è quella del programma. Le composizioni 16:9, 4:3 e 1:1 configurate in params.eventImages alimentano schema.org/Event.image.