ApparelAI
Foto dei vestiti indossati da modelli, senza servizio fotografico
Incasso mensile: 904 USD (fonte indicata nella scheda)
Cosa fa
Per i marchi di moda: si carica la foto di un capo steso, su gruccia o su manichino e si ottiene in pochi secondi una foto da catalogo con il capo indossato.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Per i piccoli negozi di abbigliamento italiani su Instagram.
- Modelli diversi per età e taglie, per un catalogo più vero.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Indossato": permette ai piccoli marchi di moda e ai negozi di trasformare la foto di un capo (steso, su gruccia o su manichino) in foto da catalogo con il capo indossato da modelle e modelli generati. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con prima/dopo e prezzi
2. Registrazione e accesso
3. Nuovo capo: foto, tipo, colore, taglia mostrata
4. Scelta del modello generato, della posa e dello sfondo
5. Galleria del catalogo con download
Stile: da moda: sfondo bianco, nero #111111, beige #E7DFD3, carattere "Cormorant Garamond" per i titoli e "Inter" per i testi, foto verticali grandi. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- "capi": foto originale, tipo (maglia, abito, pantalone...), colore, materiale, collegati all'utente
- "scatti": capo, impostazioni (modello, posa, sfondo, inquadratura), risultato nello Storage
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi capi e scatti
- i crediti non si modificano dal browser
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Dal capo alla foto indossata
L'utente carica la foto del capo e ne indica tipo, colore e materiale. Sceglie poi: modello generato (una serie di persone virtuali coerenti, di corporature e carnagioni diverse), posa (frontale, tre quarti, camminata, seduta), sfondo (studio bianco, studio colorato, strada, natura) e inquadratura (intera, mezzo busto, dettaglio).
Le istruzioni per l'API di immagini si costruiscono sempre allo stesso modo (codice nei Dettagli tecnici), così le foto di un catalogo sono coerenti. Ogni scatto costa un credito e produce 2 varianti.
Regola importante: il capo deve restare identico (colore, stampa, logo, cuciture). Se una variante lo cambia, l'utente la segnala e il credito torna indietro.
4. Catalogo ed esportazione
Galleria del catalogo per capo, con le varianti preferite segnate. Esportazione in zip con nomi ordinati (codice-capo_posa.jpg) nelle misure per negozio online (4:5) e Instagram.
Mostra la nota: "Le persone nelle foto sono generate dall'AI: indicalo se richiesto dal tuo canale di vendita".
5. Pagamenti con Stripe
Aggiungi pacchetti di crediti: 30 scatti a 19 €, 150 scatti a 69 €. Ogni nuovo utente riceve 3 crediti gratis. Ogni scatto (2 varianti) costa un credito. Mostra sempre in alto quanti crediti restano e, quando finiscono, un riquadro per comprarne altri.
A pagamento riuscito il webhook aggiunge i crediti del pacchetto con la funzione aggiungi_crediti.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Fedeltà: prova con 5 capi con stampe e loghi: nelle foto devono restare identici; se no, il rimborso del credito deve funzionare.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Istruzioni sempre coerenti per le foto
Costruisce le istruzioni per l'API di immagini partendo dalle scelte dell'utente, sempre con la stessa struttura: così tutte le foto del catalogo si somigliano.
type Scatto = {
tipoCapo: string; colore: string; materiale: string;
modello: { nome: string; descrizione: string }; // es. "Giulia", "donna 30 anni, capelli castani"
posa: "frontale" | "tre quarti" | "camminata" | "seduta";
sfondo: "studio bianco" | "studio colorato" | "strada" | "natura";
inquadratura: "intera" | "mezzo busto" | "dettaglio";
};
export function istruzioniScatto(s: Scatto): string {
return [
"Fotografia di moda professionale per catalogo e-commerce.",
"Persona: " + s.modello.descrizione + ", sempre la stessa in tutte le foto della serie.",
"Indossa il capo della foto di riferimento: " + s.tipoCapo + " " + s.colore + " in " + s.materiale + ".",
"Il capo deve restare IDENTICO: stesso colore, stampa, logo, cuciture e vestibilità. Non aggiungere accessori.",
"Posa: " + s.posa + ". Inquadratura: " + s.inquadratura + ". Sfondo: " + s.sfondo + ".",
"Luce morbida da studio, colori fedeli, nessun testo o filigrana.",
].join("\n");
}Capi, scatti e rimborso
I capi e gli scatti; se l'utente segnala uno scatto sbagliato, la funzione restituisce il credito una sola volta.
create table capi (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
codice text,
tipo text not null,
colore text not null,
materiale text not null default '',
foto_path text not null
);
create table scatti (
id uuid primary key default gen_random_uuid(),
capo_id uuid not null references capi(id) on delete cascade,
utente_id uuid not null references auth.users(id) on delete cascade,
impostazioni jsonb not null,
risultati_path text[] not null default '{}',
rimborsato boolean not null default false
);
alter table capi enable row level security;
create policy "le mie righe" on capi
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
alter table scatti enable row level security;
create policy "le mie righe" on scatti
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
insert into storage.buckets (id, name, public) values ('moda', 'moda', false);
create policy "la mia cartella moda" on storage.objects for all to authenticated
using (bucket_id = 'moda' and (storage.foldername(name))[1] = auth.uid()::text)
with check (bucket_id = 'moda' and (storage.foldername(name))[1] = auth.uid()::text);
-- Segnala uno scatto sbagliato: rimborsa un credito, una volta sola
create function segnala_scatto(scatto uuid) returns boolean
language plpgsql security definer set search_path = public as $
begin
update scatti set rimborsato = true
where id = scatto and utente_id = auth.uid() and not rimborsato;
if not found then return false; end if;
update profili set crediti = crediti + 1 where id = auth.uid();
return true;
end $;
Pezzi comuni a tutti i progetti
Glossario
- Storage
- Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.