Bali Villa Hub
Il portale degli affitti a lungo termine in una località precisa
Incasso mensile: 5600 USD (fonte indicata nella scheda)
Cosa fa
Piattaforma dedicata agli affitti di lunga durata a Bali, per chi ci si trasferisce o ci passa mesi.
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 una località italiana amata dagli stranieri che lavorano da remoto: Puglia, Sicilia, laghi.
- Affitti per studenti fuori sede in una città universitaria.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Casa per Mesi": una bacheca di affitti a medio e lungo periodo in una città italiana (es. Bologna, Milano, Torino) per studenti, lavoratori in trasferta e smart worker, con annunci verificati. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con ricerca per zona, budget e durata
2. Elenco annunci con filtri e mappa
3. Scheda dell'annuncio con foto, contratto, spese e modulo di contatto
4. Pubblica il tuo annuncio (per i proprietari)
5. Pannello del proprietario con annunci e richieste ricevute
Stile: accogliente e chiaro: sfondo bianco, terracotta #C2410C, verde salvia #4D7C0F, carattere "Nunito", foto delle case grandi e mappa sempre a portata. 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:
- "annunci": titolo, zona, indirizzo approssimativo, prezzo mensile, spese, tipo di contratto (transitorio, studenti, 4+4, 3+2), durata minima, disponibile dal, foto, stato (in attesa, approvato, scaduto), visibile fino a, collegati al proprietario
- "richieste": nome, email, messaggio, durata, collegate all'annuncio
Regole di sicurezza obbligatorie:
- tutti vedono gli annunci approvati e ancora visibili
- il proprietario vede e modifica solo i suoi annunci e le richieste ricevute
- approvazione e scadenza le cambiano solo gli amministratori e il pagamento
- l'email del proprietario non è mai mostrata
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. Ricerca e annunci
Crea la ricerca con filtri: zona, prezzo massimo comprese le spese, durata (1–6 mesi, 6–18 mesi, oltre), tipo di contratto, arredato, animali ammessi. Risultati in elenco e su mappa (posizione approssimativa, mai l'indirizzo esatto).
Ogni annuncio deve indicare obbligatoriamente: tipo di contratto, prezzo, spese condominiali e utenze, deposito, durata minima e massima. Mostra accanto al tipo di contratto una spiegazione semplice (es. "Transitorio: da 1 a 18 mesi, per esigenze temporanee").
Il modulo "Contatta il proprietario" invia la richiesta via email al proprietario senza mostrare l'indirizzo.
4. Pannello proprietari e verifica
Il proprietario pubblica l'annuncio con foto (fino a 15), e lo paga per renderlo visibile 30 giorni. Dopo il pagamento passa "in attesa": un amministratore lo controlla (foto coerenti, prezzo plausibile, dati completi) e lo approva.
Pannello con gli annunci, le richieste ricevute, il pulsante "Rinnova" e "Affittato" che lo nasconde. Avviso fisso ai cercatori: "Non pagare mai caparre prima di aver visto la casa e firmato un contratto".
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 19 € per 30 giorni di pubblicazione. Il pagamento rende l'annuncio visibile per 30 giorni, dopo l'approvazione.
A pagamento riuscito il webhook imposta "visibile_fino" a la data di oggi più 30 giorni nella tabella "annunci", sulla riga del annuncio 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. Truffe: verifica che non si possa pubblicare un annuncio senza tipo di contratto, prezzo e spese, e che l'indirizzo esatto non compaia mai.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Tabelle con approvazione e scadenza
Gli annunci sono visibili solo se approvati e non scaduti. Le richieste le legge solo il proprietario.
create table annunci (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
titolo text not null,
zona text not null,
lat_approssimata double precision,
lng_approssimata double precision,
prezzo_mese int not null check (prezzo_mese > 0),
spese_mese int not null default 0,
deposito int not null default 0,
contratto text not null check (contratto in ('transitorio', 'studenti', '4+4', '3+2')),
durata_min_mesi int not null,
disponibile_dal date not null,
arredato boolean not null default true,
stato text not null default 'in_attesa' check (stato in ('in_attesa', 'approvato', 'affittato')),
visibile_fino timestamptz
);
alter table annunci enable row level security;
create policy "annunci visibili" on annunci for select using (
(stato = 'approvato' and visibile_fino > now()) or auth.uid() = utente_id
);
create policy "pubblico il mio" on annunci
for insert with check (auth.uid() = utente_id and stato = 'in_attesa' and visibile_fino is null);
create policy "modifico il mio" on annunci
for update using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
create function proteggi_annuncio() returns trigger language plpgsql as $
begin
if coalesce(auth.role(), '') <> 'service_role' and (
new.visibile_fino is distinct from old.visibile_fino
or (new.stato is distinct from old.stato and new.stato <> 'affittato')) then
raise exception 'Approvazione e scadenza le cambia solo la redazione';
end if;
return new;
end $;
create trigger annuncio_protetto before update on annunci
for each row execute function proteggi_annuncio();
create table richieste (
id uuid primary key default gen_random_uuid(),
annuncio_id uuid not null references annunci(id) on delete cascade,
nome text not null,
email text not null,
messaggio text not null,
creato_il timestamptz not null default now()
);
alter table richieste enable row level security;
create policy "chiunque scrive" on richieste for insert with check (true);
create policy "le leggo se l'annuncio è mio" on richieste for select using (exists (
select 1 from annunci a where a.id = annuncio_id and a.utente_id = auth.uid()));
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.
- Contratto transitorio
- Un contratto d'affitto da 1 a 18 mesi, per chi ha esigenze temporanee documentate (lavoro, studio).