{"id":34520214,"url":"https://github.com/zerocostautomation/wappalyzer-fingerprints","last_synced_at":"2026-05-30T06:04:13.533Z","repository":{"id":318203654,"uuid":"1070298623","full_name":"ZeroCostAutomation/wappalyzer-fingerprints","owner":"ZeroCostAutomation","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-01T03:39:42.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-01T06:55:00.144Z","etag":null,"topics":["fingerprinting","wappalyzer","whatweb"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ZeroCostAutomation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-05T16:56:20.000Z","updated_at":"2025-10-09T07:15:42.000Z","dependencies_parsed_at":"2026-01-19T05:17:05.611Z","dependency_job_id":null,"html_url":"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints","commit_stats":null,"previous_names":["zerocostautomation/wappalyzer-fingerprints"],"tags_count":151,"template":false,"template_full_name":null,"purl":"pkg:github/ZeroCostAutomation/wappalyzer-fingerprints","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZeroCostAutomation%2Fwappalyzer-fingerprints","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZeroCostAutomation%2Fwappalyzer-fingerprints/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZeroCostAutomation%2Fwappalyzer-fingerprints/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZeroCostAutomation%2Fwappalyzer-fingerprints/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ZeroCostAutomation","download_url":"https://codeload.github.com/ZeroCostAutomation/wappalyzer-fingerprints/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZeroCostAutomation%2Fwappalyzer-fingerprints/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30111728,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T03:40:26.266Z","status":"ssl_error","status_checked_at":"2026-03-05T03:39:15.902Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fingerprinting","wappalyzer","whatweb"],"created_at":"2025-12-24T04:46:57.425Z","updated_at":"2026-03-05T05:04:48.572Z","avatar_url":"https://github.com/ZeroCostAutomation.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Wappalyzer Fingerprints\n\nA GitHub Action workflow that automatically fetches, processes, and publishes the latest Wappalyzer fingerprints for technology detection.\n\n## What is this?\n\nThis repository contains a GitHub workflow that:\n\n1. Automatically runs daily to fetch the latest Wappalyzer technology fingerprints\n2. Processes and standardizes the data format\n3. Creates GitHub Releases with the fingerprint data\n4. Updates a \"latest\" tag for easy access\n\nThe data is sourced from:\n- [HTTPArchive/wappalyzer](https://github.com/HTTPArchive/wappalyzer)\n- [enthec/webappanalyzer](https://github.com/enthec/webappanalyzer)\n\n## Download the Latest Data\n\nYou can always download the latest fingerprints using these commands:\n\n```bash\n# Download the latest technologies data\nwget https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json\n\n# Download the latest categories\nwget https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/categories.json\n\n# Download the latest groups\nwget https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/groups.json\n\n# Download everything in a ZIP archive\nwget https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/wappalyzer-fingerprints.zip\n```\n\nOr visit the [latest release page](https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest).\n\n## Data Files\n\nThe following files are included in each release:\n\n- `technologies.json`: Technology fingerprints for detection (flat array)\n- `categories.json`: Technology categories\n- `groups.json`: Category grouping information\n- `README.md`: Documentation and statistics\n- `wappalyzer-fingerprints.zip`: All files in a single ZIP archive\n\n## Data Models\n\nThe fingerprint data follows specific structures that can be modeled in various languages:\n\n### JSON Schema\n\n#### Technologies\n\n```json\n[\n  {\n    \"name\": \"technology_name\",\n    \"cats\": [1, 2],\n    \"description\": \"Technology description\",\n    \"website\": \"https://example.com\",\n    \"cpe\": \"cpe:/a:vendor:product:version\",\n    \"icon\": \"icon_file.png\",\n    \"cookies\": {\n      \"cookie_name\": \"cookie_pattern\"\n    },\n    \"headers\": {\n      \"header_name\": \"header_pattern\"\n    },\n    \"html\": [\"html_pattern1\", \"html_pattern2\"],\n    \"scripts\": [\"script_pattern1\", \"script_pattern2\"],\n    \"meta\": {\n      \"meta_name\": [\"meta_pattern\"]\n    },\n    \"js\": {\n      \"object.property\": \"\"\n    },\n    \"implies\": [\"other_technology\"]\n  }\n]\n```\n\n#### Categories\n\n```json\n{\n  \"category_id\": {\n    \"name\": \"Category Name\",\n    \"priority\": 1,\n    \"groups\": [\"group_id\"]\n  }\n}\n```\n\n#### Groups\n\n```json\n{\n  \"group_id\": {\n    \"name\": \"Group Name\"\n  }\n}\n```\n\n### TypeScript Models\n\n```typescript\n// models.ts\nexport interface Technology {\n  name: string;\n  cats: number[];\n  description?: string;\n  website?: string;\n  cpe?: string;\n  icon?: string;\n  cookies?: Record\u003cstring, string\u003e;\n  headers?: Record\u003cstring, string\u003e;\n  html?: string[];\n  scripts?: string[];\n  scriptSrc?: string[];\n  meta?: Record\u003cstring, string[]\u003e;\n  js?: Record\u003cstring, any\u003e;\n  implies?: string[];\n}\n\n// Technologies.json is a direct array of Technology objects\nexport type WappalyzerTechnologies = Technology[];\n\nexport interface Categories {\n  [categoryId: string]: {\n    name: string;\n    priority: number;\n    groups?: string[];\n  };\n}\n\nexport interface Groups {\n  [groupId: string]: {\n    name: string;\n  };\n}\n\n// Usage example\nimport { WappalyzerTechnologies, Categories, Groups } from './models';\n\nasync function loadTechnologies(): Promise\u003cWappalyzerTechnologies\u003e {\n  const response = await fetch('https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json');\n  return response.json();\n}\n```\n\n### Go Structs\n\n```go\n// models.go\npackage wappalyzer\n\n// Technologies.json is a direct array of Technology objects\ntype Technologies []Technology\n\ntype Technology struct {\n\tName        string                `json:\"name\"`\n\tCats        []int                 `json:\"cats\"`\n\tDescription string                `json:\"description,omitempty\"`\n\tWebsite     string                `json:\"website,omitempty\"`\n\tCPE         string                `json:\"cpe,omitempty\"`\n\tIcon        string                `json:\"icon,omitempty\"`\n\tCookies     map[string]string     `json:\"cookies,omitempty\"`\n\tHeaders     map[string]string     `json:\"headers,omitempty\"`\n\tHTML        []string              `json:\"html,omitempty\"`\n\tScripts     []string              `json:\"scripts,omitempty\"`\n\tScriptSrc   []string              `json:\"scriptSrc,omitempty\"`\n\tMeta        map[string][]string   `json:\"meta,omitempty\"`\n\tJS          map[string]any        `json:\"js,omitempty\"`\n\tImplies     []string              `json:\"implies,omitempty\"`\n}\n\ntype Categories map[string]Category\n\ntype Category struct {\n\tName     string   `json:\"name\"`\n\tPriority int      `json:\"priority\"`\n\tGroups   []string `json:\"groups,omitempty\"`\n}\n\ntype Groups map[string]Group\n\ntype Group struct {\n\tName string `json:\"name\"`\n}\n\n// Usage example\nfunc LoadTechnologies() (Technologies, error) {\n\tresp, err := http.Get(\"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tvar technologies Technologies\n\terr = json.NewDecoder(resp.Body).Decode(\u0026technologies)\n\treturn technologies, err\n}\n```\n\n### Python Classes\n\n```python\n# models.py\nfrom typing import Dict, List, Any, Optional\nfrom dataclasses import dataclass\nfrom pydantic import BaseModel\n\n# Pydantic model\nclass Technology(BaseModel):\n    name: str\n    cats: List[int]\n    description: Optional[str] = None\n    website: Optional[str] = None\n    cpe: Optional[str] = None\n    icon: Optional[str] = None\n    cookies: Optional[Dict[str, str]] = None\n    headers: Optional[Dict[str, str]] = None\n    html: Optional[List[str]] = None\n    scripts: Optional[List[str]] = None\n    scriptSrc: Optional[List[str]] = None\n    meta: Optional[Dict[str, List[str]]] = None\n    js: Optional[Dict[str, Any]] = None\n    implies: Optional[List[str]] = None\n\n# Technologies.json is a direct array of Technology objects\nWappalyzerTechnologies = List[Technology]\n\nclass Category(BaseModel):\n    name: str\n    priority: int\n    groups: Optional[List[str]] = None\n\nclass Group(BaseModel):\n    name: str\n\n# Usage example\nimport requests\n\ndef load_technologies():\n    response = requests.get(\"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json\")\n    data = response.json()\n    return [Technology(**tech) for tech in data]\n```\n\n### PHP Classes\n\n```php\n\u003c?php\n// models.php\n\nclass Technology {\n    public string $name;\n    public array $cats;\n    public ?string $description = null;\n    public ?string $website = null;\n    public ?string $cpe = null;\n    public ?string $icon = null;\n    public ?array $cookies = null;\n    public ?array $headers = null;\n    public ?array $html = null;\n    public ?array $scripts = null;\n    public ?array $scriptSrc = null;\n    public ?array $meta = null;\n    public ?array $js = null;\n    public ?array $implies = null;\n}\n\n// For technologies.json - array of Technology objects\n// Usage example\nfunction loadTechnologies(): array {\n    $json = file_get_contents(\"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json\");\n    $data = json_decode($json, true);\n    \n    $technologies = [];\n    \n    foreach ($data as $techData) {\n        $tech = new Technology();\n        $tech-\u003ename = $techData['name'];\n        $tech-\u003ecats = $techData['cats'];\n        $tech-\u003edescription = $techData['description'] ?? null;\n        // populate other properties\n        $technologies[] = $tech;\n    }\n    \n    return $technologies;\n}\n\nclass Category {\n    public string $name;\n    public int $priority;\n    public ?array $groups = null;\n}\n\nclass Group {\n    public string $name;\n}\n\nfunction loadCategories(): array {\n    $json = file_get_contents(\"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/categories.json\");\n    return json_decode($json, true);\n}\n```\n\n## Usage Examples\n\n### Python\n\n```python\nimport json\nimport requests\n\n# Download technologies data\ntechnologies_url = \"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json\"\nresponse = requests.get(technologies_url)\ndata = response.json()\n\n# Print number of technologies\nprint(f\"Total technologies: {len(data)}\")\n\n# Example: Find WordPress data\nwordpress_tech = next((tech for tech in data if tech[\"name\"] == \"WordPress\"), None)\nif wordpress_tech:\n    print(f\"WordPress categories: {wordpress_tech['cats']}\")\n```\n\n### JavaScript/Node.js\n\n```javascript\nconst https = require('https');\nconst fs = require('fs');\n\n// Download technologies data\nconst url = \"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json\";\nhttps.get(url, (response) =\u003e {\n    let data = '';\n    \n    response.on('data', (chunk) =\u003e {\n        data += chunk;\n    });\n    \n    response.on('end', () =\u003e {\n        const technologies = JSON.parse(data);\n        console.log(`Total technologies: ${technologies.length}`);\n        \n        // Example: Find React data\n        const reactTech = technologies.find(tech =\u003e tech.name === \"React\");\n        if (reactTech) {\n            console.log(`React categories: ${reactTech.cats.join(', ')}`);\n        }\n    });\n}).on(\"error\", (err) =\u003e {\n    console.log(\"Error: \" + err.message);\n});\n```\n\n### Go\n\n```go\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\n// Technologies.json is a direct array of Technology objects\ntype Technology struct {\n\tName string  `json:\"name\"`\n\tCats []int   `json:\"cats\"`\n\t// other fields omitted for brevity\n}\n\nfunc main() {\n\t// Download technologies data\n\tresp, err := http.Get(\"https://github.com/ZeroCostAutomation/wappalyzer-fingerprints/releases/latest/download/technologies.json\")\n\tif err != nil {\n\t\tfmt.Printf(\"Error fetching data: %s\\n\", err)\n\t\treturn\n\t}\n\tdefer resp.Body.Close()\n\n\t// Parse JSON\n\tdata, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\tfmt.Printf(\"Error reading response: %s\\n\", err)\n\t\treturn\n\t}\n\n\tvar technologies []Technology\n\tif err := json.Unmarshal(data, \u0026technologies); err != nil {\n\t\tfmt.Printf(\"Error parsing JSON: %s\\n\", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"Total technologies: %d\\n\", len(technologies))\n\n\t// Example: Find jQuery data\n\tfor _, tech := range technologies {\n\t\tif tech.Name == \"jQuery\" {\n\t\t\tfmt.Printf(\"jQuery categories: %v\\n\", tech.Cats)\n\t\t\tbreak\n\t\t}\n\t}\n}\n```\n\n## Running Locally\n\nIf you want to run the fingerprint update script locally:\n\n1. Clone this repository\n2. Install Python dependencies: `pip install requests`\n3. Run the script: `python .github/scripts/fetch_fingerprints.py`\n4. Find the output files in the `assets` directory\n\n## Workflow Schedule\n\nThe GitHub workflow runs automatically:\n- Daily at 01:00 UTC\n- Manually via GitHub Actions workflow dispatch\n\n## License\n\nThis data is derived from Wappalyzer, which is licensed under the MIT License. When using this data, please respect the original license terms.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerocostautomation%2Fwappalyzer-fingerprints","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzerocostautomation%2Fwappalyzer-fingerprints","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerocostautomation%2Fwappalyzer-fingerprints/lists"}