Model or dataset
miantiao-me/hacker-podcast avatar
miantiao-me/hacker-podcast

hacker-podcast: a self-hosted Hacker News digest that turns into a Chinese podcast

一个基于 AI 的 Hacker News 中文播客项目,每天自动抓取 Hacker News 热门文章,通过 AI 生成中文总结并转换为播客内容。

2,579 stars241 forksTypeScriptAGPL-3.0

At a glance

What is it?
A TypeScript project that scrapes Hacker News, summarizes the top stories in Chinese with an LLM, voices them with TTS, and publishes the result as an RSS feed and web player on Cloudflare. It is a pipeline you deploy, not a service you sign up for.
Who is it for?
Adopt it if you already run Cloudflare Workers and want a daily Chinese audio digest of Hacker News under your own domain, and you accept that audio merging needs remote browser rendering rather than a local run. Do not adopt it if you want an English podcast, a managed service, or a pipeline you can fully test offline.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 13 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What hacker-podcast produces, and for whom

The README describes a daily loop: scrape the hot Hacker News articles, have an AI write a Chinese summary plus a spoken script, convert that script to audio with TTS, store the audio, and expose it through an RSS feed and a web page. The published feed is at hacker-podcast.agi.li/rss.xml, and the same episodes are listed on Apple Podcasts, YouTube, 小宇宙 and Spotify. So the intended reader is a Chinese-speaking engineer who wants the day's Hacker News discussion in audio form, and the intended operator is someone willing to run the pipeline themselves on Cloudflare.

That second audience is the one the repository is actually written for. There is no hosted API to call and no way to point the project at someone else's instance. The private: true flag in package.json confirms it is not published to npm as a library, and the two halves of the system are deployed separately with pnpm deploy:worker and pnpm run deploy. If you only want to listen, subscribe to the existing feed; the code is for people who want their own.

Two deployables: a scraping Worker and a vinext web app

The README is explicit that the project is made of a Worker and a Web program. The Worker scrapes the data and processes the audio, and the README states it uses Cloudflare R2 storage, KV storage, Workflows and browser rendering. The Web program displays the data and serves the RSS subscription, is built with vinext (Vite plus React Server Components), and deploys to Workers through the Cloudflare Vite plugin. The repository layout matches: a worker/ directory, a workflow/ directory, an app/ directory, plus wrangler.jsonc and vite.config.ts at the root.

The data flow is one direction. A scheduled trigger starts the workflow, which fetches Hacker News items and asks the OpenAI-compatible endpoint for Chinese summaries and a script. TTS turns the script into audio. The audio lands in R2 and the metadata in KV, and the web app reads from those bindings to render pages and generate the feed. The split matters operationally: the Worker holds the secrets and does the expensive work, while the web app only needs the static host and base URL. It also means the two halves can fail independently, and the README's deployment steps treat them as two separate wrangler targets.

Installing hacker-podcast and running the workflow locally

The package manager is pinned in package.json as pnpm@11.6.0, so start there. The README's first step is the dependency install:

bash
pnpm install

Next you create two environment files. The root .env.local carries the static host, and worker/.env.local carries the Worker URL, the R2 bucket URL and the OpenAI settings. The README gives these keys:

bash
# .env.local
NODE_ENV=development
NEXT_STATIC_HOST=http://localhost:3000/static

# worker/.env.local
NODE_ENV=development
HACKER_PODCAST_WORKER_URL=https://you-worker-url
HACKER_PODCAST_R2_BUCKET_URL=https://your-bucket-url
OPENAI_API_KEY=your_api_key
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4.1

Then start each half in its own terminal. The Worker runs under wrangler dev on port 8787, and the README notes you can trigger the workflow by hand with a POST to that port:

bash
# 开发工作流
pnpm dev:worker
# curl -X POST http://localhost:8787 # 手动触发工作流

# 开发 Web 页面
pnpm dev

Expect friction on the first run. The README warns that Edge TTS conversion can hang when the workflow runs locally and suggests commenting that part out while debugging, and it states that merging audio depends on Cloudflare's browser rendering, which is not supported locally and needs remote debugging through pnpm tests.

Deploying to Cloudflare, secrets and the workflows toggle

Deployment assumes you already have a Cloudflare account and the wrangler CLI. The README's sequence is: create an R2 bucket, bind a domain to it, then update NEXT_STATIC_HOST and HACKER_PODCAST_R2_BUCKET_URL; create a KV namespace; edit the KV and R2 values in wrangler.jsonc; and push the private variables as secrets. The secret commands are split by target, and the --cwd worker flag is what distinguishes the Worker's secrets from the web app's:

