← Tutte le idee Intelligenza artificiale

Coco

Un assistente personale che vive su WhatsApp e Telegram

Incasso mensile: 1600 USD (fonte indicata nella scheda)

Cosa fa

Chatbot personale su WhatsApp e Telegram: promemoria (anche per gli amici), appunti, calendario e altro, scrivendo come a una persona.

Come guadagna

Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.

Rendilo tuo

  • Per persone anziane: promemoria delle medicine e degli appuntamenti, detti a voce.
  • Parti da Telegram, che ha API gratuite e semplici.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Ricordamelo": un assistente su WhatsApp a cui si scrive come a una persona per salvare promemoria, appunti e liste della spesa: "ricordami domani alle 9 di chiamare il dentista". Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con esempi di chat e prezzi
2. Registrazione e collegamento del proprio numero WhatsApp con un codice
3. Pannello web con promemoria, appunti e liste
4. Impostazioni: fuso orario, orario del riepilogo mattutino
5. Pagina privacy chiara

Stile: amichevole e semplice: sfondo bianco, verde WhatsApp scuro #075E54, verde chiaro #25D366, carattere "Inter", esempi mostrati come fumetti di chat. 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:
- "numeri": numero di telefono collegato e verificato, collegato all'utente
- "promemoria": testo, data e ora, inviato o no
- "appunti": testo, lista di appartenenza (spesa, idee, libri), fatto o no

Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi dati
- i messaggi WhatsApp li riceve e li invia solo la Edge Function
- il numero si collega solo dopo la verifica con il codice

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. Capire i messaggi

Usa la WhatsApp Business Platform (Cloud API) di Meta. La Edge Function "whatsapp" riceve i messaggi (codice nei Dettagli tecnici): verifica che la chiamata arrivi da Meta, trova l'utente dal numero e passa il testo a Claude, che lo trasforma in un'azione in JSON: promemoria con data e ora, appunto in una lista, richiesta di elenco ("cosa devo fare domani?") o cancellazione.

L'assistente risponde sempre confermando cosa ha capito: "Ok! Domani alle 9:00 ti ricordo: chiamare il dentista". Se la data non è chiara, chiede.

Ogni minuto una funzione invia i promemoria arrivati all'orario. Fuori dalla finestra di 24 ore dall'ultimo messaggio dell'utente, WhatsApp richiede un messaggio modello approvato: preparalo nel pannello di Meta.

4. Pannello web e riepilogo

Il pannello web mostra promemoria futuri e passati, appunti divisi per lista con le caselle da spuntare, e permette di modificare tutto.

Riepilogo facoltativo ogni mattina su WhatsApp con gli impegni del giorno. Comando "aiuto" che spiega cosa si può chiedere.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 3,99 € al mese. Gratis l'utente ha: 10 promemoria al mese. Con il piano Pro sblocca: promemoria e appunti illimitati, riepilogo mattutino e liste condivise.

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. Date: prova frasi come "tra due ore", "lunedì prossimo", "il 3 alle 15": il promemoria deve essere salvato all'ora giusta nel fuso orario dell'utente.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Ricevere i messaggi da WhatsApp

La Edge Function che Meta chiama: risponde alla verifica iniziale e, per ogni messaggio, controlla la firma prima di fidarsi.

// supabase/functions/whatsapp/index.ts  (pubblicata con --no-verify-jwt)
async function firmaValida(corpo: string, firma: string | null): Promise<boolean> {
  if (!firma) return false;
  const chiave = await crypto.subtle.importKey(
    "raw", new TextEncoder().encode(Deno.env.get("META_APP_SECRET")!),
    { name: "HMAC", hash: "SHA-256" }, false, ["sign"],
  );
  const firmato = await crypto.subtle.sign("HMAC", chiave, new TextEncoder().encode(corpo));
  const atteso = "sha256=" + [...new Uint8Array(firmato)].map((b) => b.toString(16).padStart(2, "0")).join("");
  return atteso === firma;
}

Deno.serve(async (req) => {
  const url = new URL(req.url);

  // 1. Verifica iniziale fatta da Meta quando si configura il webhook
  if (req.method === "GET") {
    const ok = url.searchParams.get("hub.verify_token") === Deno.env.get("WHATSAPP_VERIFY_TOKEN");
    return ok ? new Response(url.searchParams.get("hub.challenge")) : new Response("No", { status: 403 });
  }

  // 2. Messaggi in arrivo
  const corpo = await req.text();
  if (!(await firmaValida(corpo, req.headers.get("x-hub-signature-256")))) {
    return new Response("Firma non valida", { status: 401 });
  }
  const dati = JSON.parse(corpo);
  const messaggio = dati.entry?.[0]?.changes?.[0]?.value?.messages?.[0];
  if (messaggio?.type === "text") {
    await gestisciMessaggio(messaggio.from, messaggio.text.body);  // Claude + database + risposta
  }
  return new Response("ok");   // rispondere subito, altrimenti Meta riprova
});

Promemoria da inviare

Ogni minuto prende i promemoria arrivati all'orario e li segna come inviati, senza mai mandarne uno due volte.

create table promemoria (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  testo text not null,
  quando timestamptz not null,
  inviato boolean not null default false
);
create index on promemoria (quando) where not inviato;

alter table promemoria enable row level security;
create policy "le mie righe" on promemoria
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

create function promemoria_da_inviare() returns table (id uuid, utente_id uuid, testo text)
language sql security definer set search_path = public as $
  update promemoria set inviato = true
  where promemoria.id in (
    select p.id from promemoria p
    where not p.inviato and p.quando <= now()
    for update skip locked
  )
  returning promemoria.id, promemoria.utente_id, promemoria.testo;
$;
revoke execute on function promemoria_da_inviare() from public, anon, authenticated;
grant execute on function promemoria_da_inviare() to service_role;

Pezzi comuni a tutti i progetti

Glossario

Cron
Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
Finestra di 24 ore
La regola di WhatsApp: si può scrivere liberamente a un utente solo entro 24 ore dal suo ultimo messaggio; dopo servono messaggi modello approvati.