The examples below use the same small sample application to demonstrate different output formats and configuration options.

ConfigurationFormatSourceRendered
DefaultDBMLDocument
DefaultDOTDocumentSVG
DefaultQuickDBDDocument
DefaultPlantUMLDocumentSVG
DefaultMermaidDocument
DefaultD2DocumentSVG
Field commentsMermaidDocument
No fieldsDOTDocument
No fieldsMermaidDocument
No fieldsD2Document
Contexts as clustersDBMLDocument
Contexts as clustersDOTDocument
Contexts as clustersPlantUMLDocument
Contexts as clustersD2Document

Rendered demos

DOT

Default DOT entity-relationship diagram

D2

Default D2 entity-relationship diagram

PlantUML

Default PlantUML entity-relationship diagram

Configuration files

Default

No configuration file is needed.

Field comments

# .ecto_erd.exs
alias Ecto.ERD.{Field, Node}
alias Ecto.ERD.Example.Accounts.User

[
  map_node: fn
    %Node{schema_module: User} = node ->
      update_in(node.fields, fn fields ->
        Enum.map(fields, fn
          %Field{name: :email} = field -> %{field | comment: "Unique sign-in address"}
          field -> field
        end)
      end)

    node ->
      node
  end
]

No fields

# .ecto_erd.exs
[
  columns: []
]

Contexts as clusters

# .ecto_erd.exs
alias Ecto.ERD.Node

[
  map_node: fn
    %Node{schema_module: schema_module} = node when not is_nil(schema_module) ->
      case Module.split(schema_module) do
        ["Ecto", "ERD", "Example", context | _] -> Node.set_cluster(node, context)
        _ -> node
      end

    node ->
      node
  end
]