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.
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| botscope-2.0.0.tar.gz | 1.5 MB | Without provenance | Details for botscope-2.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| botscope-2.0.0-py3-none-any.whl | Python 3 | none | any | Details for botscope-2.0.0-py3-none-any.whl |
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
|
Security for botscope 2.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.