← Tutte le idee Studio e formazione

NoteMate

Gli studenti si scambiano gli appunti scritti a mano

Cosa fa

App gratuita dove gli studenti caricano i propri appunti scritti a mano, li condividono con gli altri e chiedono gli appunti delle lezioni perse.

Come guadagna

Il progetto è stato messo in vendita su SideProjectors a circa 620 $. Come guadagna non è indicato pubblicamente.

Rendilo tuo

  • Per le università italiane: appunti divisi per ateneo, corso e professore.
  • L'AI trasforma gli appunti in schede di ripasso e domande d'esame.
  • Attenzione: niente materiale coperto da diritto d'autore, come i libri dei docenti.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Appunti in Comune": gli studenti della stessa università o scuola caricano i propri appunti (anche foto di quelli scritti a mano), li condividono per corso e chiedono gli appunti delle lezioni perse. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con università e corsi più attivi
2. Registrazione con email istituzionale (es. @studenti.unibo.it)
3. Pagina del corso: appunti per lezione, richieste aperte
4. Carica appunti: foto o PDF, lezione, argomento
5. Il mio profilo: appunti condivisi, grazie ricevuti

Stile: studentesco e ordinato: sfondo bianco, blu #2563EB, giallo evidenziatore #FDE047, carattere "Nunito", pagine degli appunti come fogli a quadretti. 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:
- "corsi": università, nome del corso, anno
- "appunti": corso, lezione, argomento, file, autore, stato (visibile, segnalato, rimosso), grazie ricevuti
- "richieste": corso, lezione mancante, chi la chiede, risolta da

Regole di sicurezza obbligatorie:
- vede gli appunti solo chi è registrato con l'email della stessa università
- si caricano solo appunti propri: niente slide dei docenti, libri o compiti d'esame
- gli appunti segnalati si nascondono finché un moderatore non li controlla

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. Appunti per corso, solo tra studenti

Ci si registra con l'email istituzionale: il dominio (es. studenti.unibo.it) collega lo studente alla sua università, e vede solo i corsi e gli appunti di quella (regola nei Dettagli tecnici).

Si caricano foto (più pagine diventano un unico documento) o PDF, indicando corso, numero della lezione e argomento. Regole visibili al caricamento: "Carica solo appunti scritti da te. Niente slide dei docenti, libri, tracce o soluzioni d'esame".

Le richieste ("Mi mancano gli appunti della lezione 7 di Analisi") avvisano chi ha caricato appunti in quel corso.

4. Grazie, segnalazioni e moderazione

Ogni appunto ha il pulsante "Grazie": i più ringraziati salgono in cima. Profilo con gli appunti condivisi e i grazie ricevuti.

Pulsante "Segnala" (materiale non proprio, errori gravi, contenuti offensivi): 3 segnalazioni nascondono l'appunto finché un moderatore non lo controlla. Per i docenti: indirizzo dedicato per chiedere la rimozione di materiale proprio.

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di 4,99 € per anno accademico. Il pagamento sblocca i download in PDF, la ricerca nel testo degli appunti e gli avvisi delle richieste. La consultazione resta gratuita.

A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente 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. Università: registrati con l'email di un'altra università e verifica di non vedere gli appunti della prima.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Appunti visibili solo nella stessa università

Il dominio dell'email dell'utente (dal token di accesso) deve corrispondere a quello dell'università del corso. Gli appunti con 3 segnalazioni si nascondono da soli.

create table universita (
  id serial primary key,
  nome text not null,
  dominio text not null unique          -- es. 'studenti.unibo.it'
);

create table corsi (
  id uuid primary key default gen_random_uuid(),
  universita_id int not null references universita(id),
  nome text not null
);

create table appunti (
  id uuid primary key default gen_random_uuid(),
  corso_id uuid not null references corsi(id) on delete cascade,
  autore_id uuid not null references auth.users(id) on delete cascade,
  lezione int not null,
  argomento text not null,
  file_path text not null,
  segnalazioni int not null default 0,
  stato text not null default 'visibile' check (stato in ('visibile', 'nascosto', 'rimosso'))
);

-- Il dominio dell'email di chi è collegato
create function mio_dominio() returns text language sql stable as $
  select split_part(auth.jwt() ->> 'email', '@', 2);
$;

alter table corsi enable row level security;
alter table appunti enable row level security;

create policy "corsi della mia universita" on corsi for select using (
  exists (select 1 from universita u where u.id = universita_id and u.dominio = mio_dominio()));

create policy "appunti della mia universita" on appunti for select using (
  (stato = 'visibile' or autore_id = auth.uid())
  and exists (select 1 from corsi c join universita u on u.id = c.universita_id
              where c.id = corso_id and u.dominio = mio_dominio()));

create policy "carico i miei" on appunti for insert with check (
  auth.uid() = autore_id and stato = 'visibile' and segnalazioni = 0);

-- Segnala: alla terza segnalazione l'appunto si nasconde
create function segnala(appunto uuid) returns void
language sql security definer set search_path = public as $
  update appunti set segnalazioni = segnalazioni + 1,
         stato = case when segnalazioni + 1 >= 3 then 'nascosto' else stato end
  where id = appunto;
$;

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.
JWT
Il "pass" che il sito riceve quando ti colleghi: contiene, tra le altre cose, la tua email.