Browser-only tool to quickly inspect a domain’s email authentication posture (DMARC/SPF/DKIM, plus related checks) using public DNS only.
This repo is a static site (HTML/CSS/JS). You can open it locally or publish it via GitHub Pages.
It also includes a DMARC RUA service description page and an operational workflow for managing the required external-destination authorization TXT records on Cloudflare.
- Public repo:
mainis the only production branch. - GitHub Pages deploys from
mainvia.github/workflows/pages.yml. - Releases are cut from
mainusing annotated tags (for example:v0.1.0). - Keep non-public or experimental work in a separate private remote/repo instead of a public
developbranch.
- DMARC / SPF / DKIM quick checks (with evidence snippets)
- Optional: DNSBL sender-IP quick check (best-effort)
- Optional: BIMI lookup (
_bimi.<domain>), parsesl=(logo URL) anda= - MTA-STS / TLS-RPT, MX, CAA, DNSSEC indicators, lightweight HTTPS probes
- Installable PWA shell for repeat use on desktop/mobile
- Multi-language UI (language selector)
- This tool does not send email and does not access mailboxes.
- It queries public DNS via DNS-over-HTTPS (DoH) endpoints.
- No server-side component: input is processed in your browser.
- Network requests go to:
- DoH endpoints (selected in the UI; default: Cloudflare)
rdap.org(registrar lookup, public build only)- The checked domain itself for lightweight HTTPS reachability probes
- (Optional) BIMI logo URL (only if it is
https://)
- Standards and privacy position: https://dmarc4all.toppymicros.com/standards_privacy.html
- DNS provider setup notes: https://dmarc4all.toppymicros.com/dns_provider_guides.html
- IETF DMARC watch: track DMARCbis, DMARC Aggregate Reporting, and DMARC Failure Reporting; separate standards guidance from provider-specific behavior when they differ.
- IETF/WG sharing position: this is a public-DNS-only implementation aid, not a replacement for the specifications or a receiver-side conformance test. Feedback is especially useful on wording accuracy, RUA/RUF privacy guidance, and enforcement-readiness criteria.
- Curated LLM index: https://dmarc4all.toppymicros.com/llms.txt
- Detailed machine context: https://dmarc4all.toppymicros.com/llms-full.txt
- AI usage and safety guidance: https://dmarc4all.toppymicros.com/ai_usage.html
- Portable diagnosis schema: https://dmarc4all.toppymicros.com/schemas/diagnosis-result.schema.json
- Example diagnosis report: https://dmarc4all.toppymicros.com/examples/diagnosis-result.example.json
The browser's JSON export uses the versioned dmarc4all-diagnosis format and omits presentation HTML. It separates observations, readiness, remediation, evidence, limitations, and errors so automated consumers do not need to scrape the results page.
DMARC4all does not currently expose a public diagnosis API or MCP endpoint. Suggested records are review drafts and must not be applied automatically.
Option A (simplest): open index.html directly.
Option B (recommended): run a local static server.
cd DMARC4all
python3 -m http.server 8000Then open:
- Push this repository to GitHub.
- Keep
mainas the default branch and production branch. - In GitHub: Settings → Pages
- Set:
- Source: “GitHub Actions”
- Push to
main(or run Actions → Deploy static content to Pages viaworkflow_dispatch). - After the workflow finishes, open the Pages URL shown in the deploy job (or in Settings → Pages).
Current public site: https://dmarc4all.toppymicros.com/
- The public site can be installed as a PWA from supported browsers.
- The service worker caches the local app shell and translation assets for faster repeat visits.
- If the shell is opened without connectivity, it falls back to
offline.htmland explains that live DNS/RDAP checks still need network access. - When a new shell is available, the app shows an in-page reload prompt instead of silently staying on an old cache.
- DNS lookups, RDAP lookups, and other live diagnostics still require network access and are not served from cache.
Create releases from main only.
git checkout main
git pull --ff-only origin main
git tag -a v0.1.0 -m "v0.1.0"
git push origin main --follow-tags
gh release create v0.1.0 --generate-notesRun the lightweight regression suite with:
npm testThis runs:
- Node built-in tests for the extracted JS modules
- Python
unittestcoverage for the Cloudflare TXT management script
- Service page:
rua_service.html - Config (single source of truth):
rua_config.js(customer-facing destination is injected at runtime) - Translations:
i18n/rua_page.js
flowchart LR
A[Recipient mail servers] -- Aggregate reports (XML, zipped) --> B[RUA mailbox]
B --> C[Intake + quarantine]
C --> D[XML validation + parse]
D --> E[Aggregate metrics]
E --> F[Dashboards/alerts]
D --> G[(KV/D1/R2 storage)]
C --> H[Reject oversized/zip-bomb payloads]
Workflow: .github/workflows/manage-rua-auth-txt.yml (workflow_dispatch)
Implementation script: .github/scripts/manage_rua_auth_txt.py
- Name:
<customer_domain>._report._dmarc.dmarc4all.toppymicros.com - Type:
TXT - Value:
v=DMARC1
Required secrets:
CF_API_TOKENCF_ZONE_ID
The job is intended to be protected via the GitHub Environment cloudflare-dns.
- Public repo: keep only Worker code,
public/index.html, README, and templates (HTML/webloc). - Secrets: GitHub Actions Secrets (CI) + Cloudflare Worker Secrets (production).
- Operational logs: keep in KV/D1/R2 (not in the repo).
Mail receiving and R2 storage are handled on Cloudflare side.
- Results are best-effort. DNS responses can vary by resolver and network restrictions.
- DKIM “CNAME present” does not guarantee DKIM is actively signing/validating; confirm via real message headers.
- DNSBL checks are heuristic and may be blocked by your network.
Apache License 2.0 (Apache-2.0). See LICENSE.
This tool sends DNS queries for the entered domain to the selected DNS-over-HTTPS (DoH) provider. That provider may log and/or aggregate queries according to its policy. If you want to minimize third-party visibility, select a DoH endpoint you control in the UI, or modify the DoH provider list in app.js.
- Entry points:
index_enterprise.html,rua_service_enterprise.html - External requests are limited to the selected DoH endpoint (no CDN/Google Fonts).
- RDAP lookups and external BIMI logo fetches are disabled to reduce third-party traffic.
src/core.js: UI wiring, resolver selection, and submit flowsrc/diagnose.js: main diagnosis runner/orchestrationsrc/diagnostics.js: DNS/network/protocol helper functionssrc/render.js: findings, report sections, exports, and DNSBL renderingsrc/portable-report.js: stable machine-readable diagnosis exportsrc/i18n.js: translation state and helpers
- Service/approach spec:
docs/service-spec.md