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
]