v1.0 — DNS setup wizard now live

Self-hosted email,
built for developers.

Listonosh is an open-source mail transfer agent. Run your own SPF/DKIM/DMARC-aligned sender on your own IPs — no vendor lock-in, no shared-pool reputation, no per-email markup. Designed for the 2024+ Gmail and Yahoo enforcement rules.

What's inside

Everything you need to run mail in production.

Not just an SMTP relay. Listonosh handles the full lifecycle — DNS setup, IP warm-up, bounce parsing, suppression lists, webhook fan-out.

DNS

Pre-flight DNS lint

Before you create a domain, Listonosh resolves your existing TXT and MX records and warns about clashing SPF includes, strict DMARC policies, and existing inbound MX — so you don't accidentally break production.

CF

One-click Cloudflare push

Connect a Cloudflare API token once. From any domain page, push your SPF / DKIM / DMARC / return-path records to the zone with a single click. Existing records are updated, never duplicated.

IP

Sender warm-up

Brand-new IPs hit greylisting and spam folders. Listonosh has built-in warm-up plans that ramp daily limits over weeks, with provider-specific quotas and automatic pause on bounce-rate spikes.

FBL

Suppression & complaints

Hard bounces and spam complaints automatically populate the suppression list — hardcoded RFC 8058 one-click unsubscribe, 2-day SLA, < 0.3% complaint rate by design. Required for Gmail bulk sender compliance.

JSON-RPC 2.0 API

One endpoint, one auth scheme. Auto-generated Go and TypeScript clients straight from the schema (/v1/rpc/api.ts). OpenRPC spec available for any language.

Webhooks with HMAC

Every event — accepted, delivered, bounced, complained, opened — is POSTed to your endpoint with a SHA-256 HMAC signature. Per-endpoint DLQ if your service is down; retries up to 24 hours.

DNS Setup Wizard

Stop copy-pasting DNS records from a wiki.

Add a domain. Generate a DKIM keypair with one button. Listonosh shows you exactly which records to add — and live-resolves each one to tell you if it's already in place.

  • Per-record live verification: present / misaligned / missing
  • BIND-style zonefile export with one click
  • DMARC policy ramp-up helper (none → quarantine → reject)
  • Auto-verify 30 seconds after Cloudflare push
  • Code snippets for curl, Node.js, Python and Go
DNS records Status Zonefile
┌──────────────┬──────┬─────────────────────┬───────────┐
│ KINDTYPEHOSTSTATUS    │
├──────────────┼──────┼─────────────────────┼───────────┤
│ SPF          │ TXT  │ send                │ ● present │
│ DKIM (s5a..) │ TXT  │ s5a.._domainkey     │ ● present │
│ DMARC        │ TXT  │ _dmarc              │ ● present │
│ Return-path  │ MX   │ send                │ ● present │
│ Inbound      │ MX   │ inbound             │ ○ misaligned
└──────────────┴──────┴─────────────────────┴───────────┘

# Cache TTL: 30s — refreshes automatically
# Verification: passing ✓
node.js python go curl
const res = await fetch('https://api.listonosh.com/v1/rpc/', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.LNS_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'messages.send',
    params: {
      from: { email: 'noreply@acme.com' },
      to:   { email: 'user@example.com' },
      subject: 'Order #3214 confirmed',
      body: { html: '<p>Thanks!</p>' },
      idempotencyKey: 'order-3214-v1',
    },
  }),
})

const { result } = await res.json()
console.log(result.id) // → 01926d4f-7a0e-7c8e-...
For developers

One API. Idempotent by default. Predictable errors.

Call messages.send twice with the same idempotencyKey — the second call returns the same message ID. Safe to retry. No double-sends.

  • Single JSON-RPC 2.0 endpoint for everything
  • Per-key rate limits with X-RateLimit-Remaining headers
  • HTTP 200 + structured error codes (no guessing from status text)
  • Scoped API keys: messages:write, events:read, etc.
  • Auto-generated SDKs from the schema — no hand-written clients

Own your sending infrastructure.

Production-ready in a weekend. One Postgres database, one binary, your DNS — and you're sending compliant, signed mail from your own IPs.