chore: rebrand webclaw to noxa

This commit is contained in:
Jacob Magar 2026-04-11 00:10:38 -04:00
parent a4c351d5ae
commit 8674b60b4e
86 changed files with 781 additions and 2121 deletions

View file

@ -1,8 +1,8 @@
<p align="center">
<a href="https://webclaw.io">
<a href="https://noxa.io">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/0xMassi/webclaw/main/.github/banner.png" />
<img src="https://raw.githubusercontent.com/0xMassi/webclaw/main/.github/banner.png" alt="webclaw" width="700" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jmagar/noxa/main/.github/banner.png" />
<img src="https://raw.githubusercontent.com/jmagar/noxa/main/.github/banner.png" alt="noxa" width="700" />
</picture>
</a>
</p>
@ -13,9 +13,9 @@
</h3>
<p align="center">
<a href="https://www.npmjs.com/package/create-webclaw"><img src="https://img.shields.io/npm/dt/create-webclaw?style=for-the-badge&logo=npm&logoColor=white&label=Installs&color=CB3837" alt="npm installs" /></a>
<a href="https://github.com/0xMassi/webclaw"><img src="https://img.shields.io/github/stars/0xMassi/webclaw?style=for-the-badge&logo=github&logoColor=white&label=Stars&color=181717" alt="Stars" /></a>
<a href="https://github.com/0xMassi/webclaw/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-AGPL--3.0-10B981?style=for-the-badge" alt="License" /></a>
<a href="https://www.npmjs.com/package/create-noxa"><img src="https://img.shields.io/npm/dt/create-noxa?style=for-the-badge&logo=npm&logoColor=white&label=Installs&color=CB3837" alt="npm installs" /></a>
<a href="https://github.com/jmagar/noxa"><img src="https://img.shields.io/github/stars/jmagar/noxa?style=for-the-badge&logo=github&logoColor=white&label=Stars&color=181717" alt="Stars" /></a>
<a href="https://github.com/jmagar/noxa/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-AGPL--3.0-10B981?style=for-the-badge" alt="License" /></a>
</p>
---
@ -23,7 +23,7 @@
## Quick Start
```bash
npx create-webclaw
npx create-noxa
```
That's it. Auto-detects your AI tools, downloads the MCP server, configures everything.
@ -40,12 +40,12 @@ When it does work, you get 100KB+ of raw HTML — navigation, ads, cookie banner
## The Fix
webclaw impersonates Chrome 146 at the TLS protocol level. Perfect JA4 fingerprint. Perfect HTTP/2 Akamai hash. 99% bypass rate on 102 tested sites.
noxa impersonates Chrome 146 at the TLS protocol level. Perfect JA4 fingerprint. Perfect HTTP/2 Akamai hash. 99% bypass rate on 102 tested sites.
Then it extracts just the content — clean markdown, 67% fewer tokens.
```
Raw HTML webclaw
Raw HTML noxa
┌──────────────────────────────────┐ ┌──────────────────────────────────┐
<div class="ad-wrapper"> │ │ # Breaking: AI Breakthrough │
<nav class="global-nav"> │ │ │
@ -63,11 +63,11 @@ Then it extracts just the content — clean markdown, 67% fewer tokens.
## What It Does
```bash
npx create-webclaw
npx create-noxa
```
1. Detects installed AI tools (Claude, Cursor, Windsurf, VS Code, OpenCode, Codex, Antigravity)
2. Downloads the `webclaw-mcp` binary for your platform (macOS arm64/x86, Linux x86/arm64)
2. Downloads the `noxa-mcp` binary for your platform (macOS arm64/x86, Linux x86/arm64)
3. Asks for your API key (optional — **works locally without one**)
4. Writes the MCP config for each detected tool
@ -105,7 +105,7 @@ After setup, your AI agent has access to:
## Sites That Work
webclaw gets through where default `fetch()` gets blocked:
noxa gets through where default `fetch()` gets blocked:
Nike, Cloudflare, Bloomberg, Zillow, Indeed, Viagogo, Fansale, Wikipedia, Stripe, and 93 more. Tested on 102 sites with **99% success rate**.
@ -114,35 +114,33 @@ Nike, Cloudflare, Bloomberg, Zillow, Indeed, Viagogo, Fansale, Wikipedia, Stripe
### Homebrew
```bash
brew tap 0xMassi/webclaw && brew install webclaw
brew tap jmagar/noxa && brew install noxa
```
### Docker
```bash
docker run --rm ghcr.io/0xmassi/webclaw https://example.com
docker run --rm ghcr.io/0xmassi/noxa https://example.com
```
### Cargo
```bash
cargo install --git https://github.com/0xMassi/webclaw.git webclaw-cli
cargo install --git https://github.com/jmagar/noxa.git noxa
```
### Prebuilt Binaries
Download from [GitHub Releases](https://github.com/0xMassi/webclaw/releases) for macOS (arm64, x86_64) and Linux (x86_64, aarch64).
Download from [GitHub Releases](https://github.com/jmagar/noxa/releases) for macOS (arm64, x86_64) and Linux (x86_64, aarch64).
---
## Links
- [Website](https://webclaw.io)
- [Documentation](https://webclaw.io/docs)
- [GitHub](https://github.com/0xMassi/webclaw)
- [TLS Library](https://github.com/0xMassi/webclaw-tls)
- [Discord](https://discord.gg/KDfd48EpnW)
- [Status](https://status.webclaw.io)
- [Website](https://noxa.io)
- [Documentation](https://noxa.io/docs)
- [GitHub](https://github.com/jmagar/noxa)
- [Status](https://status.noxa.io)
## License

View file

@ -12,9 +12,9 @@ import http from "http";
// ── Constants ──
const REPO = "0xMassi/webclaw";
const BINARY_NAME = "webclaw-mcp";
const INSTALL_DIR = join(homedir(), ".webclaw");
const REPO = "jmagar/noxa";
const BINARY_NAME = "noxa-mcp";
const INSTALL_DIR = join(homedir(), ".noxa");
const BINARY_PATH = join(INSTALL_DIR, BINARY_NAME);
const VERSION = "latest";
@ -170,7 +170,7 @@ function download(url) {
return new Promise((resolve, reject) => {
const client = url.startsWith("https") ? https : http;
client
.get(url, { headers: { "User-Agent": "create-webclaw" } }, (res) => {
.get(url, { headers: { "User-Agent": "create-noxa" } }, (res) => {
// Follow redirects
if (
res.statusCode >= 300 &&
@ -195,7 +195,7 @@ async function downloadFile(url, dest) {
return new Promise((resolve, reject) => {
const client = url.startsWith("https") ? https : http;
client
.get(url, { headers: { "User-Agent": "create-webclaw" } }, (res) => {
.get(url, { headers: { "User-Agent": "create-noxa" } }, (res) => {
if (
res.statusCode >= 300 &&
res.statusCode < 400 &&
@ -225,15 +225,15 @@ function getAssetName() {
const a = arch();
if (os === "darwin" && a === "arm64")
return `webclaw-mcp-aarch64-apple-darwin.tar.gz`;
return `noxa-mcp-aarch64-apple-darwin.tar.gz`;
if (os === "darwin" && a === "x64")
return `webclaw-mcp-x86_64-apple-darwin.tar.gz`;
return `noxa-mcp-x86_64-apple-darwin.tar.gz`;
if (os === "linux" && a === "x64")
return `webclaw-mcp-x86_64-unknown-linux-gnu.tar.gz`;
return `noxa-mcp-x86_64-unknown-linux-gnu.tar.gz`;
if (os === "linux" && a === "arm64")
return `webclaw-mcp-aarch64-unknown-linux-gnu.tar.gz`;
return `noxa-mcp-aarch64-unknown-linux-gnu.tar.gz`;
if (os === "win32" && a === "x64")
return `webclaw-mcp-x86_64-pc-windows-msvc.zip`;
return `noxa-mcp-x86_64-pc-windows-msvc.zip`;
return null;
}
@ -257,7 +257,7 @@ function buildMcpEntry(apiKey) {
command: BINARY_PATH,
};
if (apiKey) {
entry.env = { WEBCLAW_API_KEY: apiKey };
entry.env = { NOXA_API_KEY: apiKey };
}
return entry;
}
@ -267,23 +267,23 @@ function buildMcpEntry(apiKey) {
function addToClaudeDesktop(configPath, apiKey) {
const config = readJsonFile(configPath);
if (!config.mcpServers) config.mcpServers = {};
config.mcpServers.webclaw = buildMcpEntry(apiKey);
config.mcpServers.noxa = buildMcpEntry(apiKey);
writeJsonFile(configPath, config);
}
function addToClaudeCode(configPath, apiKey) {
const config = readJsonFile(configPath);
if (!config.mcpServers) config.mcpServers = {};
config.mcpServers.webclaw = buildMcpEntry(apiKey);
config.mcpServers.noxa = buildMcpEntry(apiKey);
writeJsonFile(configPath, config);
}
function addToCursor(configPath, apiKey) {
const config = readJsonFile(configPath);
if (!config.mcpServers) config.mcpServers = {};
config.mcpServers.webclaw = {
config.mcpServers.noxa = {
command: BINARY_PATH,
...(apiKey ? { env: { WEBCLAW_API_KEY: apiKey } } : {}),
...(apiKey ? { env: { NOXA_API_KEY: apiKey } } : {}),
};
writeJsonFile(configPath, config);
}
@ -291,7 +291,7 @@ function addToCursor(configPath, apiKey) {
function addToWindsurf(configPath, apiKey) {
const config = readJsonFile(configPath);
if (!config.mcpServers) config.mcpServers = {};
config.mcpServers.webclaw = buildMcpEntry(apiKey);
config.mcpServers.noxa = buildMcpEntry(apiKey);
writeJsonFile(configPath, config);
}
@ -299,11 +299,11 @@ function addToVSCodeContinue(configPath, apiKey) {
const config = readJsonFile(configPath);
if (!config.mcpServers) config.mcpServers = [];
// Continue uses array format
const existing = config.mcpServers.findIndex?.((s) => s.name === "webclaw");
const existing = config.mcpServers.findIndex?.((s) => s.name === "noxa");
const entry = {
name: "webclaw",
name: "noxa",
command: BINARY_PATH,
...(apiKey ? { env: { WEBCLAW_API_KEY: apiKey } } : {}),
...(apiKey ? { env: { NOXA_API_KEY: apiKey } } : {}),
};
if (existing >= 0) {
config.mcpServers[existing] = entry;
@ -316,13 +316,13 @@ function addToVSCodeContinue(configPath, apiKey) {
function addToOpenCode(configPath, apiKey) {
const config = readJsonFile(configPath);
if (!config.mcp) config.mcp = {};
config.mcp.webclaw = {
config.mcp.noxa = {
type: "local",
command: [BINARY_PATH],
enabled: true,
};
if (apiKey) {
config.mcp.webclaw.environment = { WEBCLAW_API_KEY: apiKey };
config.mcp.noxa.environment = { NOXA_API_KEY: apiKey };
}
writeJsonFile(configPath, config);
}
@ -330,7 +330,7 @@ function addToOpenCode(configPath, apiKey) {
function addToAntigravity(configPath, apiKey) {
const config = readJsonFile(configPath);
if (!config.mcpServers) config.mcpServers = {};
config.mcpServers.webclaw = buildMcpEntry(apiKey);
config.mcpServers.noxa = buildMcpEntry(apiKey);
writeJsonFile(configPath, config);
}
@ -346,15 +346,15 @@ function addToCodex(configPath, apiKey) {
// File doesn't exist yet
}
// Remove any existing webclaw MCP section
// Remove any existing noxa MCP section
existing = existing.replace(
/\n?\[mcp_servers\.webclaw\][^\[]*(?=\[|$)/gs,
/\n?\[mcp_servers\.noxa\][^\[]*(?=\[|$)/gs,
"",
);
let section = `\n[mcp_servers.webclaw]\ncommand = "${BINARY_PATH}"\nargs = []\nenabled = true\n`;
let section = `\n[mcp_servers.noxa]\ncommand = "${BINARY_PATH}"\nargs = []\nenabled = true\n`;
if (apiKey) {
section += `env = { WEBCLAW_API_KEY = "${apiKey}" }\n`;
section += `env = { NOXA_API_KEY = "${apiKey}" }\n`;
}
writeFileSync(configPath, existing.trimEnd() + "\n" + section);
@ -378,7 +378,7 @@ async function main() {
console.log(c("bold", " ┌─────────────────────────────────────┐"));
console.log(
c("bold", " │") +
c("cyan", " webclaw") +
c("cyan", " noxa") +
c("dim", " — MCP setup for AI agents") +
c("bold", " │"),
);
@ -426,7 +426,7 @@ async function main() {
// 2. Ask for API key
console.log(c("dim", " An API key enables cloud features."));
console.log(
c("dim", " Without one, webclaw runs locally (free, no account needed)."),
c("dim", " Without one, noxa runs locally (free, no account needed)."),
);
console.log();
@ -437,7 +437,7 @@ async function main() {
console.log();
// 3. Download binary
console.log(c("bold", " Downloading webclaw-mcp..."));
console.log(c("bold", " Downloading noxa-mcp..."));
const assetName = getAssetName();
if (!assetName) {
@ -445,7 +445,7 @@ async function main() {
console.log(
c(
"dim",
" Build from source: cargo install --git https://github.com/0xMassi/webclaw webclaw-mcp",
" Build from source: cargo install --git https://github.com/jmagar/noxa noxa-mcp",
),
);
process.exit(1);
@ -502,7 +502,7 @@ async function main() {
);
try {
execSync(
`cargo install --git https://github.com/${REPO} webclaw-mcp --root "${INSTALL_DIR}"`,
`cargo install --git https://github.com/${REPO} noxa-mcp --root "${INSTALL_DIR}"`,
{ stdio: "inherit" },
);
// cargo install puts binary in INSTALL_DIR/bin/
@ -562,13 +562,13 @@ async function main() {
}).trim();
console.log(c("green", `${version}`));
} catch {
console.log(c("green", `webclaw-mcp installed`));
console.log(c("green", `noxa-mcp installed`));
}
}
// 6. Summary
console.log();
console.log(c("bold", " Done! webclaw is ready."));
console.log(c("bold", " Done! noxa is ready."));
console.log();
console.log(c("dim", " Your AI agent now has these tools:"));
console.log(c("dim", " • scrape — extract content from any URL"));
@ -583,7 +583,7 @@ async function main() {
console.log(
c(
"dim",
" Get an API key at https://webclaw.io/dashboard for cloud features.",
" Get an API key at https://noxa.io/dashboard for cloud features.",
),
);
console.log();

View file

@ -1,14 +1,14 @@
{
"name": "create-webclaw",
"name": "create-noxa",
"version": "0.1.3",
"mcpName": "io.github.0xMassi/webclaw",
"description": "Set up webclaw MCP server for AI agents (Claude, Cursor, Windsurf, OpenCode, Codex, Antigravity)",
"mcpName": "io.github.jmagar/noxa",
"description": "Set up noxa MCP server for AI agents (Claude, Cursor, Windsurf, OpenCode, Codex, Antigravity)",
"bin": {
"create-webclaw": "./index.mjs"
"create-noxa": "./index.mjs"
},
"type": "module",
"keywords": [
"webclaw",
"noxa",
"mcp",
"mcp-server",
"ai",
@ -29,13 +29,13 @@
"tls-fingerprint",
"cloudflare-bypass"
],
"author": "webclaw",
"author": "noxa",
"license": "AGPL-3.0",
"repository": {
"type": "git",
"url": "https://github.com/0xMassi/webclaw"
"url": "https://github.com/jmagar/noxa"
},
"homepage": "https://webclaw.io",
"homepage": "https://noxa.io",
"engines": {
"node": ">=18"
}