Alert Source Plugins
Alert source plugins require Python code. They live inapp/integrations/community/ and follow the same AlertSourceBase interface as builtin sources.
Contribution Process
- Research first — create
docs/integrations/{name}/api_notes.mddocumenting the source API - Implement the plugin — create
app/integrations/community/{name}.pyimplementingAlertSourceBase - Write tests — create
tests/test_community_{name}.pywith validation, normalization, and indicator extraction tests - Open a PR targeting the
mainbranch
Plugin Location
Community plugins go inapp/integrations/community/, not app/integrations/sources/. This keeps the distinction between officially supported and community-maintained integrations clear.
Requirements
- API notes committed to
docs/integrations/{name}/api_notes.md - Plugin implements
AlertSourceBase(validate, normalize, extract_indicators) - Severity mapping follows Calseta conventions (Pending/Informational/Low/Medium/High/Critical)
- Indicator extraction covers the source’s primary IOC fields
- Tests with realistic sample payloads
- No external dependencies beyond the standard library and httpx
Enrichment Provider Configs
Enrichment providers are runtime-configurable — no code needed. Contributions are JSON configuration files that can be imported via the API or added as seeds.Contribution Process
- Research the API — document in
docs/integrations/{name}/api_notes.md - Create the configuration — a JSON file with HTTP config, malice rules, and field extractions
- Test against the real API — verify the config works with actual data
- Open a PR with the configuration and API notes
Example Configuration
Field extractions are managed as separate API resources via
POST /v1/enrichment-field-extractions/bulk, not as part of the provider creation payload. The field_extractions array above is a reference for contributors — when importing the configuration, create the provider first, then create the field extractions via the bulk create endpoint.Requirements
- API notes committed to
docs/integrations/{name}/api_notes.md - HTTP config uses template variables correctly (
{{value}},{{auth_token}}) - Malice rules map to Calseta’s verdict enum (Benign/Suspicious/Malicious)
- Field extractions cover the most useful fields for agent reasoning
- Tested against the real API with sample data
- Documented any rate limits or API key requirements
Claude Code Skills
If you use Claude Code, the Calseta repository includes built-in skills that automate the scaffolding process:For Alert Source Plugins
- Researches the source’s API documentation
- Creates
docs/integrations/{name}/api_notes.md - Scaffolds the plugin file implementing
AlertSourceBase - Registers the plugin and sets up tests
For Enrichment Providers
- Researches the provider’s API documentation
- Creates
docs/integrations/{name}/api_notes.md - Builds the HTTP config, malice rules, and field extractions
- Generates either a builtin seed entry or community config files
General Guidelines
- One integration per PR — keeps reviews focused
- Include sample payloads — in tests or as fixtures
- Document edge cases — in the API notes file
- Follow existing patterns — look at builtin implementations for reference
- No secrets in PRs — use environment variable references, never hardcode API keys

