← Tutte le idee Intelligenza artificiale

TinderProfile.ai

Foto migliori per il profilo nelle app di incontri, create dall'AI

Incasso mensile: 2000 USD (fonte indicata nella scheda)

Cosa fa

Da alcuni selfie normali crea foto realistiche e curate da usare su Tinder, Hinge o Bumble. L'utente sceglie un pacchetto e riceve le foto in pochi minuti.

Come guadagna

Pagamento una tantum per pacchetto di foto, senza abbonamento. Trova clienti soprattutto da Google, senza pubblicità a pagamento.

Rendilo tuo

  • Aggiungi consigli sul profilo: quale foto mettere per prima, una bio scritta meglio.
  • Una versione per foto più naturali e meno ritoccate, che è quello che molti chiedono.
  • Attenzione: solo foto di sé stessi, mai di altre persone.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Profilo Migliore": crea foto naturali e curate per il profilo delle app di incontri partendo dai selfie della persona, solo con il suo consenso, e dà consigli su quali usare. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con esempi (con permesso) e i pacchetti
2. Registrazione con conferma della maggiore età
3. Caricamento dei selfie con controlli automatici e consenso
4. Scelta delle ambientazioni: caffè, viaggio, sport, serata, all'aperto
5. Galleria con le foto consigliate in alto

Stile: caldo e sicuro di sé: sfondo bianco, rosa corallo #F43F5E, viola #7C3AED, carattere "Plus Jakarta Sans", foto in formato verticale come nelle app. 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:
- "servizi": ambientazioni scelte, consenso (foto mie, maggiorenne) con data, stato, collegati all'utente
- "foto": selfie e risultati nello Storage, voto di qualità

Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi servizi e le sue foto
- senza i due consensi registrati non parte nessuna generazione
- i selfie si cancellano dopo 7 giorni

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. Selfie controllati e consenso

Prima del caricamento controlla nel browser i selfie (codice nei Dettagli tecnici): da 8 a 15 foto, almeno 512 pixel, file diversi tra loro, non troppo scuri. Spiega cosa non va con un messaggio chiaro.

Due caselle obbligatorie: "In tutte le foto ci sono solo io" e "Ho almeno 18 anni", con data e ora salvate. La Edge Function non avvia nulla senza.

Le foto si creano con un'API di immagini da foto di riferimento, con istruzioni per un risultato naturale: stessa persona, stessi tratti, niente ritocchi esagerati. Sotto la galleria: "Usa foto che ti somigliano davvero: chi ti incontra deve riconoscerti".

4. Galleria e consigli

La galleria mostra 6 foto consigliate in alto, scelte per varietà (un primo piano sorridente, una a figura intera, una con un'attività). Per ogni foto un consiglio in una riga ("ottima come prima foto: viso ben visibile").

Download singolo o in uno zip, ritagliate 4:5. Pulsante "Cancella tutto" sempre visibile.

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di 19 € per 40 foto in 4 ambientazioni. Il pagamento avvia la creazione del pacchetto di foto.

A pagamento riuscito il webhook imposta "pagato" a true nella tabella "servizi", sulla riga del servizio indicata in client_reference_id.

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. Consenso: prova ad avviare il servizio senza i consensi o senza pagamento chiamando direttamente la Edge Function: deve essere rifiutato.
2. Condizioni: vieta l'uso di foto di altre persone e indica un indirizzo per le segnalazioni.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Controllo dei selfie nel browser

Controlla numero, dimensione e luminosità delle foto prima del caricamento, così l'utente sa subito cosa rifare.

export async function controllaSelfie(file: File[]): Promise<string[]> {
  const problemi: string[] = [];
  if (file.length < 8 || file.length > 15) problemi.push("Servono da 8 a 15 foto");

  const visti = new Set<string>();
  for (const f of file) {
    const chiave = f.name + f.size;
    if (visti.has(chiave)) problemi.push(f.name + ": foto doppia");
    visti.add(chiave);

    const img = await createImageBitmap(f);
    if (Math.min(img.width, img.height) < 512) problemi.push(f.name + ": troppo piccola (minimo 512 pixel)");

    // Luminosità media su una versione ridotta a 32x32
    const tela = new OffscreenCanvas(32, 32);
    const ctx = tela.getContext("2d")!;
    ctx.drawImage(img, 0, 0, 32, 32);
    const px = ctx.getImageData(0, 0, 32, 32).data;
    let somma = 0;
    for (let i = 0; i < px.length; i += 4) somma += 0.299 * px[i] + 0.587 * px[i + 1] + 0.114 * px[i + 2];
    if (somma / (px.length / 4) < 60) problemi.push(f.name + ": troppo scura");
    img.close();
  }
  return problemi;
}

Servizi con consenso e pagamento

Il servizio può andare in lavorazione solo con i due consensi e il pagamento. "Pagato" lo cambia solo il webhook di Stripe.

create table servizi (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  ambientazioni text[] not null,
  consenso_mie_foto timestamptz,
  consenso_maggiorenne timestamptz,
  pagato boolean not null default false,
  stato text not null default 'in_attesa'
    check (stato in ('in_attesa', 'in_lavorazione', 'pronto')),
  creato_il timestamptz not null default now(),
  check (stato = 'in_attesa' or (pagato and consenso_mie_foto is not null and consenso_maggiorenne is not null))
);
alter table servizi enable row level security;
create policy "i miei servizi" on servizi for select using (auth.uid() = utente_id);
create policy "creo il mio" on servizi for insert
  with check (auth.uid() = utente_id and not pagato and stato = 'in_attesa');

insert into storage.buckets (id, name, public) values ('selfie', 'selfie', false);
create policy "la mia cartella selfie" on storage.objects for all to authenticated
  using (bucket_id = 'selfie' and (storage.foldername(name))[1] = auth.uid()::text)
  with check (bucket_id = 'selfie' and (storage.foldername(name))[1] = auth.uid()::text);

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.
Cron
Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
Consenso esplicito
Una scelta attiva e registrata della persona (spuntare una casella), non un permesso dato per scontato.