ThreatActor.info is a static Jekyll knowledge base for threat actors, campaigns, malware, indicators, and related intelligence artifacts. The repository stores canonical actor metadata in YAML, synchronizes actor pages from that data, and generates static JSON APIs for the site UI and downstream use.
Live site: https://wellknittech.github.io/ThreatActor.info/
- Maintains canonical actor records in
_data/actors/*.yml - Synchronizes actor pages in
_threat_actors/*.md - Generates static API artifacts in
_data/generated/*.jsonandapi/*.json - Extracts malware, campaigns, ATT&CK mappings, references, and IOCs from actor content
- Supports repeatable snapshot-based imports from public intelligence sources
- MITRE ATT&CK imports can populate denormalized
attck_*fields and asourcesaudit trail; optional abuse.ch ThreatFox imports add recent IOCs whenTHREATFOX_API_KEYis set (ruby scripts/import-automated-sources.rb --source threatfox --apply) - Validates schema, page alignment, generated JSON, and safe Jekyll builds in CI
- Jekyll static site with Ruby
3.2.5and Bundler2.5.10 1062actor YAML records currently committed under_data/actors/271malware pages currently committed under_malware/- No Node, TypeScript, package manager, or conventional unit-test framework
- Validation is done through Ruby scripts plus
bundle exec jekyll build --safe
_data/actors/ Canonical threat actor metadata
_data/generated/ Generated JSON artifacts used by the UI and API
_threat_actors/ Threat actor pages synchronized from YAML
_malware/ Generated malware/tool pages and metadata
_layouts/ Shared Jekyll layouts
_includes/ Shared UI includes, including search/filter UI
api/ Public static JSON API wrappers
assets/css/style.scss Main stylesheet
scripts/ Importers, generators, validators, and helpers
docs/ Supporting docs for API, schema, and data flows
schemas/ JSON schemas for generated artifacts
Run from the repository root:
gem install bundler -v 2.5.10
bundle installServe the site locally:
bundle exec jekyll serveBuild the site without serving:
bundle exec jekyll build --safeThe normal data flow is:
- Import or edit actor source data in
_data/actors/*.yml - Synchronize pages with
ruby scripts/generate-pages.rb --forcewhen needed - Regenerate indexes with
ruby scripts/generate-indexes.rb - Validate content with
ruby scripts/validate-content.rb - Validate generated schemas with
ruby scripts/validate-json-schemas.rb - Confirm the site builds with
bundle exec jekyll build --safe
Useful commands:
ruby scripts/generate-pages.rb --force
ruby scripts/generate-indexes.rb
ruby scripts/validate-content.rb
ruby scripts/validate-json-schemas.rb
bash scripts/validate.shThe standard automated entry point is scripts/import-automated-sources.rb.
Preview automated imports without modifying actor data:
ruby scripts/import-automated-sources.rbApply automated imports, regenerate outputs, and validate content:
ruby scripts/import-automated-sources.rb --applyRun one source only:
ruby scripts/import-automated-sources.rb --source malpedia --applyPublic snapshot-backed sources currently supported by the automated runner include:
misp-galaxyransomlooketda-thaicertmalpediamicrosoft-threat-actor-listapt-groups-operationsaptnotesransomware-tool-matrixcurated-intel-moveit-transferransomware-vulnerability-matrixrussian-apt-tool-matrix
Analyst notes are intentionally separate from the public automated runner:
ruby scripts/import-analyst-notes.rb plan
ruby scripts/import-analyst-notes.rb importMore importer details: docs/importers.md, docs/data-flows.md, scripts/README.md
The site publishes static JSON under api/. Main endpoints include:
api/threat-actors.jsonapi/recently-updated.jsonapi/campaigns.jsonapi/malware.jsonapi/malware-index.json(legacy:api/malware_index.json)api/attack-mappings.jsonapi/references.jsonapi/iocs.jsonapi/ioc-lookup.jsonapi/ioc-types.jsonapi/facets.json
API details: docs/api.md
This repository does not use a conventional test suite. In practice, validation means:
ruby scripts/validate-content.rbruby scripts/validate-json-schemas.rbbundle exec jekyll build --safe
CI workflows also regenerate pages and indexes, parse built API JSON, and check for schema and content regressions.
- Treat
_data/actors/*.ymlas the canonical actor metadata layer - Keep the actor YAML
url, page file path, and pagepermalinkaligned - Use double-quoted YAML strings to match the existing dataset
- Keep
aliasesandsector_focusinline unless a broader format change is required - Do not edit generated output in
_site/ - After content changes, run
ruby scripts/validate-content.rb - After layout, include, CSS, or config changes, run
bundle exec jekyll build --safe
docs/api.md- static API endpoints and fieldsdocs/data-flows.md- canonical source layers and importer flowdocs/importers.md- importer-specific behavior and guardrailsdocs/schema.md- actor schema notesscripts/README.md- script quick reference and usage examplesAGENTS.md- repository-specific guidance for coding agents
Contributions are welcome. For most changes:
- Edit or import source data
- Regenerate pages and indexes as needed
- Run validation
- Open a pull request with the changed source files and generated artifacts
If you are adding a new importer or changing source attribution behavior, also update the relevant docs in docs/ and scripts/README.md.