riccardo / dev

// freelance, from Piacenza

Hello, human.
Sono Riccardo

Interfacce sopra.
API, dati e automazioni sotto.

Sono un Full Stack Developer freelance con partita IVA. Lavoro con Node.js, API e automazioni. In Wedoit ho contribuito a una piattaforma corsi MERN e React Native, dal frontend al supporto su backend e database.

developer.tsread-only
01const developer = {
02  name: "Riccardo Ferri",
03  role: "Full Stack Developer",
04  focus: [
05    "backend",
06    "web interfaces",
07    "automation"
08  ],
09  stack: ["JS/TS", "Python"],
10  lookingFor: "progetti + un buon team"
11};
Nuovi incarichi e opportunità in teamRemoto · Ibrido · In sede
Node.jsExpressAstroSvelteReactMongoDBGit+ curiosità

// sito-astro · 2025 → 2026

Un sito eventi.
Più di una homepage.

repo: private

Ho creato il nuovo sito CESO nel 2025 su comitatoeventisportivioltrepo.it, integrando il vecchio dominio. Nel 2026: migliorie funzionali e proposta di redesign grafico e parzialmente architetturale. Un caso concreto: aggiungere un’edizione usando catalogo, componenti condivisi e controlli sui riferimenti.

  • Astro
  • Svelte
  • TypeScript
  • IT / EN
Percorso e caso completo ↗
CESO / proposta di redesign 2026Caso completo ↗
Homepage CESO nella proposta di redesign del 2026, con navigazione e tre eventi sportivi in evidenza.

Confronta le due versioni online.

Esplora il sito attuale e la proposta di redesign del 2026. I link si aprono in nuove schede.

  1. before

    Il vecchio sito su eventisportivioltrepo.it era gestito da un'altra azienda.

  2. 2025 / create

    Nuovo sito e integrazione del dominio precedente.

  3. 2026 / iterate

    Funzionalità, interfaccia e revisione di parte dell'architettura.

Architettura, validazioni e scelte tecniche

function composeEventPage()

01 / INPUT

Catalogo + contenuti

Dati evento, testi IT/EN e configurazione editoriale condivisa.

02 / BUILD

Astro + validazioni

Layout, componenti riutilizzabili e controllo dei riferimenti.

03 / OUTPUT

HTML + interattività

Pagine statiche e componenti Svelte dove serve interazione.

[01]

Una fonte per i dati

Titolo, anno e copertina dell'edizione precedente vengono risolti dal catalogo. Evita di mantenerli a mano in più pagine.

[02]

Errori prima della pagina

Riferimenti a edizioni sconosciute, autoreferenziali e date non valide fermano la generazione con un errore esplicito.

[03]

Fallback intenzionali

Se manca la copertina, resta una scheda testuale. Guide per i contenuti e test dedicati accompagnano lo sviluppo.

Apri il diff visivo del 2026

c9a7594 → bdc120c

− prima del redesign / 2026
Homepage CESO precedente al redesign, vista desktop.
+ proposta di redesign / 2026
Proposta di redesign della homepage CESO, vista desktop.

Schermate reali del 25 settembre 2026, entrambe del mio sito; possono differire dalle versioni online aggiornate, raggiungibili dai link sopra. La ricostruzione condivideva alcuni asset. Questo confronto non rappresenta il vecchio sito dell'altra azienda né risultati misurati di traffico o conversione. Contesto e archivio storico ↗

// backend & automazioni

Collegare servizi.
Organizzare dati.

Due progetti, due approcci: eventi e API sul server, interazione con le pagine nel browser.

01 / backend & integrations

webhook-server.js

Node.js / Express

Eventi in ingresso, operazioni sui dati e servizi esterni. Un server Express per collegare Notion, Google Calendar e notifiche email, con attività pianificate tramite cron.

  1. 01 / RECEIVEWebhook

    Ricezione evento e risposta HTTP 202.

  2. 02 / PROCESSCoda in memoria

    Le funzioni vengono eseguite in sequenza.

  3. 03 / INTEGRATEServizi esterni

    Aggiornamenti su Notion, calendario e email.

Scelte tecniche e limiti

Separare i compiti

Route, servizi e logica delle integrazioni sono moduli distinti. I job pianificati usano la stessa coda delle attività.

Leggere oltre la prima pagina

Il servizio Notion percorre i risultati con un cursore, raccogliendo anche i record delle pagine successive.

Il compromesso della coda

I task falliti possono essere rimessi in coda dal pannello amministrativo. La coda è in memoria: non offre persistenza al riavvio né garanzie di consegna durevole.

  • Express
  • Notion API
  • Google Calendar API
  • node-cron
  • Nodemailer

02 / personal automation

universita_helpbot.py

Python / Selenium

Un progetto personale di automazione del browser: acquisizione e organizzazione di domande e risposte, salvataggio in JSON e creazione di flashcard attraverso interfacce web.

Pagine webSelenium + PythonJSON / flashcard
Cosa c'è nel progetto

Interazione con le pagine

WebDriver, selettori DOM e attese esplicite per leggere contenuti e interagire con le interfacce.

Dati riutilizzabili

Raccolta e raggruppamento delle informazioni in file JSON, poi riutilizzate nei flussi dedicati alle flashcard.

Dipendenza dall'interfaccia

Un'automazione del browser segue la struttura delle pagine. Modifiche a selettori e flussi richiedono manutenzione: è uno dei limiti del progetto.

  • Python
  • Selenium WebDriver
  • DOM
  • JSON

// webhook-server · dal codice al comportamento

Un evento.
Un flusso da seguire.

Demo locale · dati fittizi

