Skip to content

Piggy vs Other Scraping Tools ​

How Nothing Browser Piggy compares to other browser automation and scraping libraries.


Quick Comparison ​

FeaturePiggyPuppeteerPlaywrightSeleniumcurl_cffi
CommunicationSocket (Unix/Windows pipes)CDPCDPWebDriverHTTP
LanguageTypeScript/BunJavaScript/Node.jsJS/TS/Python/Java/.NETMultiplePython
TLS Fingerprintβœ… Real BoringSSLβœ… Real BoringSSLβœ… Real BoringSSLβœ… Real BoringSSL⚠️ Patched
navigator.webdriverβœ… Undefined❌ True (leaks)❌ True (leaks)❌ True (leaks)N/A
Built-in fingerprint spoofingβœ… Yes❌ Plugin needed❌ Plugin needed❌ Plugin neededβœ… Yes
Network captureβœ… Built-in❌ Manual❌ Manual❌ Manual❌ No
WebSocket captureβœ… Built-in❌ Manual❌ Manual❌ Manual❌ No
One-click exportβœ… Python/cURL❌ No❌ No❌ No❌ No
Built-in API serverβœ… Yes❌ No❌ No❌ No❌ No
Session persistenceβœ… Built-in❌ Manual❌ Manual❌ Manual❌ No
Human modeβœ… Built-in❌ Manual❌ Manual❌ Manual❌ No
Cloudflare bypassβœ… Passes⚠️ Often blocked⚠️ Often blocked⚠️ Often blockedβœ… Passes
Lines of code to scrape~2080-20080-200100-250~50

How Piggy Communicates ​

Unlike Puppeteer/Playwright (which use Chrome DevTools Protocol over WebSocket), Piggy uses direct socket communication:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         Your Code                               β”‚
β”‚                    (Bun/TypeScript)                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β”‚ Socket Connection
                              β”‚ (Unix domain socket / Windows pipe)
                              β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Nothing Browser Binary                       β”‚
β”‚                    (Qt6 WebEngine + C++)                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Socket Paths ​

PlatformSocket Path
Linux/macOS/tmp/piggy (Unix domain socket)
Windows\\.\pipe\piggy (Named pipe)

Why Socket Instead of CDP? ​

AspectSocket (Piggy)CDP (Puppeteer/Playwright)
ProtocolCustom, lightweightChrome DevTools Protocol
OverheadMinimalHigher
LatencyLowerHigher
Custom commandsβœ… Easy to add❌ Limited by CDP spec
Binary sizeSmallerLarger
ControlFullLimited to CDP

Detailed Comparison ​

TLS Fingerprint ​

ToolTLS LibraryJA3 StatusCloudflare
PiggyBoringSSL (real Chrome)βœ… Chrome-identicalβœ… Passes
PuppeteerBoringSSL (real Chrome)βœ… Chrome-identical⚠️ JS leaks
PlaywrightBoringSSL (real Chrome)βœ… Chrome-identical⚠️ JS leaks
SeleniumBoringSSL (real Chrome)βœ… Chrome-identical⚠️ webdriver flag
curl_cffiBoringSSL (patched)βœ… Chrome-identicalβœ… Passes
Python requestsOpenSSL❌ Python JA3❌ Blocked

JavaScript Detection ​

Toolnavigator.webdriverchrome.runtimeDocumentCreation injection
Piggyβœ… undefinedβœ… Presentβœ… Yes
Puppeteer❌ true❌ Absent⚠️ Partial (CDP)
Playwright❌ true❌ Absent⚠️ Partial (CDP)
Selenium❌ true❌ Absent❌ No
curl_cffiN/AN/AN/A

Communication Overhead ​

ts
// Piggy - direct socket command
socket.write(JSON.stringify({ cmd: "navigate", payload: { url } }) + "\n");

// Puppeteer - CDP over WebSocket
ws.send(JSON.stringify({
  id: 123,
  method: "Page.navigate",
  params: { url }
}));

When to Use What ​

Use CaseRecommended Tool
Quick scraping with anti-detectionPiggy
Testing web appsPlaywright
Simple Chrome automationPuppeteer
Cross-browser testingPlaywright
Python-only stackcurl_cffi
API reverse engineeringPiggy
Production scraping pipelinePiggy
Browser extension testingPuppeteer

Version Compatibility ​

Important: Library vs Binary Versions ​

Piggy consists of two parts:

  1. Node/Bun library (nothing-browser npm package)
  2. Nothing Browser binary (downloaded separately)

These versions are independent and can be mixed.

How It Works ​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Your Project                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚   Node/Bun Library          β”‚   Nothing Browser Binary      β”‚
β”‚   (npm package)             β”‚   (downloaded separately)     β”‚
β”‚                             β”‚                               β”‚
β”‚   β€’ API surface             β”‚   β€’ Browser engine            β”‚
β”‚   β€’ exposeFunction logic    β”‚   β€’ TLS fingerprint           β”‚
β”‚   β€’ TypeScript types        β”‚   β€’ Network capture           β”‚
β”‚   β€’ Socket client           β”‚   β€’ Socket server             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β”‚ Socket Connection
                              β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   /tmp/piggy        β”‚
                    β”‚   (Unix socket)     β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Feature Rollout Order ​

