Documento di specifiche
First Pick
Il circuito nazionale italiano per il Magic: The Gathering limited (draft) competitivo giocato dal vivo. Aggrega i draft dei negozi verificati, fa iscrivere i giocatori, gestisce il torneo dall'inizio alla fine e alimenta un'unica classifica nazionale: i Punti Shard.
Come leggere questo documento
First Pick è in costruzione. Ogni sezione dichiara esplicitamente lo stato di ciò che descrive: Costruito funziona ed è verificato · In corso in lavorazione · Pianificato deciso ma non ancora costruito · Da definire scelta ancora aperta. Nulla in questa pagina è una promessa commerciale.
Definizione
Cos'è First Pick
In corsoNon è un gioco e non è un social: è l'infrastruttura competitiva attorno a un gioco che si continua a giocare fisicamente, in negozio.
Il draft (o limited) è il formato in cui i giocatori aprono buste sigillate, si passano le carte e costruiscono un mazzo sul momento. Si gioca dal vivo, quasi sempre in un negozio. Oggi chi vuole giocarne uno deve scoprire l'evento passaparola, e quando l'ha giocato quel risultato non conta da nessuna parte.
First Pick chiude quel cerchio: trova il draft, iscriviti, gioca, e il risultato conta in una classifica nazionale unica che porta a un campionato annuale.
Il problema, lato giocatore
Manca massa critica: non trovi abbastanza persone con cui draftare. L'offerta è frammentata tra gruppi Facebook, siti dei singoli negozi e strumenti generalisti che il limited lo coprono male. E nessuno tiene il conto di quanto sei bravo.
Il problema, lato negozio
Riempire i tavoli e farsi conoscere da giocatori che non sanno nemmeno che quel draft esista. Un evento visibile in app è pubblicità implicita e porta gente nuova dentro al negozio.
La promessa al giocatore
«Trova un draft vicino a te, iscriviti, e scala la classifica nazionale dei migliori draftatori.»
La promessa al negozio
«Ospita eventi visibili in app, riempi i tavoli, gestisci il torneo senza fogli di carta.»
I principi che guidano il prodotto
- Poche cose per schermata, ben pensate. L'app non deve sembrare fare mille cose, anche se le fa. Leggibilità massima, estetica premium — non minimal spinto.
- Prima il cerchio di base, poi i dettagli. Si costruisce uno scheletro che funziona da capo a fondo, poi lo si arricchisce.
- Integrità per costruzione. I match esistono solo dentro eventi reali, con check-in, di organizzatori verificati: non servono controlli sospettosi a valle.
- Premi mai in denaro. Montepremi e prize pool sono in prodotti Magic. È una scelta deliberata, non un ripiego.
- Configurabilità. Quote, parametri della classifica, soglie e set si regolano dal portale admin, senza toccare il codice.
- Dati in UE. Infrastruttura interamente self-hosted su server proprio a Francoforte.
Perimetro
Cosa NON è
CostruitoIl perimetro è una scelta, non un limite di tempo. Queste cose sono state escluse deliberatamente.
Non è un luogo dove si gioca
First Pick non fa giocare a Magic online. I match sono fisici, al tavolo. L'app gestisce iscrizione, check-in, abbinamenti, risultati e classifica.
Non è un trova-eventi generalista
Solo Magic, solo limited/draft, solo eventi di organizzatori verificati. Niente tornei di altri formati o di altri giochi.
Non è un social network
Il livello social è volutamente leggero: si condivide un momento, si mette like, si commenta, e finisce lì. Niente thread, niente post lunghi.
Niente messaggi privati tra giocatori
Escluso di proposito: le chat dirette porterebbero moderazione, tutela dei minori e un prodotto diverso da quello che vogliamo fare.
Niente clan né gilde
Valutate e scartate esplicitamente. La competizione è individuale.
Non richiede l'affiliazione WPN
Essere un negozio affiliato Wizards è solo un'informazione in registrazione, non un requisito: club e associazioni non restano fuori. L'idoneità la valuta First Pick caso per caso.
Non c'è ancora: rimandato dopo la v1
Deciso, non dimenticato. Ogni voce è stata tolta consapevolmente dalla prima versione.
Destinatari
Per chi è: tre ruoli, tre interfacce
I ruoli sono mutuamente esclusivi: un giocatore non è un organizzatore, e viceversa. Ognuno ha la propria superficie.
Giocatore In corso
Chiunque giochi a Magic e voglia fare un draft. Nessuna barriera d'ingresso: si registra dall'app, si iscrive, gioca. È la classifica a fare la selezione.
- Interfaccia: app mobile (iOS + Android)
- L'account si crea solo dentro l'app
- Minori ammessi, con consenso dei genitori sotto i 14 anni
Organizzatore Costruito
Chi organizza eventi validi per la classifica: per lo più negozi di carte, ma il ruolo è unico. Accesso solo dopo verifica manuale di First Pick.
- Interfaccia: portale web
- Registrazione con ragione sociale, P.IVA, indirizzo, IBAN
- Accesso con email e password (niente Google/Apple)
Admin (team First Pick) In corso
Strumento interno: approva gli organizzatori, supervisiona eventi e risultati, modera, e regola i parametri del sistema da interfaccia.
- Interfaccia: portale web interno
- Ogni decisione lascia una traccia immutabile
- Autenticazione a due fattori prevista come obbligatoria
Flusso end-to-end
Come funziona: il "cerchio di base"
In corsoSei passi. Quando girano tutti insieme su un evento reale, il prodotto è lanciato. Oggi siamo a metà del terzo.
L'organizzatore si registra e viene approvato Costruito
Il negozio si registra dal portale con i dati fiscali; resta su una schermata-cancello finché First Pick non decide. L'admin può approvare, rifiutare o chiedere altre informazioni (in questo caso il negozio corregge e re-invia). Ogni decisione richiede una nota e finisce nel registro di audit.
L'organizzatore crea e pubblica l'evento Costruito
Set, data e ora, quota d'iscrizione, numero di tavoli, scadenza iscrizioni, soglia di annullamento, premi. Alla pubblicazione il sistema genera un codice evento di 4 caratteri e crea i tavoli. Su un evento pubblicato che ha già iscritti, quota, data e set vengono congelati.
I giocatori si iscrivono — «paghi in negozio» In corso
Il giocatore vede i draft pubblicati (negozio, città, data, quota, posti liberi), apre il dettaglio e si iscrive. Nessun pagamento in app: l'iscrizione prenota il posto, si salda al banco la sera dell'evento. Può disiscriversi finché non ha fatto check-in. Il motore è pronto e verificato; le schermate dell'app sono in lavorazione.
Check-in e avvio del torneo Pianificato
In negozio il giocatore fa self check-in (con il codice evento come alternativa) e salda la quota. L'organizzatore vede chi è arrivato, aggiunge eventuali walk-in, toglie gli assenti e avvia il torneo. I tavoli sono pod da 6 a 8 giocatori; sotto i 6 alla soglia prevista il tavolo si annulla.
Si gioca: abbinamenti svizzeri e risultati Pianificato
Svizzero senza eliminazione, 3 round, match al meglio dei 3. Il vincitore inserisce il risultato e l'avversario conferma; il silenzio vale conferma dopo il tempo previsto, e l'organizzatore risolve le contestazioni.
Punti Shard e classifica nazionale Pianificato
Ogni match assegna o toglie Punti Shard in base alla forza dell'avversario. Il totale aggiorna la classifica nazionale e lo stadio del giocatore, e concorre alla qualificazione al campionato annuale.
Superficie 1
L'app del giocatore
App nativa iOS e Android (React Native + Expo). Tema scuro, cinque sezioni. Qui sotto le schermate reali già costruite e i mockup di quelle in arrivo.
Competitive MTG draft
Password dimenticata?
Bentornato
Luca
Punti Shard
1.284
Arcanista · 3° in Veneto
Il tuo prossimo draft
Gruul Games · ven 12 set, 20:30
Paghi in negozio · codice MN5S
Account
luca@email.com
Draft vicini
Eventi
Draft serale · TDM
Gruul Games · Verona
ven 12 set, 20:30 · 15 €
11 posti liberi su 16
Draft del giovedì
Cardhouse · Verona
gio 18 set, 21:00 · 18 €
2 posti liberi su 24
Draft di lancio
Tana del Drago · Padova
Esaurito
‹ Eventi
Draft serale
Gruul Games · Verona
Premi
Booster ai primi 4 · prodotto del negozio
Nessun pagamento ora: paghi al banco la sera dell'evento.
Round 2 di 3 · in corso
Il tuo tavolo
Tavolo 2 · posto 5
Luca vs Marco
Bo3 · risultato da inserire
Inserisci il risultato
L'avversario conferma; senza risposta vale dopo 24 h.
Classifica evento
1. Marco 2-0 · 2. Luca 1-1 · 3. Sara 1-1
Le 5 sezioni
- Home — Shard, stadio, prossimo draft
- Eventi — scoperta e iscrizione
- Adunanza — feed leggero della community
- Classifica — ranking nazionale
- Profilo — storico e identità
Già costruito
- Registrazione e accesso, tutto dentro l'app
- Password dimenticata e reimpostazione
- Home con dati reali dal server
- Sessione sicura nel portachiavi del telefono
In arrivo
- Lista e dettaglio eventi, iscrizione
- Le mie iscrizioni + codice evento
- Check-in e vista torneo live
- Classifica e profilo completi
Le schermate marcate «pianificato» sono mockup: rappresentano il comportamento previsto, non un'interfaccia già esistente.
Superfici 2 e 3
I portali web
CostruitoDue applicazioni web separate: una per gli organizzatori, una interna per il team. Stesso design system dell'app, tema chiaro.
Portale organizzatore
- Registrazione del negozio e schermata di verifica
- Elenco eventi con stato del ciclo di vita
- Creazione, pubblicazione e annullamento evento
- Dettaglio con tavoli, iscritti, pagamenti e presenze
- Aggiunta di walk-in la sera stessa
- Console del torneo live — pianificata
Portale admin (interno)
- Coda di approvazione degli organizzatori con audit trail
- Supervisione di tutti gli eventi, con annullamento d'autorità
- Correzione di risultati e punteggi — pianificata
- Moderazione dei contenuti — pianificata
- Parametri di sistema configurabili — pianificati
Il cuore competitivo
Punti Shard, stadi e campionato
PianificatoLa classifica non è un accessorio: è il prodotto. I Punti Shard sono un Elo vero, calcolato sui match giocati davvero al tavolo.
Come si guadagnano
Come negli scacchi: battere un giocatore più forte dà più punti, perdere contro uno più debole ne toglie di più. Si può scendere, con un limite minimo a zero. Non è un contatore di presenze: è una misura di quanto sei bravo.
Una sola classifica
Nazionale e unica: niente sotto-classifiche per città, regione o negozio nella prima versione. L'orientamento attuale è una classifica all-time, senza azzeramenti stagionali.
I 10 stadi
Muro élite
The Final Draft
Il campionato annuale che chiude la stagione: i migliori della classifica si sfidano dal vivo, con montepremi in prodotti Magic — mai in denaro. Numero di finalisti, sede e data non sono ancora confermati, e l'attivazione dipende dalla validazione legale.
Parametri ancora da fissare
I valori esatti del calcolo (peso delle vittorie, moltiplicatori, bonus di piazzamento) non sono decisi: vanno prima simulati su larga scala. Qualunque numero circolante oggi è un'ipotesi di lavoro.
Sotto il cofano
Specifiche tecniche
CostruitoMonorepo unico, un solo backend per tutte e tre le superfici, infrastruttura interamente self-hosted.
Stack per superficie
| Superficie | Tecnologia | Note |
|---|---|---|
| App giocatore | JavaScript · React Native + Expo (SDK 54) | App nativa iOS/Android, non una webview. Navigazione a file con expo-router. |
| Portali organizer e admin | JavaScript · React + Vite | Single-page app servite da nginx, con TanStack Router e Query. |
| Backend API | Go 1.26 · chi · pgx | Binario unico, SQL scritto a mano (niente ORM), migrazioni incluse nel binario. |
| Database | PostgreSQL 16 | Backup automatici pianificati. |
| Identità | Zitadel v4 self-hosted | Il browser e l'app non vedono mai una schermata Zitadel: media tutto il backend. |
| Design system | CSS con token OKLCH · StyleSheet nativo | Una sola sorgente di colori per web e mobile. |
| Infrastruttura | Docker + Traefik su server proprio (Francoforte) | Deploy automatico a ogni modifica del ramo principale. |
Modello dati
Sei tabelle oggi in produzione. Il dominio del torneo (round, match, risultati, movimenti Shard) è progettato ma non ancora a schema.
| Tabella | Contenuto |
|---|---|
users | Utenti con ruolo (admin · organizer · player). L'unico ponte con il sistema d'identità è un identificativo opaco. |
organizers | Dati del negozio e stato della pratica: in attesa · info richieste · approvato · rifiutato · sospeso. |
events | Evento e ciclo di vita: bozza · pubblicato · iscrizioni chiuse · live · concluso · annullato. Include codice evento, quota, soglie. |
event_tables | I tavoli (pod) generati alla pubblicazione, 8 posti ciascuno. |
registrations | Iscrizioni su tre assi indipendenti: pagamento (dovuto/saldato/rimborsato), presenza (iscritto/check-in/assente), tavolo assegnato. Copre anche i walk-in senza account. |
audit_log | Registro immutabile in sola aggiunta di ogni azione sensibile: chi, cosa, quando, su quale entità. |
API
Una sola API REST per tutti i client, con controlli d'accesso a tre livelli.
| Gruppo | Chi può | Cosa fa |
|---|---|---|
| Pubblico | chiunque, con limiti di frequenza | Registrazione organizzatore e giocatore, accesso, rinnovo sessione, uscita, reimpostazione password. |
| Autenticato | qualsiasi utente | Identità corrente, cambio password. |
| Giocatore | qualsiasi utente | Elenco draft pubblicati (filtro città), dettaglio, iscrizione e disiscrizione, le proprie iscrizioni col codice evento. |
| Organizzatore | ruolo organizer approvato | Profilo negozio, elenco e gestione eventi, pubblicazione, chiusura iscrizioni, annullamento, walk-in. |
| Admin | ruolo admin | Coda organizzatori e decisioni, supervisione eventi, annullamento d'autorità. |
| Sonde | infrastruttura | /healthz processo attivo · /readyz database raggiungibile. |
Sicurezza
Identità e permessi
- Accesso mediato dal backend: nessun client parla direttamente col sistema d'identità
- Il ruolo si legge dal database, mai dal token: non è manipolabile dal client
- Ogni operazione su un evento verifica che l'organizzatore sia approvato
- Un evento di un altro organizzatore risponde «non trovato»: non ne rivela l'esistenza
- All'uscita la sessione viene revocata anche sul server
Difese applicative
- Limiti di frequenza per IP su tutti gli endpoint pubblici
- Risposte e tempi uniformi su accesso e reimpostazione: non si può scoprire se un'email è registrata
- Tutte le query parametrizzate: nessuna injection
- Intestazioni di sicurezza e policy dei contenuti su API e portali
- Registro di audit immutabile sulle azioni sensibili
- Verifica formale di IBAN e partita IVA in registrazione
Un audit di sicurezza completo (revisione del codice più test dal vivo sui tre client) è stato eseguito il 19 luglio 2026: nessuna vulnerabilità critica o alta; i sette interventi di irrobustimento individuati sono stati applicati e verificati.
Linguaggio visivo
Design system
CostruitoUn'unica sorgente di verità per colori, tipografia e spaziature, condivisa fra web e app nativa.
Tipografia
Cinzel — serif inciso, per il marchio, i titoli
e le etichette in maiuscolo. Solo stringhe brevi.
Manrope — sans ad alta leggibilità, per tutto il resto. Cifre tabellari sui dati.
Principi visivi
- Superfici piatte, profondità con ombre blu tenui
- I pulsanti poggiano su un bordo solido che si comprime alla pressione
- Movimento discreto: molle riservate ai momenti di ricompensa
- La gemma Shard è il motivo grafico principale
Le grafiche definitive (gemma illustrata, stemmi dei 10 stadi, icone) sono in produzione: il sistema le accoglie in appositi spazi già predisposti, senza rifare i layout.
A che punto siamo
Stato di avanzamento
In corsoAggiornato al 19 luglio 2026.
Funziona ed è verificato Costruito
- Infrastruttura completa in produzione con deploy automatico
- Accesso, cambio e reimpostazione password su tutte e tre le superfici
- Registrazione e approvazione degli organizzatori
- Ciclo di vita completo dell'evento lato organizzatore
- Supervisione eventi lato admin
- Motore di iscrizione dei giocatori
- App giocatore funzionante su dispositivo reale
- Design system condiviso web + nativo
In lavorazione o pianificato
- Schermate eventi e iscrizione nell'app In corso
- Check-in e console del torneo live Pianificato
- Abbinamenti svizzeri e inserimento risultati Pianificato
- Calcolo dei Punti Shard e classifica Pianificato
- Invio reale delle email Pianificato
- Pubblicazione su App Store e Play Store Pianificato
Onestà intellettuale
Questioni ancora aperte
Da definireScelte non ancora prese. Sono elencate perché un documento di specifiche che le nasconde non serve a nessuno.
- Modello economico
- Come il servizio si sostiene è in fase di definizione con i consulenti fiscali. Nella prima versione non si paga in app: la quota si salda in negozio. Qualunque cifra circolante oggi è un'ipotesi di lavoro.
- Struttura dei premi
- Il principio è fermo — mai denaro, solo prodotti — ma l'impianto va confermato con un legale prima di attivare il campionato.
- Classifica
- All-time (orientamento attuale) oppure stagioni con ridimensionamento periodico: decisione non presa.
- Parametri Shard
- I valori del calcolo richiedono una simulazione su larga scala prima di essere fissati.
- Programma fedeltà
- Un meccanismo di punti spendibili in negozio è previsto come concetto, ma condizioni e funzionamento sono aperti.
- Campionato annuale
- Numero di finalisti, formula, sede e periodo non sono confermati.
- Pubblicazione sugli store
- Gli account sviluppatore Apple e Google non sono ancora attivi: oggi l'app si prova tramite strumenti di sviluppo.