Skip to content

v0.1.1 — Advanced Spam Filtering (Pro)

Released: 2026-05 · Channel: stable · Series: 0.1.x

v0.1.1 introduces Advanced Spam Filtering — the first new Pro capability since v0.1.0 GA. Every install (Free or Pro) gets the underlying schema and routing; Pro licenses unlock the API surface, the admin UI controls, and the rspamd-side enforcement.

  • Per-domain reject threshold. Override the global Rspamd reject score for an individual domain — tighten one tenant without changing the rest. Editable inline on the Domains page.
  • Per-domain greylisting toggle. Disable greylisting on a domain where the first-message delay is unacceptable, leave it enabled everywhere else.
  • Per-domain allow / block lists. Two scopes (sender email, sender domain) × two kinds (allow, block) per recipient domain, edited on a new Spam Lists page (/admin/domains/<id>/spam-lists). Block-list hits reject before delivery; allow-list hits short-circuit scoring. Edits take effect within seconds — no restart, no config file editing.
  • New schema in migration 000016_per_domain_spam_config. Adds domains.reject_threshold, domains.greylist_enabled, and the domain_spam_lists table with ON DELETE CASCADE from domains.
  • API surface gated by the advanced_spam feature flag from ValidonX. Free-tier callers get 403 FEATURE_NOT_AVAILABLE when they touch a gated field; the existing ungated spam_threshold PATCH continues to work on Free.
  • Rspamd integration uses a small Lua extension at /etc/rspamd/rspamd.local.lua plus four flat map files (one per kind × scope combination) keyed by recipient domain. Enforcement is a prefilter — block hits short-circuit with set_pre_result('reject'), allow hits short-circuit with set_pre_result('accept'). No selector acrobatics, no per-domain rule generation.
  • Per-domain reject thresholds and greylist toggles flow through local.d/settings.conf as standard Rspamd settings rules keyed on the recipient envelope.

Standard orchestrator flow: Updates → Plan → Apply from the admin UI. Migration 16 applies automatically when the API container starts on the new image; the rspamd config regenerator backfills empty map files on first apply so the bind mounts are always valid.

Free installs get the new schema and routes (which 403) but no behavioural change. To use the feature, activate a Pro license on the License page — the advanced_spam flag flips on and the new controls appear immediately, no restart required.

  • The four map files always exist on disk, even with zero entries configured. This keeps the docker-compose bind mounts valid on every install. An empty file = the prefilter is a no-op for that scope.
  • Spam-list edits trigger a partial regenerate + rspamd reload — the reload window is sub-second; existing in-flight scans are not cancelled.
  • Domain delete cascade-removes spam list rows via FK. The rspamd config is regenerated immediately after the delete so the maps stop referencing the gone domain.
  • Existing per-domain spam_threshold (Starter) is unchanged and ungated — set it on Free or Pro alike.

Per the v0.1.0 policy, existing data is never lost on Pro→Free downgrade. A customer who configured per-domain reject thresholds, greylist toggles, and allow/block lists under Pro keeps every row in the database after cancelling. The API gates editing those fields behind the Pro flag (Free PATCHes that touch them get 403 FEATURE_NOT_AVAILABLE), but the existing rspamd maps and settings stay on disk and continue to be enforced. Re-activating Pro returns full editing capability without re-entering data.