| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
A high-performance web crawler and scanner — recursively crawls websites, respects robots.txt, handles rate-limiting, and produces comprehensive JSON or text reports. Available as a single, self-contained binary via npm.
DeepScanBot is a feature-rich, concurrent web crawler that makes website crawling fast, reliable, and developer-friendly. It handles the complexities of web crawling automatically:
Here's what DeepScanBot can do for you:
DeepScanBot ships as a single, self-contained binary with zero runtime dependencies. Choose the method that fits your workflow.
| Method | Platform | Best for |
|---|---|---|
| Homebrew | macOS & Linux | Developers, long-term maintenance |
| npm | macOS, Linux, Windows | Node.js ecosystem users |
| curl | macOS & Linux | CI/CD, scripting, one-liners |
| PowerShell | Windows | Windows automation |
| Go Install | Any (Go required) | Go developers, building from source |
| Manual | Any | Air-gapped, offline environments |
# One-time tap setup (uses dedicated branch in the same repository)
brew tap mindfiredigital/DeepScanBot homebrew-tap
# Install
brew install deepscanbot
# Upgrade later
brew upgrade deepscanbotNote: The Homebrew tap is automatically maintained via a dedicated homebrew-tap branch in this repository. No separate repository is needed. After a new release, run brew update before installing to ensure Homebrew recognizes the updated cask.
npm install -g @mindfiredigital/deepscanbotThe npm package automatically detects your OS and architecture. No additional runtime dependencies are required.
deepscanbot --helpcurl -fsSL https://raw.githubusercontent.com/mindfiredigital/DeepScanBot/main/scripts/install.sh | bashInstall a specific version:
curl -fsSL https://raw.githubusercontent.com/mindfiredigital/DeepScanBot/main/scripts/install.sh | bash -s -- -b /usr/local/bin -v v1.0.0What the script does:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/mindfiredigital/DeepScanBot/main/scripts/install.ps1'))Install a specific version:
.\install.ps1 -InstallDir "C:\tools" -Version "v1.0.0"The script installs to $env:ProgramFiles\DeepScanBot by default and offers to add it to your PATH.
Requires Go 1.22+:
go install github.com/mindfiredigital/DeepScanBot/apps/cli@latestThe binary is placed in $GOPATH/bin (typically ~/go/bin).
Download the binary for your platform from the latest release:
| Platform | Architecture | Binary Name |
|---|---|---|
| macOS | x86_64 | deepscanbot_darwin_amd64 |
| macOS | Apple Silicon | deepscanbot_darwin_arm64 |
| Linux | x86_64 | deepscanbot_linux_amd64 |
| Linux | ARM64 | deepscanbot_linux_arm64 |
| Windows | x86_64 | deepscanbot_windows_amd64.exe |
Linux / macOS:
chmod +x deepscanbot_*
sudo mv deepscanbot_linux_amd64 /usr/local/bin/deepscanbotWindows (PowerShell as Administrator):
Move-Item .\deepscanbot_windows_amd64.exe C:\Windows\System32\deepscanbot.exeRun these three commands to confirm DeepScanBot is installed correctly:
# 1. Check the version
deepscanbot --version
# 2. Run the diagnostic checks
deepscanbot doctor
# 3. Verify the help output
deepscanbot --helpExpected output for deepscanbot --version:
DeepScanBot CLI v1.0.0
Checksums: Every release includes a checksums.txt file with SHA256 hashes of all binaries.
# Linux / macOS (sha256sum)
sha256sum -c checksums.txt --ignore-missing
# macOS (alternative with shasum)
shasum -a 256 -c checksums.txt --ignore-missing
# Windows PowerShell
Get-FileHash .\deepscanbot_windows_amd64.exe -Algorithm SHA256Attestation: GitHub signed attestations are generated for every release. Verify provenance with the GitHub CLI:
gh attestation verify deepscanbot_darwin_amd64 --owner mindfiredigitalThe Homebrew tap is automatically managed using a dedicated branch in this repository. No separate repository is required.
DeepScanBot/
├── main branch
│ ├── homebrew-tap/
│ │ ├── Casks/ # Source cask files (generated by GoReleaser)
│ │ │ └── deepscanbot.rb
│ │ ├── README.md # Tap documentation
│ │ └── .gitignore # Ignores generated files
│ ├── .goreleaser.yml # Configures cask generation
│ └── .github/workflows/
│ └── homebrew-sync.yml # Auto-syncs to homebrew-tap branch
│
└── homebrew-tap branch (dedicated for Homebrew)
├── Casks/
│ └── deepscanbot.rb # Only cask files (auto-synced)
└── README.md
The .github/workflows/homebrew-sync.yml workflow automatically:
To test the Homebrew tap locally:
# Clone the repository
git clone https://github.com/mindfiredigital/DeepScanBot.git
cd DeepScanBot
# Checkout the homebrew-tap branch
git checkout homebrew-tap
# View the cask file
cat Casks/deepscanbot.rb
# Test the tap (from another directory)
brew tap mindfiredigital/DeepScanBot homebrew-tap
brew install deepscanbot
brew test deepscanbotCask not found after release:
Installation fails:
# Crawl a website with default settings
deepscanbot scan https://example.com
# Crawl with custom depth and concurrency
deepscanbot scan https://example.com depth=3 concurrency=10
# Output as JSON
deepscanbot scan https://example.com --json
> **Note:** The `--json` global flag enables JSON-formatted output for commands that produce structured output (`scan`, `version`, `doctor`, and `help`).
# Use a proxy
deepscanbot scan https://example.com proxy=http://127.0.0.1:8080
# Enable sitemap discovery
deepscanbot scan https://example.com sitemap=true
# Resume a previous crawl
deepscanbot scan https://example.com resume=true output=crawler_results
# Show version
deepscanbot --version
## CLI Commands
DeepScanBot provides several commands to help you work with the tool effectively.
### scan
Crawl and analyze a website. This is the main command for web crawling.
```bash
# Basic scan
deepscanbot scan https://example.com
# Scan with options
deepscanbot scan https://example.com depth=3 concurrency=10
# Scan with JSON output
deepscanbot scan https://example.com --jsonShow the installed version of DeepScanBot.
# Show version
deepscanbot version
deepscanbot --version
# Show version in JSON format
deepscanbot version --jsonVerify your DeepScanBot installation and environment. This command checks that the binary is properly installed and the environment is configured correctly.
# Run diagnostics
deepscanbot doctor
# Run diagnostics with JSON output
deepscanbot doctor --jsonManage CLI configuration settings. Currently, all settings must be specified via command-line flags.
# View configuration help
deepscanbot configGenerate shell completion scripts for Bash, Zsh, Fish, or PowerShell. This enables tab completion for DeepScanBot commands.
# Generate bash completion
deepscanbot completion bash
# Generate zsh completion
deepscanbot completion zsh
# Generate fish completion
deepscanbot completion fish
# Generate PowerShell completion
deepscanbot completion powershellSetup instructions:
# Bash - Add to ~/.bashrc or ~/.bash_profile
mkdir -p ~/.local/share/bash-completion/completions
deepscanbot completion bash > ~/.local/share/bash-completion/completions/deepscanbot
# Zsh - Add to ~/.zshrc
deepscanbot completion zsh > "${fpath[1]}/_deepscanbot"
# Fish - Add to ~/.config/fish/completions/
deepscanbot completion fish > ~/.config/fish/completions/deepscanbot.fishShow help for any command.
# Show general help
deepscanbot help
deepscanbot --help
# Show help for a specific command
deepscanbot help scan
deepscanbot scan --helpdeepscanbot doctor
# Generate shell completion
deepscanbot completion bashDeepScanBot supports a consistent --json flag across all commands that return structured data. When enabled, all output is written as valid JSON to stdout, while progress messages and diagnostics are sent to stderr.
DeepScanBot is designed to run reliably in CI/CD pipelines, scripts, and AI agents without ever hanging on user input.
Add --no-input to any command to disable all interactive prompts. If required input is missing, the CLI fails immediately with a clear error message instead of waiting.
# Run scan in non-interactive mode
deepscanbot scan https://example.com --no-input --force
# Check version non-interactively
deepscanbot --no-input --version --json
# Run doctor in CI
deepscanbot --no-input doctorThe --force flag allows overwriting existing output files without prompting. In non-interactive mode, the scan command refuses to overwrite an existing output file unless --force is explicitly passed.
# Safe for CI/CD — overwrites output if it exists
deepscanbot scan https://example.com --no-input --force
# Will fail in non-interactive mode without --force
deepscanbot scan https://example.com --no-input
# Error: Output file "crawler_results.txt" already exists.
# Hint: Pass --force to overwrite or use output=<filename>.When stdin is not connected to a terminal (e.g., piped input, CI runners), the CLI automatically detects the non-TTY environment and never waits for user input. The --no-input flag provides an explicit override for cases where TTY detection is insufficient.
# Always use --no-input and --force for automated runs
deepscanbot scan https://example.com --no-input --force --json
# Use exit codes to check success
if deepscanbot scan https://example.com --no-input --force depth=0; then
echo "Scan completed"
else
echo "Scan failed with exit code $?"
fiDeepScanBot uses standardized exit codes to make CLI failures predictable for scripts, CI/CD pipelines, and AI agents. Every command returns a consistent exit code that tells you exactly what happened.
| Code | Constant | Description | Example Scenarios |
|---|---|---|---|
| 0 | Success | Command completed successfully | Scan finished, version shown |
| 1 | InvalidInput | Invalid argument or option value | Malformed URL, unknown flag, missing argument |
| 2 | ValidationError | Semantic validation failure | Empty output filename, invalid option value |
| 3 | AuthFailure | Authentication failure with a remote service | Invalid API token, missing credentials |
| 10 | AuthzFailure | Authenticated but lacking permission | Insufficient rights to access resource |
| 20 | NotFound | Requested resource could not be located | URL/file not found |
| 30 | NetworkFailure | Network request failed (non-timeout) | DNS resolution failure, connection refused |
| 31 | Timeout | Operation exceeded its configured deadline | Request timed out, scan exceeded max duration |
| 70 | InternalError | Unexpected internal error (likely a bug) | Failed to write output file, serialization bug |
# Check exit code in a script
deepscanbot scan https://example.com
exit_code=$?
echo "Exit code: $exit_code"
# Conditional execution based on exit code
if deepscanbot scan https://example.com depth=0; then
echo "Scan succeeded"
else
echo "Scan failed with exit code $?"
fiAll errors include:
$ deepscanbot scan ftp://example.com
Error: Invalid URL: "ftp://example.com" must be an absolute http:// or https:// URL.
Hint: Example: https://example.com
$ deepscanbot scan http://example.com output=
Error: Output filename must not be empty.
Hint: Use output=<filename> with a non-empty value.# Scan with JSON output
deepscanbot scan https://example.com --json
# Version with JSON output
deepscanbot --version --json
# Doctor with JSON output
deepscanbot doctor --json$ deepscanbot scan https://example.com depth=0 --json
{
"status": "success",
"data": {
"start_url": "https://example.com",
"output_file": "crawler_results.json",
"started_at": "2024-01-15T10:30:00Z",
"finished_at": "2024-01-15T10:30:05Z",
"duration_ms": 5000,
"summary": {
"total": 1,
"passed": 1,
"failed": 0,
"skipped": 0,
"discovered": 0,
"max_depth": 0
},
"urls": [
{
"url": "https://example.com",
"depth": 0,
"status_code": 200,
"content_type": "text/html",
"result": "passed"
}
],
"skipped": null
},
"meta": {
"timestamp": "2024-01-15T10:30:05Z",
"command": "scan",
"duration_ms": 5000
}
}$ deepscanbot --version --json
{
"status": "success",
"data": {
"version": "1.0.0",
"name": "DeepScanBot CLI"
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"command": "version",
"duration_ms": 0
}
}$ deepscanbot doctor --json
{
"status": "success",
"data": {
"installed": true,
"executable": true,
"configured": true,
"checks_passed": 3,
"message": "All checks passed!"
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"command": "doctor",
"duration_ms": 0
}
}$ deepscanbot scan invalid-url --json
{
"status": "error",
"error": {
"message": "invalid URL \"invalid-url\": must be an absolute http:// or https:// URL",
"code": "invalid_url"
},
"meta": {
"timestamp": "2024-01-15T10:30:00Z",
"command": "scan",
"duration_ms": 0
}
}All JSON responses follow this structure:
{
"status": "success | error",
"data": { ... }, // Present on success
"error": { // Present on error
"message": "Error description",
"code": "error_code"
},
"meta": {
"timestamp": "ISO8601 timestamp",
"command": "command_name",
"duration_ms": 1234
}
}The JSON output mode is designed for easy integration with scripts and tools:
# Parse with jq
deepscanbot scan https://example.com --json | jq '.data.summary'
# Extract specific fields
deepscanbot --version --json | jq -r '.data.version'
# Check command success
if deepscanbot scan https://example.com --json | jq -e '.status == "success"'; then
echo "Scan completed successfully"
fiDeepScanBot uses a modern command-based CLI structure similar to git, docker, and kubectl.
deepscanbot <command> [options]| Command | Description |
|---|---|
| scan | Crawl and analyze a website |
| version | Show installed version |
| doctor | Verify installation and environment |
| config | Manage CLI configuration |
| completion | Generate shell completion script |
| help | Show help for any command |
deepscanbot scan <url> [key=value ...]Options are specified as key=value pairs after the URL.
| Option | Description | Default |
|---|---|---|
| depth | Maximum crawl depth | 2 |
| timeout | Request timeout in seconds | 2 |
| proxy | Proxy URL (e.g. http://127.0.0.1:8080) | "" |
| size | Page size limit in KB (-1 = no limit) | -1 |
| disable-redirects | Disable following redirects | false |
| show-source | Show source of each URL | false |
| insecure | Disable TLS verification | false |
| unique | Ensure unique URLs | false |
| concurrency | Maximum concurrent requests | 8 |
| host-concurrency | Max concurrent requests per host (0 = use concurrency) | 2 |
| content-types | MIME types to download (quoted, space/comma separated) | "text/html" |
| output | Output filename without extension | "crawler_results" |
| ignore-robots | Ignore robots.txt restrictions | false | | cross-domain | Follow links to other hosts | false | | retries | Number of retry attempts | 0 | | retry-backoff | Base retry backoff duration (e.g. 500ms, 2s) | 1s | | delay | Politeness delay between requests to same host | 0 | | sitemap | Discover URLs from /sitemap.xml | false | | resume | Load existing output and avoid recrawling | false |
Note on Output Files: The output filename is specified without an extension. DeepScanBot automatically appends the appropriate extension based on the output format:
- Text format (default): crawler_results.txt
- JSON format (--json): crawler_results.json Note on Timeout: The default timeout is 2 seconds, which balances speed and reliability for most websites. Increase this value (for example, timeout=10 or timeout=30) when crawling slow websites or large pages that take longer to respond. For very slow sites, consider timeout=60 or higher.
deepscanbot scan https://example.comdeepscanbot scan https://docs.example.com \
depth=5 \
concurrency=20 \
host-concurrency=5 \
timeout=10 \
delay=200ms \
retries=3 \
retry-backoff=1s \
--json \
sitemap=true \
cross-domain=true \
content-types="text/html application/pdf" \
output=scan_resultsThe release process is fully automated via GitHub Actions.
Git Tag (v1.0.0)
↓
GitHub Action (release.yml)
↓
GoReleaser Build
↓
dist/ (binaries + checksums)
↓
Copy to npm package
↓
Update package.json version
↓
npm publish
↓
npm install -g @mindfiredigital/deepscanbot
↓
[Async] Sync homebrew-tap branch (may take a few minutes)
↓
brew update && brew install deepscanbot
Note: Homebrew tap synchronization happens asynchronously after the release. If the cask is not immediately available, wait a few minutes for the homebrew-tap branch to update, then run brew update before installing.
git tag -a v1.0.0 -m "Release v1.0.0"
git push origin v1.0.0The GitHub Action will automatically:
Users can then install:
npm install -g @mindfiredigital/deepscanbotThis project follows Semantic Versioning:
Pre-release versions use the -next tag on npm:
npm install -g @mindfiredigital/deepscanbot@nextThe npm publish configuration comes from environment variables:
| Variable | Description | Default |
|---|---|---|
| NPM_REGISTRY | npm registry URL | https://registry.npmjs.org/ |
| NPM_TOKEN | npm authentication token | (required) |
| Registry | URL | Authentication |
|---|---|---|
| npmjs | https://registry.npmjs.org/ | NPM_TOKEN |
| GitHub Packages | https://npm.pkg.github.com/ | GITHUB_TOKEN |
| Verdaccio | http://localhost:4873/ | NPM_TOKEN |
| Nexus | https://nexus.example.com/repository/npm-private/ | NPM_TOKEN |
| Artifactory | https://artifactory.example.com/artifactory/api/npm/npm-private/ | NPM_TOKEN |
# npmjs (default)
npm publish
# GitHub Packages
NPM_REGISTRY=https://npm.pkg.github.com/ npm publish
# Verdaccio (local)
NPM_REGISTRY=http://localhost:4873/ npm publish
# Dry run (verify without publishing)
npm publish --dry-runFor testing purposes, you can create snapshot releases:
# Create a snapshot build
goreleaser release --snapshot --clean
# Copy binaries and update version
bash scripts/copy-to-npm.sh
VERSION=0.0.0-snapshot node scripts/sync-version.js
# Dry run publish
npm publish --dry-runproject/ │ ├── apps/ │ └── cli/ # Go CLI application │ ├── main.go │ └── tests/ │ ├── packages/ │ ├── crawler/ # Web crawling logic │ ├── exitcode/ # Standardized exit codes and error handling │ ├── noinput/ # Non-interactive mode and TTY detection │ ├── fetcher/ # HTTP fetching │ ├── logger/ # Logging utilities │ ├── output/ # Output formatting (JSON, human-readable, command tree) │ ├── parser/ # HTML parsing │ ├── storage/ # Output storage │ └── types/ # Shared types │ ├── dist/ # Pre-built binaries (generated) ├── bin/ # Installed binary (generated by postinstall) ├── scripts/ # Helper scripts │ └── prepublish-check.js │ ├── .github/ │ └── workflows/ │ ├── ci.yml # CI workflow │ └── release.yml # Release workflow │ └── release-docs.yml # Release docs workflow │ ├── .goreleaser.yml # GoReleaser configuration ├── package.json # npm package configuration ├── postinstall.js # npm post-install script └── README.md # This file
Problem: npm install -g @mindfiredigital/deepscanbot fails
Solutions:
Problem: "Unsupported platform" error during installation
Solutions:
Problem: "Command not found" after installation
Solutions:
Problem: No results or empty output
Solutions:
Problem: Too many requests or being blocked
Solutions:
Runs on every push and pull request to main:
Triggered by pushing a Git tag matching v*:
Triggered after every GitHub release:
Please see CONTRIBUTING.md for contribution guidelines.
This project is licensed under the MIT License - see LICENSE.md for details.
| Back | FazBrowse Home | New Git URL |