Documentation

Learn how to use PhoenixPrerender in your Phoenix application

prerendered

This page and all /docs/* pages are prerendered using scoped route discovery.

Scoped Prerendering

All documentation pages are prerendered using a scoped route block. Dead views inside prerender do automatically get prerender: true injected. LiveView routes pass through unchanged and require explicit metadata.

# Scoped prerendered routes (dead views)
scope "/docs", DemoWeb do
  pipe_through :browser

  prerender do
    get "/", DocsController, :index
    get "/getting-started", DocsController, :getting_started
    get "/terms", DocsController, :terms
  end
end

# LiveView routes with per-route metadata
scope "/", DemoWeb do
  pipe_through :browser

  prerender do
    live "/changelog", ChangelogLive, :index,
      metadata: %{prerender: :bots_only}
    live "/status", StatusLive, :index,
      metadata: %{prerender: :always, isr: true}
  end
end

Route discovery uses Phoenix.Router.routes/1 and matches any truthy value for the :prerender metadata key. Scope prefixes are automatically applied to the canonical path.

Manifest-Driven Serving

After generation, each page's prerender_mode and isr flag are written to manifest.json. At serve time, the plug reads these values to decide per-route behavior:

  • prerender_mode: "true" — serve to all clients
  • prerender_mode: "bots_only" — serve only to crawlers
  • prerender_mode: "always" — serve to all with fresh CSRF token
  • isr: true — trigger background regeneration when stale