← Tutte le idee Giochi e hobby

Car Identifier

Fotografi un'auto e scopri che modello è

Incasso mensile: 492 USD (fonte indicata nella scheda)

Cosa fa

App che riconosce un'auto da una foto e permette di collezionare le auto avvistate, come le figurine.

Come guadagna

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

Rendilo tuo

  • La stessa idea per moto, aerei, treni o piante.
  • Raduni e sfide tra amici: chi trova l'auto più rara.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Avvistauto": riconosce marca, modello e generazione di un'auto da una foto e permette di collezionare le auto avvistate come figurine, con punti per le più rare. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con esempi di collezione e prezzi
2. Registrazione e accesso
3. Fotocamera: scatta e scopri l'auto
4. Scheda dell'auto con dati, rarità e punti
5. La mia collezione e la classifica tra amici

Stile: da collezionista: sfondo antracite #18181B, rosso corsa #DC2626, oro #EAB308 per le auto rare, carattere "Rajdhani" per i titoli e "Inter" per i testi, carte della collezione con bordi colorati per rarità. 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:
- "modelli": marca, modello, generazione, anni, rarità (comune, rara, leggendaria), punti
- "avvistamenti": modello riconosciuto, foto, città facoltativa, data, collegati all'utente

Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi avvistamenti; la classifica mostra solo nome e punti
- le foto stanno in uno spazio privato
- le targhe non vanno mai salvate né mostrate

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. Riconoscere l'auto

L'utente scatta la foto. Prima del caricamento il browser sfoca la zona della targa se l'utente la indica, e Claude ha l'istruzione di non leggere né riportare targhe o persone.

La Edge Function "riconosci" (un credito) chiede a Claude in JSON: marca, modello, generazione, anni di produzione approssimativi e quanto è sicuro. Se è poco sicuro, propone 3 alternative tra cui l'utente sceglie.

La scheda mostra dati dell'auto, rarità, punti e "Nuova per la tua collezione!" se è la prima volta.

4. Collezione e classifica

La collezione è un album per marca con le carte ottenute e quelle ancora mancanti in grigio, e la percentuale di completamento. Sfide settimanali ("Avvista 3 auto italiane degli anni '80").

Classifica tra amici con codice d'invito: solo nome e punti, mai le foto o i luoghi.

5. Pagamenti con Stripe

Aggiungi pacchetti di crediti: 50 riconoscimenti a 2,99 €, 200 a 7,99 €. Ogni nuovo utente riceve 10 crediti gratis. Ogni riconoscimento costa un credito. Mostra sempre in alto quanti crediti restano e, quando finiscono, un riquadro per comprarne altri.

A pagamento riuscito il webhook aggiunge i crediti del pacchetto con la funzione aggiungi_crediti.

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. Privacy: verifica che né il risultato né il database contengano mai una targa, anche se ben leggibile nella foto.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Istruzioni per l'AI: riconosci

Le istruzioni fisse che la Edge Function "riconosci" dà a Claude, che risponde in JSON. Il resto della funzione (accesso, crediti, rimborso se l'AI rifiuta) è uguale per tutti i progetti: è nella guida "Chiamare l'AI dal server".

Riconosci l'automobile principale nella foto. Non leggere e non riportare mai targhe, persone o luoghi. Rispondi solo con JSON: {"marca", "modello", "generazione", "anni": "es. 1990-1995", "sicurezza": 0-100, "alternative": [{"marca", "modello", "generazione"}]}. Se nella foto non c'è un'auto rispondi {"auto": false}.

Sfocare la targa nel browser

L'utente trascina un riquadro sulla targa: quella zona viene sfocata prima che la foto lasci il telefono.

export async function sfocaZona(
  foto: Blob,
  zona: { x: number; y: number; larghezza: number; altezza: number },   // in pixel
): Promise<Blob> {
  const img = await createImageBitmap(foto);
  const tela = new OffscreenCanvas(img.width, img.height);
  const ctx = tela.getContext("2d")!;
  ctx.drawImage(img, 0, 0);

  // Ridisegna solo la zona con un filtro di sfocatura forte
  ctx.save();
  ctx.beginPath();
  ctx.rect(zona.x, zona.y, zona.larghezza, zona.altezza);
  ctx.clip();
  ctx.filter = "blur(" + Math.max(12, zona.altezza / 3) + "px)";
  ctx.drawImage(img, 0, 0);
  ctx.restore();

  img.close();
  return tela.convertToBlob({ type: "image/jpeg", quality: 0.9 });
}

Collezione e completamento

Gli avvistamenti dell'utente e la percentuale di modelli collezionati per ogni marca.

create table modelli (
  id serial primary key,
  marca text not null, modello text not null, generazione text,
  rarita text not null default 'comune' check (rarita in ('comune', 'rara', 'leggendaria')),
  punti int not null default 10,
  unique (marca, modello, generazione)
);
alter table modelli enable row level security;
create policy "modelli pubblici" on modelli for select using (true);

create table avvistamenti (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  modello_id int not null references modelli(id),
  foto_path text,
  avvistato_il timestamptz not null default now()
);
alter table avvistamenti enable row level security;
create policy "le mie righe" on avvistamenti
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

-- Completamento della collezione per marca
select m.marca,
       count(distinct a.modello_id) as collezionati,
       count(distinct m.id) as totali,
       round(100.0 * count(distinct a.modello_id) / count(distinct m.id)) as percentuale
from modelli m
left join avvistamenti a on a.modello_id = m.id and a.utente_id = auth.uid()
group by m.marca
order by percentuale desc;

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.
Rarità
Quanto è difficile incontrare un modello per strada: più è raro, più punti vale.