Curated library of 38 atomic skills, 7 personas, and 1 orchestrator for Elixir and Phoenix development. Organized by category: fundamentals, phoenix, database, testing, auth, infrastructure, quality, security, integrations, tooling, frameworks, personas, and orchestration. Covers core Elixir patterns, Phoenix LiveView, Ecto, OTP, Oban, testing, security, deployment, real-time, and modern tooling (Req, Swoosh, Cachex, Broadway, Ash).
73
91%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Use this skill when extending phx.gen.auth with custom fields.
registration_changeset to cast and validate new fields — don't create a separate changesetconfirmed_at or tests will failsave/2 handler — the form must send the fieldunique_constraint + database unique index for uniqueness — never validate in application code alone# Generate auth with LiveView (recommended)
mix phx.gen.auth Accounts User usersmix ecto.gen.migration add_username_to_usersdefmodule MyApp.Repo.Migrations.AddUsernameToUsers do
use Ecto.Migration
def change do
alter table(:users) do
add :username, :string, null: false
end
create unique_index(:users, [:username])
end
end# Run migration and verify success before proceeding
mix ecto.migratedefmodule MyApp.Accounts.User do
schema "users" do
field :email, :string
field :username, :string # Add new field
field :password, :string, virtual: true, redact: true
field :hashed_password, :string, redact: true
field :confirmed_at, :utc_datetime
timestamps()
end
# Update registration_changeset to include username
def registration_changeset(user, attrs, opts \\ []) do
user
|> cast(attrs, [:email, :username, :password])
|> validate_required([:username])
|> validate_username()
|> validate_email(opts)
|> validate_password(opts)
end
defp validate_username(changeset) do
changeset
|> validate_required([:username])
|> validate_format(:username, ~r/^[a-zA-Z0-9_]+$/,
message: "only letters, numbers, and underscores"
)
|> validate_length(:username, min: 3, max: 30)
|> unsafe_validate_unique(:username, MyApp.Repo)
|> unique_constraint(:username)
end
enddef user_fixture(attrs \\ %{}) do
{:ok, user} =
attrs
|> Enum.into(%{
email: "user#{System.unique_integer([:positive])}@example.com",
username: "user#{System.unique_integer([:positive])}", # Add username
password: "hello world!",
confirmed_at: DateTime.utc_now(:second) # Confirm for tests
})
|> MyApp.Accounts.register_user()
user
end# Verify fixtures pass before updating forms
mix test<.simple_form for={@form} phx-change="validate" phx-submit="save">
<.input field={@form[:username]} type="text" label="Username" />
<.input field={@form[:email]} type="email" label="Email" />
<.input field={@form[:password]} type="password" label="Password" />
<:actions>
<.button>Register</.button>
</:actions>
</.simple_form>