← Tutte le idee Marketing e social

Blogosphere

Una prima pagina che raccoglie i migliori blog personali

Cosa fa

Un sito che raccoglie i nuovi articoli dei blog personali in una prima pagina, come un giornale fatto di persone e non di testate.

Come guadagna

Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: sponsor discreti, versione premium senza pubblicità con filtri personali.

Rendilo tuo

  • La prima pagina dei blog e delle newsletter italiane di un tema: cucina, viaggi, tecnologia.
  • Newsletter settimanale con i 10 articoli migliori.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Blog Italiani": raccoglie i nuovi articoli dei blog personali italiani in una prima pagina, come un giornale fatto di persone e non di testate, con i voti dei lettori. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Prima pagina: articoli recenti più apprezzati, con titolo, blog e tempo di lettura
2. Nuovi articoli in ordine di tempo
3. Pagina del blog con i suoi articoli
4. Proponi il tuo blog
5. Pagina dei sostenitori

Stile: da giornale minimal: sfondo carta #FCFBF8, nero #111111, rosso #B91C1C per i dettagli, carattere "Source Serif 4" per i titoli e "Inter" per il resto, elenco denso e leggibile. 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:
- "blog": nome, indirizzo, feed RSS, approvato, autore
- "articoli": titolo, link, blog, data di pubblicazione, identificativo dal feed, voti
- "voti": utente e articolo

Regole di sicurezza obbligatorie:
- tutti vedono blog approvati e articoli
- un voto per utente per articolo
- solo i blog approvati dalla redazione entrano in prima pagina

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. Raccolta dai feed e prima pagina

Ogni 30 minuti una Edge Function legge i feed RSS o Atom dei blog approvati e salva gli articoli nuovi, senza doppioni grazie all'identificativo dell'articolo nel feed. Il sito mostra solo titolo, primo paragrafo e link: per leggere si va sul blog dell'autore.

La prima pagina ordina gli articoli con un punteggio che unisce voti e freschezza, come su Hacker News (codice nei Dettagli tecnici): un articolo nuovo con pochi voti può superarne uno vecchio con tanti.

Chiunque può proporre un blog personale (niente testate, aziende o siti di sole pubblicità): la redazione lo approva.

4. Voti, scoperta e sostenitori

Voto con un clic (serve l'accesso con link via email), pagina "Scopri un blog a caso", e newsletter settimanale con i 10 articoli più apprezzati.

Il sito vive senza pubblicità grazie ai sostenitori, che ricevono la newsletter estesa e possono seguire i blog preferiti con un feed personale.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 2 € al mese (sostenitore). Gratis l'utente ha: lettura, voti e newsletter settimanale per tutti. Con il piano Pro sblocca: newsletter estesa, blog seguiti con feed personale e filtri per argomento.

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. Doppioni: modifica il titolo di un articolo in un feed di prova: non deve comparire due volte.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Punteggio della prima pagina

Il punteggio cresce con i voti e scende con il passare delle ore (la "gravità"), come nella formula di Hacker News.

create table articoli (
  id uuid primary key default gen_random_uuid(),
  blog_id uuid not null,
  guid text not null,                    -- identificativo dell'articolo nel feed
  titolo text not null,
  link text not null,
  estratto text not null default '',
  pubblicato_il timestamptz not null,
  unique (blog_id, guid)                 -- niente doppioni
);

create table voti (
  articolo_id uuid not null references articoli(id) on delete cascade,
  utente_id uuid not null references auth.users(id) on delete cascade,
  primary key (articolo_id, utente_id)
);

alter table articoli enable row level security;
create policy "articoli pubblici" on articoli for select using (true);
alter table voti enable row level security;
create policy "voti pubblici" on voti for select using (true);
create policy "voto io" on voti for insert to authenticated with check (auth.uid() = utente_id);

-- Prima pagina: (voti) / (ore + 2)^1,8
create view prima_pagina as
  select a.*, count(v.utente_id) as voti,
         (count(v.utente_id) + 1) / power(extract(epoch from now() - a.pubblicato_il) / 3600 + 2, 1.8) as punteggio
  from articoli a left join voti v on v.articolo_id = a.id
  where a.pubblicato_il > now() - interval '7 days'
  group by a.id
  order by punteggio desc
  limit 60;

Leggere un feed RSS o Atom

Legge un feed e restituisce gli articoli; funziona con RSS e Atom, i due formati più diffusi dei blog.

import { parseFeed } from "jsr:@mikaelporttila/rss";

export async function leggiFeed(url: string) {
  const r = await fetch(url, { headers: { "User-Agent": "BlogItaliani/1.0 (+https://blogitaliani.it)" } });
  if (!r.ok) throw new Error("Feed non raggiungibile: " + r.status);
  const feed = await parseFeed(await r.text());
  return feed.entries.slice(0, 20).map((v) => ({
    guid: v.id ?? v.links[0]?.href ?? "",
    titolo: v.title?.value ?? "(senza titolo)",
    link: v.links[0]?.href ?? "",
    estratto: (v.description?.value ?? v.content?.value ?? "").replace(/<[^>]+>/g, "").slice(0, 280),
    pubblicato_il: (v.published ?? v.updated ?? new Date()).toISOString(),
  }));
}

Pezzi comuni a tutti i progetti

Glossario

Cron
Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
RSS
Un formato che i blog usano per pubblicare l'elenco dei loro articoli, così altri siti e app li possono seguire.