Claude Skills Guide

Claude Code Phoenix LiveView Workflow Guide

Building real-time web applications with Phoenix LiveView becomes significantly more productive when you use Claude Code effectively. This guide provides practical workflows for developing Phoenix LiveView applications with Claude Code, covering project setup, component development, state management, and testing patterns that work well with AI-assisted development.

Setting Up Your Phoenix LiveView Project

When starting a new Phoenix LiveView project, you can use Claude Code to accelerate the initial setup and configuration. Begin by creating your Phoenix application using the standard generator:

mix phx.new my_app --live
cd my_app

Once your project is initialized, ask Claude Code to review the generated structure and identify key files you’ll be working with. A prompt like “What are the key files in this LiveView project and their purposes?” helps establish context for subsequent work.

For teams working with multiple environments, Claude Code excels at generating environment-specific configurations. The supermemory skill can track your development patterns across projects, making it easier to maintain consistent setups.

Developing LiveView Components

LiveView’s component model requires understanding both the Elixir backend and the template layer. Claude Code can help bridge this gap by explaining how data flows between your LiveView modules and their corresponding HEEx templates.

When creating a new LiveView component, structure your prompts to focus on specific functionality:

Instead of:

“Create a user management feature”

Use:

“Create a LiveView for managing users with a list view, inline editing, and real-time search. Include proper form validation and handle the socket assigns correctly.”

This specificity helps Claude Code generate more accurate code. Here’s a practical example of a search-enabled LiveView component:

defmodule MyAppWeb.UserLive.Index do
  use MyAppWeb, :live_view

  alias MyApp.Accounts

  @impl true
  def mount(_params, _session, socket) do
    {:ok, stream(:users, Accounts.list_users()), socket}
  end

  @impl true
  def handle_event("search", %{"query" => query}, socket) do
    users = Accounts.search_users(query)
    {:noreply, stream(socket, :users, users, reset: true)}
  end
end

The frontend-design skill can assist with styling your LiveView components, suggesting Tailwind classes or CSS patterns that work well with LiveView’s reactive updates.

State Management Patterns

Phoenix LiveView offers several state management approaches, and choosing the right one impacts your application’s maintainability. Claude Code can help you evaluate which pattern fits your use case.

Assigns-Based State

For simple components, using socket assigns directly provides the clearest approach:

def handle_event("increment", _params, socket) do
  new_count = socket.assigns.count + 1
  {:noreply, assign(socket, count: new_count)}
end

Agent-Based State

For complex state that benefits from encapsulation, agents work well:

def mount(_params, _session, socket) do
  agent = Agent.start_link(fn -> %{} end)
  {:ok, assign(socket, cart: agent)}
end

ETS for Shared State

When multiple LiveViews need to share state, ETS provides a performant solution:

def mount(_params, _session, socket) do
  :ets.insert(:sessions, {self(), %{}})
  {:ok, socket}
end

The tdd skill proves valuable when developing these state management patterns, helping you write tests that verify state transitions correctly.

Handling Real-Time Updates

LiveView’s strength lies in its real-time capabilities. Claude Code can help you implement pubsub patterns and handle the various update scenarios efficiently.

For broadcasting updates across LiveViews:

def broadcast_user_update(user) do
  MyAppWeb.Endpoint.broadcast("users:lobby", "user_updated", %{
    id: user.id,
    name: user.name
  })
end

Then subscribe in your LiveView:

@impl true
def mount(_params, _session, socket) do
  if connected?(socket) do
    MyAppWeb.Endpoint.subscribe("users:lobby")
  end
  {:ok, socket}
end

@impl true
def handle_info(%{event: "user_updated", payload: user}, socket) do
  {:noreply, stream_insert(socket, :users, user)}
end

Form Handling and Validation

Working with forms in LiveView requires understanding the form struct and proper error handling. Claude Code can generate robust form components with validation:

def handle_event("save", %{"user" => user_params}, socket) do
  case Accounts.create_user(user_params) do
    {:ok, user} ->
      {:noreply,
       socket
       |> put_flash(:info, "User created successfully")
       |> push_navigate(to: ~p"/users/#{user}")}

    {:error, %Ecto.Changeset{} = changeset} ->
      {:noreply, assign(socket, form: to_form(changeset))}
  end
end

The pdf skill can be useful when generating reports from LiveView data, allowing you to create downloadable PDF documents from your real-time interfaces.

Testing LiveView Applications

Testing LiveView requires understanding both the controller-style testing and the JavaScript-equivalent browser testing. Claude Code with the tdd skill can help structure your tests effectively.

Unit testing LiveView modules:

defmodule MyAppWeb.UserLiveTest do
  use MyAppWeb.ConnCase
  import Phoenix.LiveViewTest

  test "renders user list", %{conn: conn} do
    {:ok, _view, html} = live(conn, "/users")
    assert html =~ "Listing Users"
  end
end

For more comprehensive testing, consider using Wallaby for browser-based tests that verify JavaScript interactions and real-time updates.

Performance Optimization

As your LiveView application grows, performance considerations become important. Claude Code can analyze your code and suggest optimizations:

  1. Lazy loading: Use live_render with the live_session option to load components only when needed
  2. Optimistic UI: Implement optimistic updates to reduce perceived latency
  3. Payload reduction: Send only the necessary data in assigns, avoiding large structs
  4. Connection management: Properly handle connected? checks for WebSocket-only functionality
# Optimistic update example
def handle_event("toggle", %{"id" => id}, socket) do
  item = get_item(socket, id)
  new_status = not item.status

  # Optimistically update UI
  socket = stream_insert(socket, :items, %{item | status: new_status}, at: -1)

  # Perform actual update
  case update_status(item, new_status) do
    {:ok, updated} ->
      {:noreply, stream_insert(socket, :items, updated, at: -1)}

    {:error, _} ->
      # Revert on failure
      {:noreply, stream_insert(socket, :items, item, at: -1)}
  end
end

Deployment Considerations

When deploying Phoenix LiveView applications, ensure your deployment pipeline accounts for the WebSocket connections. Claude Code can help you generate appropriate Docker configurations and deployment scripts.

Key deployment factors include:

Conclusion

Claude Code transforms Phoenix LiveView development by providing intelligent code generation, pattern suggestions, and testing assistance. The key is structuring your prompts with specific requirements rather than broad requests. Combine Claude Code with skills like tdd for testing, frontend-design for styling, and supermemory for context retention to build robust LiveView applications efficiently.

For Elixir developers transitioning from other frameworks, Claude Code helps bridge knowledge gaps by explaining Phoenix-specific patterns and idioms. The combination of real-time capabilities with AI-assisted development creates a powerful workflow for building modern web applications.

Built by theluckystrike — More at zovo.one