mcpbeat

Lv Assigns

oliver-kriska/claude-elixir-phoenix-opencode-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.

732 tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
514
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix --skill lv-assigns

The instruction itself

12 sections, as written by the author

LiveView Assigns Audit

Analyze LiveView socket assigns for memory efficiency, clarity, and best practices.

Iron Laws - Never Violate These

  • Use streams for lists > 100 items - Never store large lists directly in assigns
  • Use temporary_assigns for transient data - Flash messages, temp errors, notifications
  • Preload only needed fields - Don't store full Ecto schemas when only needing subset
  • Initialize all assigns in mount - Never access assigns that might not exist
  • NEVER modify assigns or code during audit — this is a read-only diagnostic; report findings only

Quick Audit Commands

Extract All Assigns

Use Grep to find all assign( and assign_new( calls in the target LiveView file.

Find Large Data Patterns

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.

Audit Checklist

1. Memory Issues

| 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 |

2. Missing temporary_assigns

Should use temporary_assigns:

  • Flash messages
  • Form errors after submission
  • One-time notifications
  • Upload progress
def mount(_params, _session, socket) do
  {:ok, socket, temporary_assigns: [flash_message: nil]}
end

3. Unused Assigns

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.

4. Missing Initialization

# 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

Memory Estimation

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 |

Usage

Run /lv-assigns path/to/live_view.ex to generate an assigns inventory with memory estimates and optimization recommendations.

How to use it

Copy the folder

Take oliver-kriska/claude-elixir-phoenix-opencode-lv-assigns from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

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.