Un record cambia, il server accetta l’evento e il lavoro entra in coda. Questa simulazione rende visibili attesa, completamento e recupero di un errore. Puoi inviare più eventi e farli avanzare uno alla volta.

La demo interattiva richiede JavaScript. Il flusso e le scelte tecniche sono descritti anche qui sotto.

Registro degli eventi
  1. In attesa di eventi.
Scelte, limiti e codice della demo

Cosa riprende dal progetto

Risposta 202 delle route specifiche, esecuzione sequenziale e possibilità di rimettere manualmente i task falliti in fondo alla coda. Il sorgente separa route, coda e servizi esterni.

Il limite che conta

La coda vive in memoria: al riavvio lo stato si perde. Il nuovo tentativo riesegue il task e non garantisce assenza di duplicati. Persistenza e idempotenza sarebbero evoluzioni da progettare.

Come leggere questa prova

È una simulazione autonoma scritta per il portfolio, con massimo sei eventi. Il servizio fittizio torna disponibile al secondo tentativo. Il codice del backend privato non viene eseguito né distribuito.

Leggi il codice della demo ↓

// il lato sperimentale

Codice per
curiosità.

Giochi, mondi 3D e interazioni in rete.
Dodici progetti di apprendimento, dalle basi dei tutorial alle mie rielaborazioni. E due piccoli pezzi da provare qui.

Live fragment / Three.js

Dal mio portfolio 3D.

Una superficie che si muove e cambia colore al passaggio del puntatore. Ripresa da my-portfolio, adattata a questo piccolo spazio.

Si anima solo quando la attivi.
01Giochi & interazioneMovimento, collisioni e sistemi di gioco6 progetti
Schermata reale di fight: due combattenti pixel art in un'arena, con barre della salute e timer.

In evidenza / JavaScript + Canvas

Fight.

fight · due giocatori, tastiera o touch

Un picchiaduro nato dal tutorial di Chris Courses, che ho poi continuato a migliorare.

In questa versione
Doppio salto, salto sulle pareti, attrito e reazione ai colpi.
Dentro il codice
Stati dei combattenti, sprite animati e collisioni degli attacchi.
Round da 60 secondi · 2 giocatori locali
Base di Chris Courses ↗

JavaScript / Canvas / Camera

js_vertical_platformer

Platformer con gravità, collisioni, piattaforme e camera che segue il personaggio sui due assi. Un prototipo per studiare il rapporto tra coordinate del mondo, movimento e inquadratura.

Tutorial ↗

Three.js / JavaScript

js_threejs_game

Movimento da tastiera, gravità, collisioni e comparsa progressiva dei nemici. Un prototipo per esplorare il ciclo di aggiornamento di un gioco 3D.

Tutorial ↗
02Grafica 3D & shaderGeometria, luce e interazioni con il mouse5 progetti

Three.js / Raycaster / GSAP

my-portfolio

Primo esperimento di portfolio 3D: una superficie triangolata animata, colori dei vertici che reagiscono al mouse e parametri regolabili con dat.GUI. Un laboratorio di geometria e interazione.

Tutorial ↗

GLSL / Uniforms / Varyings

intro_to_GLSL

Esperimenti con vertex e fragment shader, tempo passato tramite uniform e deformazioni a onde. Il sorgente contiene anche prove personali delle formule.

Tutorial ↗

Three.js / OrbitControls / GSAP

three_crash_course_n12

Scena, camera e luci; controllo orbitale, gestione del ridimensionamento e variazione del colore con il mouse.

Tutorial ↗
03Multiplayer & reteStato condiviso, sincronizzazione e latenza1 progetto

Node.js / Express / Socket.IO

multiplayer_game

Stato dei giocatori gestito dal server, sincronizzazione dei movimenti, interpolazione sul client, proiettili e classifica. Un esercizio per studiare il rapporto tra rete e gameplay.

Tutorial ↗
Input del clientStato sul serverInterpolazione sul client

Schermate reali delle copie locali; nella preview i font remoti sono sostituiti da font locali. Le basi sono attribuite nei link, le rielaborazioni personali nelle schede. Gli asset dei tutorial appartengono ai rispettivi autori.

// un edge case vale più di tre buzzword

E se manca qualcosa?

Un esempio interattivo delle regole per l'edizione precedente: riferimenti validi, contenuti incompleti e dati da correggere. Dati dimostrativi, esecuzione nel browser.

event.demo.jsoninput
{
  "slug": "evento-2026",
  "lastEdition": "evento-2025",
  "previousCover": "cover.jpg"
}
OK / RIFERIMENTO VALIDO

L'edizione precedente c'è.

Il catalogo risolve titolo, anno e copertina. La pagina può essere generata.

→ scheda con titolo + anno + copertina

Un altro modo
di conoscermi.

Prova help, whoami o coffee.
La shell vive soltanto in questa pagina.

visitor@riccardo:~portfolio-shell

Benvenuto nel lato developer.

Digita help per la lista dei comandi. Tab e Invio funzionano come ti aspetti.

// niente ticket per dire ciao

Apriamo una
conversazione.

Freelance con partita IVA, disponibile per nuovi incarichi.
Interessato a entrare in un team: da remoto, in modalità ibrida o in sede.

rikiferri999@gmail.com ↗

Playground / demo giocabile

Fight.

Due giocatori sulla stessa tastiera, oppure usa i pulsanti qui sotto. Premi di nuovo salto mentre sei in aria per il doppio salto. Esc per uscire.

01 / SamuraiA · D · Spazio · J
02 / Kenji← · → · ↑ · Canc

Dal mio repository fight · base di Chris Courses ↗, proseguita con le mie modifiche.

Vai a…

Tab per scegliere · Invio per aprire · Esc per chiudere