Reconnaissance Dossier

Tech Stack Teardown
chaturbate-bots.com

A full fingerprint of the hosting, frontend, backend APIs, and third-party services behind the site — reverse-engineered from HTTP headers, HTML, CSS tokens, and 1.2 MB of JavaScript bundles.

Target
chaturbate-bots.com
Method
Passive · read-only
Surface
Headers · HTML · 15 JS chunks
Date
2026-06-27
0
Technologies
0
API endpoints
0
Live backends
0
JS bundles
0
Code parsed

Frontend & UI

HTML + CSS bundles

Next.js — App Router

React framework

React Server Components on the App Router. Pages are statically prerendered (SSG/ISR) and served from Vercel's edge cache.

meta generator="Next.js" · Vary: rsc, next-router-state-tree · X-Nextjs-Prerender: 1
Confirmed

React + Turbopack

UI runtime · bundler

React under the hood, compiled with Turbopack — Next.js's Rust-based bundler — rather than Webpack.

/_next/static/chunks/turbopack-54361d1fe90ce5d7.js
Confirmed

Tailwind CSS v4

styling engine

Utility-first CSS. The v4 engine is given away by heavy color-mix() output and --tw-* variables.

441× color-mix() · 1390× --tw- vars · @layer
High confidence

shadcn/ui + lucide

component system

Radix-based components keyed by semantic design tokens, paired with lucide-react icons.

classes: bg-background/80 · border-border · backdrop-blur-md
High confidence

Geist Font

typography

Vercel's Geist typeface, self-hosted as woff2 via next/font — zero layout shift, no Google Fonts call.

