- Create Container Worker entry point with load balancing (20 instances)
- Add wrangler-container.toml configuration with KV binding for environment variables
- Configure container to use standard-1 instance type with Chromium support
- Implement dynamic environment variable loading from Cloudflare KV
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
* feat: deploy RSSHub to Cloudflare Workers
- Create Worker entry point (lib/worker.ts) with polyfills
- Implement Worker-specific app configuration (lib/app.worker.tsx)
- Add automatic .worker.ts resolution plugin for cleaner config
- Simplify build configuration with only 3 essential shims
- Enable static asset serving via Cloudflare Static Assets feature
- Support dynamic route loading with proper module aliasing
🤖 Generated with Claude Code
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
* feat(worker): add puppeteer and request-rewriter support
- Add @cloudflare/puppeteer for Browser Rendering API support
- Create puppeteer.worker.ts with Cloudflare Browser binding
- Add request-rewriter Worker version with static browser headers
- Add vm module shim to node-module.ts for JSDOM compatibility
- Configure __dirname/__filename in tsdown for CommonJS compat
- Update wrangler.toml with BROWSER binding configuration
- Dynamically extract namespaces from foloAnalysisTop100 for routes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(cache): restore synchronous initialization for tests
The async initialization caused cache tests to fail because the cache
module wasn't ready when tests ran. Restored synchronous imports while
keeping Worker-specific no-op behavior.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(worker): add automated Worker integration tests
- Add miniflare for Worker environment simulation
- Create lib/worker.worker.test.ts with integration tests
- Test basic routes (/test/1, /, unknown routes)
- Test RSS feed routes (hackernews, v2ex)
- Test error handling for puppeteer routes without BROWSER binding
- Add worker-test npm script
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* refactor(worker): use test routes for Worker integration tests
- Replace third-party routes (hackernews, v2ex, weibo) with /test/* routes
- Remove miniflare dependency (wrangler includes it internally)
- Simplify test setup using wrangler's unstable_dev API
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(test): make header-generator test less flaky
The header-generator library may return different platform values due to
internal randomness. Update test to check for valid format instead of
exact value.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(test): exclude worker tests from vitest coverage run
Worker tests require the dist-worker bundle to be built first,
which is not part of the regular CI test workflow. These tests
should be run separately using 'pnpm worker-test'.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* test(worker): add automated Worker integration tests
- Add worker-build step to CI workflow before running tests
- Revert exclusion of worker tests from vitest coverage run
- Worker tests now run as part of the regular test suite
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(worker): fix routes.js alias path in worker build config
Change alias key from absolute path to relative import path to match
how it's imported in lib/registry.ts. This fixes the worker build
failing with "Could not resolve '../assets/build/routes.js'" error.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* ci: trigger CI re-run
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(ci): build worker routes before worker-build
The worker build requires routes-worker.js which is generated by
running build:routes with WORKER_BUILD=true. This was missing in CI,
causing the worker build to fail with "Could not resolve routes.js".
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(test): increase timeout for Worker integration tests
Worker tests need more time in CI environments. Increase individual
test timeouts from default 10s to 30s for each test case.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Haiku 4.5 <noreply@anthropic.com>
* feat(nix): add flake module and offline-friendly build
* chore(nix): upgrade to Node.js 24 and pnpm 10
Update devenv.nix to match project dependencies:
- Upgrade Node.js from 22 to 24 (aligns with Dockerfile node:24-bookworm)
- Upgrade pnpm from 9 to 10 (aligns with package.json pnpm@10.22.0)
* test: fix buffer-get test timeout
Replace external URL with mock server endpoint to prevent test timeout.
The test was trying to fetch from http://example.com which is not mocked,
causing it to timeout. Now uses http://rsshub.test/headers which is
properly mocked in the test setup.
* fix(.envrc): add --no-pure-eval for devenv flake compatibility
This fixes an issue where devenv fails when entering the directory with
direnv, reporting: "devenv was not able to determine the current directory."
The --no-pure-eval flag allows devenv to determine the project root via
builtins.getEnv "PWD" in flake mode.
Also adds .direnv, .devenv, and .pre-commit-config.yaml to .gitignore
following alphabetical order as per project conventions.
* feat(nix): add flake module and offline-friendly build
* chore(nix): upgrade to Node.js 24 and pnpm 10
Update devenv.nix to match project dependencies:
- Upgrade Node.js from 22 to 24 (aligns with Dockerfile node:24-bookworm)
- Upgrade pnpm from 9 to 10 (aligns with package.json pnpm@10.22.0)
* test: fix buffer-get test timeout
Replace external URL with mock server endpoint to prevent test timeout.
The test was trying to fetch from http://example.com which is not mocked,
causing it to timeout. Now uses http://rsshub.test/headers which is
properly mocked in the test setup.
* change route 'weibo/user' to fit api could be opened with Share(third-party android weibo clent)
* update weibo group route using cookies approach
* fix typo
* code optimization for /weibo/group; docs for /weibo/group
* try fix ESLint error
* fix typo and code optimization
* fix missing ','
* '/weibo/group' throw error when the cookie is not set
* feat: add prettier and commit hooks
* style(*): prettier format
* fix(eslint): parsing error: Unexpected token ...
* style(eslint): eslint --fix
* style(bilibili): fix `no-undef` and `no-unused-vars`
* style(jiandan): fix eqeqeq
* style(pixiv): disable `no-constant-condition` rule for eslint
* fix(pixiv): use template string
* style(toutiao): remove unused variables
* style(weibo): use `forEach` instead of `map`
The array has no return value, you should use `forEach` instead of `map`
* chore(hooks): add eslint hooks
* chore(hooks): switch from husky to yorkie
* style(zhihu): prettier format
* style(docs): fix vuepress custom container
https://vuepress.vuejs.org/guide/markdown.html#custom-containers
* chore(prettier): set a more reasonable `printWidth` value
* style(*): better prettier format