# AIHOT and pay.news: how an open-source news site curates itself

AIHOT turns sources and editorial rules into a news site. We trace its scoring, event ranking and daily briefs, then see what pay.news changed for payments.

Author: J.A. Watte
Published: October 21, 2026
Source: https://jwatte.com/blog/aihot-open-source-ai-news-site-framework/

---

A news reader helps us get through our subscriptions. AIHOT goes further: it runs the publication. It collects reports, decides which deserve attention, writes summaries, groups coverage of the same event and assembles editions. We supply the sources and the judgment about what matters.

[AIHOT's English README](https://github.com/KKKKhazix/AIHOT/blob/main/README.en.md) explains why its creator, 数字生命卡兹克, or Khazix, shared it. Friends wanted versions for law, HR, finance and precious metals. The creator could share the machinery, but those fields needed their own experts.

[pay.news](https://pay.news/) shows that idea applied to payments. Its About page explicitly credits AIHOT. We examined the upstream code and public pages to separate what the engine supplies from what a specialist publication adds.

## A production engine with an editorial starting point

AIHOT is a TypeScript application built around Node.js 24, React Router server-side rendering, Fastify, PostgreSQL 17, the pg-boss job queue and Tailwind. Server-side rendering means the server produces the page HTML. A job queue runs collection and model work separately from reader requests.

The author describes the repository as an export of the production engine, with rough edges. It is not a polished universal publishing platform. The interface, prompts and generated writing default to Chinese. The production source list and operating data are excluded. The demo contains **18 RSS sources**, although the engine supports other inputs.

The code is MIT-licensed. [NOTICE](https://github.com/KKKKhazix/AIHOT/blob/main/NOTICE) excludes the AIHOT name and logo from that license. We need our own branding, and the code license gives us no rights to publishers' articles.

The public repository was created September 28, 2026. Our October 21 check found 8,232 stars, 1,974 forks and 145 default-branch commits. There were no GitHub releases. That is substantial early interest, with a short public maintenance history. It is not evidence of editorial accuracy or reliability.

On the [original site's About page](https://aihot.news/about), the workflow is visible: sources flow into selected AI news, events and a morning briefing. Its live model leaderboard and reset monitor are site-specific features that the exported framework leaves out.

## How material becomes a publication

The [selection documentation](https://github.com/KKKKhazix/AIHOT/blob/main/docs/selection.md) describes several decisions between collection and publication. Passing one does not guarantee passing the next.

| Stage | What happens | Why we care |
|---|---|---|
| Collect | Read RSS, web listings, JSON APIs, X accounts, WeChat Official Accounts or pushed material | We choose the evidence the publication sees |
| Deduplicate | Recognize repeated URLs and content | Repeated collection should not manufacture news |
| Pre-screen | Check whether the material belongs to the field | Clearly irrelevant material stays out of public output |
| Score and structure | Score twice; extract categories, subjects and facts | Importance and factual identity are separate decisions |
| Write | Produce a headline, answer-first summary and reading reason | Readers get the change before background |
| Group | Identify the same occurrence, follow-ups and genuinely new information | Reworded coverage should not occupy another news slot |
| Publish | Serve selected items, event rankings and scheduled editions | People and agents read the same published material |

Sources have three scoring tiers. T1 means official first-hand sources. T1_5 covers official accounts and semi-official creators. T2 covers media and individuals. These are editorial configuration choices, not automatic guarantees of truth.

The pre-screen allows uncertain cases to continue. Ordinary articles with only a title wait for usable material rather than inviting a model to invent a summary. Material without a trustworthy publication time waits before public release.

### Two scores, with real thresholds

A large language model, or LLM, scores each promising item twice against the same rubric. Independent calls do not necessarily mean different models.

The actual values in [industry/selection.ts](https://github.com/KKKKhazix/AIHOT/blob/main/industry/selection.ts) are:

| Tier | Required average | Equivalent score sum |
|---|---:|---:|
| T1 | 60 | 120 |
| T1_5 | 65 | 130 |
| T2 | 76 | 152 |

Each score is between 0 and 100. The sum must be at least twice the threshold. Official material gets a lower hurdle because the design favors first-hand reporting.

Clearing that hurdle only makes an item a candidate. Grouping must still establish its news identity and added value. An unselected item with an average **strictly above 50** can receive the richer headline-and-summary treatment; lower scores use a cheaper summary path. That writing threshold is not the selection threshold.

The [prompt files](https://github.com/KKKKhazix/AIHOT/tree/main/industry/prompts) divide the work into relevance screening, scoring, fact extraction, writing, translation, grouping and edition introductions. Shared rules ask for source-supported names, self-contained headlines and summaries that open with the answer. Source text is treated as untrusted material. These guards reduce specific mistakes; they do not prove every sentence correct.

### Events, then heat

An event holds reports about the same unfolding story. AIHOT looks for candidates from the previous two weeks using embeddings, numerical representations of textual meaning, or text overlap when embeddings are unavailable. A model judges the relationship. A separate merge review can use another provider. Manual grouping corrections are preserved.

The [heat calculation](https://github.com/KKKKhazix/AIHOT/blob/main/packages/backend/src/events/hot.ts) ranks events by attention from independent participants. Its exact rule is:

```text
H = sum over participants of 0.5 ^ (ageHours / 24)
displayedHeat = round(H * 100) / 10
```

For each participant, use its latest qualifying evidence with a source timestamp newer than 48 hours ago and no later than now. The timestamp is the source's time, not collection time. A fresh participant contributes 10 on the displayed scale; after 24 hours it contributes 5. Evidence exactly 48 hours old is excluded. Repeated posts can refresh that participant's time but cannot create extra contributions. Ranking requires at least two participants, including an editorial participant.

“Independent” depends on configuration. The code can combine company channels by owner, combine a media group, or distinguish authors on configured community feeds. Without those identities, it falls back to individual source IDs. We should not assume different feed URLs represent different organizations.

### Editions without rewriting everything

Daily editions default to **08:00 Beijing time**. Rules choose and arrange existing material without a new model call. Repeated events need qualifying developments to return. Weekly editions default to Monday at **10:00**, monthly editions to the first at **10:30**, configured through `EDITION_TIMES` in `site/site.ts`.

Weekly and monthly editions select from the dailies. Models write overview prose and section introductions, not the item list. Guards reject introductions with unsupported names or numbers. Reading a page does not itself trigger a model call.

The [architecture](https://github.com/KKKKhazix/AIHOT/blob/main/docs/architecture.md) puts pages, RSS, the public API, MCP and agent-readable Markdown behind one publication layer. Withdrawals and full-text permissions can therefore follow the content across those outputs.

## What pay.news changed

[pay.news's About page](https://pay.news/about) describes payments research covering rails, cards, banking, acquiring, regulation and licensing, with stablecoins where they affect money movement. It says Dogpay operates the publication. The footer and Terms identify Dogads Limited. We draw no conclusions about traffic, revenue or team size.

At our check, About reported **48 sources: 43 RSS, two web sources and three APIs**. Those are the site's reported counts. Its nine interface-language choices are Simplified Chinese, English, Traditional Chinese, Japanese, Korean, German, Spanish, French and Brazilian Portuguese. Language choices do not establish that every article has a complete translation; the fetched daily response identified its content as Chinese.

The [llms.txt guide](https://pay.news/llms.txt) lists payments categories: payments, banking, cards, stablecoins, crypto, compliance, licensing, web3-ai and fintech. Branding, domain vocabulary, categories and source choices are visible customizations.

It also lists payment-license and licensed-institution directories, an agent-products directory and a model leaderboard. These extend beyond the exported framework's core. The original AIHOT site also has a leaderboard, so we should not attribute the entire idea to pay.news. Public pages establish what is offered, not which private code implements it.

For readers, the site offers selected news, all updates, an event-based hot list and daily, weekly and monthly editions. About states an 08:00 Beijing daily brief, Monday weekly review and monthly roundup on the first. The fetched hot-topics response supplied ranked events with source names and story links. We verified that output, not the underlying payments claims against their original reporting.

For agents, [the access guide](https://pay.news/agent) documents anonymous, read-only interfaces requiring no key:

- **RSS**, a feed format readers can subscribe to, includes selected items and category feeds.
- **REST API v1** returns structured data over HTTP. We read its [OpenAPI specification](https://pay.news/openapi-v1.json), current hot topics and latest daily response.
- **MCP**, the Model Context Protocol, exposes named tools to compatible assistants at `https://pay.news/api/mcp`.
- **llms.txt** maps the site; Markdown companions provide simpler reading pages for machines.

The five documented MCP tools are `dogpay_news_get_latest`, `dogpay_news_search`, `dogpay_news_get_hot_topics`, `dogpay_news_get_story` and `dogpay_news_get_daily`. We read their documentation without invoking the tools. An assistant can request recent coverage, find an event and retrieve a briefing. It still needs to verify important facts against originals.

[Terms](https://pay.news/terms) distinguish anonymous reading from permission to republish commercially or in bulk. An open endpoint is not an unrestricted content license.

## Building our own field's version

The [README setup](https://github.com/KKKKhazix/AIHOT/blob/main/README.en.md#run-it) starts with **Use this template** for an independent repository, or a fork when we want upstream changes. We need Docker with Compose, Node.js 24 for initialization and an OpenAI-compatible model API key.

After cloning our repository, the documented steps are:

```bash
node scripts/init-env.ts --llm-key <your-model-api-key>
docker compose up -d --build
```

These are instructions for a future installation. We did not run AIHOT's installer, containers or tests for this article. Initialization defaults to DeepSeek; `.env.example` explains alternative endpoints and model settings. Actual keys belong outside version control.

Next, the README suggests giving a coding agent the repository, asking it to read `AGENTS.md` and `docs/customize.md`, and describing our sources, important developments and unwanted noise. We also ask it to translate interface text and prompts, run the documented checks and return decisions that still need our judgment.

Most identity and presentation changes belong in `site/`. Our categories, topics, sources, prompts and thresholds belong in `industry/`. Site-specific features can become modules. Our field knowledge needs concrete examples: which regulatory changes matter, what counts as a product release, and which promotional announcements should be rejected.

[Deployment notes](https://github.com/KKKKhazix/AIHOT/blob/main/docs/deploy.md) recommend at least two CPU cores and 4 GB of memory for a cloud build. Their demo observation was about **930 model calls for 152 initially imported items**. That is a workload example, not a monthly price. Feed volume, models, translation and event processing determine recurring consumption. Optional X, WeChat and Jina collection can add charges.

The admin exposes call counts, token usage, failures and manual corrections. Budget breakers pause paid services at per-minute, hourly and daily request ceilings. Stored receipts help reuse paid results during retries. Request ceilings limit activity, but we still need to monitor actual spending.

Before publishing, we need our own source permissions, corrections process and reviewed terms. Chinese text appears beyond the main configuration file. X and WeChat integrations do not grant permission to collect or redistribute platform content. Default summaries and original links are a sensible starting point; full-text republication needs explicit permission.

## Similar projects solve different parts

All counts and last-push dates below were read **October 21, 2026** from GitHub metadata; roles come from their READMEs. Last push can include branches or automation and is not a release date. Stars measure interest. We searched news-aggregator, daily-digest, content-curation and LLM/RSS candidates and added UglyFeed as an active close fit.

| Project | Kind and AI role | License | Stars; last push | Self-hosted? |
|---|---|---|---|---|
| [AIHOT](https://github.com/KKKKhazix/AIHOT) | News-site engine; selection, writing, grouping | MIT, branding excluded | 8,232; 2026-10-21 | Yes |
| [TrendRadar](https://github.com/sansan0/TrendRadar) | Trend monitor; AI analysis and alerts | GPL-3.0 | 63,063; 2026-10-20 | Yes |
| [NewsNow](https://github.com/newsnext/newsnow) | Hot-news reader; MCP access, no stated AI editorial pipeline | MIT | 22,095; 2026-10-13 | Yes |
| [DailyHotApi](https://github.com/imsyy/DailyHotApi) | Hot-list API/RSS plumbing; no stated AI curation | MIT | 4,090; 2026-03-11 | Yes |
| [Folo](https://github.com/RSSNext/Folo) | Reader; AI-assisted reading | AGPL-3.0, icon exception | 39,129; 2026-10-20 | Client source; service dependencies |
| [RSSHub](https://github.com/DIYgod/RSSHub) | Source plumbing; generates RSS | AGPL-3.0 | 46,599; 2026-10-20 | Yes |
| [FreshRSS](https://github.com/FreshRSS/FreshRSS) | Reader; extensions, no stated core LLM editor | AGPL-3.0 | 16,344; 2026-10-20 | Yes |
| [Miniflux](https://github.com/miniflux/v2) | Reader; no stated core LLM editor | Apache-2.0 | 9,810; 2026-10-21 | Yes |
| [Glance](https://github.com/glanceapp/glance) | Dashboard; feed widgets, no stated AI editor | AGPL-3.0 | 37,585; 2026-10-20 | Yes |
| [auto-news](https://github.com/finaldie/auto-news) | Personal aggregator; LLM insights and recaps | MIT | 909; 2025-07-19 | Backend; Notion client |
| [RSS-GPT](https://github.com/yinan-c/RSS-GPT) | Personal digest script; summaries via Actions | MIT | 355; 2025-09-08 | Fork/workflow |
| [Kagi News / Kite](https://github.com/kagisearch/kite-public) | News front end; hosted LLM summaries | MIT code; CC BY-NC 4.0 data | 1,087; 2026-10-19 | Front end only |
| [BestBlogs](https://github.com/ginobefun/BestBlogs) | Reading service/resources; AI scoring | No license found | 4,057; 2026-07-08 | Full engine not established |
| [UglyFeed](https://github.com/fabriziosalmi/UglyFeed) | Feed publishing pipeline; LLM grouping/rewriting | AGPL-3.0 | 321; 2026-10-17 | Yes |

We would choose TrendRadar for monitoring and alerts, NewsNow for browsing hot lists, or DailyHotApi for feeding another application. RSSHub supplies missing feeds. FreshRSS and Miniflux suit a personal reading queue; Folo adds AI-assisted reading, while Glance combines feeds with other dashboard widgets.

UglyFeed is closer when the desired output is a rewritten RSS feed. auto-news and RSS-GPT target personal digests, but their older push dates deserve attention; RSS-GPT explicitly says its hosted feed updates are suspended. Kagi shares its front end, not the complete news-generation engine. BestBlogs is useful to study, but an unlicensed public repository is not permission to reuse a full publishing system.

## The part worth copying

AIHOT makes editorial decisions inspectable. We can change a prompt, see why a candidate failed and compare another model against our own labels. Two scores can reduce an unlucky judgment, but shared model bias survives both calls. Event grouping reduces repetition, while a bad merge can hide a distinct story. Heat measures configured attention, not truth or importance.

The [calibration guide](https://github.com/KKKKhazix/AIHOT/blob/main/docs/selection.md#校准) recommends labeling 100 to 200 examples ourselves, including difficult cases, and reserving some for a final check. SelectBench shows mistakes and model failures. We should improve the rubric before moving thresholds and compare coverage alongside accuracy. Story-summary changes need separate human review.

That is the useful bargain: editable editorial rules, event-based reading, decaying attention, predictable daily assembly and agent-readable outputs. We still own the source choices, permissions, spending and published mistakes.

## Fact-check notes and sources

All sources read **2026-10-21 UTC**. Repository snapshot: `a0d1e75b00ede7e503ca948e71a468db964b2df2`.

- AIHOT [README](https://github.com/KKKKhazix/AIHOT/blob/main/README.en.md), [NOTICE](https://github.com/KKKKhazix/AIHOT/blob/main/NOTICE) and [repository metadata](https://api.github.com/repos/KKKKhazix/AIHOT): purpose, branding, setup and repository figures. [Commit history](https://github.com/KKKKhazix/AIHOT/commits/main/) and [releases](https://github.com/KKKKhazix/AIHOT/releases): commit count and absence of releases.
- [Sources](https://github.com/KKKKhazix/AIHOT/blob/main/industry/sources.json), [thresholds](https://github.com/KKKKhazix/AIHOT/blob/main/industry/selection.ts), [selection](https://github.com/KKKKhazix/AIHOT/blob/main/docs/selection.md), [heat code](https://github.com/KKKKhazix/AIHOT/blob/main/packages/backend/src/events/hot.ts), [schedule](https://github.com/KKKKhazix/AIHOT/blob/main/site/site.ts) and [deployment](https://github.com/KKKKhazix/AIHOT/blob/main/docs/deploy.md): counts, numbers and mechanics.
- Live [AIHOT](https://aihot.news/about) and [machine guide](https://aihot.news/llms.txt), observed 03:32 UTC; pay.news [About](https://pay.news/about), [agent guide](https://pay.news/agent), [llms.txt](https://pay.news/llms.txt), [hot topics](https://pay.news/api/v1/hot-topics), [latest daily](https://pay.news/api/v1/dailies/latest), [RSS](https://pay.news/feed.xml) and [Terms](https://pay.news/terms), observed 03:32 UTC: public offerings and stated policies. No installation or independent content-accuracy benchmark was performed.
- Comparison rows cite each repository. GitHub repository API metadata and each README were read on the same date; license qualifications are explained above. These are documentation comparisons, not deployment tests.

## Related reading

- [RSS and JSON Feed from the same content](/blog/blog-json-feed-modern-syndication/)
- [Running our own email digest](/blog/self-hosted-email-digest-serverless/)
- [What held up when making websites agent ready](/blog/agent-ready-small-business-website/)
- [llms.txt and keeping its mirror consistent](/blog/blog-llms-txt-and-well-known-mirror/)

*This post is informational, not legal, financial or investment advice. Every product and company named is mentioned under nominative fair use. We are not affiliated with AIHOT, its author, pay.news or Dogpay. No other affiliation or endorsement is implied.*


---

Canonical HTML: https://jwatte.com/blog/aihot-open-source-ai-news-site-framework/
RSS: https://jwatte.com/feed.xml
JSON Feed: https://jwatte.com/feed.json
Hero image: https://jwatte.com/images/aihot-open-source-ai-news-site-framework.webp
