DailyHotApi's endpoint table has a status column and no statuses in it
🔥 今日热榜 API,一个聚合热门数据的 API 接口,支持 RSS 模式 及 Vercel 部署 | 前端页面:https://github.com/imsyy/DailyHot
At a glance
- What is it?
- An aggregator for about forty-six Chinese trending lists whose table of endpoints has an empty status column, whose two government alert feeds sit behind a sixty-minute cache, whose last commit is seven months old, and whose compose file replaces the image's user with an identifier the image never creates.
- Who is it for?
- DailyHotApi suits someone building a personal dashboard who wants one endpoint per site and does not mind a broken scraper, and it is a poor fit for anything that has to keep working unattended. Check six things first.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Activity is slowing. The repository last received commits 6 months 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 October 4, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The endpoint table has a status column and not one entry in it
The interface overview is the centre of the file, and it is a four-column table of about forty-six sites: the site, the category of list, the name you call it by, and a status column. The status column is empty in every row. The padding in that column is ragged, with a different number of trailing spaces on each line, which is the signature of cells that were cleared and had their width left behind rather than of a column that was never filled in. The table sits inside a collapsed section labelled as the full interface list, so a reader who expands it gets the complete set of callable names and no indication of which of them work. For a project whose entire mechanism is scraping somebody else's page, that is the one column that carries information the code cannot. A route either resolves or it throws, and a caller has to find out which by trying. The table also reveals how broad the surface is: video platforms, social networks, two news portals, a forum, a developer community, four game announcement feeds, and two official scientific feeds.
Two government alert feeds sit behind a cache measured in hours
Two of the forty-six endpoints are not trend lists at all. One is the national meteorological administration's nationwide weather warning feed, and one is the earthquake network's rapid report feed. Both are time-critical by nature: a seismic report or a severe weather warning is worth reading in minutes and worth little an hour later. The default cache is one hour, configured in seconds in the example environment file, and the file's own stated reason for caching is to avoid sending frequent requests to the upstream sites, with an instruction to change it yourself. That reason is a good one and the default is defensible for a trending list, where an hour of staleness costs nothing. Applied to the two alert feeds it inverts the value of the data. A self-hoster can lower the interval, and the interval is global rather than per-endpoint, so lowering it for the alerts also lowers it for the forty-four trend lists and undoes the politeness the cache exists to provide. The file does not say that the setting is global, and it does not call out the two endpoints as different in kind.
The last commit is seven months old and the newest release is over a year
Two dates decide how much weight this project can carry. The branch was last pushed on 11 March 2026, roughly seven months ago, and the newest published release is 2.0.8 from 20 August 2025, with the two before it from December and November 2024. The manifest version matches the newest tag, so the packaged release and the repository are the same code, and neither has moved in over a year. For most libraries that is unremarkable. For this one it is the central fact, because the work here is not an algorithm that stays correct, it is a set of selectors and parsers aimed at markup other people control. A site that changes its page structure breaks its endpoint, and the fix has to land as a commit. The empty status column makes the same point from the other side: the file contains the machinery for telling a caller which endpoints are alive and does not use it. There is also no changelog in the tree, so the only record of what changed between those three releases is the release list itself, and the two older ones are close enough together to suggest a batch rather than a cadence.
The compose file replaces the image's user with an identifier the image never creates
The container image is careful about this and the compose file then overrides it. The image creates a system group and a system user with fixed identifiers of one thousand and one, creates the log directory, and gives that directory to the new user before switching to it. The compose file then sets the runtime user to a four-digit identifier instead, and that identifier belongs to no account in the image. Three ownership stories therefore disagree. The image chowns the log directory to the first identifier. The compose file runs the process as the second. And the compose file bind-mounts a host directory over the log path, so the ownership that actually applies is whatever the host filesystem says, not anything the image did. The process runs as an identifier with no entry in the password file, which mostly works until something asks the operating system who the user is, and it cannot write to the log directory the image prepared unless the host directory happens to permit it. There is a third path to the same logs as well, a symbolic link created in the image, and the compose file mounts only one of the two.
The image bakes in a configuration file that allows any calling domain
The build stage copies the example configuration into the working directory if a real one is not already there, and the final stage copies that file into the shipped image. So the image contains a configuration file, and the shipped one is the example with its defaults. The default for the setting that controls which calling domains are permitted is a wildcard, with a separate setting for an allowed host that, when filled, takes precedence over it. Every other default in that file is a sensible starting point: a port, a request timeout in milliseconds, a switch for writing log files, a switch for RSS mode, a switch for filtering advertisements out of one site, and a block of Redis connection details with an empty password. The wildcard is the one to notice, because the compose file passes exactly one environment variable through, the port, and mounts one directory. So a deployment that follows the documented compose path cannot change the allowed-domain setting without editing the image or adding a mount the file never mentions. Every value in that file is a build input in practice, not a runtime knob.
The Node package route silently omits the endpoints that need a browser
There is a library route as well as the server route, and it has a documented limitation. You add the package, import one exported function, and call it with a port:
import serveHotApi from "dailyhot-api";
/**
* 启动服务器
* @param {Number} [port] - 端口号
* @returns {Promise<void>}
*/
serveHotApi(3000);The note attached to that section says this route cannot use some of the interfaces that require a browser environment. The dependency list then makes the consequence concrete. There are seventeen runtime dependencies, covering the HTTP framework and its Node adapter, an HTTP client, an HTML parser, a date library, environment loading, feed generation, a flat-JSON serialiser, a character-set decoder, a Redis client, an in-memory cache, an md5 helper, an RSS parser, a user-agent string helper, a logger and a terminal colouring library. A browser automation library is not among them. So the subset of endpoints that need one cannot work from an installed package unless the consumer installs a browser automation library themselves, discovers the requirement from a note in the readme rather than from the package metadata, and wires it up. The published tarball is the compiled output plus the readme and the licence, with source maps and declaration maps included, so a consumer can read the compiled code but the dependency list they resolve is the seventeen above.
Three one-click deployments need a fork and one deploys a different repository
Six deployment routes are described and they are not equally maintained. Two are Docker, a local build and a pull of a published image tagged with a moving label. Two are manual, a clone followed by install, build and start, and a process manager path that installs the manager globally and runs a shell script from the repository. Then there are three one-click routes, and each has a catch. The Vercel button clones a different repository entirely, a separate variant maintained for that platform, and nothing in this file says how that variant is kept in step with this one, so a Vercel deployment runs source you are not reading. The Railway and Zeabul instructions both begin by telling you to fork the project to your own repository, which means the one-click button only works for a copy you maintain. The detailed documentation is not here either: the deployment section opens by pointing at a personal blog post, and that post is dated April 2024, more than a year before the newest release. So for the current version of the project, the authoritative deployment guide is an external page written for an earlier one.
The script named start declares itself a development environment
The manifest has three environment values across three ways of running the same code, and the one that runs the build is not the production one. The development script sets the environment to development and runs the TypeScript source directly with a watcher. The start script runs the compiled output that the build script produced, and it also sets the environment to development. The container image sets it to a third value, a word of its own, and runs the compiled entry point directly. So a value intended to switch behaviour on the basis of environment never reads production in any documented path. The build itself is a single compiler invocation against the project config, with no bundler, no minification step and no separate type-check, so the shipped JavaScript is the compiler's own output. Two further details are worth a maintainer's attention. There are two development scripts that differ only by a flag disabling the transform cache, and nothing in the file explains when you would want which. And the repository's lockfile belongs to one package manager while the manual instructions tell you to install with a different one, so a manual install resolves dependencies fresh rather than from the lockfile the project ships.
Editorial conclusion
DailyHotApi suits someone building a personal dashboard who wants one endpoint per site and does not mind a broken scraper, and it is a poor fit for anything that has to keep working unattended. Check six things first. The branch was last pushed on 11 March 2026 and the newest release is from 20 August 2025, so for an aggregator whose scrapers break whenever a site changes its markup, that gap is the central fact. The table's status column, which exists to tell you which feeds still work, is empty in all forty-six rows. The weather and seismic alert feeds are cached for an hour by default, which is the wrong shape for early warnings. The Node package route silently omits the endpoints that need a browser, and the browser library is not a declared dependency. The compose file runs the container as a user identifier the image does not define, over a log directory owned by a different one. And the image bakes in a configuration file that allows any calling domain by default.
Frequently asked questions
What is DailyHotApi?
A self-hosted API that aggregates trending lists from about forty-six Chinese sites, covering video platforms, social networks, news portals, forums, a developer community, four game announcement feeds, and two official weather and seismic alert feeds. It serves both JSON and RSS output.
How do I run DailyHotApi?
Six routes are described. Build the Docker image locally or pull a published one, clone the repository and install, build and start it with the npm scripts, or install the package and call its exported function to start a server. A process manager script and three one-click platform deployments are also described, each with a catch noted in the readme.
What does the DailyHotApi npm package leave out?
The readme says the Node calling path cannot serve the interfaces that require a browser environment, and a browser automation library is not among the seventeen declared runtime dependencies. So installing the package alone gives you a server missing that subset of endpoints unless you add one yourself.
How long does DailyHotApi cache responses?
Sixty minutes by default, expressed in seconds in the example environment file, with the stated reason being to avoid frequent requests to the upstream sites and an instruction to change it yourself. An in-memory cache library and a Redis client are both dependencies, but the provided compose file starts no Redis service.
Is DailyHotApi still being worked on?
The branch was last pushed on 11 March 2026 and the newest release is 2.0.8 from 20 August 2025, with the two before it from December and November 2024. The endpoint table's status column, which exists to show which feeds still work, is empty in every row.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/imsyy-dailyhotapi)