The preview surface runs in dev and uses Mailglass.Renderer, the shared production renderer used for direct rendering, synchronous send preparation, and asynchronous send preparation. Its HTML and text therefore observe the same explicit-text precedence, automatic-plaintext switch, and CSS-inliner switch.

For HTML-only mail, renderer.plaintext: true generates plaintext and false leaves it absent; nonblank authored plaintext is preserved in either case. renderer.css_inliner: :premailex inlines CSS, while :none skips only CSS inlining and keeps HEEx rendering plus data-mg-* stripping.

This is renderer parity, not a provider dispatch promise: Phase 149 does not claim private-envelope fidelity, atomic durable enqueue, provider-wire equivalence, dispatch outcomes, or payload lifecycle. Those boundaries belong to Phases 150 and 151.

The screenshot capture workflow is for preview-pipeline confidence only. It does not claim cross-client parity across Outlook/Gmail/Apple Mail.

Prerequisites

  • mailglass_admin dependency available in :dev
  • Router mounted behind your dev-only routes

Mount preview routes

defmodule MyAppWeb.Router do
  use Phoenix.Router
  import MailglassAdmin.Router

  if Application.compile_env(:my_app, :dev_routes) do
    scope "/dev" do
      pipe_through :browser
      mailglass_admin_routes "/mail"
    end
  end
end

Start and open preview

mix phx.server
# open http://localhost:4000/dev/mail

Add preview props on a mailable

defmodule MyApp.UserMailer do
  use Mailglass.Mailable, stream: :transactional

  @impl Mailglass.Mailable
  def preview_props do
    [name: "Alice", email: "alice@example.com"]
  end
end

End-to-End Example

mix phx.server

Deterministic capture workflow

Use one maintainer command to capture a deterministic screenshot matrix from the same /dev/mail preview route:

cd mailglass_admin
mix mailglass_admin.preview.capture \
  --base-url http://localhost:4000/dev/mail \
  --output-dir tmp/mailglass_admin_preview_capture

Default matrix dimensions:

  • Widths: 375, 768, 1024
  • Themes: light, dark
  • Scenarios: discovered from each mailable's preview_props/0

Dry-run before capture

Dry-run prints the matrix and still writes deterministic contract artifacts:

cd mailglass_admin
mix mailglass_admin.preview.capture \
  --dry-run \
  --base-url http://localhost:4000/dev/mail \
  --output-dir tmp/mailglass_admin_preview_capture

Artifact contract

The command writes:

  • tmp/mailglass_admin_preview_capture/<mailable>--<scenario>--w<width>--<theme>.png
  • tmp/mailglass_admin_preview_capture/manifest.json
  • tmp/mailglass_admin_preview_capture/checkpoint.json

manifest.json and checkpoint.json use schema version preview_capture.v1 and include bounded language: preview-pipeline confidence only; not cross-client parity.