bash
pnpx wrangler secret put --cwd worker HACKER_PODCAST_WORKER_URL
pnpx wrangler secret put --cwd worker HACKER_PODCAST_R2_BUCKET_URL
pnpx wrangler secret put --cwd worker OPENAI_API_KEY
pnpx wrangler secret put --cwd worker OPENAI_BASE_URL
pnpx wrangler secret put --cwd worker OPENAI_MODEL

pnpx wrangler secret put NODE_ENV # 建议 production
pnpx wrangler secret put NEXT_PUBLIC_BASE_URL # Web 服务地址
pnpx wrangler secret put NEXT_STATIC_HOST # 绑定域名后,修改为绑定域名

The trap is documented in a single line: before running the deploy commands, restore the commented-out workflows configuration in wrangler.jsonc. If the workflow binding is missing, the scheduled job has nothing to run. The deploy itself is two commands, pnpm deploy:worker and pnpm run deploy, and pnpm logs:worker wraps wrangler tail for reading Worker logs.

Where hacker-podcast breaks or is the wrong choice

The local development story is the clearest limitation, and the README states it rather than hiding it. Audio merging depends on Cloudflare's browser rendering, so the full pipeline cannot be exercised on your machine; the README points to pnpm tests, which runs wrangler dev in the tests directory with the --remote flag. That is a remote round trip for something you would normally want to verify offline. Edge TTS hanging locally compounds it: the suggested workaround is to comment out that code, which means the part you commented out is the part you cannot test until you deploy.

There is also a lock-in shape to the design. R2, KV, Workflows and browser rendering are all Cloudflare products, and the README's deployment section is written entirely around wrangler. Moving the pipeline to another host would mean replacing storage, the scheduler and the rendering step, not just changing a config value. The output is Chinese by construction, so anyone wanting an English digest would be rewriting the prompts rather than toggling a locale. And the content itself is derived from Hacker News threads; the README's disclaimer notes the project is not affiliated with Hacker News or Y Combinator and that "Hacker News" is a Y Combinator trademark, which is worth reading before you put it behind your own domain.

Compared with Podify and with listening to Hacker News directly

The README credits Podify as the project that supplied the design inspiration and reference for the podcast theme, and the two sit at different points in the stack. Podify is described there as an elegant podcast theme, so it addresses presentation; hacker-podcast bundles a theme with the ingestion and generation pipeline behind it. If you already have audio and only need a player and feed, the theme is the smaller dependency. If you have no audio and no summarization step, adopting hacker-podcast means taking the Cloudflare Worker, the workflow and the TTS chain along with the UI.

The other alternative is not a project at all: reading Hacker News yourself, or subscribing to an existing English tech podcast. That keeps you out of the R2, KV and Workflows setup entirely, and it avoids the local-development gaps described above. The trade-off hacker-podcast makes is that you get a daily Chinese audio digest on infrastructure you control, in exchange for operating a two-part Cloudflare deployment and accepting that the audio path can only be verified remotely.

Editorial conclusion

Adopt it if you already run Cloudflare Workers and want a daily Chinese audio digest of Hacker News under your own domain, and you accept that audio merging needs remote browser rendering rather than a local run. Do not adopt it if you want an English podcast, a managed service, or a pipeline you can fully test offline. Before deploying, verify three things in your own account: that an R2 bucket and a KV namespace exist and their bindings in wrangler.jsonc match, that the workflows block you commented out for local development is restored, and that the OPENAI_BASE_URL you set actually serves the model named in OPENAI_MODEL.

Frequently asked questions

What is the best podcast about hackers?

The README does not rank podcasts; it describes hacker-podcast as a project that generates a Chinese audio digest of Hacker News articles and publishes it as an RSS feed. The README lists the project's own subscription points on Apple Podcasts, YouTube, 小宇宙 and Spotify.

Who is the No.1 hacker?

The README does not cover this. The repository is a pipeline for scraping Hacker News and generating Chinese summaries, and it does not discuss individual hackers.

What happened to Kevin Mitnick?

The README does not cover this. Nothing in the README or the repository files mentions Kevin Mitnick.

Are darknet diaries stories true?

The README does not cover this. Darknet Diaries is unrelated to the repository, which scrapes Hacker News and generates its own Chinese summaries with an AI model.

Official sources

  1. Issues
  2. License: AGPL-3.0
  3. miantiao-me/hacker-podcast on GitHub
  4. Project website
  5. README
Community notes

Community notes