BotScope
Python-first observability for an Internet-wide census of automated traffic.
BotScope is an Internet-wide bot traffic census: the Global Observatory federates public crawler/IP panels, crawl catalogs, and optional CDN estimates into a worldwide automation picture — alongside a local analyzer and native Qt desktop Observatory for authorized logs, sessions, and live capture.
Install from PyPI: pip install botscope · GUI: pip install "botscope[gui]"
Network contribution is OFF by default. BotScope does not perform unauthorized scanning. Zero-config for your own logs: no account, no cloud profile, and no API key required to classify local traffic.
Screenshots
Observatory — KPI cards, composition ring, Traffic Pulse, and category breakdown on the bundled synthetic demo corpus (DEMO DATA banner visible).
Global — Internet-wide census from zero-auth public sources; Cloudflare Radar optional |
Events — virtualized table, query language, Classification Inspector |
Bot Library — known signatures vs observed-in-dataset markers |
Sources — registry status for public feeds and optional providers |
Settings — local theme, privacy, and optional Cloudflare Radar token for CDN estimates (field shown empty; no account required).
Video demo
Animated tour of the main Observatory pages (demo data):
Screenshot strip · Recording script / MP4 placeholder
To capture a short screen recording yourself (launch → Demo → KPIs → Global → Events), follow the steps in docs/assets/demo/README.md and drop botscope-demo.mp4 (or .webm) beside the GIF.
What BotScope is
BotScope is an Internet-wide census of automated traffic, with a local measurement workstation for traffic you are authorized to analyze:
- Build a worldwide automation census in Global Observatory from federated zero-auth public sources (crawler IP ranges, Common Crawl catalog, and similar) plus optional Cloudflare Radar CDN estimates
- Classify requests from combined/common access logs (and optional PCAP / live paths)
- Separate OBSERVED totals from CLASSIFIED shares, with provenance badges
- Keep an honest UNKNOWN outcome instead of forcing certainty
- Explore both global census views and local sessions in a native desktop Observatory (Qt / PySide6 — not a website)
What BotScope is not
- Not limited to a single site or sensor — Global Observatory is the Internet-wide census surface
- Not a claim that one local log alone equals the whole Internet (local shares stay labeled local; the census comes from federated global sources)
- Not a cloud SaaS — analysis and preferences stay on your machine by default
- Not a substitute for authorization: only analyze systems and traffic you own or have permission to measure
The product’s primary global story is the Internet-wide census. Local Observatory KPIs remain dataset-scoped so you can compare your sensors against that census without conflating the two.
Features
| Area | What you get |
|---|---|
| Observatory KPIs | Automated / human-likely / unknown shares, request & byte totals, quality hint, observation window |
| Composition ring | Visual breakdown of classified traffic with actor callouts |
| Traffic Pulse | Short trend readout for the loaded dataset view |
| Global Observatory | Internet-wide automation census from zero-auth public sources (e.g. Common Crawl, Google/Bing crawler ranges); optional Cloudflare Radar for CDN estimates |
| Bot Library | Known signature packs vs bots actually observed in the current dataset |
| Dataset Health | Multi-dimension quality scorecard for the loaded session |
| Events | Virtualized event browser, quick search, shared safe query language |
| Compare | Session-to-session deltas and classifier-vs-labels panels (no causal claims) |
| Provenance | OBSERVED vs CLASSIFIED vs INFERRED — numbers keep their lineage |
| Exports | Multi-format reports (Markdown, HTML, JSON, CSV) and research export helpers |
| Live capture | Authorized log-tail and optional local-interface sniff; measured rates only |
| CLI + Python API | Headless analyze / query / report / doctor alongside the GUI |
| Privacy transforms | Optional IP hashing/truncation and query redaction on ingest |
Full matrix: FEATURES.md. Machine-readable registry: botscope features.
Quickstart
Requires Python 3.10+. Install from PyPI:
pip install "botscope[gui]"
Core (CLI / library only):
pip install botscope
From source (contributors):
git clone https://github.com/theworker02/botscope.git
cd botscope
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
pip install -e ".[gui,dev]"
Environment check and synthetic demo:
botscope doctor
botscope demo --output demo_analysis.bscope
botscope open demo_analysis.bscope
Desktop Observatory:
botscope gui
# or simply: botscope
In the GUI: Demo loads the bundled synthetic corpus (shows a DEMO DATA banner). Open analyzes an authorized access log. Drag-and-drop of logs, PCAPs, or .bscope sessions is supported.
Analyze a log from the CLI:
botscope analyze path/to/access.log --output analysis.bscope
botscope report analysis.bscope --format markdown --output report.md
Python API:
from botscope import Analyzer
result = Analyzer().analyze("access.log")
print(result.automation_fraction)
print(result.stats.by_category)
More detail: docs/guides/QUICKSTART.md · docs/guides/INSTALLATION.md
CLI overview
botscope with no subcommand launches the Observatory. Use --no-gui to print help without opening a window.
| Command | Purpose |
|---|---|
doctor |
Environment / policy diagnostics |
demo |
Analyze bundled synthetic corpus (always labeled DEMO) |
analyze |
Analyze an authorized log or PCAP |
open |
Summarize an existing .bscope session |
query |
Filter events with the shared query language |
report / export |
Emit reports from a session |
gui |
Launch the native desktop Observatory |
compare / compare-classifiers |
Session and classifier comparisons |
quality / provenance |
Scorecard and provenance summaries |
live-tail / capture |
Authorized live log-tail / local sniff helpers |
federation |
Collect Global Observatory public-source snapshot |
citation |
Software citation helpers (no invented DOI) |
features |
Capability registry |
quickstart |
Print the fastest path to a first result |
Run botscope --help or botscope <command> --help for options. Tutorials live under docs/tutorials/.
Architecture (summary)
Access log / PCAP / live sensor
│
▼
Ingest + privacy transforms
│
▼
Classify (rules, identity, optional ML)
│
├──► .bscope session store (events, aggregates, workspace)
├──► CLI reports / export / research packs
└──► Observatory GUI (KPIs, Events, Global census, Live, …)
│
└──► Global federation → Internet-wide census
(zero-auth public sources; Cloudflare Radar if you supply a token)
- Internet-wide census: Global Observatory is the census product — federated public panels and optional CDN estimates.
- Local-first: sessions and preferences stay on disk unless you explicitly enable network contribution.
- Provenance-aware: OBSERVED counts are never relabeled as CLASSIFIED shares; local KPIs stay distinct from the global census.
- Methodology notes:
docs/research/METHODOLOGY.md·docs/research/GLOBAL_ESTIMATION.md.
Deeper maps: docs/architecture/REPOSITORY_MAP.md · diagrams in docs/architecture/diagrams/ · GUI guide docs/GUI.md
Documentation
| Doc | Description |
|---|---|
docs/README.md |
Documentation index |
docs/guides/QUICKSTART.md |
Fastest path to a first analysis |
docs/guides/INSTALLATION.md |
Install, extras, verify |
docs/GUI.md |
Observatory desktop application |
docs/QUERY.md |
Safe query language (CLI + GUI + Python) |
docs/CAPTURE.md |
Authorized capture notes |
docs/PRIVACY.md |
Privacy transforms and boundaries |
docs/GLOSSARY.md |
Terms (OBSERVED, CLASSIFIED, …) |
docs/research/METHODOLOGY.md |
Measurement methodology |
docs/research/LIMITATIONS.md |
What BotScope will not claim |
docs/sources/SOURCE_RESEARCH.md |
Public source inventory |
FEATURES.md |
Feature matrix vs repository reality |
CHANGELOG.md |
Release notes |
examples/ |
Runnable scripts |
Asset inventory (logos, screenshots, demo): docs/assets/README.md
Optional extras
| Extra | Purpose |
|---|---|
gui |
PySide6 + pyqtgraph desktop Observatory |
capture |
scapy (authorized live interface sniff) |
network |
httpx / cryptography for opt-in network client |
ml |
numpy / scikit-learn classifier hooks |
analytics |
duckdb / pyarrow |
dev |
pytest, ruff, mypy |
all |
everything above |
pip install -e ".[gui,network,dev]"
Cloudflare Radar is optional. Leave Settings blank for normal local-log workflows; add your Radar Read token only if you want CDN bot/human estimates in Global Observatory. See docs/sources/CLOUDFLARE_RADAR.md.
Principles
- Treat Global Observatory as an Internet-wide census, built from federated sources with provenance
- Prefer UNKNOWN over forced certainty
- Separate OBSERVED counts from CLASSIFIED shares — and local KPIs from the global census
- Privacy transforms and local-first storage by default
- Network contribution remains OFF unless explicitly enabled
Contributing
Development setup, style (Ruff), and PR guidelines: CONTRIBUTING.md.
Code of conduct: CODE_OF_CONDUCT.md.
Security reports: SECURITY.md (do not file public issues for vulnerabilities).
Support pointers: SUPPORT.md.
pip install -e ".[dev]"
pytest
ruff check src tests scripts
License
Apache License 2.0 — see LICENSE.
Citation helpers: botscope citation and CITATION.cff.
Release files for botscope 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| botscope-2.0.0.tar.gz | 1.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| botscope-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.8 MB
Release files / botscope-2.0.0.tar.gz
| Download URL | botscope-2.0.0.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
819406037a834bc014f29fea03ca222e7d4f36f9b700b09bba66d85a255041f1
|
|
BLAKE2b-256 checksum How to use checksums |
53994689d19c1d5ccbe272208e5e59df113990e309f4178a121851ea6f4f3e00
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / botscope-2.0.0-py3-none-any.whl
| Download URL | botscope-2.0.0-py3-none-any.whl |
|---|---|
| Size | 263.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
78300f89ad2dbc723d4c06a7215e6cb05a44afeb8d3cd9e23fdceb5744c30cdd
|
|
BLAKE2b-256 checksum How to use checksums |
fdf2695bf57a69f147a796480d95ea6a71049f466e97c0b16725f361255d876b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|