oliver-kriska/claude-elixir-phoenix-pi-lv-assigns
Inspect LiveView socket assigns for memory bloat — missing temporary_assigns, unused assigns, unbounded lists needing streams, memory estimates. Use when LiveView memory grows or you need to add temporary_assigns.
npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix --skill lv-assigns
Analyze LiveView socket assigns for memory efficiency, clarity, and best practices.
Use Grep to find all assign( and assign_new( calls in the target LiveView file.
Use Grep to find large data patterns: lists stored in assigns (assign.*\[\], assign.*Repo\.all) and full schema storage (assign.*Repo\.get) in the target file.
| Pattern | Problem | Solution |
|---------|---------|----------|
| assign(:items, Repo.all(...)) | Unbounded list | Use stream/3 |
| assign(:user, Repo.get!(...)) | Full schema | Select only needed fields |
| assign(:file_data, binary) | Large binary | Store reference, not data |
| Nested preloads | Excessive data | Preload only what's rendered |
Should use temporary_assigns:
def mount(_params, _session, socket) do
{:ok, socket, temporary_assigns: [flash_message: nil]}
end
Search for assigns defined but never used in templates:
Use Grep to extract all assign names (assign\(:(\w+)) from the LiveView file, then use Grep to find all @\w+ references in the corresponding .heex template. Compare to find unused assigns.
# BAD: @items might not exist
def render(assigns) do
~H"<%= for item <- @items do %>"
end
# GOOD: Initialize in mount
def mount(_params, _session, socket) do
{:ok, assign(socket, items: [])}
end
For each assign, estimate memory footprint:
| Data Type | Approx Size | Concern Level |
|-----------|-------------|---------------|
| Integer | 8 bytes | Low |
| String (100 chars) | ~200 bytes | Low |
| List of 100 maps | ~10-50 KB | Medium |
| List of 1000 items | ~100-500 KB | High |
| Binary (image) | Varies | Critical |
| Full Ecto schema | ~1-5 KB each | Medium |
Run /skill:lv-assigns path/to/live_view.ex to generate an assigns inventory with memory estimates and optimization recommendations.
Take oliver-kriska/claude-elixir-phoenix-pi-lv-assigns from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.