# Piattaforma videocorsi: stato al 4 novembre 2026 e prossimi passi

Le scelte tecniche stanno nel design (`2026-11-03-piattaforma-videocorsi-design.md`); qui c'è solo lo stato del lavoro.

## Fatto

Tappe 1-7 del preventivo, tutte in locale, nel repo `paoloalby/inlumia-corsi` e provate nel browser:

- accesso (codice email sui dispositivi nuovi, max 3, TOTP per gli admin, invito, recupero, area personale con dispositivi, cambio password e consenso promozionale);
- catalogo e pannello contenuti, caricamento video su Bunny con versioni;
- player con token di 3 minuti rinnovati dal battito, un video alla volta, filigrana, tracciamento e ripresa;
- pannello corsisti (attivazione 365 giorni, rinnovo, proroga, sospensione, gruppi, storico);
- report con CSV e riepilogo del pannello;
- avvisi di scadenza, sincronizzazione systeme.io, job giornaliero.

Ogni commit è stato controllato da una revisione di sicurezza automatica e tutti i punti segnalati sono stati corretti.

Il 4 novembre sera: suite di **test end-to-end** (`app/e2e/`, 92 test su Chrome vero, Bunny vero, systeme.io finto) che percorre tutti i flussi da amministratore e da corsista, passata due volte di fila senza errori; revisione del design (altezze uniche di pulsanti e campi, gerarchia dei pulsanti, regole in `docs/DESIGN.md`). I test hanno trovato e fatto correggere: email cancellata nella pagina di accesso se scritta prima del caricamento, id non numerici negli indirizzi che davano errore 500, stati "pronto" di Bunny letti come errore, copertine illeggibili registrate come errori di sistema, filtro del report con i corsi archiviati, filigrana tagliata sul telefono.

## Non ancora provato

- **systeme.io**: provato dal vero il 5 novembre. Il piano di Inlumia ha al massimo 10 tag; Cristiano ha scelto un solo tag (`Corsi - iscritto`) e ha fatto togliere "Colorificio Tognela". Con un corsista di prova: contatto creato, tag assegnato, poi contatto eliminato e consenso tolto. Ora i tag su systeme.io sono di nuovo 10 su 10: se ne servirà un altro, bisogna liberare un posto o cambiare piano.
- **Webhook Bunny**: impostato il 5 novembre nella libreria (sezione API) su `https://corsi.inlumia.it/api/bunny/webhook`. Arriva anche per i video caricati dai test e2e: l'endpoint ignora gli id che non conosce. Il pannello continua comunque a controllare lo stato ogni 8 secondi.
- **iPhone vero**: lo schermo intero simulato e l'HLS nativo (token da 15 minuti) sono provati solo in teoria.
- **Email vere**: dominio `inlumia.it` verificato su Resend il 4 novembre; la prima email vera partirà col primo invito o recupero password.

## Tappa 8: messa online

Serve da Cristiano (messaggio ancora da mandare):

1. account **Vercel** a nome di Inlumia, piano Pro (circa 20 $/mese, solo carta). Conviene che passi il login come per Bunny: su Vercel ogni membro del team è un posto a pagamento;
2. account **Resend** gratuito con una loro email, poi i record DNS (SPF, DKIM) su Register.it per spedire da `corsi@inlumia.it`;
3. record DNS di `corsi.inlumia.it` verso Vercel;
4. **chiave API di systeme.io**;
5. **carta su Bunny** prima della fine della prova gratuita (circa 17 novembre).

Database **Turso** fatto il 4 novembre sull'account di Paolo: `inlumia-corsi`, gruppo `default`, `aws-eu-west-1` (Irlanda), schema applicato. URL e token in `~/.claude/credenziali.md`. Le funzioni Vercel girano in `dub1` (Dublino), accanto al database: ogni pagina fa più query e Francoforte aggiungerebbe circa 20 ms a ciascuna.

Poi, in ordine:

