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_admindependency 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
endStart 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
endEnd-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>.pngtmp/mailglass_admin_preview_capture/manifest.jsontmp/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.