Your email looks perfect in the React Email preview. Then Gmail strips half the CSS, and Outlook on Windows renders it with Word's engine from 2007. Nobody notices until a customer replies with a screenshot.
Frontend developers solved this problem years ago: we lint, we type-check, we run visual tests in CI. Email developers mostly still send a test to themselves and squint at it on their phone. This post shows how to close that gap for React Email projects: compile your templates in CI, lint the output against real email client support data, and fail the PR when someone introduces CSS that Outlook will eat.
Full disclosure up front: I built the linter used below, Emailens. The engine is open source (MIT), the free tier covers this workflow, and the approach works even if you swap in your own checks.
Why linting beats "send a test email"
Render-testing services like Litmus screenshot your email in real clients. That's valuable, but it's slow, costs per test, and happens late. Linting is the complement: static analysis of your compiled HTML against a database of what each client actually supports (think caniemail.com, but as a build step). It runs in seconds, costs nothing per run, and catches the boring 80% of breakage: unsupported CSS properties, missing MSO conditionals, dark mode surprises, oversized HTML that Gmail clips at 102KB.






