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.