When a new feature is added:

  1. First added to binary (C++ layer with socket handler)
  2. Then added to library (TypeScript layer with socket client)
  3. Then documented
Timeline:
────────────────────────────────────────────────────────────►
     Binary v0.2.0          Library v0.6.0
     (adds new feature)     (exposes new feature)
     (new socket command)   (new method in library)
          β”‚                        β”‚
          β–Ό                        β–Ό
     Binary ready            Library ready
     but not exposed         with new API

If You Update Library Without Binary ​

ts
// You updated library to v0.6.0 but binary is still v0.1.0
await piggy.launch();  // OK - works

// New function that requires binary v0.2.0+
await piggy.site.newFunction();  
// ❌ TypeError: piggy.site.newFunction is not a function

Error message:

TypeError: piggy.site.newFunction is not a function

The library is trying to send a socket command that the binary doesn't understand.
Either update the binary or don't use this new function.

This happens because:

  1. Library sends a new socket command to binary
  2. Old binary doesn't recognize that command
  3. Library throws "not a function" error

Solutions ​

SolutionWhen to Use
Update binaryYou need the new feature
Don't use new functionYou don't need it
Downgrade libraryYou want to stay stable

Compatible Version Examples ​

bash
# These combinations all work fine:
Library v0.5.0 + Binary v0.1.0  βœ… (old binary, old socket commands)
Library v0.5.0 + Binary v0.2.0  βœ… (new binary, same socket commands)
Library v0.6.0 + Binary v0.1.0  ⚠️ (new socket commands unavailable)
Library v0.6.0 + Binary v0.2.0  βœ… (new socket commands available)

Backward Compatibility Promise ​

  • βœ… We never delete socket commands without announcement
  • βœ… Old library continues to work with newer binaries
  • βœ… You can stick with an old library (e.g., v0.0.7) and a newer binary (e.g., v0.1.10)
  • βœ… Even 15 versions ahead, old library + new binary works
  • βœ… Old socket commands remain supported in new binaries

Upgrade Policy ​

ts
// Safe to upgrade library if:
// 1. You don't use new functions
// 2. You also upgrade binary

// Also safe to stay on old library:
// - It will continue working
// - We don't break existing APIs
// - All old socket commands still work

Multi-Language Support (Coming Soon) ​

Piggy's socket-based communication means any language that can connect to Unix domain sockets or Windows named pipes can use it:

LanguageStatusTarget Release
TypeScript/Bunβœ… Available nowv0.1.0
PythonπŸ”¨ In developmentv0.7.0
GoπŸ“‹ Plannedv0.8.0
JavaπŸ“‹ Plannedv0.9.0
RustπŸ“‹ Plannedv1.0.0
C#/.NETπŸ“‹ Plannedv1.0.0
RubyπŸ“‹ Plannedv1.0.0
C++πŸ“‹ Plannedv1.0.0

Python Example (Coming Soon) ​

python
# Future Python version - connects to /tmp/piggy socket
from nothing_browser import piggy

await piggy.launch()
await piggy.register("site", "https://example.com")
await piggy.site.navigate()
data = await piggy.site.evaluate("() => ({ title: document.title })")
print(data)

Go Example (Coming Soon) ​

go
// Future Go version - connects to /tmp/piggy socket
package main

import "github.com/nothing-browser/piggy"

func main() {
    piggy.Launch()
    site := piggy.Register("site", "https://example.com")
    site.Navigate()
    title := site.Title()
    fmt.Println(title)
}

Why Socket Communication Matters for Multi-Language ​

All language versions communicate via socket (Unix domain socket / Windows named pipe), which means:

  • βœ… Same features across all languages
  • βœ… Same performance across all languages
  • βœ… Same anti-detection across all languages
  • βœ… Binary is language-agnostic
  • βœ… Any language with socket support can implement a client
  • βœ… No HTTP/WebSocket overhead like CDP-based tools

Socket Protocol ​

json
// Command format (library β†’ binary)
{
  "id": "123",
  "cmd": "navigate",
  "payload": { "url": "https://example.com", "tabId": "default" }
}

// Response format (binary β†’ library)
{
  "id": "123",
  "ok": true,
  "data": { "title": "Example Domain" }
}

// Event format (binary β†’ library, unsolicited)
{
  "type": "event",
  "event": "navigate",
  "tabId": "default",
  "url": "https://example.com"
}

Summary ​

AspectPiggy
CommunicationSocket (Unix/Windows pipes) - faster than CDP
Easiest to useβœ… Yes
Best anti-detectionβœ… Yes
Fastest setupβœ… Yes
Most features built-inβœ… Yes
Multi-languageπŸ”¨ Coming soon (via socket protocol)
Production readyβœ… Yes

Nothing Ecosystem Β· Ernest Tech House Β· Kenya Β· 2026

MIT Licensed | Built by Ernest Tech House Β· Kenya Β· 2026