I have a bad habit.

Every morning, I open 36kr, 量子位 (QbitAI), 虎嗅 (Huxiu), and 掘金 (Juejin) before I start working out. They are the largest and most interesting platforms to learn about what’s happening in the Chinese tech world.

Chinese tech forums and engineering blogs are some of the most underrated sources of signal in AI right now. Developers on Juejin write detailed build logs about deploying Qwen in production. QbitAI breaks model releases hours before English-language outlets pick them up. Huxiu publishes sharp opinion pieces on how ByteDance and Alibaba are shipping AI into real products. 36kr covers everything.

You could argue that it’s just Chinese Reddit.

Not quite, I read Reddit too. The quality is so different.

For someone who reads Chinese and builds with these tools, it is a goldmine.

The problem is volume. On any given morning, these sources produce 100–200 articles (or more). Maybe 10% is useful to me. The rest are like funding rounds, chip sanction commentary, corporate PR dressed up as product launches, and consumer lifestyle content. These are noise for me.

I used to spend 2–3 hours a day doing this manually.

Open tabs. Scan the headlines. Read the first two paragraphs. Decide: useful or not. Repeat 80 times. Close 70 tabs.

That time should go toward writing. Toward building. Toward the output that matters.

So I built a program to do the filtering for me.

Designing It with Claude Code

As most people do nowadays, I did not sit down and architect this from scratch on a whiteboard. Well, I am a software engineer myself, but I prefer to collaborate with my AI assistant.

I used Claude Code. I described what I wanted — a daily pipeline that fetches Chinese AI articles, scores them by relevance, and delivers the results to me — and iterated from there. Claude Code helped me scaffold the project structure, write the fetchers, and set up the extraction prompt for DeepSeek.

The first version was rough.

It fetched articles fine, but scored everything too high. Corporate announcements about “strategic AI partnerships” were getting 4s and 5s. I spent a few sessions tuning the scoring rubric in the prompt until it matched my editorial judgment.

That loop — describe what you want, get a working version, then refine the parts that don’t match your taste — is how I build most things now.

The tool did the scaffolding. The editorial decisions were mine.

I still don’t know what to call this thing.

It’s not an app — there’s no UI. It’s not really a script — it has multiple modules, a database, and a scheduler. “Pipeline” is the closest word.

So: pipeline it is.

How It Works

The pipeline runs six steps every morning at 7 AM Singapore time.

1) Fetch. It pulls from RSS feeds — QbitAI, 36kr (via RSSHub), Huxiu (via RSSHub), Juejin (via RSSHub), Hugging Face Blog, Simon Willison’s blog, and LangChain Blog. It also scrapes GitHub Trending for Chinese AI organizations. All sources are defined in a single config file.

On a typical morning, the fetcher pulls 100–200 raw articles for me.

2) Dedup (Deduplicate). Every URL gets checked against a local SQLite database before anything else happens. If the pipeline has seen that URL before — yesterday, last week, whenever — it skips it. This was not in the first version. I added it after a painful lesson I will describe below.

3) Pre-filter. Surviving articles pass through keyword include/exclude lists. Exclude terms kill noise immediately: 芯片制裁 (chip sanctions), 融资 (funding), brain-computer interface, regulatory approval. Include terms catch builder-relevant content: API, 开源 (open-source), SDK, 模型 (model), benchmark, DeepSeek, Qwen.

No API calls and no tokens spent here. Pure string matching.

This step takes 100–200 articles down to 20–40.

4) Extract with DeepSeek. Each surviving article gets one API call. DeepSeek reads the title and up to 4,000 characters of body text (usually good enough for the articles that I sent), then returns structured JSON: an English headline, a summary, the single most important technical detail, a build angle (what can a developer learn or build from this?), a relevance score from 1 to 5, and metadata tags like category, companies mentioned, and whether the project is open-source or has an API.

The scoring rubric is the editorial brain:

  • 5 — Must read. New API, model release, SDK, pricing change.

  • 4 — High value. Major company AI product launch, robotics milestone, engineering insight.

  • 3 — Worth watching. How engineers use AI, community discussions, and robotics progress.

  • 2 — Background context. Company strategy with a minor technical angle.

  • 1 — Filter out. No technical angle.

5) Markdown brief. The pipeline writes a dated Markdown file — briefs/brief-2026-03-20.md — with three sections: High Priority (score 4–5), Worth Watching (score 2–3), and Raw Feed (score 1). I read the High Priority section. I scan Worth Watching. I ignore the rest.

6) Send to Discord. Score 3–5 articles get sent as individual embeds to a Discord channel with colour-coded category tags. Score 1–2 articles are bundled in a compact footer. This is how I actually consume the brief most mornings — a quick scroll through Discord on my phone while the coffee brews.

Lessons from Building This

The pipeline works now. The first few versions did not. Here are the things I learned the hard way.

RSSHub Is Non-Negotiable for Chinese Sources

Most Chinese tech sites do not offer native RSS feeds.

36kr doesn’t. Huxiu doesn’t. Juejin doesn’t.

If you want to pull their content programmatically, you need RSSHub — an open-source project that generates RSS feeds for sites that don’t provide them.

I self-host RSSHub in a Docker container. The pipeline’s run.sh starts RSSHub automatically before each run and stops it after. Point it at 36kr’s AI section, and it scrapes the page into a clean feed.

If you are building anything that ingests Chinese content at scale, RSSHub is your first dependency. Without it, half my sources won’t work.

Dedup: The Problem I Didn’t Expect

The first week I ran the pipeline, I noticed something annoying. The same article kept showing up across multiple days. A 36kr piece from Monday would reappear in Tuesday’s brief because the RSS feed still included it.

The fix: a SQLite database that tracks every URL the pipeline has ever seen. Before any processing, each URL gets checked.

Already seen? Skip. New? Process it and write it to the database.

Simple. But I didn’t think I needed it until the duplicates piled up.

Now, database.py runs a cleanup every 90 days to keep the database small (it doesn’t take up much space, so 90 days is fine).

Discord Changed How I Consume the Brief

The Markdown brief is the archive. Discord is where I actually read it.

I set up a Discord webhook and pointed the pipeline’s output at it. Score 3–5 articles get their own embed cards with colour-coded categories — model releases in one colour, open-source in another, robotics in another. Score 1–2 articles get bundled into a single compact message at the bottom.

I scroll through my Discord channel in 2 minutes over morning coffee and know what happened in Chinese AI overnight. The Markdown file is still generated for reference and for pulling material into articles, but Discord is the daily driver.

Logging Saved Me from Silent Failures

The first version of the pipeline had no logging. It ran. It produced output. But when it didn’t produce output, I had no idea why. Did the RSS feed timeout? Did DeepSeek reject a request? Did RSSHub crash?

I added a logging module that writes timestamped entries to logs/pipeline-YYYY-MM-DD.log. Every step reports: how many articles fetched, how many passed dedup, how many passed the keyword filter, how many tokens consumed, how much it cost.

When something breaks — and it does, because RSSHub occasionally hangs or DeepSeek rate-limits a burst of requests — I open the log file and find the failure in 30 seconds.

One more detail: the pipeline runs via macOS launchd at 7 AM. When my MacBook wakes from sleep, the network might not be ready. So run.sh includes a preflight check — it pings api.deepseek.com every 5 seconds for up to 60 seconds before starting. If the network never comes up, it aborts cleanly instead of running a broken pipeline that produces an empty brief.

Small thing. Saved me from a lot of confused mornings.

Pre-Filter Is the Best Cost Optimization

Everyone talks about prompt engineering for cost savings. Nobody talks about not calling the API in the first place.

My keyword filter costs zero tokens. It drops 60–80% of the raw feed before a single article touches DeepSeek. That is the highest-ROI line of code in the entire project. If your pipeline processes any volume of content, build the dumb filter first.

The Cost: DeepSeek Makes This Trivial

Here is the daily cost at ~20 articles passing the pre-filter:

Step Cost/Day DeepSeek extraction ~$0.015 Everything else (fetch, dedup, filter, Discord, Markdown) $0.00 Total ~$0.015/day

Monthly: ~$0.45.

Forty-five cents. For a daily intelligence brief that monitors Chinese AI sources, scores them by relevance, and delivers them to Discord before breakfast.

This is the cost that Claude Code calculated for me. I only spent less than $0.02 per day, so it might only cost me $0.35 till the end of the month.

From the usage, you can see there were a few days with no tokens spent. Those were the days when I was troubleshooting my pipeline when it failed to send me messages.

DeepSeek’s chat model costs $0.27 per million input tokens and $1.10 per million output tokens. These are among the lowest prices for any production-quality LLM with strong Chinese-language comprehension. And because the pipeline uses the OpenAI-compatible API, the entire thing runs on the standard openai Python SDK with base_url pointed at DeepSeek’s endpoint. If I ever need to swap models, it is a one-line config change.

What’s Next for the Pipeline

The code now lives in a private GitHub repo. The scoring rubric, keyword lists, and source configuration encode my editorial judgment — what Zero Address readers care about, what they don’t.

But the architecture is generalizable. I am planning an open-source version where you can plug in your own sources, define your own scoring rubric, choose your own model, and run your own daily intelligence brief. Your sources. Your rubric. Your pipeline.

I am also picking up some fresh material on agentic AI — working through Ed Donner’s courses on building AI agents. The pipeline already feels like a proto-agent: it fetches, reasons, scores, and delivers without human intervention. The next step is to make it smarter about what it fetches, based on what I have been writing about. More on that when I have something concrete to share.

For now, the pipeline runs every morning. 20 articles, scored and delivered, before 7:15 AM.

Forty-five cents a month. And I got my mornings back.

Zero Address covers Chinese AI technology for English-speaking builders. I read the Mandarin tech docs so you don’t have to. Subscribe to get weekly deep dives delivered to your inbox.