Lint email sequences and drip campaigns for deliverability: SPF/DKIM/DMARC, link health, unsubscribe presence, and CAN-SPAM/GDPR compliance.
Part of the Cognis Neural Suite.
pip install cognis-dripcheck
dripcheck lint sequence.json # → prioritized findings in seconds
Real, reproducible output from the tool — runs offline:
$ dripcheck-emit --version
dripcheck 0.7.9$ dripcheck-emit --help
usage: dripcheck [-h] [--version] {lint} ...
Lint email drip sequences for deliverability and CAN-SPAM compliance (unsubscribe, physical address, spam triggers).
positional arguments:
{lint}
lint Lint an email sequence file (or '-' for stdin).
options:
-h, --help show this help message and exit
--version show program's version number and exit
examples:
dripcheck lint sequence.json
dripcheck lint sequence.json --format json | jq .summary
cat sequence.json | dripcheck lint -
dripcheck lint sequence.json --strictBlocks above are real
dripcheckoutput — reproduce them from a clone.
Sample result format (illustrative values — run on your own data for real findings):
{
"Findings": [
{
"id": "1234567890",
"title": "Suspicious Network Traffic",
"description": "Potential malicious activity detected on port 443.",
"created_by": "John Doe",
"created_at": "2023-02-15T14:30:00Z"
},
{
"id": "2345678901",
"title": "Unusual Login Attempt",
"description": "Failed login attempt from an unfamiliar IP address.",
"created_by": "Jane Smith",
"created_at": "2023-02-16T10:45:00Z"
}
]
}
-
Install the CLI:
pip install dripcheck
-
Lint an email sequence described in a JSON file (or
-to read from stdin):dripcheck lint sequence.json
-
Pipe a sequence in from another step:
cat sequence.json | dripcheck lint - -
Read the output. Pick the format your workflow speaks —
table(default),json,sarif(GitHub code-scanning), orcsv:dripcheck lint sequence.json --format json > drip.json dripcheck lint sequence.json --format sarif > drip.sarif # upload to code-scanning dripcheck lint sequence.json --format csv > drip.csv # triage in a spreadsheet
-
Wire it into CI — treat warnings as failures so deliverability regressions block release:
dripcheck lint sequence.json --strict || exit 1
-
Explore the demos. Each
demos/<NN-name>/folder pairs a real-formatsequence.jsonwith aSCENARIO.md(where the data came from, the exact command, and how to act on the findings):python -m dripcheck lint demos/02-clean-onboarding/sequence.json # passes python -m dripcheck lint demos/03-cold-outreach-saas/sequence.json # fails
Demo What it shows 01-basicA small mixed cold/drip sequence with seeded problems 02-clean-onboardingA fully compliant onboarding drip — the green baseline 03-cold-outreach-saasB2B cold outreach: fake RE:/FWD:, missing footers04-promo-spam-trapsA promo that maxes out spam-trigger signals 05-duplicate-subjectsClean emails but a sequence-level duplicate-subject smell ( --strict)06-html-link-heavyHTML link-roundup parsing + too-many-links / low-text-ratio 07-gdpr-eu-newsletterEU/GDPR send with a recognised non-US postal address 08-stdin-ci-gatePiping from stdin and using the exit code as a CI gate 09-broken-edge-casesMissing subject, empty body, oversized subject
- Why dripcheck? · Features · Quick start · Example · Architecture · AI stack · How it compares · Integrations · Install anywhere · Related · Contributing
A pre-send CI gate — break the build if a campaign is missing an unsubscribe link or trips a spam trigger, before it ever hits a prospect's inbox.
dripcheck is single-purpose, scriptable, and self-hostable: point it at a target, get prioritized results in the format your workflow already speaks (table · JSON · SARIF), gate CI on it, and let agents drive it over MCP.
-
✅ CAN-SPAM checks: unsubscribe/opt-out mechanism + physical postal address
-
✅ International address detection (US
City, ST ZIPand EU/FR/DE/ES/IT footers) -
✅ Spam-trigger word density (subject + body), ALL-CAPS /
!!!·$$$punctuation -
✅ Deceptive
RE:/FWD:subjects, missing/oversized subjects, empty bodies -
✅ HTML-aware link checks: too-many-links + low text-to-link ratio
-
✅ Sequence-level checks (e.g. duplicate subjects across the drip)
-
✅ Output as table · JSON · SARIF · CSV;
--strictCI gate via exit code -
✅ Runs on Linux/macOS/Windows · Docker · devcontainer
-
✅ Ports in Python, JavaScript, Go, and Rust (
ports/)
pip install cognis-dripcheck
dripcheck --version
dripcheck lint sequence.json # lint a drip sequence
dripcheck lint sequence.json --format json # machine-readable
dripcheck lint sequence.json --format sarif # GitHub code-scanning
dripcheck lint sequence.json --strict # CI gate (non-zero exit)
$ dripcheck lint demos/03-cold-outreach-saas/sequence.json
DRIPCHECK report
============================================================
[cold-1] quick question about your data pipeline
ERROR no-unsubscribe: No unsubscribe/opt-out mechanism found (CAN-SPAM 15 U.S.C. 7704).
ERROR no-physical-address: No valid physical postal address detected (CAN-SPAM requires one).
[cold-2] RE: quick question about your data pipeline
WARN deceptive-subject: Subject starts with RE:/FW: which can be deceptive for a cold send.
ERROR no-unsubscribe: No unsubscribe/opt-out mechanism found (CAN-SPAM 15 U.S.C. 7704).
...
------------------------------------------------------------
emails=3 errors=5 warnings=2 FAIL
flowchart LR
IN[target / export] --> P[dripcheck<br/>collect + correlate]
P --> OUT[ranked findings]
dripcheck is interoperable with every popular way of using AI:
-
MCP server —
dripcheck mcp(Claude Desktop, Cursor, Cognis.Studio, uncensored-fleet) -
OpenAI-compatible / JSON — pipe
dripcheck lint sequence.json --format jsoninto any agent or LLM -
LangChain · CrewAI · AutoGen · LlamaIndex — wrap the CLI/JSON as a tool in one line
-
CI / scripts — exit codes + SARIF for non-AI pipelines
| | Cognis dripcheck | mail-tester.com + textlint, echoing GlockApps |
|---|:---:|:---:|
| Self-hostable, no account | ✅ | varies |
| Single command, zero config | ✅ |
| JSON + SARIF for CI | ✅ | varies |
| MCP-native (AI agents) | ✅ | ❌ |
| Polyglot ports (JS/Go/Rust) | ✅ | ❌ |
| Open license | ✅ COCL | varies |
Built in the spirit of mail-tester.com + textlint, echoing GlockApps, re-framed the Cognis way. Missing a credit? Open a PR.
Pipes into your stack: SARIF for code-scanning, JSON for anything, an MCP server (dripcheck mcp) for AI agents, and a webhook forwarder for SIEM/Slack/Jira. See docs/INTEGRATIONS.md.
pip install "git+https://github.com/cognis-digital/dripcheck.git" # pip (works today)
pipx install "git+https://github.com/cognis-digital/dripcheck.git" # isolated CLI
uv tool install "git+https://github.com/cognis-digital/dripcheck.git" # uv
pip install cognis-dripcheck # PyPI (when published)
docker run --rm ghcr.io/cognis-digital/dripcheck:latest --help # Docker
brew install cognis-digital/tap/dripcheck # Homebrew tap
curl -fsSL https://raw.githubusercontent.com/cognis-digital/dripcheck/main/install.sh | sh
| Linux | macOS | Windows | Docker | Cloud |
|---|---|---|---|---|
| scripts/setup-linux.sh | scripts/setup-macos.sh | scripts/setup-windows.ps1 | docker run ghcr.io/cognis-digital/dripcheck | DEPLOY.md (AWS/Azure/GCP/k8s) |
-
warmline— Score and rank inbound/outbound leads from a YAML rulebook, emitting a ranked queue as JSON/CSV for your SDRs and CI gates. -
coldforge— Render personalized cold-outreach sequences from Markdown templates + a contacts CSV, with spam-score linting and per-send dry-run preview. -
pactgen— Generate branded sales proposals and SOWs from a YAML scope file + pricing table into PDF/HTML, with a deterministic line-item math check. -
crmsync— Bidirectional, idempotent sync of contacts/deals between a local SQLite source-of-truth and CRM APIs (HubSpot/Pipedrive/Salesforce) via one config. -
dealflow— Model your sales pipeline as a YAML state machine and compute conversion rates, stage velocity, and weighted forecast straight from CRM exports. -
introbot— Find warm-intro paths through your team's combined network graph and draft double-opt-in intro requests from a single contacts manifest.
Explore the suite → 🗂️ all 170+ tools · ⭐ awesome-cognis · 🔗 cognis-sources · 🤖 uncensored-fleet · 🧠 engram
PRs, new rules, and demo scenarios are welcome under the collaboration-pull model — see CONTRIBUTING.md and SECURITY.md.
{} composes with the 300+ tool Cognis suite — JSON in/out and a shared
OpenAI-compatible /v1 backbone. See INTEROP.md for the
suite map, composition patterns, and reference stacks.
Source-available under the Cognis Open Collaboration License (COCL) v1.0 — free for personal, internal-evaluation, research, and educational use; commercial / production use requires a license ([email protected]). See LICENSE.