diff --git a/.github/banner.png b/.github/banner.png deleted file mode 100644 index 07a6673..0000000 Binary files a/.github/banner.png and /dev/null differ diff --git a/.github/workflows/deps.yml b/.github/workflows/deps.yml index 29e851b..352ca3e 100644 --- a/.github/workflows/deps.yml +++ b/.github/workflows/deps.yml @@ -11,7 +11,7 @@ env: jobs: sync-tls: - name: Update webclaw-tls dependencies + name: Update noxa-tls dependencies runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -20,9 +20,9 @@ jobs: - uses: dtolnay/rust-toolchain@stable - - name: Update webclaw-tls crates + - name: Update noxa-tls crates run: | - cargo update -p webclaw-http -p rustls -p 'h2@0.4' -p 'hyper@1' -p 'hyper-util@0.1' -p 'reqwest@0.13' 2>&1 + cargo update -p noxa-http -p rustls -p 'h2@0.4' -p 'hyper@1' -p 'hyper-util@0.1' -p 'reqwest@0.13' 2>&1 - name: Check for changes id: diff @@ -39,13 +39,13 @@ jobs: git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add Cargo.lock - git commit -m "chore: update webclaw-tls dependencies" + git commit -m "chore: update noxa-tls dependencies" git push - name: Trigger server update if: steps.diff.outputs.changed == 'true' run: | - gh api repos/0xMassi/webclaw-server/dispatches \ + gh api repos/0xMassi/noxa-server/dispatches \ -f event_type=core-updated \ -f client_payload[sha]=${{ github.sha }} env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 95be38f..abadb4b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -64,10 +64,10 @@ jobs: shell: bash run: | tag="${GITHUB_REF#refs/tags/}" - staging="webclaw-${tag}-${{ matrix.target }}" + staging="noxa-${tag}-${{ matrix.target }}" mkdir "$staging" - cp target/${{ matrix.target }}/release/webclaw "$staging/" 2>/dev/null || true - cp target/${{ matrix.target }}/release/webclaw-mcp "$staging/" 2>/dev/null || true + cp target/${{ matrix.target }}/release/noxa "$staging/" 2>/dev/null || true + cp target/${{ matrix.target }}/release/noxa-mcp "$staging/" 2>/dev/null || true cp README.md LICENSE "$staging/" tar czf "$staging.tar.gz" "$staging" echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV @@ -128,12 +128,12 @@ jobs: run: | tag="${GITHUB_REF#refs/tags/}" for target in x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu; do - dir="webclaw-${tag}-${target}" - curl -sSL "https://github.com/0xMassi/webclaw/releases/download/${tag}/${dir}.tar.gz" -o "${target}.tar.gz" + dir="noxa-${tag}-${target}" + curl -sSL "https://github.com/0xMassi/noxa/releases/download/${tag}/${dir}.tar.gz" -o "${target}.tar.gz" tar xzf "${target}.tar.gz" mkdir -p "binaries-${target}" - cp "${dir}/webclaw" "binaries-${target}/webclaw" - cp "${dir}/webclaw-mcp" "binaries-${target}/webclaw-mcp" + cp "${dir}/noxa" "binaries-${target}/noxa" + cp "${dir}/noxa-mcp" "binaries-${target}/noxa-mcp" chmod +x "binaries-${target}"/* done ls -laR binaries-*/ @@ -145,22 +145,22 @@ jobs: # amd64 docker build -f Dockerfile.ci --build-arg BINARY_DIR=binaries-x86_64-unknown-linux-gnu \ - --platform linux/amd64 -t ghcr.io/0xmassi/webclaw:${tag}-amd64 --push . + --platform linux/amd64 -t ghcr.io/0xmassi/noxa:${tag}-amd64 --push . # arm64 docker build -f Dockerfile.ci --build-arg BINARY_DIR=binaries-aarch64-unknown-linux-gnu \ - --platform linux/arm64 -t ghcr.io/0xmassi/webclaw:${tag}-arm64 --push . + --platform linux/arm64 -t ghcr.io/0xmassi/noxa:${tag}-arm64 --push . # Multi-arch manifest - docker manifest create ghcr.io/0xmassi/webclaw:${tag} \ - ghcr.io/0xmassi/webclaw:${tag}-amd64 \ - ghcr.io/0xmassi/webclaw:${tag}-arm64 - docker manifest push ghcr.io/0xmassi/webclaw:${tag} + docker manifest create ghcr.io/0xmassi/noxa:${tag} \ + ghcr.io/0xmassi/noxa:${tag}-amd64 \ + ghcr.io/0xmassi/noxa:${tag}-arm64 + docker manifest push ghcr.io/0xmassi/noxa:${tag} - docker manifest create ghcr.io/0xmassi/webclaw:latest \ - ghcr.io/0xmassi/webclaw:${tag}-amd64 \ - ghcr.io/0xmassi/webclaw:${tag}-arm64 - docker manifest push ghcr.io/0xmassi/webclaw:latest + docker manifest create ghcr.io/0xmassi/noxa:latest \ + ghcr.io/0xmassi/noxa:${tag}-amd64 \ + ghcr.io/0xmassi/noxa:${tag}-arm64 + docker manifest push ghcr.io/0xmassi/noxa:latest homebrew: name: Update Homebrew @@ -172,11 +172,11 @@ jobs: COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }} run: | tag="${GITHUB_REF#refs/tags/}" - base="https://github.com/0xMassi/webclaw/releases/download/${tag}" + base="https://github.com/0xMassi/noxa/releases/download/${tag}" # Download all 4 tarballs and compute SHAs for target in aarch64-apple-darwin x86_64-apple-darwin aarch64-unknown-linux-gnu x86_64-unknown-linux-gnu; do - curl -sSL "${base}/webclaw-${tag}-${target}.tar.gz" -o "${target}.tar.gz" + curl -sSL "${base}/noxa-${tag}-${target}.tar.gz" -o "${target}.tar.gz" done SHA_MAC_ARM=$(sha256sum aarch64-apple-darwin.tar.gz | cut -d' ' -f1) @@ -190,53 +190,53 @@ jobs: echo "Linux x86_64: $SHA_LINUX_X86" # Generate formula - cat > webclaw.rb << FORMULA - class Webclaw < Formula + cat > noxa.rb << FORMULA + class Noxa < Formula desc "The fastest web scraper for AI agents. 67% fewer tokens. Sub-ms extraction." - homepage "https://webclaw.io" + homepage "https://noxa.io" license "AGPL-3.0" version "${tag#v}" on_macos do if Hardware::CPU.arm? - url "${base}/webclaw-${tag}-aarch64-apple-darwin.tar.gz" + url "${base}/noxa-${tag}-aarch64-apple-darwin.tar.gz" sha256 "${SHA_MAC_ARM}" else - url "${base}/webclaw-${tag}-x86_64-apple-darwin.tar.gz" + url "${base}/noxa-${tag}-x86_64-apple-darwin.tar.gz" sha256 "${SHA_MAC_X86}" end end on_linux do if Hardware::CPU.arm? - url "${base}/webclaw-${tag}-aarch64-unknown-linux-gnu.tar.gz" + url "${base}/noxa-${tag}-aarch64-unknown-linux-gnu.tar.gz" sha256 "${SHA_LINUX_ARM}" else - url "${base}/webclaw-${tag}-x86_64-unknown-linux-gnu.tar.gz" + url "${base}/noxa-${tag}-x86_64-unknown-linux-gnu.tar.gz" sha256 "${SHA_LINUX_X86}" end end def install - bin.install "webclaw" - bin.install "webclaw-mcp" + bin.install "noxa" + bin.install "noxa-mcp" end test do - assert_match "webclaw", shell_output("#{bin}/webclaw --version") + assert_match "noxa", shell_output("#{bin}/noxa --version") end end FORMULA # Remove leading whitespace from heredoc - sed -i 's/^ //' webclaw.rb + sed -i 's/^ //' noxa.rb # Push to homebrew tap - git clone "https://x-access-token:${COMMITTER_TOKEN}@github.com/0xMassi/homebrew-webclaw.git" tap - cp webclaw.rb tap/Formula/webclaw.rb + git clone "https://x-access-token:${COMMITTER_TOKEN}@github.com/0xMassi/homebrew-noxa.git" tap + cp noxa.rb tap/Formula/noxa.rb cd tap git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - git add Formula/webclaw.rb - git diff --cached --quiet || git commit -m "Update webclaw to ${tag}" + git add Formula/noxa.rb + git diff --cached --quiet || git commit -m "Update noxa to ${tag}" git push diff --git a/CHANGELOG.md b/CHANGELOG.md index cbe6897..c65ca0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -All notable changes to webclaw are documented here. +All notable changes to noxa are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/). ## [0.3.11] — 2026-04-10 @@ -33,19 +33,19 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). ## [0.3.8] — 2026-04-03 ### Fixed -- **MCP research token overflow**: research results are now saved to `~/.webclaw/research/` and the MCP tool returns file paths + findings instead of the full report. Prevents "exceeds maximum allowed tokens" errors in Claude/Cursor. +- **MCP research token overflow**: research results are now saved to `~/.noxa/research/` and the MCP tool returns file paths + findings instead of the full report. Prevents "exceeds maximum allowed tokens" errors in Claude/Cursor. - **Research caching**: same query returns cached result instantly without spending credits. - **Anthropic rate limit throttling**: 60s delay between LLM calls in research to stay under Tier 1 limits (50K input tokens/min). ### Added -- **`dirs` dependency** for `~/.webclaw/research/` path resolution. +- **`dirs` dependency** for `~/.noxa/research/` path resolution. --- ## [0.3.7] — 2026-04-03 ### Added - **`--research` CLI flag**: run deep research via the cloud API. Prints report to stdout and saves full result (report + sources + findings) to a JSON file. Supports `--deep` for longer reports. -- **MCP extract/summarize cloud fallback**: when no local LLM is available, these tools now fall back to the cloud API instead of erroring. Set `WEBCLAW_API_KEY` for automatic fallback. +- **MCP extract/summarize cloud fallback**: when no local LLM is available, these tools now fall back to the cloud API instead of erroring. Set `NOXA_API_KEY` for automatic fallback. - **MCP research structured output**: the research tool now returns structured JSON (report + sources + findings + metadata) instead of raw text, so agents can reference individual findings and source URLs. --- @@ -80,13 +80,13 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). ## [0.3.3] — 2026-04-01 ### Changed -- **Replaced custom TLS stack with wreq**: migrated from webclaw-tls (patched rustls/h2/hyper/reqwest) to [wreq](https://github.com/0x676e67/wreq) by [@0x676e67](https://github.com/0x676e67). wreq uses BoringSSL for TLS and the [http2](https://github.com/0x676e67/http2) crate for HTTP/2 fingerprinting — both battle-tested with 60+ browser profiles. -- **Removed all `[patch.crates-io]` entries**: consumers no longer need to patch rustls, h2, hyper, hyper-util, or reqwest. Just depend on webclaw normally. +- **Replaced custom TLS stack with wreq**: migrated from noxa-tls (patched rustls/h2/hyper/reqwest) to [wreq](https://github.com/0x676e67/wreq) by [@0x676e67](https://github.com/0x676e67). wreq uses BoringSSL for TLS and the [http2](https://github.com/0x676e67/http2) crate for HTTP/2 fingerprinting — both battle-tested with 60+ browser profiles. +- **Removed all `[patch.crates-io]` entries**: consumers no longer need to patch rustls, h2, hyper, hyper-util, or reqwest. Just depend on noxa normally. - **Browser profiles rebuilt on wreq's Emulation API**: Chrome 145, Firefox 135, Safari 18, Edge 145 with correct TLS options (cipher suites, curves, GREASE, ECH, PSK session resumption), HTTP/2 SETTINGS ordering, pseudo-header order, and header wire order. - **Better TLS compatibility**: BoringSSL handles more server configurations than patched rustls (e.g. servers that previously returned IllegalParameter alerts). ### Removed -- webclaw-tls dependency and all 5 forked crates (webclaw-rustls, webclaw-h2, webclaw-hyper, webclaw-hyper-util, webclaw-reqwest). +- noxa-tls dependency and all 5 forked crates (noxa-rustls, noxa-h2, noxa-hyper, noxa-hyper-util, noxa-reqwest). ### Acknowledgments - TLS and HTTP/2 fingerprinting powered by [wreq](https://github.com/0x676e67/wreq) and [http2](https://github.com/0x676e67/http2) by [@0x676e67](https://github.com/0x676e67), who pioneered browser-grade HTTP/2 fingerprinting in Rust. @@ -114,7 +114,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). ## [0.3.0] — 2026-03-29 ### Changed -- **Replaced primp with webclaw-tls**: switched to custom TLS fingerprinting stack. +- **Replaced primp with noxa-tls**: switched to custom TLS fingerprinting stack. - **Browser profiles**: Chrome 146 (Win/Mac), Firefox 135+, Safari 18, Edge 146 — captured from real browsers. - **HTTP/2 fingerprinting**: SETTINGS frame ordering and pseudo-header ordering based on concepts pioneered by [@0x676e67](https://github.com/0x676e67). @@ -141,7 +141,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/). ## [0.2.1] — 2026-03-27 ### Added -- **Docker image on GHCR**: `docker run ghcr.io/0xmassi/webclaw` — auto-built on every release +- **Docker image on GHCR**: `docker run ghcr.io/0xmassi/noxa` — auto-built on every release - **QuickJS data island extraction**: inline `