Made in 🇧🇷 |
Clickdetect
Clickdetect is a generic alerting and detection engine that supports any data source and integrates with any webhook. It is vendor-agnostic, with no lock-in, and enables powerful, flexible detection workflows.
Follow the doc: https://clickdetect.souzo.me
Core Concepts
- Runner.yml: The file where you configure everything
- Detector: Component that runs rules based on thresholds
- Rule: File with structured format to define datasource analysis
- Datasource: Where rule queries are executed, like a database or another SIEM engine
- Webhooks: Where alerts are sent
- Plugin: Script that can intercept Clickdetect actions like "on_rule_triggered"
Supported Integrations
Datasources
- Clickhouse
- Loki
- VictoriaLogs
- PostgreSQL
- Elastic
- Opensearch
- Opensearch PPL
- Databricks
- Duckdb
Webhooks
- Generic
- DFIR Iris
- Forgejo
- Microsoft Teams
- Slack
- Telegram
- Discord
- TheHive
- Opsgenie
- AlertManager
Plugins
- clickagentic: LLM AI Agent that analyzes your alerts
Quick Start
Start by creating a runner.yml file — see the full reference in the documentation.
uv
Follow uv installation in https://docs.astral.sh/uv
uv sync --no-dev
uv run clickdetect --api
Docker/Podman
Local
podman build -t clickdetect .
podman run -v ./runner.yml:/app/runner.yml -p 8080:8080 clickdetect --api -p 8080
GitHub Packages
podman run -v ./runner.yml:/app/runner.yml -p 8080:8080 ghcr.io/clicksiem/clickdetect:latest --api -p 8080
Options
| Flag | Default | Description |
|---|---|---|
--api |
off | Start the REST API server |
-p, --port |
8080 |
Port for the API server |
-r, --runner |
runner.yml |
Path to the runner configuration file |
--stdin |
off | Read the runner configuration from stdin |
--verbose |
off | Verbose mode |
--reload |
off | Hot reload rules |
--no-start |
off | Do not start detectors on start |
--list-webhooks |
off | List webhooks |
--list-datasources |
off | List datasources |
--list-plugins |
off | List all plugins |
--sigma |
off | Treat all rules as Sigma rule |
--version |
off | Print version and exit |
Runner Configuration
datasource:
type: clickhouse
host: localhost
port: 8123
verify: false
username: default
password: default
database: siem
webhooks:
generic_webhook:
type: generic
url: <webhook_url>
headers:
X-Type: test
detectors:
5m_detector:
name: "5m interval"
for: "5m"
tenant: 'all'
description: "detect rules with 5 min interval"
rules:
- "<your rule path>"
sigma: true # threat all rules for this detector as sigma rule
webhooks:
- generic_webhook
data:
var1: '<var>' # variables to send
plugins:
clickagentic: # plugin id
provider: 'openai' # provider: openai, anthropic, google, huggingface, ollama, openrouter, deepseek
model: 'gpt-5.2' # get model from your provider
token: 'xxx'
from_level: 60 # only run for alerts with alert level >= 60
ids:
- "id1"
More example of runner in example_rules
High Availability
By default Clickdetect runs as a single process and keeps the detection window of each detector in memory, so two instances sharing a config would emit duplicate alerts.
Adding a top-level redis block turns it into an active-passive, multi-replica setup with automatic failover:
redis:
url: redis://localhost:6379/0
namespace: clickdetect # optional
lock_ttl: 1500 # optional, failover latency in seconds
Every detector run takes a distributed lock, so only one replica evaluates a given window, and the window itself is stored in Redis, so a replica taking over resumes from exactly where the previous one stopped — no gaps, no reprocessing. Run identical replicas against the same runner.yml and the same Redis.
See High Availability for details.
Rule Configuration
id: "00000000-0000-0000-0000-000000000000"
name: "Base rule for help"
level: 50
size: ">0"
active: false
author:
- Vinicius Morais <me@souzo.me>
group: < group >
tags:
- <tags>
data: # variables sent to rules by jinja
max_match_time: 5
rule: |-
< rule >
Severity
A rule's level is an integer from 0 to 100 — anything outside that range makes the rule fail to load. Sigma rules use a textual level (informational, low, medium, high, critical), which is converted to that scale on load.
Since every destination has its own severity vocabulary, the level is first resolved into a band:
| Band | Level |
|---|---|
informational |
0 |
low |
20 |
medium |
40 |
high |
60 |
critical |
80 |
Each webhook then translates the band into what its destination expects. The bands are configurable per webhook with severity_map, which sets the minimum rule level of each band — bands left out keep their default:
webhooks:
opsgenie_hook:
type: opsgenie
api_key: 'xxx'
severity_map:
high: 70
critical: 90
See Severity levels for details.
Release
See the latest releases and changelog
Contact
- E-mail: me@souzo.me
- Matrix: @souzo:matrix.org
- Linkedin: https://www.linkedin.com/in/vinicius-m-a76ba51b5/
- Twitter/X: https://x.com/souzomain
- Reddit: https://www.reddit.com/user/_souzo/
Metadata
Release files for clickdetect 1.18.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| clickdetect-1.18.0.tar.gz | 32.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| clickdetect-1.18.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 89.6 kB
Release files / clickdetect-1.18.0.tar.gz
| Download URL | clickdetect-1.18.0.tar.gz |
|---|---|
| Size | 32.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
017c2ee7c1ec67d7fe06aa824a091c51307b8abfaa9df0b1cbf89b3d5941e638
|
|
BLAKE2b-256 checksum How to use checksums |
184260a4105f571d34f41a8c8266e723155b94d278a3d4a8a394e62a0dd24700
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / clickdetect-1.18.0-py3-none-any.whl
| Download URL | clickdetect-1.18.0-py3-none-any.whl |
|---|---|
| Size | 57.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
58ff25495440180fd33e89faee85df7475738e708563907c967824446928aa54
|
|
BLAKE2b-256 checksum How to use checksums |
ef874e208bc05f11829c5a719a9526a9ff20b916ae0b0f8cc3cf4ee14fbc69f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|