Il Sistema Operativo
Tutto dall'app Claude sul tuo computer: Chat e Progetti, la scheda Code, i Connettori. Colleghi GitHub, Railway, Resend, Stripe, Bunny e gli strumenti creativi. In 72 ore la prima landing è online.
Le 4 fasi del sistema
M00 = il sistema operativo sotto tutte e quattro le fasi
Le tre stanze dell'app Claude
i comandi girano dietro le quinte · nessun file di configurazione · nessuna chiave in chat
Cosa colleghiamo, in ordine
- Il patto NM OSmappa, metodo Guarda e Fai, cosa avrai tra 60 giorni · 5'
- Claude Pro/Maxaccount, Progetti, il Progetto "NM OS" · 12'
- L'app Claude sul computerMac e Windows: installazione e scheda Code · 15'
- Il primo progetto nella scheda Codecartella, permessi, «descrivi cosa vuoi» · 15'
- GitHub dalla scheda Codeaccount, repository privato, primo caricamento · 15'
- Railwayconnettore, «metti online questa cartella», variabili, dominio · 20'
- Resendconnettore, dominio verificato, DNS su IONOS, prima email · 15'
- Lovable, Canva, Higgsfieldaccount e primo risultato · 12'
- Stripe + ShopifyPayment Link e Checkout; Shopify come alternativa · 15'
- Bunny Streamlibreria, caricamento, embed (opzione completa video) · 10'
- ConnettoriRailway, Resend, Shopify, Canva, GitHub, Meta Ads (e Google Ads senza) · 25'
- SFIDA 72hla tua prima landing online · 15'
Il patto NM OS
Obiettivo: sapere cosa costruirai, in che ordine, con quali strumenti e quanto costa al mese.
Dieci pezzi. Ognuno si verifica.
- Compliance Card dell'aziendaverifica: punteggio 0-100 nel Progetto
- Validation Report con l'idea vincenteverifica: keyword, volumi, CPC in tabella
- Landing online con dominioverifica: c'è un URL che risponde
- Form → email Resend + Pixel + GA4verifica: eventi che arrivano
- Checkout Stripe (o Shopify)verifica: ordine di test riuscito
- 20 creatività pronte per le adsverifica: cartella creativita/ piena
- Campagna Meta e Search attiveverifica: spesa e contatti nel report
- Sequenze email, agente filtra-lead e CRMverifica: un contatto attraversa il sistema in 60 s
- 3 Tool di Attrazione pubblicativerifica: quiz, calcolatore, referenze online
- Kit Duplicazione + piano 90 giorniverifica: primo clone consegnato
Guarda e Fai
Niente slide. Apro l'app Claude, chiedo in italiano, consento, verifico. Ogni lezione finisce con una cosa che esiste.
Stessa app, stesse tre stanze. Una lezione di 15 minuti ti prende 30-45 minuti. Se ti blocchi, copi l'errore e lo incolli a Claude.
Quanto costa, al mese
| Funzione | Economica | Completa |
|---|---|---|
| AI | Claude Pro 20 €/meseapp, scheda Code e Connettori inclusi | Claude Max da 100 €/mesestessa app, più capacità |
| Codice + hosting | GitHub Free + Railway Hobby 5 $/mese | Railway Pro + Postgres + dominio IONOS 20 $/mese + ~10 €/anno |
| Resend Free 0 €3.000 email/mese | Resend Pro + Broadcasts 20 $/mese | |
| App · design · immagini | Lovable Free · Canva Free · Higgsfield Basic 0-10 € | Lovable Pro 25 $ · Canva Pro 12 € · Higgsfield Pro |
| Pagamenti · video | Stripe Payment Links (solo commissioni) · YouTube non in elenco 0 € | Stripe Checkout / Shopify 27 € · Bunny Stream ~1 $ |
| Totale indicativo | ≈ 25-30 €/mese | ≈ 180-250 €/mese |
Il mio piano di 60 giorni e il budget dello stack
Sei il mio coach operativo per il corso NM OS (Network Marketing Operating System). Non sei un consulente finanziario e non fai promesse di guadagno: il tuo compito è aiutarmi a pianificare il lavoro. Contesto su di me: - Azienda di network marketing: [NOME AZIENDA] - Categoria prodotto: [es. oli essenziali / sostituti pasto / integratori / cosmesi] - Livello: [principiante / networker attivo / leader con team di N persone] - Tempo disponibile a settimana: [N ore] - Computer: [Mac / Windows] - Budget mensile per i tool: [N €] - Ho già un dominio? [sì, nome / no] - Esperienza tecnica: nessuna. Nel corso uso solo l'app Claude sul computer (Chat e Progetti, scheda Code, Connettori): non uso un terminale e non scrivo codice a mano. Il percorso ha 11 moduli (M00 setup, M01-M02 VALIDA, M03-M04 COSTRUISCI, M05-M07 VENDI, M08 DUPLICA, M09 organico, M10 duplicazione) e va completato in 60 giorni con il rilascio settimanale: settimana 1 M00+M01, settimana 2 M02, settimane 3-4 M03+M04, settimana 5 M05+M06, settimana 6 M07+M09, settimana 7 M08, settimana 8 M10. Compito: 1. Costruisci il mio calendario personale di 60 giorni: per ogni settimana, i moduli, le ore da bloccare in agenda e i giorni concreti in cui le blocco, in base al tempo che ti ho dato. 2. Scegli per me lo stack: per ogni funzione (AI, hosting, email, pagamenti, creatività, video) indica se partire con l'opzione economica o completa, dato il mio budget, e il costo mensile stimato totale. Opzione economica: Claude Pro 20 €, Railway Hobby 5 $, GitHub free, Resend free, Lovable free, Canva free, Stripe solo commissioni. Opzione completa: Claude Max, Railway Pro 20 $, Resend Pro 20 $, Lovable Pro 25 $, Canva Pro 12 €, Higgsfield Pro, Bunny pay-as-you-go. 3. Elenca i 5 rischi più probabili per cui NON finirò il percorso (es. tempo, blocchi tecnici, policy aziendale) e per ciascuno una contromisura concreta. Per i blocchi tecnici, ricorda che la regola del corso è: copio l'errore e lo incollo nella scheda Code o in una chat del Progetto NM OS, e Claude mi guida. Formato di output: tabella "Settimana | Moduli | Ore | Giorni", poi tabella "Funzione | Tool scelto | Piano | €/mese", poi elenco dei rischi. Italiano, frasi corte, niente incoraggiamenti generici. Non usare mai le parole "facile", "garantito", "guadagno".
Claude e il Progetto "NM OS"
Obiettivo: account Claude a pagamento e Progetto "NM OS" con istruzioni e file. È la tua scrivania per 60 giorni.
Pro o Max?
| Cosa ti serve | Economica · Claude Pro | Completa · Claude Max |
|---|---|---|
| Costo | 20 €/mese≈ 17 €/mese se annuale | da 100 €/meselimiti di utilizzo 5× o 20× |
| Chat, Progetti, file caricati | Sì | Sì |
| App sul computer: scheda Code | Sì, inclusa | Sì, stessa app, sessioni lunghe senza pause |
| Connettori (Railway, Resend, Meta…) | Sì, inclusi | Sì, più connettori attivi nella stessa conversazione |
| Quando sceglierlo | Da subito: basta per tutto il corso | Se in M03 tocchi il limite ogni giorno |
| Consiglio | Parti da qui, mensile | Passa a Max quando serve capacità |
Il profilo che Claude legge in ogni chat
Sei l'assistente operativo di [NOME E COGNOME], networker dell'azienda [NOME AZIENDA], che segue il corso NM OS (Network Marketing Operating System) di Michele Farace. Il metodo è Product-First: prima si valida un prodotto da vendere a clienti veri, poi si costruisce un sistema di vendita online con l'AI, poi si vende, e solo alla fine si duplica il sistema nel team. Il reclutamento è una conseguenza, mai l'inizio. Il mio contesto: - Azienda: [NOME AZIENDA], categoria [oli essenziali / sostituti pasto / integratori / cosmesi / altro] - Prodotti principali: [PRODOTTO 1], [PRODOTTO 2], [PRODOTTO 3] - Cliente tipo: [es. donne 35-55 attente al benessere quotidiano] - Dominio: [DOMINIO] · Email mittente: [ciao@DOMINIO] - Stack: app Claude sul computer (Pro/Max) con Chat e Progetti, scheda Code (Claude Code integrato) e Connettori; GitHub, Railway (hosting Node.js), Resend (email), Stripe (pagamenti) o Shopify, Lovable, Canva, Higgsfield, Bunny Stream; Connettori per Railway, Resend, GitHub, Shopify, Canva, Meta Ads; Google Ads senza connettore (script e istruzioni preparati da te). - Non uso un terminale e non scrivo codice a mano: quando serve un file, un comando o un deploy, lo chiedo a te nella scheda Code e lo esegui tu, chiedendomi il permesso. Regole che rispetti sempre, senza eccezioni: 1. Nessuna promessa di guadagno: mai "guadagna", "rendita", "facile", "garantito", "sicuro", "automatico al 100%", mai cifre di guadagno. Se ti chiedo di scriverle, rifiuta e proponi una formulazione sul sistema o sul processo. 2. Nessun claim medico o terapeutico sui prodotti: gli oli essenziali non curano né trattano; i sostituti pasto non "fanno dimagrire X kg" ma sostituiscono un pasto nel contesto di una dieta ipocalorica secondo etichetta. Usa parole come benessere, routine, abitudine, supporto quotidiano. Segnala ogni frase a rischio con [ATTENZIONE CLAIM]. 3. Ogni strategia deve superare il check "è permesso dalla policy della mia azienda?" (uso del brand, prezzi, vendita online, ads con il nome dell'azienda). Se non lo sai, chiedimelo o segnalalo con [VERIFICA POLICY]. 4. Organico e social: prepari testi e risposte, non simuli automazioni che pubblicano o inviano messaggi al posto mio. Niente scraping, niente spam. 5. Privacy: ogni form prevede consenso esplicito, link alla privacy policy, e double opt-in se possibile. 6. Testimonianze e risultati: accanto a ogni testimonianza inserisci il disclaimer «I risultati mostrati si riferiscono a esperienze specifiche e non sono garantiti né rappresentativi dei risultati medi.» 7. Chiavi e password: non me le chiedi mai in chat e non le scrivi mai nei file di codice. Vivono solo nelle Variabili di Railway e nel file .env locale, che resta fuori da GitHub. Stile: italiano, diretto, frasi corte, verbi. Quando scrivi codice: Node.js con Express, HTML single-file con CSS e JS inline, font Google Unbounded (titoli), Inter (testo), JetBrains Mono (codice); palette: sfondo #05060A, superficie #0C0E16, lime #C8FF00, cyan #00E5FF, orange #FF6B35, violet #8B5CF6, testo #F5F7FA. Responsive, nessuna dipendenza esterna non necessaria, nessun testo segnaposto. Quando ti do un compito: prima riassumi in 2 righe cosa hai capito, poi esegui, poi elenca cosa devo verificare io.
Test del Progetto NM OS
Questa è la prima chat del Progetto "NM OS". Prima di qualsiasi altra cosa, dimostrami che hai letto le istruzioni di progetto e i file caricati. Compito: 1. Riassumi in 5 righe chi sono, quale azienda rappresento, quali sono i miei 3 prodotti principali e qual è il mio cliente tipo, prendendo i dati SOLO dalle istruzioni di progetto e dai file nella Project knowledge. Se un dato manca, scrivi "dato mancante" invece di inventarlo. 2. Elenca le 7 regole che devi rispettare, ognuna in una riga, con parole tue. 3. Prendi il primo prodotto del listino che ho caricato e scrivi due frasi di presentazione: una che sarebbe VIETATA (perché contiene un claim medico o una promessa di guadagno) e una CORRETTA che rispetta la regola 2. Marca la vietata con [ATTENZIONE CLAIM] e spiega in una riga perché non va. 4. Dimmi qual è lo stack che userò e quali account devo ancora aprire per completare il Modulo 0 del corso (Claude, GitHub, Railway, Resend, Lovable, Canva, Higgsfield, Stripe o Shopify, Bunny). Presentalo come checklist con caselle vuote. Per ogni tool indica se nel corso si collega con un Connettore dell'app Claude (Railway, Resend, GitHub, Shopify, Canva, Meta Ads) oppure si usa solo dalla sua interfaccia. 5. Proponi il nome del file in cui salverai, da ora in poi, gli appunti del mio sistema (es. "sistema-[AZIENDA].md") e la sua struttura in 6 sezioni. Formato: titoli numerati, elenchi puntati, italiano, frasi corte. Non aggiungere incoraggiamenti. Se le istruzioni di progetto non sono presenti, dimmelo esplicitamente nella prima riga.
Attiviamo Claude rec
L'app Claude sul computer
Obiettivo: app installata su Mac o Windows, scheda Code aperta, cartella nm-os creata in Documenti.
Download, doppio click, login
- Macpagina Stack → Claude → Download → "Claude per Mac" → apri il .dmg → trascina l'icona in Applicazioni → espelli il disco → Launchpad
- Windows"Claude per Windows" (o Microsoft Store) → doppio click sull'installer → se "PC protetto da Windows": Ulteriori informazioni → Esegui comunque
- Login con la stessa email della L02a sinistra compaiono le stesse chat e il Progetto NM OS: l'app e claude.ai sono la stessa cosa in due posti
- Tour: Chat · Progetti · Code · Impostazioni → ConnettoriConnettori vuoti: oggi solo il tour, li colleghiamo quando servono
- Prima apertura della scheda Codel'app prepara il motore (30-60 s), chiede di confermare l'account: incluso nel piano Pro, nessun costo in più
Barra laterale: Chat, Progetti, Code, Connettori
Claude scrive i file, li prova, li carica su GitHub, li mette online. Ti chiede il permesso prima di ogni azione.
Apri cartellaPermessi: chiedi prima di ogni azione (default: lascialo così)
Documenti / nm-os
- MacFinder → Documenti → tasto destro → Nuova cartella →
nm-os· percorso/Users/[nome]/Documents/nm-os - WindowsEsplora file → Documenti → tasto destro → Nuovo → Cartella →
nm-os· percorsoC:\Users\[NOME]\Documents\nm-os - Tutto minuscolo, con il trattino, vuotanon sul Desktop, non dentro iCloud/OneDrive/Drive con la sincronizzazione attiva
- Fai tu (L03)app aperta con il tuo account · scheda Code senza errori · cartella creata · permessi su "chiedi prima di ogni azione"
- Se ti blocchi: P003 nel Progetto NM OSincolla il testo esatto dell'errore, parola per parola. Claude ti guida con click e menu, mai con comandi
Diagnosi dell'installazione
Sono uno studente del corso NM OS senza esperienza tecnica. Sto installando l'app Claude sul mio computer e mi sono bloccato. Non uso un terminale e non voglio comandi da digitare: guidami solo con click, menu e finestre, un passo alla volta, aspettando la mia conferma prima del passo successivo. Il mio computer: [Mac (modello e versione di macOS) / Windows 10 o 11] Cosa stavo facendo: [es. aprivo l'app la prima volta / cliccavo sulla scheda Code / facevo il login] Cosa vedo a schermo (copiato parola per parola, o descritto): "[TESTO DELL'ERRORE O DESCRIZIONE]" Cosa ho già provato: [es. chiuso e riaperto l'app / riavviato il computer / niente] Compito: 1. Dimmi in una riga qual è la causa più probabile, in italiano semplice, senza termini tecnici non spiegati. 2. Dammi la soluzione come sequenza di click (massimo 6 passi), dicendo per ogni passo cosa devo vedere se ha funzionato. 3. Se la causa può essere una di queste, riconoscila e trattala così: "app non aperta perché scaricata da Internet" (Mac: Impostazioni di Sistema → Privacy e sicurezza → "Apri comunque"); "PC protetto da Windows" (Ulteriori informazioni → Esegui comunque); "scheda Code che resta in caricamento" (chiudere del tutto l'app: Mac Cmd+Q, Windows tasto destro sull'icona nella barra → Esci; riaprire; se persiste, disconnettersi e rifare il login); "login che non torna all'app" (copiare l'indirizzo mostrato nel browser e incollarlo nella finestra dell'app, o chiudere il browser e ripetere); "cartella nm-os non trovata" (verificare che sia in Documenti e che si chiami esattamente nm-os, minuscolo). 4. Se dopo la tua soluzione il problema resta, dimmi quali due informazioni copiare dallo schermo per il tentativo successivo. Vincoli: mai proporre comandi da digitare in un terminale, PowerShell o Prompt dei comandi; mai chiedermi password o codici; se una soluzione richiede davvero un comando, dimmi invece di chiedere aiuto nella community del corso.
Il primo progetto nella scheda Code
Obiettivo: cartella nm-os aperta nella scheda Code, index.html creato da Claude col tuo permesso e una modifica già fatta.
Descrivi → Approvi → Verifichi
nessun codice da copiare · nessun comando da scrivere · i comandi passano dietro le quinte
«Crea un file index.html con scritto Ciao»
Stai lavorando nella cartella nm-os che ho appena aperto nella scheda Code dell'app Claude. Sono all'inizio del corso NM OS, non ho esperienza tecnica e non uso un terminale: spiega in una riga ogni azione prima di farla, chiedi il permesso prima di creare o modificare file, e rispondi sempre in italiano con frasi corte. Compito: 1. Crea un file chiamato index.html in questa cartella. Contenuto: una pagina HTML completa, in italiano, con lang="it", titolo "NM OS — Ciao", sfondo #05060A, testo #F5F7FA, font Inter da Google Fonts, e al centro dello schermo una sola scritta "Ciao" grande, in font Unbounded, colore #C8FF00. Tutto il CSS deve stare dentro il file (nessun file esterno). Deve essere responsive. 2. Crea anche un file README.md con tre righe: nome del progetto "nm-os", il mio nome [NOME E COGNOME], la data di oggi. 3. Alla fine elenca i file creati con il percorso completo e dammi il link per aprire index.html nel browser (o aprilo tu, se puoi). 4. Non installare nulla, non creare altre cartelle, non caricare niente su GitHub: lo faremo nella prossima lezione. 5. Chiudi con una riga: "Prossimo passo: dimmi cosa vuoi cambiare nella pagina".
Ogni azione, una domanda
Crea un file index.html con scritto Ciao, e un README.md con il mio nome e la data di oggi.
Creo index.html (pagina con "Ciao" in lime su sfondo scuro) e README.md. Prima di scrivere ti chiedo il permesso per ciascun file.
File creati: Documents/nm-os/index.html · Documents/nm-os/README.md. sta eseguendo… (apre il file nel browser) Prossimo passo: dimmi cosa vuoi cambiare nella pagina.
Fatto quando…
- La cartella
nm-osè aperta nella scheda Code e il nome compare in alto nella sessione - Hai risposto "Sì, mi fido" solo per
nm-os index.htmleREADME.mdesistono e li hai visti creare con due richieste di permessoindex.htmlsi apre nel browser e mostra "Ciao"- Hai chiesto «Cambia la scritta in "Ciao, sono [NOME]" e mettila in cyan», visto il confronto rosso/verde, ricaricato: cambiata
- Sai riaprire una sessione dall'elenco a sinistra e aprirne una nuova sulla stessa cartella
GitHub dalla scheda Code
Obiettivo: account GitHub verificato e repository privato nm-os-landing con index.html, README.md e .gitignore, caricato da Claude su tua richiesta.
Il tuo computer → GitHub → Railway
prima: account GitHub (Free) con email verificata · username consigliato nome-cognome
«Crea un repository privato e caricaci questa cartella»
Stai lavorando nella cartella nm-os aperta nella scheda Code. Non uso un terminale: spiega ogni azione in una riga prima di farla, chiedi il permesso prima di eseguirla, rispondi in italiano con frasi corte. Se qualcosa manca sul computer, dimmelo e proponi come installarlo con click (installer ufficiale) o fallo tu chiedendomi il permesso. I miei dati: - Nome e cognome: [NOME COGNOME] - Email dell'account GitHub: [EMAIL GITHUB] - Username GitHub: [USERNAME] Compito, in questo ordine: 1. Controlla se git è disponibile su questo computer. Se manca: su Mac aspetta che io installi gli strumenti per sviluppatori quando compare la finestra di sistema (ti scrivo "fatto"); su Windows aprimi la pagina di download di Git for Windows e aspetta il mio "fatto". Poi ricontrolla. 2. Imposta la mia firma per le versioni (nome ed email sopra), solo se non è già impostata. 3. Crea un file .gitignore con almeno queste righe: node_modules/, .env, .env.*, .DS_Store, Thumbs.db, *.log, dist/, leads.json. Spiegami in una riga perché .env non deve mai finire su GitHub. 4. Se non esiste, crea README.md con: titolo "nm-os-landing", una riga "Landing NM OS di [NOME COGNOME]", una riga "Stack: Node.js + Express su Railway, email via Resend", la data di oggi. 5. Prepara la cartella come repository (se non lo è già) e registra la prima versione con il messaggio "Primo caricamento: index.html, README e .gitignore". 6. Crea sul mio account GitHub un repository PRIVATO chiamato nm-os-landing e caricaci questa cartella. Per farlo usa lo strumento ufficiale di GitHub: se non è installato, chiedimi il permesso di installarlo; per l'autorizzazione mostrami il codice da incollare e apri la pagina GitHub nel browser, poi aspetta il mio "fatto". Se per qualsiasi motivo non riesci a creare il repository da qui, dimmi i 4 click per crearlo io su GitHub (New repository → nome nm-os-landing → Private → senza README) e chiedimi il link che finisce con .git; poi carica. 7. Alla fine dammi il link della pagina del repository e dimmi cosa devo vedere per confermare che è andato tutto bene (tre file, etichetta Private, messaggio della versione). Regole: nessun caricamento forzato, nessun file cancellato, nessun altro ramo oltre a main. Se un passo dà errore, fermati, spiegamelo in italiano semplice e proponi il rimedio prima di continuare. Non stampare mai codici di autorizzazione o token nei file.
Il ponte c'è
| File | Ultima versione |
|---|---|
.gitignore | Primo caricamento: index.html, README e .gitignore |
README.md | Primo caricamento: index.html, README e .gitignore |
index.html | Primo caricamento: index.html, README e .gitignore |
Landing NM OS di [NOME COGNOME] · Stack: Node.js + Express su Railway, email via Resend
Fatto quando…
- Account GitHub creato ed email verificata (nessun banner giallo)
- Hai visto Claude controllare git, impostare la firma e creare
.gitignorecon la riga.env - Hai incollato il codice a 8 caratteri su GitHub e autorizzato (una volta sola)
- Il repository
nm-os-landingè Private e mostra i tre file con "Primo caricamento" - Sai che per le prossime modifiche basta dire «carica su GitHub con il messaggio "…"»
Railway: «metti online questa cartella»
Obiettivo: connettore Railway collegato, nm-os-landing online con URL pubblico, PORT, NODE_ENV e RESEND_API_KEY impostate, dominio se ce l'hai.
Caricamento = deploy
prima serve un'app vera: server.js + package.json + railway.json, scritti da Claude (P006) · Node.js dall'installer ufficiale
Prepara l'app Node per Railway
Stai lavorando nella cartella nm-os aperta nella scheda Code: è già un repository collegato a GitHub (nm-os-landing, ramo main) e contiene index.html. Devo pubblicare questa pagina su Railway con Node.js ed Express. Non uso un terminale: spiega ogni passo in una riga, chiedi il permesso prima di eseguirlo, rispondi in italiano.
Compito:
1. Controlla se Node.js (versione 20 o superiore) è installato. Se manca, aprimi la pagina di download di nodejs.org (versione LTS), spiegami in due righe come installarlo con l'installer (Avanti, Avanti, Installa) e aspetta il mio "fatto"; poi ricontrolla. Non tentare installazioni alternative.
2. Crea package.json con: "name": "nm-os-landing", "private": true, "type": "module", "scripts": { "start": "node server.js", "dev": "node --watch server.js" }, "engines": { "node": ">=20" }.
3. Installa express come dipendenza.
4. Crea server.js in ES module che: legge la porta da process.env.PORT con fallback 3000; usa express.json(); serve i file statici della cartella; risponde a GET /health con { ok: true, app: "nm-os-landing" }; risponde a GET / con index.html; stampa in console "nm-os-landing in ascolto sulla porta X" all'avvio.
5. Crea railway.json con builder NIXPACKS, startCommand "npm start", healthcheckPath "/health", restartPolicyType "ON_FAILURE", restartPolicyMaxRetries 3.
6. Crea .env.example (NON .env) con le righe PORT=3000 e RESEND_API_KEY=la_tua_chiave_resend, e verifica che .gitignore contenga .env e node_modules/.
7. Avvia il server per 5 secondi per verificare che parta senza errori, poi fermalo. Dimmi che quando vorrò provarlo basterà scriverti "avvia il server e dammi il link".
8. Registra la versione con il messaggio "App Express pronta per Railway" e carica su GitHub.
9. Alla fine elenca i file del progetto e dimmi cosa vedrò nei log di Railway se il deploy va a buon fine.
Vincoli: nessuna dipendenza oltre express; niente file .env reale; nessun caricamento forzato. Se un passo fallisce, fermati e spiegami l'errore in italiano semplice.
Cosa dici a Claude
- Impostazioni → Connettori → Railway → Connetti → login → Autorizzapallino verde "Connesso". Niente da copiare, nessun file da modificare. Vale in Chat e nella scheda Code.
- «Metti online questa cartella su Railway: crea un progetto nm-os-landing collegato al repository GitHub nm-os-landing, ramo main, e avvia il deploy»permesso "Claude vuole usare Railway: crea progetto" → Consenti. La prima volta Railway chiede di autorizzare la sua app GitHub solo su quel repository.
- «Leggi i log dell'ultimo deploy di nm-os-landing e dimmi se è andato a buon fine»Build (installazione) → Deploy: "nm-os-landing in ascolto sulla porta 8080"
- «Genera il dominio pubblico del servizio nm-os-landing e dammi l'URL»https://nm-os-landing-production-[xxxx].up.railway.app → "Ciao" online, con HTTPS
- «Imposta sul servizio le variabili PORT=8080, NODE_ENV=production e RESEND_API_KEY con il segnaposto da_sostituire_in_L07, poi riavvia il deploy»le chiavi vere, quelle segrete, le incolli tu nella pagina Variables di Railway: mai in chat
Claude usa Railway. Con il tuo permesso.
Metti online questa cartella su Railway: crea un progetto nm-os-landing collegato al repository GitHub nm-os-landing, ramo main, e avvia il deploy.
Progetto creato, deploy avviato. Railway sta leggendo package.json, installando Express, avviando npm start. Stato: Building → Active. Vuoi che legga i log e generi il dominio pubblico?
Sì: leggi i log, genera il dominio pubblico e dammi l'URL.
Una riga nella rubrica di Internet
- Railway → servizio → Settings → Networking → Custom Domain →
www.[DOMINIO]Railway mostra il record: tipo CNAME · nome www · valore [xxxx].up.railway.app - IONOS → Domini & SSL → il dominio → scheda DNS → Aggiungi recordTipo CNAME · Nome host solo
www· Punta a: il valore copiato da Railway · TTL predefinito · Salva - Dominio nudo senza wwwIONOS non accetta CNAME sulla radice: ingranaggio → Modifica destinazione → Inoltra dominio → https://www.[DOMINIO], permanente
- Torna su Railway: da "Waiting for DNS" a verde in 5-30 minutiHTTPS lo fa Railway da solo. Cloudflare DNS: stesso CNAME, nuvola grigia finché non è verde
- Se non ricordi i passiin Chat: «dammi i passi esatti per creare su IONOS il CNAME che mi chiede Railway»
Resend: il postino verificato
Obiettivo: connettore Resend collegato, dominio verificato con i record su IONOS, chiave di solo invio in Railway e nel .env, prima email ricevuta.
Form → server → Resend → inbox
account Resend: Free 3.000 email/mese, 100/giorno, 1 dominio · regione EU (Ireland) per il GDPR · connettore: Impostazioni → Connettori → Resend → Connetti
Tre-quattro righe. Copiate, non inventate.
| Tipo | Nome host (solo questo) | Valore | Priorità | Scopo |
|---|---|---|---|---|
| MX | send | feedback-smtp.eu-west-1.amazonses.com | 10 | bounce / SPF |
| TXT | send | v=spf1 include:amazonses.com ~all | — | SPF: "Resend può spedire per me" |
| TXT | resend._domainkey | p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB… (lungo: usa il bottone copia) | — | DKIM: la firma digitale |
| TXT | _dmarc | v=DMARC1; p=none; | — | DMARC: osserva senza bloccare |
| IONOS → Domini & SSL → dominio → DNS → Aggiungi record · TTL predefinito · non toccare i record MX/SPF della casella email sulla radice · poi in Chat: «Verifica i record DNS del dominio [DOMINIO] su Resend e dimmi lo stato» | ||||
Mai
- Incollare la chiave in una chat "per far prima"
- Scriverla dentro server.js o in un file su GitHub
- Permesso "Full access" quando basta "Sending"
Sempre
- Railway Variables (icona dell'occhio) + .env locale, a mano
- «verifica che .env non sia tracciato su GitHub» → Claude conferma
- Se finisce in chat per errore: revoca, rigenera, incolla di nuovo
Prima email dal tuo server
Stai lavorando nella cartella nm-os aperta nella scheda Code: progetto Node.js ES module con Express già pronto. Nel file .env (che è nel .gitignore) c'è la variabile RESEND_API_KEY con la mia chiave Resend: non leggerla ad alta voce, non stamparla, non copiarla in nessun altro file. Il mio dominio verificato su Resend è [DOMINIO]; se non fosse ancora verificato, usa come mittente "onboarding@resend.dev" e come destinatario solo [TUA_EMAIL] (l'email del mio account Resend). Non uso un terminale: spiega ogni azione in una riga, chiedi il permesso, rispondi in italiano. Compito: 1. Installa il pacchetto ufficiale resend. 2. Crea la cartella scripts/ e il file scripts/test-email.js che: importa Resend; crea il client con process.env.RESEND_API_KEY; invia UNA email con from "[NOME BRAND] <ciao@[DOMINIO]>", to ["[TUA_EMAIL]"], subject "Test NM OS: il postino funziona", html con un contenitore scuro (#05060A), titolo "Funziona." in #C8FF00, una riga di testo e una riga piccola in #A3A9B8 con "Email di test inviata da [NOME E COGNOME] durante il Modulo 0 di NM OS"; se error è presente lo stampa ed esce con codice 1, altrimenti stampa "Inviata. ID:" e l'id. 3. Eseguilo leggendo le variabili dal file .env (con l'opzione --env-file di Node; se la mia versione di Node non la supporta, installa dotenv come dipendenza di sviluppo e adatta l'esecuzione). Mostrami solo l'output. 4. Se Resend risponde con un errore, spiegamelo in italiano semplice: 403 "domain not verified" (il dominio non è ancora verde, usa onboarding@resend.dev), 401 (chiave sbagliata o mancante nel .env), 422 (mittente non sul dominio verificato). 5. Aggiungi in package.json lo script "test:email" così in futuro potrò dirti "esegui il test email". 6. Verifica che .env non sia tracciato, poi registra la versione "Script test email Resend" e carica su GitHub. Vincoli: non stampare mai il valore di RESEND_API_KEY; non inserire la chiave nel codice; nessun contenuto promozionale nell'email di test.
Lovable, Canva, Higgsfield
Obiettivo: tre account attivi, un'app di prova con form su Lovable, Brand Kit su Canva con il connettore collegato, prima immagine su Higgsfield.
Tre account, tre risultati rec
Un prompt, un'app
Crea una pagina web single-page in italiano per il brand "[NOME BRAND]" (categoria: [oli essenziali / sostituti pasto / altro]). Stile: scuro, tecnico, premium. Sfondo #05060A, superfici #0C0E16 con bordo rgba(255,255,255,0.08) e raggio 16px, testo #F5F7FA, testo secondario #A3A9B8, accento #C8FF00 usato solo per il bottone e un dettaglio del titolo. Font: Unbounded per i titoli, Inter per il testo (da Google Fonts). Responsive, mobile-first. Struttura della pagina: 1. Header con il wordmark "[NOME BRAND]" a sinistra. 2. Hero con titolo "Una routine che regge" e sottotitolo "[una frase su benessere quotidiano e abitudini, senza promesse di risultato e senza claim medici]". 3. Un form con i campi: Nome (obbligatorio), Email (obbligatoria, con validazione), una casella di consenso obbligatoria con il testo "Ho letto la privacy policy e acconsento a ricevere email da [NOME BRAND]" e un link "privacy policy" che punta a /privacy, e un bottone "Ricevi la guida". 4. Alla submit non inviare nulla a nessun server: mostra un messaggio di conferma "Grazie [Nome], controlla la tua email." e svuota il form. Salva i dati solo nello stato locale del componente. 5. Footer con la riga "I contenuti hanno finalità informative e non sostituiscono il parere di un professionista." e "© [ANNO] [NOME BRAND]". Vincoli: nessun testo segnaposto finto o riempitivo; nessuna promessa economica, nessuna parola tra "cura", "dimagrisci", "risultati garantiti"; nessuna immagine esterna; il bottone deve essere disabilitato finché la casella di consenso non è spuntata. Non aggiungere autenticazione né database.
Stripe: un prodotto, un link
Obiettivo: Stripe in modalità test con un prodotto, un Payment Link, un pagamento di prova con 4242 4242 4242 4242 e l'endpoint Checkout scritto da Claude. E sai quando scegliere Shopify.
Prodotto, link, carta di prova, chiavi
- Catalogo prodotti → + Aggiungi prodottoKit Routine Serale AromaVita (brand fittizio) · descrizione che parla di routine, non di effetti · immagine creativita/prova-01.jpg · 39,00 € una tantum
- Crea link di pagamentoquantità OFF · indirizzo di spedizione ON se fisico · conferma "Grazie. Riceverai una email con i dettagli." → https://buy.stripe.com/test_…
- Paga con la carta di test4242 4242 4242 4242 · 12/34 · 123 → Pagamenti: "Riuscito, 39,00 €" · rifiuto simulato: 4000 0000 0000 0002
- Sviluppatori → Chiavi APIla segreta sk_test_… la incolli tu in Railway Variables (STRIPE_SECRET_KEY) e nel .env · STRIPE_PRICE_ID (price_…) e BASE_URL non sono segreti: puoi dirli a Claude
- Scheda Code: P009Claude installa stripe, aggiunge POST /api/checkout e le pagine /grazie e /annullato, fa lui la richiesta di prova, ti dà l'URL checkout.stripe.com da cliccare, carica su GitHub
Endpoint Checkout Session
Stai lavorando nella cartella nm-os aperta nella scheda Code: progetto Node.js ES module con Express in server.js, già pubblicato su Railway. Nel .env (ignorato da GitHub) ci sono STRIPE_SECRET_KEY (chiave sk_test), STRIPE_PRICE_ID (id del prezzo del prodotto di test, formato price_...) e BASE_URL (http://localhost:3000 in locale). Non stampare mai i valori delle variabili. Non uso un terminale: spiega ogni azione in una riga, chiedi il permesso, rispondi in italiano.
Compito:
1. Installa il pacchetto ufficiale stripe.
2. In server.js aggiungi: import di Stripe; client creato con process.env.STRIPE_SECRET_KEY; una route POST /api/checkout che crea una Checkout Session con mode "payment", line_items [{ price: process.env.STRIPE_PRICE_ID, quantity: 1 }], success_url `${BASE_URL}/grazie?session_id={CHECKOUT_SESSION_ID}`, cancel_url `${BASE_URL}/annullato`, locale "it", shipping_address_collection con allowed_countries ["IT"]; risponde con { url: session.url }; in caso di errore logga err.message e risponde 500 con { error: "Checkout non disponibile" }.
3. Aggiungi due route GET: /grazie che risponde con una pagina HTML minima scura (#05060A, testo #F5F7FA, titolo in #C8FF00) "Grazie. Ordine di test ricevuto." e /annullato con "Pagamento annullato. Puoi riprovare quando vuoi."
4. In index.html aggiungi un bottone "Ordina (test)" che, al click, fa fetch POST a /api/checkout e reindirizza window.location all'url ricevuto. Stile: sfondo #C8FF00, testo #05060A, raggio 999px.
5. Aggiorna .env.example con STRIPE_SECRET_KEY, STRIPE_PRICE_ID e BASE_URL (valori di esempio, non reali).
6. Avvia il server, fai tu una richiesta di prova a POST /api/checkout e mostrami che la risposta contiene un url che inizia con https://checkout.stripe.com, scrivendo l'url per intero così posso cliccarlo. Poi ferma il server.
7. Registra la versione "Checkout Session Stripe (test)" e carica su GitHub. Ricordami che le tre variabili devono esserci anche su Railway (STRIPE_SECRET_KEY la incollo io nella pagina di Railway; STRIPE_PRICE_ID e BASE_URL puoi impostarle tu con il connettore Railway se glielo chiedo) e che serve un nuovo deploy.
Vincoli: nessun webhook per ora (lo faremo in M03.L07); nessuna chiave nel codice; nessun testo con promesse di risultato nelle pagine.
Un prodotto o un catalogo
| Funzione | Economica · Stripe Payment Links | Completa · Checkout integrato / Shopify |
|---|---|---|
| Quando | Un prodotto o un kit: link fisso, nessun codice | Server che sa chi ha pagato (M03.L07); Shopify per 10-50 prodotti con varianti, magazzino, spedizioni, sconti |
| Costo | 0 €/mese + ≈ 1,5 % + 0,25 € per carte europeeShopify Starter: 5 €/mese + 5 % + commissioni (Buy Button da incollare nella landing) | 0 €/mese + stesse commissioniShopify Basic: 27 €/mese + commissioni carte |
| Connettore | Nessuno: Stripe si usa dal suo pannello e dal codice scritto da Claude | Connettore Shopify: Impostazioni → Connettori → Shopify → Connetti → «Elenca i prodotti del mio negozio» |
| Cosa cambia | Ordine visibile solo nel pannello Stripe | Email di conferma, CRM, evento Purchase per Meta e GA4; catalogo gestito da Claude via connettore (M03) |
| Regola | La tua azienda ti permette di vendere i suoi prodotti in un tuo checkout, e a che prezzo? Compliance Card, Modulo 1. Fino ad allora: modalità test. | |
Bunny Stream: il tuo player
Obiettivo: Video Library con Allowed Referrers, un video caricato e l'embed 16:9 in un file creato da Claude. YouTube "non in elenco" è l'alternativa gratuita.
Libreria, protezioni, upload, embed
- Stream → Video Libraries → Add Video Librarynome nm-os-landing · Europe · Library ID (non segreto: puoi dirlo a Claude) · API Key (solo nel .env, la incolli tu)
- Security → Allowed Referrers[DOMINIO], www.[DOMINIO], l'URL Railway, localhost · Token Authentication OFF fino a M03.L08
- Videos → Uploadtrascina un .mp4 (demo: "Come preparo il pasto sostitutivo in 60 secondi", FitMeal, brand fittizio) · Uploading → Processing → Finished · Video ID
- Scheda Code: P010 con Library ID e Video IDClaude crea video-test.html con il contenitore aspect-ratio 16/9 e ti dà il link: ridimensiona la finestra, resta 16:9
- Economica: YouTube Studio → Non in elenco → Incorpora«sostituisci l'iframe di video-test.html con questo» · stesso contenitore, ma logo e suggerimenti a fine video
Embed responsive 16:9
Stai lavorando nella cartella nm-os aperta nella scheda Code. Ho una Video Library su Bunny Stream con Library ID [LIBRARY_ID] e un video caricato con Video ID [VIDEO_ID]. Non ho ancora attivato la token authentication: l'embed pubblico funziona sui domini in Allowed Referrers, tra cui localhost. Non uso un terminale: chiedi il permesso prima di creare file, rispondi in italiano. Compito: 1. Crea video-test.html: pagina HTML completa in italiano (lang="it"), meta viewport, font Inter e Unbounded da Google Fonts, sfondo #05060A, testo #F5F7FA, contenitore centrato max 960px. 2. Titolo h1 "Il pasto sostitutivo in 60 secondi" con "60 secondi" in #C8FF00. 3. Un div con classe "video": width 100%, aspect-ratio 16/9, sfondo #0C0E16, bordo 1px rgba(255,255,255,0.08), raggio 16px, overflow hidden, leggero glow lime; dentro un iframe posizionato assoluto che riempie il contenitore, senza bordo, con src https://iframe.mediadelivery.net/embed/[LIBRARY_ID]/[VIDEO_ID]?autoplay=false&preload=true, loading="lazy", allow="accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture", allowfullscreen e un title descrittivo. 4. Aggiungi un fallback @supports not (aspect-ratio) con padding-bottom 56.25%. 5. Sotto il video, un paragrafo in #A3A9B8 14px: "Video di esempio del corso NM OS. [NOME BRAND] è un brand fittizio. Il prodotto sostituisce un pasto nel contesto di una dieta ipocalorica, secondo etichetta." 6. Aggiungi al .env.example le righe BUNNY_LIBRARY_ID= e BUNNY_API_KEY= (vuote) e ricordami di NON mettere la API key nell'HTML: l'embed usa solo gli ID, la API key serve solo lato server e nel .env la incollo io. 7. Dammi il link per aprire il file nel browser (o aprilo tu) e dimmi cosa devo controllare ridimensionando la finestra. 8. Registra la versione "Embed Bunny Stream responsive" e carica su GitHub. Vincoli: nessun JavaScript necessario; nessuna dipendenza esterna oltre Google Fonts e l'iframe Bunny; nessun testo con claim su salute o peso.
Connettori: Claude ha le mani
Obiettivo: Railway, Resend, GitHub, Canva e Meta Ads collegati con permessi minimi. Sai cosa può fare ciascuno e dove si revoca. E cosa fare per Google Ads.
Claude al centro, gli strumenti intorno
Connetti, login, Autorizza
Impostazioni · Disconnetti
Impostazioni · Disconnetti
Impostazioni · Disconnetti
Only select repositories: nm-os-landing
Business [NOME] · 1 account pubblicitario
Connetti · solo se vendi con Shopify
Legge / Fa / Dove lo usi
| Connettore | Legge | Fa (sempre con permesso) | Dove lo usi |
|---|---|---|---|
| Railway | progetti, servizi, deploy, log, variabili (valori nascosti), domini | crea progetti e servizi da GitHub, imposta variabili non segrete, riavvia deploy, genera domini | M00, M03, M07, M08, M10 |
| Resend | domini e stato DNS, email inviate e stato, audience | aggiunge domini, manda email, crea broadcast e audience | M00, M03, M07, M10 |
| GitHub | repository, file, versioni, issue | crea repository e modelli, apre issue e pull request | M05, M10 |
| Shopify | prodotti, collezioni, ordini, clienti (se lo usi) | crea e modifica prodotti, collezioni, sconti | M03, M07 |
| Canva | design, Brand Kit, cartelle | crea design da modello, ridimensiona, esporta | M04 |
| Meta Ads | account, campagne, ad set, ad, metriche, pixel | crea campagne, ad set e ad in pausa, carica creatività, modifica budget | M05 |
| Notion / Airtable | pagine, database, record | crea e aggiorna record: il mini CRM economico | M07 |
Consenti una volta. Rifiuta quando vuoi.
- Prova: «Imposta sul servizio nm-os-landing la variabile APP_NAME con valore nm-os» → Consenti una voltala richiesta dice quale connettore, quale azione, con quali dati
- Prova: «Cancella il servizio nm-os-landing» → RifiutaClaude si ferma e basta. Nelle impostazioni del connettore spegni le azioni che non vuoi mai (es. "delete-service")
- Regola 1 · permessi minimisolo il Business che usi, solo il repository che serve, solo il negozio che vendi
- Regola 2 · "consenti una volta" finché non conosci l'azione"sempre" solo per le letture
- Regola 3 · le azioni distruttive le fai tucancellare, pubblicare, attivare campagne: nel pannello dello strumento, o spente nel connettore
- Regola 4 · mai chiavi e password in chati connettori servono a non copiare chiavi; se uno strumento te ne dà una, vive nel .env e su Railway
- Regola 5 · sai dove si revocaImpostazioni → Connettori → Disconnetti, più la pagina "app collegate" dello strumento. Nel dubbio revochi e ricolleghi: un minuto
Google Ads: due strade, stesso Claude
In Chat Claude prepara lo script (JavaScript che gira dentro Google Ads). Tu: Google Ads → Strumenti → Script → incolla → Autorizza → Esegui. Report e pausa automatica delle keyword che costano troppo, ogni giorno, da solo. Mette in pausa, non attiva.
Struttura completa in Chat: campagna, gruppi, keyword, annunci, negative. Istruzioni passo-passo per l'interfaccia di Google Ads, o file da importare in Google Ads Editor. Un passaggio manuale in più, stessa qualità.
non installare "connettori" Google Ads non ufficiali trovati online · se arriverà quello ufficiale, lo dirà M06 e la pagina Stack del portale
Inventario dei connettori e Carta dei permessi
Sei il mio assistente nel Progetto NM OS. Ho collegato dei connettori all'app Claude da Impostazioni → Connettori. Non uso un terminale e non ho file di configurazione: tutto passa dai connettori. Voglio un inventario chiaro e una "Carta dei permessi" da salvare qui nel Progetto. Compito, chiedendo il permesso prima di ogni lettura e senza eseguire alcuna azione di scrittura, modifica o cancellazione: 1. Elenca i connettori che hai a disposizione in questa conversazione (attesi: Railway, Resend, GitHub, Canva, Meta Ads, e Shopify se presente). Se uno di quelli attesi manca, dimmelo. 2. Per ciascun connettore fai UNA sola lettura di prova, la più innocua possibile: Railway → elenco progetti; Resend → elenco domini con stato; GitHub → elenco repository accessibili; Canva → elenco Brand Kit o ultimi design; Meta Ads → elenco account pubblicitari; Shopify → nome del negozio e numero di prodotti. Riporta il risultato in una riga per connettore (senza dati personali di terzi). 3. Compila la tabella "Connettore | Cosa può leggere | Cosa può fare a nome mio | Rischio se usato male | Dove si revoca (nell'app e nel tool)". Per "dove si revoca nel tool" indica il percorso della pagina "app collegate / autorizzazioni" di Railway, Resend, GitHub, Canva, Meta (Business Manager → Integrazioni aziendali) e Shopify. 4. Segnala i permessi troppo larghi che riesci a dedurre dalle letture (es. Meta Ads con più account di quelli che uso: [ELENCA GLI ACCOUNT CHE USI DAVVERO]; GitHub con più repository di nm-os-landing) e dimmi come restringerli. 5. Scrivi la "Carta dei permessi NM OS" in 6 righe: (1) permessi minimi, (2) "consenti una volta" finché non conosco l'azione, (3) azioni distruttive spente o fatte a mano nel tool, (4) mai chiavi in chat, (5) dove si revoca, (6) revisione ogni 30 giorni. 6. Ricordami in una riga che Google Ads non ha un connettore ufficiale e che in M06 userò gli script e le istruzioni passo-passo preparati da te. Formato: titoli numerati, tabella, italiano, frasi corte. Vincoli: nessuna azione oltre alle letture del punto 2; nessun valore di chiavi, token o variabili nella risposta; se una lettura fallisce, riporta l'errore in italiano semplice e vai avanti.
SFIDA 72h: la prima landing online
Obiettivo: entro 72 ore la landing "Coming soon" è su Railway, con il tuo nome, una promessa che non parla di guadagno e un form che manda email con Resend. URL nella community.
Sette punti
- Titolo "[NOME BRAND] sta arrivando" e la promessa senza cifre di guadagno né claim su salute o pesoes. «Un pasto sostituito al giorno, con una routine che regge. Guide, ricette e un metodo per non mollare alla seconda settimana.»
- La riga "Un progetto di [NOME COGNOME]"
- Form Nome + Email + checkbox consenso obbligatoria con link a /privacy + bottone "Avvisami quando parte"
- POST /api/lead: valida, salva in leads.json (fuori da GitHub), manda l'email a te e la conferma al contatto con Resend
- /privacy con titolare, finalità, base giuridica, revoca, servizi usati (Railway, Resend)
- Footer "Progetto formativo indipendente, non collegato ad alcuna rete di vendita"
- Online su Railway (LEAD_TO_EMAIL e MAIL_FROM impostate da Claude con il connettore) e URL nel canale #sfida-72h
Landing "Coming soon" con form → Resend, su Railway
Stai lavorando nella cartella nm-os aperta nella scheda Code: progetto Node.js ES module con Express in server.js, pubblicato su Railway da GitHub, con il pacchetto resend già installato e RESEND_API_KEY nel .env locale e nelle Variabili di Railway. Hai a disposizione il connettore Railway. Il mio dominio verificato su Resend è [DOMINIO] (se non verificato, usa il mittente onboarding@resend.dev e invia solo a [TUA_EMAIL]). Non uso un terminale: spiega ogni passo in una riga, chiedi il permesso prima di scrivere file o usare un connettore, rispondi in italiano.
Dati:
- Nome e cognome: [NOME COGNOME]
- Brand della landing: [NOME BRAND] (brand personale, non il nome dell'azienda NM salvo policy verificata)
- Promessa (senza cifre di guadagno, senza claim su salute o peso): "[PROMESSA, es. Un pasto sostituito al giorno, con una routine che regge. Guide, ricette e un metodo per non mollare alla seconda settimana.]"
- Email a cui ricevere le iscrizioni: [TUA_EMAIL]
- Mittente: "[NOME BRAND] <ciao@[DOMINIO]>"
Compito:
1. Riscrivi index.html come landing "Coming soon" single-file (CSS e JS inline), lang="it", responsive mobile-first, font Google Unbounded (titoli) e Inter (testo). Palette: sfondo #05060A, superficie #0C0E16, bordo rgba(255,255,255,0.08), raggio 16px, accento #C8FF00 (bottone e una parola del titolo), testo #F5F7FA, secondario #A3A9B8. Un leggero gradient mesh animato nel hero (solo CSS). Struttura: header con wordmark del brand; hero con titolo "[NOME BRAND] sta arrivando", la promessa come sottotitolo, la riga "Un progetto di [NOME COGNOME]"; card con form: Nome (obbligatorio), Email (obbligatoria, type email), checkbox obbligatoria "Ho letto la privacy policy e acconsento a ricevere email da [NOME BRAND]" con link a /privacy, bottone "Avvisami quando parte" disabilitato finché la checkbox non è spuntata; messaggio di successo inline "Grazie [Nome], controlla la tua email." e messaggio di errore inline; footer con "© [ANNO] [NOME BRAND] · Progetto formativo indipendente, non collegato ad alcuna rete di vendita" e link a /privacy. Nessun testo segnaposto.
2. In server.js aggiungi POST /api/lead che: legge nome, email, consenso dal body JSON; rifiuta con 400 se manca il nome, se l'email non è valida (regex semplice) o se consenso non è true; salva { nome, email, consenso: true, data: ISO, ip: req.ip } in leads.json (crea il file se manca, array JSON); invia con Resend una email a LEAD_TO_EMAIL con oggetto "Nuovo iscritto: [nome]" e corpo con nome, email, data; invia al lead una email di conferma con oggetto "Sei in lista: [NOME BRAND]" e un HTML scuro con titolo "Sei dentro." e due righe di testo senza promesse; risponde { ok: true }; in caso di errore Resend logga il messaggio e risponde 500 { ok: false }. Aggiungi un limite semplice: massimo 5 richieste al minuto per IP, in memoria.
3. Aggiungi GET /privacy che serve privacy.html: pagina minima con titolare [NOME COGNOME], email di contatto [TUA_EMAIL], finalità (invio email informative sul lancio), base giuridica (consenso), conservazione (fino a revoca), diritti dell'interessato e come revocare (rispondendo alla email), servizi usati (Railway per l'hosting, Resend per l'invio). Stessa palette.
4. Verifica che leads.json sia nel .gitignore. Aggiorna .env.example con LEAD_TO_EMAIL e MAIL_FROM e usa queste variabili nel codice invece dei valori fissi; aggiungi le due righe con i valori veri al mio .env locale (non sono segreti).
5. Avvia il server, fai tu una richiesta di prova a POST /api/lead con un JSON valido e mostrami la risposta; lasciami il link http://localhost:3000 per provare il form dal browser e aspetta il mio "ok"; poi ferma il server.
6. Registra la versione "Landing Coming soon con form Resend" e carica su GitHub.
7. Con il connettore Railway imposta sul servizio nm-os-landing le variabili LEAD_TO_EMAIL e MAIL_FROM (non sono segrete) e riavvia il deploy; poi leggi i log dell'ultimo deploy e dimmi se è andato a buon fine e qual è l'URL pubblico da provare.
Vincoli: mai le parole "guadagna", "facile", "garantito", "sicuro", "cura", "dimagrisci"; nessuna cifra di guadagno o di peso; nessuna dipendenza oltre express e resend; nessuna chiave nel codice; non chiedermi mai il valore di RESEND_API_KEY.
Tre blocchi tipici, tre frasi
Quasi sempre Claude trova la causa, corregge e ricarica su GitHub. Railway riparte da solo.
Errore 403: usa onboarding@resend.dev verso te stesso, o riverifica i record DNS della L07. In Chat: «quale record manca».
Mancano LEAD_TO_EMAIL, MAIL_FROM o RESEND_API_KEY su Railway. La chiave, se manca, la incolli tu.
bloccato da 20 minuti? copi l'errore, lo incolli nella scheda Code o nella community con il contesto, e passi avanti · post in #sfida-72h: M00 SFIDA · [NOME] · [URL] · eco/completa · cosa mi ha bloccato di più
Non fare
- Chiave Resend o Stripe incollata in chat o dentro server.js
- "Consenti sempre" a un'azione di scrittura di un connettore
- Form senza checkbox di consenso · landing con il logo dell'azienda senza permesso
Fai
- Railway Variables + .env, a mano · «verifica che .env non sia tracciato»
- Permessi minimi (un Business, un repository) · revisione ogni 30 giorni
- Consenso esplicito, /privacy e doppio consenso (M03) · landing a nome tuo
Cosa hai costruito
- Claude Pro/Max + Progetto "NM OS" con istruzioni e file
- App Claude sul computer: scheda Code attiva su Documenti/nm-os
- Repository privato nm-os-landing caricato da Claude; servizio Railway online con URL, variabili e (se lo hai) dominio
- Resend verificato, chiave in Railway e .env, prima email ricevuta
- Lovable, Canva, Higgsfield, Stripe (o Shopify), Bunny attivi
- Connettori Railway, Resend, GitHub, Canva, Meta Ads collegati con permessi minimi
- Landing "Coming soon" online con form → Resend, URL nella community