Vai al contenuto principale
Torna ai casi

Spike Series

Una piattaforma per far girare un intero circuito.

Circuiti regionali di VALORANT per un organizzatore europeo: sito pubblico, portale di gestione e bot Discord, costruiti da zero da VentuLabs con lo stesso stack e le stesse garanzie dei nostri prodotti.

4839
test automatici
8
lingue
197
decisioni di architettura
67
tabelle nel database
1200
spettatori in contemporanea, misurati

In produzione su spikeserieseu.es (Si apre in una nuova scheda)

Home pubblica di Spike Series con partite in diretta, regioni e prossimi tornei

Una piattaforma per far girare un intero circuito

Sito pubblico per giocatori e spettatori, portale di gestione per l'organizzatore e un bot Discord che collega tutto in tempo reale.

  • Motore di competizione completo

    Eliminazione singola e doppia, gironi, svizzero, campionato e GSL. Genera tabelloni e classifiche e li ricalcola da solo dopo ogni risultato.

  • Veto delle mappe in diretta

    I due capitani escludono e scelgono le mappe a turno con conto alla rovescia, in tempo reale e senza ricaricare, con lo storico della serie in vista.

  • Check-in e flusso della partita

    Check-in prima di giocare, riprogrammazioni con fasce orarie proposte e accettate tra capitani, e report del risultato per mappa.

  • Chat collegata a Discord

    Chat di squadra e di partita dentro il sito, con conservazione automatica, sincronizzata con i canali Discord del circuito.

  • Bot Discord integrato

    Crea automaticamente ruoli e canali di squadra e avvisa con un messaggio diretto di partite, risultati e scadenze, nella lingua dell'utente.

  • Mercato di squadre e giocatori

    Bacheca dove giocatori e squadre pubblicano annunci e trovano posto prima che chiudano le iscrizioni.

  • Accesso con Discord

    Registrazione e accesso con l'account Discord del giocatore, oltre a email e password con sessione cifrata.

  • Otto lingue

    Sito, portale e contenuti tradotti in ES, EN, FR, PT, IT, DE, NL e TR, con ogni lingua che carica solo il suo.

  • Punteggio in diretta

    Lettura del punteggio dalla trasmissione per aggiornare le partite in diretta senza intervento manuale.

  • Manutenzione senza interruzioni

    Si attiva dal portale e arriva all'istante a chi sta navigando, senza ricaricare la pagina.

  • Supporto tracciato

    Il team di supporto può entrare come un utente per aiutarlo, con avviso visibile e registro completo della sessione.

  • Progettato mobile first

    Ogni schermata viene pensata e testata prima a 390 px di larghezza, dal tabellone alla chat, prima di adattarla al desktop.

Architettura tecnica

Lo stesso stack e le stesse garanzie dei nostri prodotti: test, deploy automatico e più organizzatori per istanza dal primo giorno.

Frontend

  • Next.js 16 con App Router
  • React 19
  • TypeScript in modalità strict
  • Tailwind CSS 4
  • 8 lingue, ognuna con il suo pacchetto
  • Mobile first, testato a 390 px

Backend

  • Server component e route API
  • Sessioni cifrate e bcrypt
  • Validazione con Zod su tutto ciò che modifica dati
  • Diretta con eventi dal server
  • Protezione CSRF e rate limiting
  • Accesso con Discord

Dati

  • PostgreSQL 16 con Drizzle ORM
  • 67 tabelle e 99 migrazioni
  • Isolamento per organizzatore e per circuito
  • Chiavi esterne con cancellazione controllata
  • Trigger di data di modifica
  • Migrazioni SQL versionate

Motore di competizione

  • Libreria pura, senza framework né database
  • Eliminazione singola e doppia, svizzero, campionato e GSL
  • Deterministico: lo stesso torneo genera lo stesso tabellone
  • Copertura del 100% delle righe
  • Classifiche e spareggi configurabili
  • Solo l'interfaccia e il portale lo usano

Infrastruttura

  • Server Ubuntu 24.04 con Node 22
  • Nginx e PM2 con più istanze
  • Certificati Let's Encrypt con HSTS
  • Deploy da VentuHub con backup preventivo
  • Health check e rollback automatico
  • 1.200 spettatori in contemporanea misurati

