Commercial threat intelligence feed for the CraftedSignal platform. Translates trending and novel threats into ready-to-use detection rules with tests, MITRE ATT&CK mappings, and IOCs.
briefs/ YAML threat brief source files (cleartext, gitignored)
cmd/feedgen/ Compiler that builds encrypted feed bundles
cmd/notifier/ Cloud Run service: public alert subscriptions
internal/ Compiler internals (loader, encryption, types)
output/ Compiled bundle output (encrypted)
site/ Hugo source for feed.craftedsignal.io
Each YAML file in briefs/ is a self-contained threat brief:
- Metadata: title, summary, severity, threat actor, tags, references
- Content: detailed write-up of the threat (Markdown)
- Rules: detection rules with platform-specific queries (SPL, KQL, FalconQL)
- Tests: positive and negative test cases per rule
- TTPs: MITRE ATT&CK tactic/technique mappings
- IOCs: indicators of compromise (IPs, domains, hashes)
Each brief is the source for two artifacts:
- Encrypted bundle — the full brief, AES-256-GCM encrypted, consumed by the CraftedSignal platform.
- Public Markdown — a redacted derivative published at feed.craftedsignal.io. One Markdown file per brief, written by
ti-bot's publisher intosite/content/briefs/. Hugo builds and deploys via theSite Deployworkflow.
The public derivative includes:
slug,title,description(the summary),published_attype(threat / coverage / advisory / rumour) andseverity(critical → low; rumour for unverified)tags,referencesactors,vendors,products,affected_osexploited(true when active exploitation observed)- MITRE ATT&CK mappings (
mitre_ttps[]) - CVE references (
cves[]: id, EPSS, CVSS, KEV) - The full
contentbody (rendered by Hugo) - Per-rule metadata: title, description, platform, severity, MITRE tactics/techniques, data sources
- IOCs (type + value) and aggregate
ioc_counts
The redacted fields — never included in the public output:
- Detection rule queries (the operational logic)
- Rule tests (real TTP samples)
- Internal priority scoring fields
- Anything outside the whitelisted set above
Brief authors should write summary and content assuming everything except the explicitly-withheld fields above is publicly indexable.
Subscribers can filter the public feed by any of the published fields and receive matching briefs by email, Slack, or Microsoft Teams via the subscription form (cmd/notifier/).
Compile briefs into an encrypted bundle:
go run ./cmd/feedgen -public-key <ed25519-hex> -briefs ./briefs -out ./output/bundle.jsonOptions:
| Flag | Description |
|---|---|
-public-key |
Ed25519 public key (64 hex chars). Also reads PUBLIC_KEY env var. |
-briefs |
Directory containing YAML brief files. Default: briefs |
-out |
Output path for encrypted bundle. Default: output/bundle.json |
-version |
Bundle version. Defaults to YYYY.MM.DD.<git-sha> |
-max-age-days |
Exclude briefs older than N days. Default: ~5 years |
- Create a new YAML file in
briefs/following the naming convention:YYYY-MM-DD-<slug>.yaml - Fill in metadata, content, rules (with tests), TTPs, and IOCs
- Run
feedgento compile and verify - The platform fetches the updated bundle automatically