Claude Skills Guide

Claude Code Next.js Image Optimization Guide

Image optimization in Next.js combines the framework’s built-in Image component with modern formats like WebP and AVIF. When you pair Next.js image handling with Claude Code’s CLI capabilities, you can automate optimization workflows, validate image implementations, and maintain consistent performance across your application.

This guide covers practical approaches for developers using Claude Code for frontend work with Next.js image optimization.

Next.js Image Component Basics

The Next.js Image component (next/image) provides automatic optimization out of the box. It handles lazy loading, format conversion, and responsive sizing without manual configuration. Here’s a basic implementation:

import Image from 'next/image';

export default function Hero() {
  return (
    <div className="hero">
      <Image
        src="/hero-image.jpg"
        alt="Product showcase"
        width={1200}
        height={600}
        priority
        sizes="100vw"
      />
    </div>
  );
}

The priority prop tells Next.js to preload this image, which is essential for above-the-fold content. Without it, the browser delays loading until the image enters the viewport.

Optimizing with Claude Code and frontend-design Skill

The frontend-design skill helps you structure image-heavy pages correctly. When you need to build a gallery or product listing, describe your requirements to Claude:

Create a product gallery component with Next.js Image.
Include responsive layouts for mobile and desktop.
Use the sizes prop correctly for different breakpoints.

Claude will generate a component like this:

import Image from 'next/image';
import styles from './ProductGallery.module.css';

export default function ProductGallery({ products }) {
  return (
    <div className={styles.gallery}>
      {products.map((product) => (
        <div key={product.id} className={styles.card}>
          <Image
            src={product.image}
            alt={product.name}
            width={400}
            height={300}
            sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
            placeholder="blur"
            blurDataURL={product.blurHash}
          />
          <h3>{product.name}</h3>
        </div>
      ))}
    </div>
  );
}

The sizes prop is critical here. It tells the browser how wide the image will be at different viewport widths, allowing Next.js to serve appropriately sized images. Without it, Next.js defaults to serving full-width images, defeating the optimization benefits.

Static Image Handling

For images stored in your repository, place them in the public folder. Next.js treats these as static assets:

// Images in public/images/logo.png
import Image from 'next/image';

export function Logo() {
  return (
    <Image
      src="/images/logo.png"
      alt="Company logo"
      width={200}
      height={60}
    />
  );
}

When working with static images, you can also use the unoptimized prop for external CDNs that already handle optimization:

<Image
  src="https://cdn.example.com/image.jpg"
  alt="External image"
  width={800}
  height={600}
  unoptimized
/>

This skips Next.js optimization entirely, useful when your CDN handles format conversion and resizing.

Remote Images Configuration

Next.js requires explicit domain configuration for remote images. Update your next.config.js:

/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'images.unsplash.com',
        pathname: '/**',
      },
      {
        protocol: 'https',
        hostname: 'cdn.yourdomain.com',
        pathname: '/**',
      },
    ],
  },
};

module.exports = nextConfig;

This configuration allows Next.js to fetch and optimize images from these domains. Without proper configuration, the Image component rejects remote URLs.

Testing Image Implementations

The tdd skill helps you write tests for image components through a test-driven pipeline. Describe your testing requirements:

Write tests for the ProductGallery component.
Verify that images have correct alt text.
Check that the sizes prop renders correctly.
Test that placeholder blur works.

A resulting test might look like:

import { render, screen } from '@testing-library/react';
import ProductGallery from './ProductGallery';

const mockProducts = [
  { id: 1, name: 'Product 1', image: '/img1.jpg', blurHash: 'L6PZfSi_.AyE_3t7t7R**0o#DgR4' },
  { id: 2, name: 'Product 2', image: '/img2.jpg', blurHash: 'LGF5]+Yk^6#M@-5c,1J5@[or[Q6.' },
];

describe('ProductGallery', () => {
  it('renders all product images with alt text', () => {
    render(<ProductGallery products={mockProducts} />);
    
    const images = screen.getAllByRole('img');
    expect(images).toHaveLength(2);
    expect(images[0]).toHaveAttribute('alt', 'Product 1');
  });

  it('includes sizes attribute', () => {
    render(<ProductGallery products={mockProducts} />);
    
    const image = screen.getByRole('img');
    expect(image).toHaveAttribute('sizes');
  });
});

Running tests through Claude’s TDD workflow ensures your image components work correctly before deployment.

Image Formats and Quality Settings

Next.js automatically converts images to WebP or AVIF based on browser support. AVIF offers better compression but takes longer to generate. Configure your preference in next.config.js:

const nextConfig = {
  images: {
    formats: ['image/avif', 'image/webp'],
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048],
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
};

The deviceSizes array defines breakpoints for responsive images, while imageSizes defines widths for intermediate srcset values. Adjust these based on your design’s actual breakpoints.

Automating Image Workflows

You can combine Claude Code with build scripts to automate image processing. For example, generate blur placeholders during your build process:

// scripts/generate-blur.js
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');

async function generateBlurHash(imagePath) {
  const buffer = fs.readFileSync(imagePath);
  const { data } = await sharp(buffer)
    .resize(10, 10, { fit: 'inside' })
    .raw()
    .toBuffer({ resolveWithObject: true });
  
  // Return base64 placeholder
  return `data:image/jpeg;base64,${buffer.toString('base64')}`;
}

Run this script through Claude to process your entire images directory:

Run the blur placeholder generation script on all product images.
Output the results to a JSON file for use in components.

Summary

Next.js image optimization works best when you understand the component’s key features: the priority prop for above-the-fold content, the sizes prop for responsive images, and proper remote domain configuration. After optimizing images, you can deploy your Next.js app with confidence using Claude Code’s Vercel deployment workflow. Using Claude Code with skills like frontend-design and tdd accelerates development while maintaining quality through tested implementations.

Built by theluckystrike — More at zovo.one