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.