A high performance go implementation of Wappalyzer Technology Detection Library
Go
1,115
430 commits
updated Oct 4, 2026
A high performance port of the Wappalyzer Technology Detection Library to Go. Inspired by Webanalyze.
Uses data from
go install -v github.com/projectdiscovery/wappalyzergo/cmd/update-fingerprints@latest
After this command wappalyzergo library source will be in your current go.mod.
Usage Example:
package main
import (
"fmt"
"io"
"log"
"net/http"
wappalyzer "github.com/projectdiscovery/wappalyzergo"
)
func main() {
resp, err := http.DefaultClient.Get("https://www.hackerone.com")
if err != nil {
log.Fatal(err)
}
data, _ := io.ReadAll(resp.Body) // Ignoring error for example
wappalyzerClient, err := wappalyzer.New()
fingerprints := wappalyzerClient.Fingerprint(resp.Header, data)
fmt.Printf("%v\n", fingerprints)
// Output: map[Acquia Cloud Platform:{} Amazon EC2:{} Apache:{} Cloudflare:{} Drupal:{} PHP:{} Percona:{} React:{} Varnish:{}]
}
Fingerprint still uses only the response headers and body. Use
FingerprintWithRuntime to also check JavaScript properties, the rendered DOM,
and script content. The optional headless adapter works with a Rod page that
the caller has already loaded. The caller remains responsible for launching,
navigating, and closing the browser.
collector := headless.New(page)
fingerprints, err := wappalyzerClient.FingerprintWithRuntime(
ctx, resp.Header, data,
wappalyzer.RuntimeOptions{
Collector: collector,
Timeout: 10 * time.Second,
},
)
If runtime collection returns an error, the result still includes passive
matches and any matches found before the failure. Other browser integrations
can implement wappalyzer.RuntimeCollector without importing the Rod adapter.
2,273 followers · starred Feb 2025
308 followers · starred Jan 2024
404 followers · starred Feb 2025
28 followers · starred Feb 2024
A high performance go implementation of Wappalyzer Technology Detection Library
Go
1,115
430 commits
updated Oct 4, 2026
A high performance port of the Wappalyzer Technology Detection Library to Go. Inspired by Webanalyze.
Uses data from
go install -v github.com/projectdiscovery/wappalyzergo/cmd/update-fingerprints@latest
After this command wappalyzergo library source will be in your current go.mod.
Usage Example:
package main
import (
"fmt"
"io"
"log"
"net/http"
wappalyzer "github.com/projectdiscovery/wappalyzergo"
)
func main() {
resp, err := http.DefaultClient.Get("https://www.hackerone.com")
if err != nil {
log.Fatal(err)
}
data, _ := io.ReadAll(resp.Body) // Ignoring error for example
wappalyzerClient, err := wappalyzer.New()
fingerprints := wappalyzerClient.Fingerprint(resp.Header, data)
fmt.Printf("%v\n", fingerprints)
// Output: map[Acquia Cloud Platform:{} Amazon EC2:{} Apache:{} Cloudflare:{} Drupal:{} PHP:{} Percona:{} React:{} Varnish:{}]
}
Fingerprint still uses only the response headers and body. Use
FingerprintWithRuntime to also check JavaScript properties, the rendered DOM,
and script content. The optional headless adapter works with a Rod page that
the caller has already loaded. The caller remains responsible for launching,
navigating, and closing the browser.
collector := headless.New(page)
fingerprints, err := wappalyzerClient.FingerprintWithRuntime(
ctx, resp.Header, data,
wappalyzer.RuntimeOptions{
Collector: collector,
Timeout: 10 * time.Second,
},
)
If runtime collection returns an error, the result still includes passive
matches and any matches found before the failure. Other browser integrations
can implement wappalyzer.RuntimeCollector without importing the Rod adapter.
2,273 followers · starred Feb 2025
308 followers · starred Jan 2024
404 followers · starred Feb 2025
28 followers · starred Feb 2024