← Tutte le idee Studio e formazione

Piattaforma per imparare le lingue

Una piattaforma per imparare le lingue, pronta e con utenti attivi

Incasso mensile: 17 USD (fonte indicata nella scheda)

Cosa fa

Piattaforma web completa per imparare le lingue, con utenti attivi e pagamenti già integrati. Venduta per circa 5.000 $.

Come guadagna

Incasso annuo dichiarato di circa 200 $ nell'annuncio di vendita su Microns, che verifica i dati: il valore stava nel prodotto già pronto più che negli incassi. Il nome del progetto non è pubblico.

Rendilo tuo

  • Insegnare l'italiano agli stranieri che vivono in Italia: lavoro, burocrazia, vita quotidiana.
  • Lezioni brevi di 5 minuti al giorno.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Parola al Giorno": aiuta a imparare una lingua con carte da ripassare al momento giusto (ripetizione dilazionata) e brevi conversazioni scritte con un tutor AI sul proprio livello. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con le lingue, il metodo e il prezzo
2. Registrazione e test di livello veloce
3. Ripasso del giorno: carte con parola, frase d'esempio e audio
4. Conversazione con il tutor AI su un tema
5. Progressi: parole imparate, giorni di fila, livello

Stile: allegro e chiaro: sfondo bianco, blu #2563EB, verde #16A34A per le risposte giuste, rosso #DC2626 per quelle sbagliate, carattere "Nunito", carte grandi da girare. 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:
- "carte": lingua, parola, traduzione, frase d'esempio, livello
- "ripassi": per ogni utente e carta: intervallo in giorni, facilità, prossimo ripasso
- "conversazioni": tema, messaggi, correzioni, collegate all'utente

Regole di sicurezza obbligatorie:
- le carte sono pubbliche
- ogni utente vede solo i suoi ripassi e conversazioni
- il piano non si modifica 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. Ripassare al momento giusto

Il ripasso del giorno mostra solo le carte "in scadenza": la parola, poi il tocco per girare (traduzione, frase d'esempio, audio con la sintesi vocale del browser). L'utente dice quanto è stato facile: "Di nuovo", "Difficile", "Bene", "Facile".

In base alla risposta l'algoritmo SM-2 decide tra quanti giorni rivedere la carta (codice nei Dettagli tecnici): le parole sapute tornano sempre più di rado, quelle sbagliate domani. Ogni giorno si aggiungono 10 carte nuove del livello dell'utente.

Obiettivo giornaliero e serie di giorni, per creare l'abitudine.

4. Conversazioni con il tutor

Nella pagina conversazioni si sceglie un tema (al bar, in viaggio, colloquio di lavoro) e si chatta con il tutor AI, che scrive al livello dell'utente e alla fine di ogni messaggio corregge con gentilezza gli errori, spiegando la regola in italiano.

Le parole nuove incontrate nella conversazione si possono aggiungere alle carte con un tocco.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 5,99 € al mese. Gratis l'utente ha: 20 carte nuove a settimana e 3 conversazioni al mese. Con il piano Pro sblocca: carte illimitate, conversazioni illimitate, tutte le lingue e statistiche.

A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.

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. Algoritmo: segna una carta "Facile" 4 volte di fila e controlla che l'intervallo cresca (1, 6, circa 15, circa 40 giorni), e che "Di nuovo" lo riporti a 1.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Ripetizione dilazionata (SM-2)

L'algoritmo classico usato da Anki: calcola quando rivedere una carta in base a quanto è stato facile ricordarla.

export type Ripasso = { intervallo: number; ripetizioni: number; facilita: number; prossimo: Date };

// voto: 0 = di nuovo, 3 = difficile, 4 = bene, 5 = facile
export function aggiornaRipasso(r: Ripasso, voto: 0 | 3 | 4 | 5, oggi = new Date()): Ripasso {
  let { intervallo, ripetizioni, facilita } = r;

  if (voto < 3) {
    ripetizioni = 0;
    intervallo = 1;                       // sbagliata: domani
  } else {
    ripetizioni += 1;
    intervallo = ripetizioni === 1 ? 1 : ripetizioni === 2 ? 6 : Math.round(intervallo * facilita);
  }

  // La facilità sale con le risposte facili e scende con quelle difficili (minimo 1,3)
  facilita = Math.max(1.3, facilita + (0.1 - (5 - voto) * (0.08 + (5 - voto) * 0.02)));

  const prossimo = new Date(oggi);
  prossimo.setDate(prossimo.getDate() + intervallo);
  return { intervallo, ripetizioni, facilita, prossimo };
}

export const nuovaCarta = (): Ripasso => ({ intervallo: 0, ripetizioni: 0, facilita: 2.5, prossimo: new Date() });

Carte da ripassare oggi

I ripassi di ogni utente e la query delle carte in scadenza, più le nuove del giorno.

create table carte (
  id serial primary key,
  lingua text not null,
  parola text not null,
  traduzione text not null,
  esempio text not null,
  livello text not null check (livello in ('A1', 'A2', 'B1', 'B2', 'C1'))
);
alter table carte enable row level security;
create policy "carte pubbliche" on carte for select using (true);

create table ripassi (
  utente_id uuid not null references auth.users(id) on delete cascade,
  carta_id int not null references carte(id) on delete cascade,
  intervallo int not null default 0,
  ripetizioni int not null default 0,
  facilita real not null default 2.5,
  prossimo date not null default current_date,
  primary key (utente_id, carta_id)
);
alter table ripassi enable row level security;
create policy "le mie righe" on ripassi
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

-- Carte da ripassare oggi
select c.* from ripassi r join carte c on c.id = r.carta_id
where r.utente_id = auth.uid() and r.prossimo <= current_date
order by r.prossimo
limit 100;

Pezzi comuni a tutti i progetti

Glossario

Ripetizione dilazionata
Un metodo di studio che ti fa ripassare una cosa proprio quando stai per dimenticarla: si impara con meno ripassi.