Hacker News Trends
Google Trends, ma per i commenti di una comunità online
Cosa fa
Ha indicizzato 18 anni di commenti di Hacker News per mostrare quanto si parla di un argomento nel tempo, come Google Trends.
Come guadagna
Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: report a pagamento per aziende che vogliono sapere cosa pensa la comunità del loro prodotto.
Rendilo tuo
- Le tendenze di un forum o subreddit italiano di settore.
- Report mensile venduto alle aziende di quel settore.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Di Cosa si Parla": mostra quanto si parla di un argomento nel tempo in una grande comunità online (si parte da Hacker News, che ha un archivio pubblico), con grafici anno per anno e confronti tra parole, come Google Trends. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con il campo di ricerca e confronti famosi (es. "React contro Vue")
2. Grafico dell'andamento anno per anno, fino a 4 parole a confronto
3. Discussioni più votate per ogni anno, con link all'originale
4. Tendenze del mese: parole in crescita
5. Pagina Pro con avvisi
Stile: da analisi dati: sfondo bianco, arancione #FF6600 come accento, un colore diverso per ogni parola, carattere "Inter", grafico grande e pulito. 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:
- "cache": risultati delle ricerche già fatte (parola, anno, numero di menzioni), per non ripetere le chiamate
- "avvisi": parole seguite dall'utente Pro, con la soglia
Regole di sicurezza obbligatorie:
- la cache è pubblica in lettura e la scrive solo la Edge Function
- ogni utente vede solo i suoi avvisi
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. Conteggio anno per anno
Hacker News ha un'API di ricerca pubblica (Algolia) che dice quanti commenti e post contengono una parola in un intervallo di date. Per ogni anno dal 2007 a oggi la Edge Function chiede il numero di risultati (codice nei Dettagli tecnici) e lo divide per il totale dei commenti di quell'anno: così si confrontano anni con più o meno attività.
I risultati si salvano nella cache: la seconda volta la ricerca è istantanea, e si rispettano i limiti dell'API. Il grafico confronta fino a 4 parole, con valori assoluti o in percentuale.
Per ogni anno, le 5 discussioni più votate con quella parola, con il link alla pagina originale.
4. Tendenze e avvisi
Tendenze del mese: parole che crescono di più rispetto alla media degli ultimi 12 mesi, calcolate su un elenco di tecnologie e temi curato dalla redazione.
Pro: avvisi via email quando una parola seguita supera una soglia, esportazione dei dati in CSV, e confronti fino a 10 parole.
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 9 € una volta sola. Il pagamento sblocca avvisi, esportazione CSV e confronti fino a 10 parole.
A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente 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. Limiti: cerca 20 parole di seguito e controlla che le chiamate all'API siano distanziate e che le parole già cercate vengano dalla cache.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Menzioni di una parola anno per anno
Chiede all'API di ricerca di Hacker News quanti commenti contengono la parola in ogni anno, usando il campo nbHits (numero di risultati) senza scaricarli.
const API = "https://hn.algolia.com/api/v1/search_by_date";
async function conta(parola: string | null, dal: number, al: number): Promise<number> {
const parametri = new URLSearchParams({
tags: "comment",
hitsPerPage: "0", // solo il conteggio
numericFilters: "created_at_i>=" + dal + ",created_at_i<" + al,
});
if (parola) parametri.set("query", '"' + parola + '"'); // frase esatta
const r = await fetch(API + "?" + parametri);
return (await r.json()).nbHits as number;
}
export async function andamento(parola: string) {
const anni = [];
for (let anno = 2007; anno <= new Date().getFullYear(); anno++) {
const dal = Date.UTC(anno, 0, 1) / 1000, al = Date.UTC(anno + 1, 0, 1) / 1000;
const [menzioni, totale] = await Promise.all([conta(parola, dal, al), conta(null, dal, al)]);
anni.push({ anno, menzioni, perMille: totale ? (menzioni / totale) * 1000 : 0 });
await new Promise((ok) => setTimeout(ok, 250)); // gentili con l'API
}
return anni;
}Cache delle ricerche
I risultati già calcolati restano in una tabella: le ricerche ripetute non chiamano più l'API, tranne l'anno in corso che si aggiorna ogni giorno.
create table cache (
parola text not null,
anno int not null,
menzioni int not null,
per_mille numeric not null,
aggiornato_il timestamptz not null default now(),
primary key (parola, anno)
);
alter table cache enable row level security;
create policy "lettura pubblica" on cache for select using (true);
-- Cosa manca o va aggiornato per una parola
select anno from generate_series(2007, extract(year from now())::int) as anno
where not exists (
select 1 from cache c where c.parola = 'rust' and c.anno = anno
and (anno < extract(year from now()) or c.aggiornato_il > now() - interval '1 day'));
Pezzi comuni a tutti i progetti
Glossario
- CSV
- Un file di testo con i dati separati da virgole, che si apre con Excel.
- Cache
- Una copia dei risultati già calcolati, per rispondere subito senza rifare il lavoro.