/_next/static/media/*.woff2 · font-family:Geist
Confirmed

core-js v3.38.1 polyfills

browser compatibility

Babel/core-js polyfills are bundled for older-browser support — a standard part of the Next.js build pipeline.

github.com/zloirock/core-js/blob/v3.38.1/LICENSE
Confirmed

Hosting, Analytics & SEO

response headers

Vercel

hosting + edge CDN

Served from Vercel's edge with full CDN caching — pages return cache HITs.

Server: Vercel · X-Vercel-Cache: HIT · X-Vercel-Id: yul1
Confirmed

GA4 + Tag Manager

analytics

Google Analytics 4 loaded through Google Tag Manager.

gtag/js?id=G-SVMCCWG4DC
Confirmed

Vercel Analytics

first-party metrics

Vercel's own web-analytics script runs alongside GA4.

va.vercel-scripts.com/v1/script.debug.js
Confirmed

JSON-LD Structured Data

SEO schema

Rich schema.org markup spanning 10 entity types for search visibility.

Organization · FAQPage · SoftwareApplication · Service · Offer · WebSite · ContactPoint
Confirmed

HSTS

transport security

Strict-Transport-Security enforced for 2 years.

max-age=63072000
Confirmed

Telegram

contact channel

Primary sales / support runs through Telegram.

t.me/chaturbate_bots
Confirmed

Backend APIs & Data

decompiled from JS

Fastify / Node.js API LIVE

the traffic engine

The core "traffic" service is a Fastify (Node.js) API fronted by Cloudflare. Base URLs are pulled live from Firestore, with hardcoded fallbacks in the bundle.

traffic-api.apirouting.live (3000) · info-api.apirouting.live (3001)
Confirmed via probe

Firebase — cb-api-auth

Firestore + Auth

Firestore stores operator settings (settings/public, admin/settings): the BTC wallet & traffic-server URLs. Firebase Auth gates admin login.

114× firestore · getAuth · securetoken.google.com · authDomain: cb-api-auth.firebaseapp.com
Confirmed
MethodEndpointHostPurpose
POST/start-trafficapirouting.liveBegin a bot/viewer session (sends modelName)
POST/stop-trafficapirouting.liveEnd session — fired via navigator.sendBeacon on unload
POST/heartbeatapirouting.liveKeep-alive ping while a session runs
GET/api/btc-priceNext.js routeFetch current Bitcoin price for checkout

Bitcoin Payments

crypto checkout

Crypto-only billing. A hardcoded BTC wallet (overridable via Firestore) pairs with the live price route.

wallet: 3BkKknBk7z6qBUH6UCp8Gg9wmW4ZymBWbY
Confirmed

Dynamic Config (Firestore)

runtime indirection

Backend URLs aren't baked in — they're read at runtime from Firestore so servers can be rotated without a redeploy. The bundle holds only fallbacks.

doc(db,"settings","public") → { trafficServer3000, trafficServer3001, bitcoinWallet }
Confirmed

Third-Party Services

external calls in bundle

reCAPTCHA Enterprise

abuse protection

Google reCAPTCHA Enterprise guards forms/actions — 45 references throughout the bundle.

google.com/recaptcha/enterprise.js
Confirmed

ipapi.co

geolocation

Client-side IP geolocation of each visitor on load.

https://ipapi.co/json/
Confirmed

Chaturbate Media CDN

live thumbnails

Pulls live model thumbnails straight from Chaturbate's own media CDN (MMCDN).

jpeg.live.mmcdn.com/stream
Confirmed

Endpoint Liveness

DNS · TLS · HTTP probe
recon — probe · traffic-api.apirouting.live
$ curl -sS -D - https://traffic-api.apirouting.live/ HTTP/2 404 Server: cloudflare Content-Type: application/json CF-RAY: a12795eeddb9c9d6-YYZ {"message":"Route GET:/ not found","error":"Not Found","statusCode":404} # ↑ the exact default 404 shape of Fastify → confirms a live Node.js origin # (an empty edge 404 would mean nothing is answering behind the proxy)
HostResolves ToResponseVerdict
traffic-api.apirouting.liveCloudflareJSON 404 (app)LIVE
info-api.apirouting.liveCloudflareJSON 404 (app)LIVE
dvdp5qq7-3000.euw.devtunnels.msAzure · 20.103.221.187404 · empty bodyINACTIVE
dvdp5qq7-3001.euw.devtunnels.msAzure · 20.103.221.187404 · empty bodyINACTIVE

Notable Leftovers

  • Bundle fallback URLs point at Microsoft VS Code Dev Tunnels — a developer's local machine, shipped to production and currently inactive.
  • 72× [v0] console-log markers reveal the app was scaffolded with v0.dev, Vercel's AI app builder.
  • Firebase client keys sit in the bundle — normal for Firebase (security relies on Firestore rules, not key secrecy).

Architecture at a Glance

request lifecycle
Browser
Next.js / React
Vercel Edge
SSG / ISR + CDN
Firestore
reads config
Cloudflare
proxy / WAF
Fastify API
apirouting.live

The frontend resolves the backend address from Firestore at runtime, then drives the traffic engine — startheartbeatstop — through Cloudflare to the Fastify origin.

Session Lifecycle

reconstructed from JS

The exact client ↔ backend message sequence for one traffic session — every call, its trigger, and its payload, decompiled from the React bundle. Animated packets show direction of flow.

Browser client
Fastify API apirouting.live
on mountgetAdminSettings() reads Firestore → resolves backend base URL & BTC wallet
client → APIon mount
GET /api/btc-price
{ rate } · fallback 42000 if it fails
client → APIon START click
POST /start-traffic
{ modelName, numUsers, connectionDelayMs,
  user: email || "No Auth User", source: "free-test" }
hdr: X-Tunnel-Skip-Anti-Phishing-Page: true
API → clientresponse
200 ok  ·  400 "limit 100" (RO)  ·  already_running
200 → isRunning = true · 400 → per-model 100-viewer cap · already_running → blocked
💾 on success (if authed) — saveSentTrafficModel(uid, modelName, …) writes a record to Firestore
client → API every 10s
POST /heartbeat
{ modelName } · driven by a Web Worker timer (survives background tabs)
📊 while running — cosmetic progress bar estimates numUsers × connectionDelayMs (no server data)
client → APIon STOP / unload
POST /stop-traffic
{ modelName } · sendBeacon → keepalive fetch → retrying fetch
🧹 cleanupstopHeartbeat() → Worker.terminate() · removes beforeunload listener
1Tab close / navigateprimary

navigator.sendBeacon() — the only call guaranteed to fire during page unload.

2Beacon returns falsefallback

fetch(…, keepalive:true) — retries the teardown if the beacon was rejected.

3Manual stop buttongraceful

Retrying ev() wrapper — 3 retries, 1s backoff, on HTTP 408 / 5xx.

Reading the sequence

  • Only the control plane is visible — start / heartbeat / stop carry just a modelName. The actual viewer connections happen server-side and never touch the browser.
  • The X-Tunnel-Skip-Anti-Phishing-Page header betrays the dev-tunnel origin; the Romanian 400 message betrays the operators' language and a hard 100-viewer cap.
  • Three independent stop paths exist because an orphaned session burns paid backend capacity — they optimize to stop reliably, not start reliably.
  • The Copy-as-cURL buttons emit the request shape with a MODELNAME placeholder — they document the reconstructed API surface, not a targeting tool.

Key Insights

analyst notes
01

A 404 can prove a service is alive. The signal isn't the status code — it's who generates the body. A framework-shaped JSON 404 means the origin app ran; an empty edge 404 means nothing answered behind the proxy.

02

Error-body fingerprinting beats version banners. "Route GET:/ not found" is uniquely Fastify, just as Cannot GET / is Express — no version string required.

03

Config-in-Firestore hides the real backend. Reading the API address at runtime lets the operator rotate or conceal servers without a redeploy — the shipped bundle only contains fallbacks.

04

Tailwind v3 vs v4 needs no version string. v4 compiles to color-mix() + @layer output; 441 color-mix calls is a reliable tell.

05

Cloudflare in front is deliberate. It hides the origin IP and adds WAF/DDoS protection — sensible for a traffic-generating, abuse-prone service that is itself a likely target.

06

AI-builder leakage is real. 72 [v0] markers and a localhost dev-tunnel fallback shipping to prod are classic artifacts of an AI-scaffolded app that wasn't fully hardened.