1. ~~database Turso in regione EU, `npx drizzle-kit push` con `DATABASE_URL`/`DATABASE_AUTH_TOKEN` di produzione~~ (fatto il 4 novembre; per gli aggiornamenti dello schema lanciare lo stesso comando con le due variabili);
2. ~~progetto Vercel, variabili d'ambiente~~ (fatto il 4 novembre). Progetto `inlumia-corsi` nel team `inlumia` (Pro, in prova fino al 18 novembre circa: serve la carta di Cristiano). Non è collegato a GitHub, perché il GitHub di Paolo è già legato al suo Vercel personale: si pubblica con `sh app/scripts/deploy-produzione.sh`, che parte da una copia pulita dell'ultimo commit senza `.git`: con i dati del commit Vercel blocca il deploy, perché l'autore (Paolo) non è membro del team (a Cristiano arriva un'email di avviso). La cartella `~/.vercel-inlumia` contiene il login CLI di Inlumia, così quello personale di Paolo resta com'è. Tredici variabili di produzione, tutte segrete; `CRON_SECRET` e `SEGRETO_APP` sono anche in `~/.claude/credenziali.md`. Online su `inlumia-corsi.vercel.app` e, dal 4 novembre sera, su **https://corsi.inlumia.it** (certificato emesso con `vercel certs issue`, si rinnova da solo). Account admin di Paolo creato (`paoloalby@hotmail.com`). `AVVISI_ERRORI_A=paoloalby@hotmail.com`;
3. DNS: i nameserver di inlumia.it sono su **Cloudflare** (dominio e posta su Register.it). Record da far aggiungere a Cristiano, tutti con la nuvola grigia (solo DNS):
   - `A corsi 76.76.21.21` (Vercel; il dominio è già aggiunto al progetto);
   - `TXT resend._domainkey` con la chiave DKIM mostrata in Resend → Domains → inlumia.it;
   - `CNAME rsend rsend-euw1.forge.rmta.net` e `CNAME send send.forge.rmta.net` (Resend, invio);
   - **non** aggiungere l'MX su `@` che Resend propone per la ricezione: la posta di inlumia.it sta su Register.it.

   Poi in Bunny aggiungere ai domini ammessi eventuali domini di anteprima Vercel e impostare l'URL del webhook;
4. ~~amministratori veri~~ creati il 5 novembre (Paolo, Cristiano `ballerani@inlumia.it`, Luis Perez `perez@inlumia.it`): i link per la password (validi 7 giorni, fino al 12 novembre) sono in `~/Desktop/link-admin-inlumia-corsi.txt`, da girare a ciascuno; il TOTP si configura al primo accesso. Se scadono, si rilancia `scripts/crea-admin.ts`, che ne crea uno nuovo;
5. prova completa da computer e da iPhone con un corsista di prova;
6. guida d'uso del pannello: fatta il 4 novembre, è la pagina `/admin/guida` (voce "Guida" nel menu); resta la sessione di formazione in videochiamata (compresa nel preventivo);
7. prima del lancio: eliminare dalla libreria Bunny i due video di prova (`video-prova.mp4`, `video-lungo.mp4`), togliere `localhost`, `localhost:5190` e `localhost:5191` (test end-to-end) dai domini ammessi se non servono più; finché si usano i test e2e, `localhost:5191` deve restare.

## Bunny lento il 5 novembre

Nel pomeriggio del 5 novembre le conversioni di Bunny sono rimaste ferme allo stato 2 (elaborazione, 0%) per più di 5 minuti anche con un video di 8 secondi caricato a mano, con la pagina di stato di Bunny tutta verde. Il giorno prima la stessa conversione durava 1-2 minuti. Per questo il test e2e del caricamento video è andato in timeout e i test che dipendono dal corso pubblicato non sono partiti; quelli che non dipendono da Bunny (accesso, catalogo, corsisti, job ed email, registro errori: 43 test) passano. Era un problema di Bunny: alle 15:23 UTC hanno aperto l'incidente "Degraded API Response Times" su dashboard e API (https://status.bunny.net/incidents/5g6q6n2c5vk0), con la riproduzione dei video non toccata. Quando capita, prima di cercare il problema da noi guardare status.bunny.net.

## Materiale atteso da Inlumia

Un corso vero con 3-5 video (anche le prove HeyGen), copertine e descrizioni; testi di privacy e condizioni d'uso da iubenda, da linkare nell'area personale e nel piè di pagina.

## Note

- Il database locale `app/data/dev.db` ha dati di prova (corsisti, visioni, gruppo "Carrozzeria Rossi"). Si rifà da zero cancellando il file e lanciando `drizzle-kit push` e `scripts/seed.ts`.
- L'acconto del 30% non è ancora stato fatturato: Paolo l'aveva tolto dall'email di richiesta. Dati di fatturazione di Inlumia nella memoria.
