* feat(core): add honeybadger support
* feat(honeybadger): configure Honeybadger to disable uncaught error tracking
* feat(tests): add info logger mock to app-bootstrap tests
* test: fix mock value
* test: mock honeybadger as well
* feat(route/locals): add authenticated feed route
Add a Locals route with auth_token-based feed fetching, classic-to-beta URL fallback, and support for community, home, content, and content_plus feed views. Parse feed pages into RSS items using shared post selectors while surfacing clear errors when access is unavailable.
* feat(route/locals): add content feed
Add a Locals content route that uses the authenticated session-backed server functions instead of brittle page scraping. Support tier filters and media-type filters so paid and content-library posts can be subscribed to reliably.
* fix(route/locals): include content thumbnails
Use Locals preview and audio image fields so content and podcast entries expose thumbnails consistently. Render the image into item descriptions and standard image fields for better feed reader compatibility.
* fix(route/locals): include regular content posts
Keep Locals content feeds from dropping regular text and photo posts that arrive as no_content entries with real body content. Preserve image handling while leaving plus feeds unchanged when the source only returns five content-plus items.
* fix(route/locals): prefer content poster images
Prefer Locals poster-style preview images over raw first-frame captures when both are available. Keep the raw frame fallback for posts where the API does not expose a styled poster image.
* fix(route/locals): resolve runtime action ids
Derive the Locals feed action id from the current runtime assets instead of hardcoding build-specific server function ids. Tighten option validation with own-key checks and align the radar source with supported matching rules.
* fix(config): sort locals session settings
Move the Locals session env key and config blocks into alphabetical order so the route-specific configuration matches the repository's config layout rules.
* fix(config): reorder locals session settings
* fix(route/locals): simplify route and request handling
* fix(config): restore locals config ordering
* fix(config): sort security key entry
* fix(route/locals): adjust message clarity of path parameter necessity
* refactor(theinitium): rewrite routes for Ghost CMS, add cookie support
- Rewrite all routes to use Ghost Content API (old API deprecated)
- Add INITIUM_MEMBER_COOKIE env var for paid article full-text
- Add features block with requireConfig to all route files
- Add url field and radar rules per RSSHub standards
- Strip -zh-hans suffix from author/category display names
- Update namespace with English name and zh translations
- Mark follow route as deprecated (Ghost doesn't support it)
- Fix hostname binding to 0.0.0.0 for LAN access
* fix(theinitium): use routeExpire with refresh=false to prevent stale cache
Cache was never expiring because refresh=true (default) extends TTL on every hit.
Now uses 5-min routeExpire and won't extend on access.
* refactor(theinitium): address review feedback
- Remove unused INITIUM_USERNAME/PASSWORD/BEARER_TOKEN env keys
- Remove hardcoded User-Agent (use RSSHub's internal UA)
- Remove fragile html.length > 500 check
- Remove refresh: false from cache.tryGet
- Hoist stripLangSuffix to module scope (dedupe with cleanName)
* fix(theinitium): detect paywall CTA instead of length check
If cookie is invalid/expired, scrape returns paywall HTML.
Check for .gh-post-upgrade-cta to detect this and fall back
to cleaner Ghost API preview.
* revert(index): restore '::' hostname per #16513
* feat(theinitium): clean Ghost Koenig card HTML for RSS output
* fix(theinitium): use redirected Ghost API URL, remove unused config types
* fix(theinitium): remove unrelated neureality config changes
---------
Co-authored-by: Ryan Yao <ryanyao@Macmini.lan>
Co-authored-by: Ryan Yao <ryanyao@Ryans-Mac-mini.lan>
Co-authored-by: Ryan Yao <ryanyao@Ryans-Mac-mini.local>
* feat(route/twitter): support official api with user credentials (act as a logged user) support
* fix: update namespace docs
* fix(route/twitter): use optional chaining for access tokens
* feat(route): add f95zone routes
* fix(route): fix f95zone threads route for folo parse
* fix(route): parse f95zone thread guid from [YYYY-MM-DD] in title
* fix(route): use update date in thread title as pubDate
* fix(route/f95zone): revert image URL processing
* fix(route/f95zone): reenable image URL processing for telegram-bot
* feat(route/f95zone): support post and thread route
* feat(route/f95zone): optimize title
* feat(route/f95zone): optimize image display
* feat(route/f95zone): optimize image display
* feat(route/f95zone): reoptimize img-elements processing
* feat(route/f95zone): reset to the original route pattern
* feat(route/f95zone): optimize routes
* feat(route/f95zone): optimize content processing
* feat(route/f95zone): reduce code
* fix(route/f95zone): use parseDate for proper date handling
* fix(route/f95zone): remove broken radar
* fix(route/f95zone): remove invalid radar config and improve docs
- Remove radar config from post route (postId is in URL hash, cannot be extracted)
- Add empty radar array to prevent Folo parsing error
- Add detailed URL format documentation for both routes
- Explain how to convert browser URL to subscription URL
* fix(route/f95zone): fix invalid example URL
* fix(route/f95zone): use internally generated UA
* fix(route/f95zone): only fetch the first and the last page
* fix(route/f95zone): remove unnecessary sorting logic
Allow xiaohongshu routes to bypass anti-scraping measures by routing requests through a configurable proxy. When XIAOHONGSHU_PROXY is set, all xiaohongshu HTTP requests (user, board, notes) will be routed through the proxy endpoint instead of using Puppeteer.
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
* Initial plan
* Replace @tonyrl/rand-user-agent with header-generator and add sec-ch-* headers
Co-authored-by: TonyRL <11386903+TonyRL@users.noreply.github.com>
* Extract unwanted UA validation into standalone isValidUserAgent function
Co-authored-by: TonyRL <11386903+TonyRL@users.noreply.github.com>
* Add headerGeneratorPreset option to got and ofetch utilities
* Replace randUserAgent usage in lib/routes with headerGeneratorPreset option
Co-authored-by: TonyRL <11386903+TonyRL@users.noreply.github.com>
* chore: pin header-generator to exact match
* fix: replace randUserAgent with a static user agent string in config
* Remove deprecated _randUserAgent function and related tests
Co-authored-by: TonyRL <11386903+TonyRL@users.noreply.github.com>
* refactor: rename to header-generator
* Changes before error encountered
Co-authored-by: TonyRL <11386903+TonyRL@users.noreply.github.com>
* fix: update generateHeaders parameter type to Partial<HeaderGeneratorOptions>
* fix: add ios preset
* fix: rename headerGeneratorPreset to headerGeneratorOptions
* feat: add MODERN_IOS preset and update header-generator patch hash
* fix: use ios preset
* fix: update FetchOptions to include headerGeneratorOptions type
* refactor: simplify header generation and update header inclusion list
* fix: remove header-generator patch
* refactor: update user-agent handling in requests and tests
* test: remove redundant headerGeneratorOptions test and add new ofetch header preset test
* test: add custom user-agent test for ofetch
* test: update user-agent expectation in ofetch headers test
* Update lib/utils/ofetch.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* refactor: replace hardcoded headers with generatedHeaders in fetch and get request handlers
* refactor: rename test suite from rand-user-agent to header-generator and remove unused dependency
* Update lib/utils/header-generator.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: TonyRL <11386903+TonyRL@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add Tumblr posts route
* Reorder based on name
* Store refresh token longer
* Remove radar route as it cannot match part of a path
* Maintainer name case
* Throw ConfigNotFoundError if minimum required config is not present
* Camel case function name and reorder to be alphabetical
* Keep refresh token for a year
* Don't trust refactoring
* Get limit from query params
* Remove old doc
* Retrieve post tags
* feat(namespace): add namespace for CJLU
* feat(route): Add route for graduate school of CJLU
为中国计量大学研究生院添加路由
支持将`教师通知`和`研究生通知`页面转化为 RSS 订阅源
* doc: modify discription of some params
修改参数描述
* fix(radar rule): modify radar rule
修改 radar 规则,以正确提供订阅源
* fix: add exception handling
增加异常处理
* chore: optimize conditional logic
优化判断逻辑
* Update lib/routes/cjlu/yjsy/index.ts
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
* fix(radar rule): list all source choices
在 radar 规则中列出全部的类型
修改行尾符为 LF
* fix(example): correct example of the route
订正路由的案例
* chore: add missing namespace information
* fix(mangadex): resolve incorrect route detection
* chore: update route name and include myself as a maintainer
* feat(mangadex): add token retrieval utility base on config
* feat(mangadex): add utility to retrieve user configurations
Added a utility function `getFilteredLanguages` to retrieve filtered languages based on the current user's configuration.
* feat: add `getMangaMeta` utility to retrive metadata for a manga
* refactor: add utility to retrive chapter info for a manga
Original implementation by @vzz64 was embedded in modules.
Extracted the common logic into a standalone function for better code reusability and maintainability.
* refactor(feed util): move the fallback logic into function
Add a docstring to explain its usage
* doc(access util): add docstrings for key function
* refactor: purify result of function
Change result type from object to array by remove `total` param.
* feat(feed util): add support for alternative parameter type
- Add docstring for util functions
- Add a new combination function
- Improve code type inference
* refactor: move constants to separate files for better organization
* feat: modify the route for single manga
- **important**: add a prefix to the route for space for other routes in namespace, not compatiable to former route
- use integrated utility to retrieve details of a single manga
* refactor: move `token expire time` to constant
* docs(access): add Error docstring
* chore: make cover became thumbnail to save bandwidth and better display
* feat: add new route for user follow's list
- support reading, plan to read etc.
- add new optional param to utility function
* fix: improve perfomance in retrieving manga's meta data
- if cover is needed, use the optional param `includes` to fetch in one request
* refactor: rearrange code
- skip some code for branch without cover needed
* docs: add description for route
* docs: add a detailed param description for route
- offer a default value for param
* feat: add a new constant
* feat: seperate util-function for better organization
- add docstring for `toQueryString`
* feat: add new utility function to fetch manga meta data in batch
* fix: use dynamic key to cache result
- otherwise it may get wrong result with diffrent types
- rearrange the code
* feat: add a new route for all user's followed mangas
* chore: add parameters' desctiption
- offer a more detailed example
- use local constant to maintance limit
- change some code's style
* style: change style in using utility function
* style: refactor query string construction for improved readability
* style: change a variable's name
* feat: add new route for sepecific mdlist feed
* fix: use correct time for pubDate
* fix: use `image` prop to display thumbnail instead of `description`
* refactor(mangadex): improve access token retrieval logic and handle refresh token errors
* refactor(mangadex): replace getMangaMeta with getMangaMetaByIds for improved efficiency
* chore: modify route's decription
* fix: remove unnecessary nullish coalescing in description assignment
* fix: update access token retrieval to use client ID and secret instead of username and password
* fix: correct spellings in definition
* chore: remove unnecessary code
* fix: dedupe ids before fetch manga metas
- add `limit` param to get the full response
* fix: remove wrong suffix
* fix: remove unnecessary code
* chore: remove unnessary code
* fix: set manga and config feed's cache to not refreshable
* fix: remove filteredLanguages option
* fix: remove filteredLanguages option
* fix: add sort operation after dedupe
* style: add trailing comma
* fix: remove common params
* fix: remove unnecessary code
* fix: remove route's unnecessary name prefix
* fix: change TTL for hot caches
* fix: remove docs for non-exist config
* refactor: fix lint issue for better readability
* fix: ensure cover image is only set if cover filename exists
---------