Claude Skill

lv-assigns

Inspect LiveView socket assigns for memory bloat — missing temporary_assigns,

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download oliver-kriska-claude-elixir-phoenix-targets_amp_skills_lv-assigns-9767a82.zip · 1 KB
Part of oliver-kriska/claude-elixir-phoenix — 93 skills

Install

skills CLI npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix/tree/main/targets/amp/skills/lv-assigns
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install oliver-kriska-claude-elixir-phoenix@llmmart
Git git clone https://github.com/oliver-kriska/claude-elixir-phoenix.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole oliver-kriska/claude-elixir-phoenix collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

LiveView Assigns Audit

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

Iron Laws - Never Violate These

  1. Use streams for lists > 100 items - Never store large lists directly in assigns
  2. Use temporary_assigns for transient data - Flash messages, temp errors, notifications
  3. Preload only needed fields - Don't store full Ecto schemas when only needing subset
  4. Initialize all assigns in mount - Never access assigns that might not exist
  5. 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.

Files (claude-elixir-phoenix)
  • SKILL.md 2.9 KB
    ---
    name: lv-assigns
    description: 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.
    ---
    
    # LiveView Assigns Audit
    
    Analyze LiveView socket assigns for memory efficiency, clarity, and best practices.
    
    ## Iron Laws - Never Violate These
    
    1. **Use streams for lists > 100 items** - Never store large lists directly in assigns
    2. **Use temporary_assigns for transient data** - Flash messages, temp errors, notifications
    3. **Preload only needed fields** - Don't store full Ecto schemas when only needing subset
    4. **Initialize all assigns in mount** - Never access assigns that might not exist
    5. **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
    
    ```elixir
    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
    
    ```elixir
    # 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.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related