Qualità

  • 4.141 test con Vitest in 405 file
  • 698 test end-to-end con Playwright
  • Tre progetti: Chrome mobile, Safari mobile e desktop
  • Postgres reale nei test
  • ESLint con regole di qualità e ratchet
  • Lighthouse 91, 100, 100 e 100 su mobile

Ruoli distinti

Un capitano non può toccare un'altra squadra. Un arbitro verifica solo le partite che gli spettano.

  • Admin

    Accesso completo: utenti, audit, impostazioni dell'organizzatore e manutenzione.

  • Organizzazione

    Gestione operativa di circuiti, tornei, iscrizioni e squadre.

  • Arbitro

    Verifica i risultati delle partite che gli sono assegnate.

  • Capitano

    La sua squadra: roster, iscrizioni, check-in, veti e report del risultato.

  • Giocatore

    Vede la sua squadra e le sue partite e modifica il proprio profilo.

Non è solo un sito di risultati

Decisioni di ingegneria che di solito non si vedono, ma che danno stabilità a una competizione in diretta.

  • Motore di competizione come libreria pura

    Senza dipendenze dal framework, dal database né dall'ora di sistema: l'ora viene iniettata e il sorteggio usa un seed, così lo stesso torneo genera sempre lo stesso tabellone nei test.

  • Solo la lingua attiva viaggia fino al browser

    Ognuna delle otto lingue è un pacchetto a sé: il server conosce la lingua prima di disegnare la pagina e il client scarica solo quella.

  • Partite in diretta senza ricaricare

    Un unico flusso di eventi per scheda avvisa di risultati, veti e cambi di classifica appena succedono, con riconnessione automatica.

  • Manutenzione senza lasciare nessuno a metà

    Si attiva dal portale e arriva all'istante a chi sta navigando, senza dover aggiornare la pagina per accorgersene.

  • Supporto con tracciabilità completa

    Il team di supporto può entrare come un utente per risolvere un problema, con un avviso permanente sullo schermo e il registro di cosa ha fatto.

  • Più organizzatori dal primo giorno

    Ogni organizzatore e ogni circuito restano isolati nel database: è ciò che trasforma il prototipo in un prodotto replicabile.

  • Capacità misurata, non stimata

    Test di carico con partite in diretta: 1.200 spettatori in contemporanea con risposte sotto i 350 ms al 95º percentile.

  • Deploy con rollback automatico

    La build si prepara a parte ed entra sul server in un colpo solo; se l'avvio fallisce, il sistema torna da solo alla versione precedente.

Migliaia di test automatici

Copertura dal motore di competizione ai flussi completi di capitano e organizzatore. Ogni deploy si blocca se qualcosa fallisce.

4.141
test con Vitest
405
file di test
698
test end-to-end
3
progetti: due mobile e uno desktop
  • Motore di competizione

    Tabelloni a eliminazione singola e doppia, svizzero, campionato e GSL: bye corretti, classifiche stabili e risultati impossibili rifiutati.

  • Autenticazione e sessione

    Accesso con email e con Discord, sessione cifrata, CSRF, limite ai tentativi e audit.

  • Isolamento per organizzatore

    Separazione per organizzatore e per circuito verificata a livello di query e di database.

  • Partite e diretta

    Check-in, riprogrammazioni, veto delle mappe, report e verifica dei risultati e il flusso di eventi in diretta.

  • Lingue e contenuti

    Le otto lingue caricano ciò che devono e niente di più: si verifica che nessun client scarichi una lingua che non sta usando.

  • End-to-end, mobile first

    Flussi completi di capitano e organizzatore su Chrome reale, in due progetti mobile e uno desktop, con controlli di accessibilità.

Stack completo

Lo stesso criterio dei nostri prodotti: solo strumenti moderni, mantenuti e con una community attiva.

  • Next.js 16
  • React 19
  • TypeScript 5
  • Tailwind CSS 4
  • Node.js 22
  • PostgreSQL 16
  • Drizzle ORM
  • PGlite nei test
  • Sessioni cifrate
  • Zod
  • discord.js
  • Vitest
  • Playwright
  • ESLint 9
  • SQL
  • Bash
  • Nginx
  • PM2
  • Ubuntu 24.04
  • VentuHub
  • Let's Encrypt

Ti serve qualcosa del genere?

Spike Series è codice nostro costruito su misura per un organizzatore di circuiti di VALORANT: senza template, senza servizi di terzi e con lo stesso rigore tecnico che mettiamo nei nostri prodotti.

Torna ai casi