← Tutte le idee Negozi e community

BackPedal

Tracciamento GPS e recupero della bici rubata

Incasso mensile: 28.000 USD (fonte indicata nella scheda)

Cosa fa

Un piccolo localizzatore GPS per bici ed e-bike con un servizio di recupero: se la bici viene rubata, l'azienda aiuta a ritrovarla. Si paga il dispositivo più un abbonamento.

Come guadagna

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

Rendilo tuo

  • Parti da localizzatori già in commercio e costruisci tu il servizio: app, avvisi, aiuto con la denuncia.
  • Lo stesso per monopattini, moto o attrezzi da cantiere.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "RitrovaBici": collega un localizzatore GPS alla bici, avvisa se si muove senza permesso e aiuta a ritrovarla in caso di furto. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con come funziona, il dispositivo consigliato e i prezzi
2. Registrazione e collegamento del dispositivo (codice sulla scatola)
3. Mappa con la posizione attuale della bici
4. Impostazioni: zona sicura, orari di parcheggio, contatti da avvisare
5. Modalità furto: cronologia delle posizioni e PDF per la denuncia

Stile: sportivo e rassicurante: sfondo bianco, verde lime #65A30D come colore principale, rosso #DC2626 per gli allarmi, carattere "Archivo", mappa a tutto schermo. 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:
- "dispositivi": codice del localizzatore, nome della bici, zona sicura (centro e raggio), modalità parcheggio attiva o no, collegati all'utente
- "posizioni": latitudine, longitudine, velocità e data inviate dal localizzatore

Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi dispositivi e le loro posizioni
- le posizioni le scrive solo la Edge Function che riceve i dati dal localizzatore, con un token segreto per dispositivo

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. Ricezione delle posizioni e allarme

Crea la Edge Function pubblica "posizione" che riceve dal localizzatore GPS (via HTTP) codice, token, latitudine, longitudine e velocità. Controlla il token del dispositivo, salva la posizione e, se la modalità parcheggio è attiva e la bici è fuori dalla zona sicura di più del raggio impostato (calcolo della distanza nei Dettagli tecnici), invia subito un allarme via email e notifica push: "La tua bici si sta muovendo".

Nella pagina mappa mostra la posizione attuale aggiornata in tempo reale con Supabase Realtime, con l'ora dell'ultimo segnale e il livello della batteria se il dispositivo lo invia.

4. Modalità furto e PDF per la denuncia

Aggiungi il pulsante "La mia bici è stata rubata": attiva la modalità furto, che chiede al dispositivo una posizione ogni minuto e mostra il percorso sulla mappa.

Crea un PDF scaricabile per la denuncia alle forze dell'ordine con: dati della bici (marca, modello, numero di telaio, foto), ora dell'ultima posizione sicura, cronologia delle posizioni con orari e una mappa del percorso. Mostra l'avviso: "Non cercare di recuperare la bici da solo: dai la posizione alle forze dell'ordine".

5. Pagamenti con Stripe

Aggiungi un abbonamento a 4,99 € al mese. Gratis l'utente ha: posizione ogni 30 minuti e nessun allarme. Con il piano Pro sblocca: allarmi immediati, posizione ogni minuto in modalità furto, cronologia di 90 giorni e PDF per la denuncia.

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. Allarme: simula con uno strumento di test l'invio di posizioni fuori dalla zona sicura e controlla che l'allarme arrivi una volta sola e non a ogni posizione.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Tabelle del database

Dispositivi e posizioni. Il token segreto del dispositivo non è mai leggibile dal browser.

create table dispositivi (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  codice text not null unique,
  token_hash text not null,             -- il token vero lo conosce solo il dispositivo
  nome text not null default 'La mia bici',
  zona_lat double precision,
  zona_lng double precision,
  zona_raggio_m int not null default 100,
  parcheggiata boolean not null default false
);

create table posizioni (
  id bigint generated always as identity primary key,
  dispositivo_id uuid not null references dispositivi(id) on delete cascade,
  lat double precision not null,
  lng double precision not null,
  velocita_kmh real,
  registrata_il timestamptz not null default now()
);
create index on posizioni (dispositivo_id, registrata_il desc);

alter table dispositivi enable row level security;
alter table posizioni enable row level security;
create policy "i miei dispositivi" on dispositivi
  for select using (auth.uid() = utente_id);
create policy "aggiorno le mie impostazioni" on dispositivi
  for update using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
create policy "le posizioni delle mie bici" on posizioni
  for select using (exists (
    select 1 from dispositivi d where d.id = dispositivo_id and d.utente_id = auth.uid()));

Distanza dalla zona sicura

La formula di Haversine calcola la distanza in metri tra due punti GPS: se supera il raggio della zona sicura, scatta l'allarme.

// Distanza in metri tra due coordinate GPS (formula di Haversine)
export function distanzaMetri(lat1: number, lng1: number, lat2: number, lng2: number): number {
  const R = 6_371_000; // raggio medio della Terra in metri
  const rad = (g: number) => (g * Math.PI) / 180;
  const dLat = rad(lat2 - lat1);
  const dLng = rad(lng2 - lng1);
  const a = Math.sin(dLat / 2) ** 2 +
    Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * Math.sin(dLng / 2) ** 2;
  return 2 * R * Math.asin(Math.sqrt(a));
}

// Nella Edge Function "posizione":
// if (dispositivo.parcheggiata &&
//     distanzaMetri(dispositivo.zona_lat, dispositivo.zona_lng, lat, lng) > dispositivo.zona_raggio_m) {
//   await inviaAllarme(dispositivo);
// }

Pezzi comuni a tutti i progetti

Glossario

Realtime
Una funzione di Supabase che aggiorna la pagina da sola quando cambia un dato, senza ricaricare.