mirror of
https://github.com/0xMassi/webclaw.git
synced 2026-05-13 17:02:36 +02:00
chore: rebrand webclaw to noxa
This commit is contained in:
parent
a4c351d5ae
commit
8674b60b4e
86 changed files with 781 additions and 2121 deletions
|
|
@ -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
|
||||
|
||||
|
|
@ -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();
|
||||
|
|
@ -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"
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue