Ecto-shaped facade over Dust — DustEcto.Schema plus DustEcto.Repo,
designed to feel like the parts of Ecto.Schema and Ecto.Repo that
map cleanly onto Dust's flat KV model.
See the design doc at docs/plans/2026-05-10-dust-ecto-design.md in
the dust monorepo for the rationale, scope, and trade-offs.
Quick start
defmodule MyApp.Reading.Link do
use DustEcto.Schema,
prefix: ["links"],
required: [:slug, :title, :url]
embedded_schema do
field :title, :string
field :url, :string
field :note, :string
end
def changeset(link, attrs) do
link
|> cast(attrs, [:slug, :title, :url, :note])
|> validate_required(__dust_required_fields__())
|> validate_dust_slug(:slug)
end
end
# Configure once at startup:
# config :dustlayer_ecto,
# store: System.get_env("DUST_STORE"),
# dust_facade: MyApp.Dust # WS-mode (recommended)
# # OR for HTTP-only:
# # base_url: "https://dustlayer.io",
# # token: System.get_env("DUST_TOKEN")
Reading.Link.changeset(%Reading.Link{}, %{slug: "x", title: "X", url: "http://x"})
|> DustEcto.Repo.insert()
# => {:ok, %Reading.Link{...}}