She warned of the danger. Nobody listened.
CassandraCTI collects threat intelligence from 30+ sources and makes sure
your team actually receives it — on Teams, Discord, or wherever they work.
Every run fetches, deduplicates, routes, and delivers. No dashboard to check — events come to your team.
Add your own with a single command. 30+ feeds pre-configured.
Polls any RSS or Atom feed with custom User-Agent. HTML stripped via BeautifulSoup, dates normalized to UTC. Fine-grained routing per feed via rss:{name} identifiers.
Tracks ransomware group attacks from ransomware.live. Country flag emoji auto-detected from victim domain. Configurable lookback window.
Downloads the daily malicious domain list. One event per run with a 50-domain preview and a direct link to the full list.
Batching, throttling, emoji mapping, retry with backoff. Each transport is independently configurable.
# No secrets in files — use environment variables connectors: - id: "teams-cert" type: "teams" params: webhook_url: ${MSTEAMS_WEBHOOK_CERT} theme_color: "0078D7" emojis: true batching: { enabled: true, max_items: 5 } - id: "discord-alert" type: "discord" params: webhook_url: ${DISCORD_WEBHOOK_URL} username: "CassandraCTI" throttle_ms: 500
Init, run, debug, repair — everything from a single cassandra command.
~/.config/cassandra-cti/. First step on any new machine.--loop for daemon mode, --dry-run to test without sending.Name,URL,Tags.--force.Clone and install. The cassandra CLI entry point is available globally after install.
$ git clone https://github.com/franckferman/CassandraCTI.git $ cd CassandraCTI && pip install .
Create default config files. Edit them — or use CLI commands to populate them.
$ cassandra init # → ~/.config/cassandra-cti/config.yaml # → ~/.config/cassandra-cti/connectors.yaml
Register your webhook. Add feeds. Enable trackers.
$ cassandra add-connector \ --id "teams-soc" \ --webhook-url "https://..." $ cassandra add-source rss \ --name "CERT-FR" \ --url "https://cert.ssi.gouv.fr/alerte/feed/" \ --tags "cert,fr" $ cassandra add-source ransomware_live
$ cassandra doctor config $ cassandra doctor connector --id teams-soc $ cassandra run --dry-run --verbose # Go live — loop every 5 minutes $ cassandra run --loop --interval 300
schema_version: 1 sources: rss: enabled: true feeds: - name: "CERT-FR Alertes" url: "https://cert.ssi.gouv.fr/alerte/feed/" tags: ["cert", "fr"] ransomware_live: enabled: true lookback_days: 30 transports: use: ["teams-soc"] routes: - name: "cert-alerts" include_tags: ["cert"] transports: ["teams-soc"] - name: "ransomware" include_sources: ["ransomware.live"] transports: ["teams-soc"] template: "templates/ransomware_card.j2" store: sqlite_path: ".cassandra_cti.db" seen_ttl_days: 90
services: cassandra-cti: build: . volumes: - ./config:/config environment: - MSTEAMS_WEBHOOK_SOC=${MSTEAMS_WEBHOOK_SOC} - DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL} command: > cassandra run --config /config/config.yaml --loop --interval 300 restart: unless-stopped
CassandraCTI is free, open-source, AGPL-3.0.