A terminal scanner tells you what powers a website without opening a browser. For developers, security engineers, and automation builders, detecting a stack straight from the command line beats reading headers by hand or digging through HTML. A lightweight CLI does the whole job.
This guide builds a fast website technology scanner in Go using ProjectDiscovery's open-source library. If you're new to detection, read our
Step 1: Create the project
Start by creating a new directory:
mkdir tech-scanner-cli
cd tech-scanner-cli
Initialize a Go module:
go mod init tech-scanner-cli
Step 2: Install Wappalyzergo
Run:
go get github.com/projectdiscovery/wappalyzergo
This pulls in the fingerprinting engine ProjectDiscovery maintains.
Step 3: Write the CLI tool
Create a main.go file and add the following code:
package main
import (
"flag"
"fmt"
"io"
"log"
"net/http"
wappalyzer "github.com/projectdiscovery/wappalyzergo"
)
var target = flag.String("url", "", "Target URL to scan")
func main() {
flag.Parse()
if *target == "" {
log.Fatal("Please provide a URL using -url")
}
resp, err := http.Get(*target)
if err != nil {
log.Fatalf("failed to fetch target: %v", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatalf("failed to read response: %v", err)
}
client, err := wappalyzer.New()
if err != nil {
log.Fatalf("failed to create client: %v", err)
}
technologies := client.Fingerprint(resp.Header, body)
fmt.Println("Detected technologies:")
for tech := range technologies {
fmt.Println("-", tech)
}
}
Step 4: Build the CLI
Compile the binary:
go build
That drops an executable into your project directory.
Step 5: Run the scanner
./tech-scanner-cli -url https://example.com
Expected output:
Detected technologies:
- Cloudflare
- React
- Nginx
That's a working detector in under 50 lines of Go.
Optional: Install it globally
To run the tool from anywhere:
sudo cp tech-scanner-cli /usr/local/bin/
Then:
tech-scanner-cli -url https://example.com
Improve the CLI (recommended enhancements)
Once the basic scanner works, add:
Output formats
- JSON for automation
- CSV for reporting
Concurrency
Scan multiple targets at once.
Timeout controls
Stop slow sites from blocking scans.
Category detection
Use FingerprintWithCats to group technologies.
Using custom fingerprints
Wappalyzergo ships an embedded dataset, but you can load your own if you need to:
client, err := wappalyzer.NewFromFile("fingerprints.json", true, true)
That covers internal tooling or specialized detection without writing a matcher yourself.
When should you use a CLI scanner?
A terminal scanner earns its place when you're:
- running reconnaissance at scale
- automating security workflows
- integrating into CI pipelines
- building developer utilities
For a tooling comparison, watch for our
This article was originally published on and Technology Fingerprinting for Developers.
SOCIAL SHARE CARD GENERATOR