Usa questa checklist per la consegna del codice sorgente per esportare, documentare, ruotare i segreti, eseguire le migrazioni, verificare le build e confermare la proprietà del deployment con i clienti.

La consegna del codice sorgente è il momento in cui il progetto smette di essere “qualcosa che l'agenzia può gestire” e diventa “qualcosa che il cliente può possedere”. Senza una consegna chiara, i problemi comuni emergono in fretta: l'app si compila solo su un laptop, la produzione dipende da un segreto che nessuno trova, o un piccolo aggiornamento si trasforma in giorni di tentativi.
L'obiettivo di qualsiasi checklist di consegna del codice sorgente è semplice: dopo il trasferimento, il cliente deve essere in grado di costruire, eseguire e distribuire il prodotto senza aver bisogno che l'agenzia sia in standby. Questo non significa “mai più supporto”. Significa che le basi sono ripetibili e documentate, così la prossima persona può riprendere il lavoro con fiducia.
Cosa conta come deliverable deve essere esplicito. Come minimo, una consegna completa di solito include:
L'ambito conta tanto quanto il contenuto. Alcune consegne coprono solo un ambiente (per esempio, production). Altre includono dev, staging e production con impostazioni e processi separati. Se non si nomina quali ambienti sono inclusi, le persone assumono cose diverse, ed è lì che avvengono gli outage.
Un modo pratico per definire il successo è un test di verifica: una persona che non ha costruito l'app può esportare il codice (per esempio da una piattaforma come Koder.ai), seguire la documentazione, impostare le variabili d'ambiente, eseguire le migrazioni, compilare e distribuire nell'ambiente concordato.
Questa checklist si concentra sulla prontezza tecnica: variabili d'ambiente, rotazione dei segreti, migrazioni database, script di deployment e verifica delle build. Non copre termini legali, contratti, clausole di proprietà intellettuale o controversie di pagamento. Anche quelli sono importanti, ma appartengono a un accordo separato.
Una consegna pulita inizia prima di qualsiasi esportazione. Se concordate chi possiede cosa e quando, eviterete sorprese dell'ultimo minuto come deployment interrotti, hosting non pagato o accessi mancanti.
Scegliete una data di consegna e definite una finestra di freeze (spesso 24-72 ore) in cui vanno fatte solo correzioni urgenti. Questo mantiene il codice esportato e il sistema in esecuzione sincronizzati. Se serve un hotfix durante il freeze, annota esattamente cosa è cambiato e assicurati che sia incluso nell'export finale.
Decidete chi possiederà DNS, cloud hosting e eventuali servizi a pagamento dopo la consegna. Non è solo burocrazia. Se la fatturazione resta sulla carta dell'agenzia, i servizi possono essere sospesi più tardi senza preavviso.
Un modo rapido per renderlo concreto:
Annota tutto in linguaggio semplice così entrambe le parti possono seguirlo.
Concorda quali ambienti esistono (local, staging, production) e dove ognuno gira. Nota se lo staging è un server separato, un database separato o solo un feature flag. Se hai usato una piattaforma come Koder.ai, conferma anche cosa è ospitato lì rispetto a cosa ci si aspetta che giri nell'infrastruttura del cliente dopo l'export.
Non aspettare l'ultimo giorno per richiedere gli accessi. Assicurati che le persone giuste possano raggiungere ciò di cui hanno bisogno: il repo, CI, hosting, il database e il provider email.
Concorda anche il test di accettazione finale e il processo di firma. Per esempio: “Il cliente può compilare da una macchina pulita, eseguire le migrazioni, distribuire su staging e passare lo smoke test. Poi entrambe le parti firmano per iscritto.”
Una buona checklist di consegna del codice sorgente inizia con un repo che un nuovo team può aprire e comprendere in pochi minuti. Conferma cosa è incluso (codice dell'app, template di configurazione, script) e cosa è intenzionalmente escluso (segreti reali, chiavi private, file generati di grandi dimensioni). Se qualcosa è escluso, indica dove risiede e chi ne è il proprietario.
Mantieni la struttura prevedibile. Punta a cartelle top-level chiare come frontend/, backend/, mobile/, infra/, scripts/ e docs/. Se il progetto è un monorepo, spiega come i pezzi si relazionano e come eseguire ciascuno di essi.
Il tuo README dovrebbe poter essere usato da qualcuno che non ha costruito il progetto. Deve coprire i prerequisiti e il percorso più veloce per avere un ambiente di sviluppo funzionante, senza supposizioni.
Includi una breve sezione README che risponda a:
Aggiungi brevi note architetturali in linguaggio semplice: cosa comunica con cosa e perché. Un piccolo diagramma è opzionale, ma poche frasi sono solitamente sufficienti. Esempio: “Frontend React chiama l'API Go. L'API legge e scrive su PostgreSQL. I job in background girano come processo worker separato.”
Infine, includi un changelog o note di rilascio versionate per la build di consegna. Può essere un CHANGELOG.md o un breve file “handoff release notes” che indica l'esatto commit/tag, cosa è stato consegnato e problemi noti.
Se il codice è stato esportato da una piattaforma come Koder.ai, annota il tipo di progetto generato (web, server, mobile), la toolchain prevista (per esempio React, Go, PostgreSQL, Flutter) e le versioni di OS/tooling supportate che il cliente dovrebbe usare per riprodurre la build.
Le variabili d'ambiente sono spesso la ragione per cui un'app “funzionava” ma fallisce subito dopo la consegna. Una buona checklist tratta le variabili d'ambiente come parte del prodotto, non come un ripensamento.
Inizia scrivendo un inventario che un nuovo team possa seguire senza indovinare. Tienilo in linguaggio semplice e includi un esempio del formato del valore (non segreti reali). Se una variabile è opzionale, indica cosa succede quando manca e quale valore di default viene usato.
Un modo semplice di presentare l'inventario è:
Evidenzia chiaramente le differenze per ambiente. Per esempio, lo staging può puntare a un DB di test e a un provider di pagamenti sandbox, mentre la production usa servizi live. Nota anche i valori che devono corrispondere tra sistemi, come callback URL, allowed origins o bundle identifier delle app mobile.
Documenta dove ogni valore risiede oggi. Molti team dividono i valori tra posti: file .env locali per lo sviluppo, variabili CI per le build e impostazioni hosting per il runtime. Se hai usato Koder.ai per esportare l'app, includi un file .env.example e una breve nota su quali variabili devono essere compilate prima della prima build.
Infine, dimostra che non ci sono segreti nascosti nel repo. Non limitarti a controllare i file correnti. Esamina la storia dei commit per chiavi accidentali, vecchi file .env o credenziali copiate in config di esempio.
Esempio concreto: un frontend React più un'API Go possono aver bisogno di API_BASE_URL per il web e di DATABASE_URL più JWT_SIGNING_KEY per il backend. Se lo staging usa un dominio diverso, scrivi entrambi i valori e indica dove cambiarli, così il nuovo team non deploya impostazioni di staging in produzione.
La consegna non è completa finché il cliente non controlla ogni credenziale che l'app utilizza. Questo significa ruotare i segreti, non solo condividerli. Se un'agenzia (o un ex consulente) ha ancora chiavi funzionanti, rimane una porta aperta che non puoi auditare.
Inizia facendo un inventario completo. Non fermarti alle password del database. Includi chiavi API di terze parti, segreti client OAuth, segreti di firma webhook, chiavi di firma JWT, credenziali SMTP, chiavi di accesso allo storage e qualsiasi token “temporaneo” presente nella CI.
Ecco una semplice checklist per il giorno della rotazione:
Dopo la rotazione, dimostra che nulla si è rotto. Esegui test rapidi “da utente reale” invece di controllare solo i log.
Concentrati sui flussi che dipendono dai segreti:
Esempio: se hai esportato un progetto da Koder.ai e l'app usa un provider di pagamenti più un servizio email, ruota entrambe le chiavi, ridistribuisci, poi effettua una piccola transazione di test e invia un'email di prova. Solo dopo che questi passaggi hanno successo revoca le chiavi dell'agenzia.
Infine, documenta dove risiederanno i segreti in futuro (vault, variabili CI o impostazioni hosting), chi può cambiarli e come tornare indietro in sicurezza se una rotazione causa errori.
Una consegna può sembrare “fatta” mentre il database è la prima parte che si rompe. Tratta migrazioni e dati come un prodotto a sé: versionati, ripetibili e testati.
Inizia annotando la versione corrente del database e dove risiedono le migrazioni nel repo. Sii specifico: il percorso della cartella, il pattern di naming e l'ultimo ID di migrazione (o timestamp). Se usi PostgreSQL (comune con backend Go), annota anche eventuali estensioni richieste.
Includi un breve runbook che risponda a queste domande:
I rollback meritano onestà. Alcune modifiche sono reversibili solo con il ripristino di un backup. Indicalo in linguaggio semplice e abbinalo a un passo di backup (snapshot prima del deploy, verifica del processo di restore).
Prima che la consegna sia completa, esegui le migrazioni su una copia dei dati di produzione se possibile. Questo cattura query lente, indici mancanti e problemi del tipo “funziona su dati vuoti”. Un test realistico è esportare il codice, impostare le variabili d'ambiente, ripristinare un dump anonimizzato, poi applicare le migrazioni da zero. Quell'esercizio valida una grande parte di qualsiasi checklist di consegna.
Se l'app è stata costruita in una piattaforma come Koder.ai e poi esportata, ricontrolla che i file di migrazione e eventuali script di seed siano inclusi nell'export e ancora referenziati correttamente dal processo di avvio del backend.
Una consegna è completa solo quando qualcun altro può ricostruire l'app da zero su una macchina pulita. La checklist dovrebbe includere i comandi di build esatti, le versioni richieste e l'output atteso (per esempio: “bundle web in /dist”, “nome del binario API”, “posizione APK Flutter”).
Annota gli strumenti e i package manager che usi realmente, non quello che pensi di usare. Per uno stack tipico potrebbe essere Node.js (e npm o pnpm) per un'app React, la toolchain Go per il server, gli strumenti client PostgreSQL per il setup locale e l'SDK Flutter per il mobile.
Rendi le installazioni delle dipendenze prevedibili. Conferma che i lockfile siano committati (package-lock.json, pnpm-lock.yaml, go.sum, pubspec.lock) e fai una nuova installazione su un computer nuovo o in un container pulito per dimostrare che funziona.
Cattura cosa fa la CI, passo per passo, così può essere copiata su un altro provider CI se necessario:
Separa la configurazione di build da quella di runtime. La config di build cambia ciò che viene compilato (come un API base URL incorporato in un bundle web). La config di runtime viene iniettata all'avvio (come URL del database, chiavi API e feature flag). Mischiare queste due è una ragione comune per cui “funziona in CI” ma fallisce dopo il deploy.
Fornisci una semplice ricetta di verifica locale. Anche pochi comandi sono sufficienti:
# Web
pnpm install
pnpm test
pnpm build
# API
go test ./...
go build ./cmd/server
# Mobile
flutter pub get
flutter test
flutter build apk
Se stai esportando da una piattaforma come Koder.ai, includi eventuali file CI generati o preset di build usati durante il deployment così il cliente può riprodurre la stessa build fuori dalla piattaforma.
Una buona checklist di consegna non si ferma a “ecco il repo.” Spiega anche come l'app passa dal codice sorgente a un servizio in esecuzione e chi preme il pulsante.
Inizia annotando come avvengono oggi i deploy: completamente manuale (qualcuno esegue comandi su un server), guidato da CI (una pipeline costruisce e distribuisce) o tramite una piattaforma hostata. Includi dove risiedono le configurazioni e quali ambienti esistono (dev, staging, production).
Rendi i passaggi di rilascio ripetibili. Se il processo dipende da una persona che si ricorda 12 comandi, trasformali in script e annota i permessi necessari.
Dai al cliente abbastanza elementi per distribuire al giorno uno:
Concorda le aspettative di downtime. Se è richiesto “zero downtime”, specifica cosa significa in pratica (blue-green, rolling deploy, finestra read-only per le migrazioni). Se il downtime è accettabile, definisci una finestra chiara.
Gli asset statici e le cache sono punti di fallimento comuni. Nota come gli asset sono costruiti e serviti, quando invalidare le cache e se è coinvolta una CDN.
Un rollback dovrebbe essere una ricetta breve e testata legata a un tag o ID di release. Per esempio: deploy del tag precedente, ripristino dell'ultimo snapshot del database se necessario e invalidazione delle cache.
Se l'app è stata creata su Koder.ai e poi esportata, menziona l'ultimo snapshot noto-buono e l'esatta versione di export così il cliente può associare il codice a una release funzionante rapidamente.
La verifica è il momento in cui scopri se la consegna è reale. L'obiettivo è semplice: una persona nuova deve poter prendere il codice esportato, impostarlo e ottenere la stessa app funzionante senza tentativi.
Prima di iniziare, registra cosa significa “corretto”: la versione dell'app in esecuzione, il commit/tag corrente (se disponibile) e una o due schermate o risposte API chiave da confrontare. Se l'export proviene da una piattaforma come Koder.ai, annota lo snapshot o il timestamp dell'export così puoi dimostrare di aver testato lo stato più recente.
Per gli smoke test, mantienili brevi e legati al rischio:
Se qualcosa fallisce, cattura il comando esatto, l'output d'errore e le env var usate. Quel dettaglio salva ore quando la proprietà cambia mani.
Il modo più rapido per trasformare una consegna in un incendio è presumere “il codice basta”. Una buona checklist si concentra sui piccoli dettagli noiosi che decidono se il cliente può davvero eseguire e modificare l'app senza di voi.
La maggior parte dei problemi rientra in pochi schemi ripetuti:
Rendi la rotazione e la pulizia degli accessi un'attività programmata, non un elemento “quando abbiamo tempo”. Fissa una data in cui gli account agenzia vengono rimossi, le chiavi di servizio rigenerate e il cliente conferma di poter distribuire usando solo le proprie credenziali.
Per le env var, fai un inventario semplice da tre posti: il repo, il sistema CI e l'interfaccia hosting. Poi convalida eseguendo una build pulita da una macchina o container nuovo.
Per le migrazioni, testa con lo stesso ruolo database che userà il deploy di produzione. Se la produzione richiede passaggi elevati (come abilitare un'estensione), documentali e rendine chiara la proprietà.
Un esempio realistico: dopo aver esportato un progetto da Koder.ai, il cliente deploya con successo ma i job in background falliscono perché un URL di coda era impostato solo nella dashboard hosting. Un rapido audit delle env var lo avrebbe evitato. Abbinalo a una release taggata e a un rollback documentato (per esempio, “redeploy tag v1.8.2 e ripristina l'ultimo snapshot”) e il team evita downtime.
Se devi conservare solo una pagina da questa checklist, tieni questa. L'obiettivo è semplice: un clone pulito dovrebbe partire su una macchina nuova, con segreti nuovi e un database che può evolvere in sicurezza.
Esegui questi controlli su un laptop che non ha mai visto il progetto (o in un container/VM pulito). È il modo più rapido per catturare file mancanti, assunzioni nascoste e credenziali vecchie.
Un'agenzia consegna un frontend React, un'API Go e un database PostgreSQL. Il team cliente clona il repo, copia il fornito .env.example nelle effettive env var e crea nuove credenziali per il database, il provider email e eventuali API di terze parti. Eseguono go test (o il comando di test concordato), compilano l'app React, applicano le migrazioni su una nuova istanza Postgres e avviano entrambi i servizi. Infine deployano usando lo script documentato e confermano che lo stesso commit può essere ricostruito in seguito.
Mantieni la consegna breve e con responsabilità chiare. Una walkthrough di 30-60 minuti spesso vale più di un documento lungo.