Claude Skills Guide

Fresh is Deno’s official web framework—a modern, island-based framework that delivers zero-config TypeScript applications with excellent performance. Combined with Claude Code, the AI-powered CLI companion, you can accelerate Fresh development significantly. This guide walks you through practical workflows to build, debug, and deploy Fresh applications using Claude Code.

Why Combine Fresh with Claude Code?

Fresh embraces Deno’s philosophy: simple, secure, and TypeScript-first. The framework uses islands—interactive components that hydrate on the client while the rest of your page remains static. This architecture reduces JavaScript payloads and improves load times.

Claude Code enhances this developer experience by providing:

Together, they create a powerful workflow for modern web development.

Setting Up Your Fresh Project with Claude Code

Before diving into workflows, ensure you have Deno and Claude Code installed. Initialize a Fresh project:

deno run -A -r https://fresh.deno.dev my-fresh-app
cd my-fresh-app

Now, when working with Claude Code in your Fresh project, provide context about your Fresh setup. A helpful prompt:

I'm working on a Fresh Deno project with islands in the islands/ directory and routes in routes/. Help me create a new page with an interactive form island.

Claude Code understands Fresh’s directory structure and can generate appropriate code.

Creating Routes and Pages

Fresh uses file-based routing. Routes in the routes/ directory become your application’s endpoints. Here’s how Claude Code helps:

Example: Building a Todo Route

Ask Claude Code to generate a todo route with an interactive island:

Create a todo list page at routes/todos.tsx with an island at islands/TodoList.tsx that allows adding, completing, and deleting todos.

Claude Code produces both files:

routes/todos.tsx:

import { PageProps } from "$fresh/server.ts";
import TodoList from "../islands/TodoList.tsx";

export default function TodosPage({ url }: PageProps) {
  return (
    <>
      <h1>My Todos</h1>
      <TodoList />
    </>
  );
}

islands/TodoList.tsx:

import { useState } from "preact/hooks";

interface Todo {
  id: number;
  text: string;
  completed: boolean;
}

export default function TodoList() {
  const [todos, setTodos] = useState<Todo[]>([]);
  const [input, setInput] = useState("");

  const addTodo = () => {
    if (!input.trim()) return;
    setTodos([...todos, { id: Date.now(), text: input, completed: false }]);
    setInput("");
  };

  const toggleTodo = (id: number) => {
    setTodos(todos.map(t => t.id === id ? { ...t, completed: !t.completed } : t));
  };

  const deleteTodo = (id: number) => {
    setTodos(todos.filter(t => t.id !== id));
  };

  return (
    <div>
      <input
        type="text"
        value={input}
        onInput={(e) => setInput(e.currentTarget.value)}
        placeholder="Add a todo..."
      />
      <button onClick={addTodo}>Add</button>
      <ul>
        {todos.map(todo => (
          <li key={todo.id}>
            <input
              type="checkbox"
              checked={todo.completed}
              onChange={() => toggleTodo(todo.id)}
            />
            <span style={{ textDecoration: todo.completed ? "line-through" : "none" }}>
              {todo.text}
            </span>
            <button onClick={() => deleteTodo(todo.id)}>Delete</button>
          </li>
        ))}
      </ul>
    </div>
  );
}

This pattern—static route with interactive island—exemplifies Fresh’s island architecture.

Working with Fresh Components and Layouts

Fresh provides reusable components in the components/ directory. These render on the server and send HTML to the client. Claude Code helps create consistent components:

Example: Creating a Layout Component

Request a shared layout:

Create a layout component at components/Layout.tsx that wraps pages with a header containing navigation links and a main content area with consistent styling.

Claude Code generates:

import { ComponentChildren } from "preact";

interface LayoutProps {
  children: ComponentChildren;
  title?: string;
}

export default function Layout({ children, title = "My App" }: LayoutProps) {
  return (
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>{title}</title>
      </head>
      <body>
        <header>
          <nav>
            <a href="/">Home</a>
            <a href="/todos">Todos</a>
            <a href="/about">About</a>
          </nav>
        </header>
        <main>
          {children}
        </main>
      </body>
    </html>
  );
}

Apply this layout in your routes using Fresh’s wrap function or by importing directly.

Debugging Fresh Applications

Claude Code excels at debugging. When encountering issues:

  1. Share error messages directly - Paste the error and ask for analysis
  2. Request debugging steps - Ask Claude to explain what’s happening
  3. Get help with Deno imports - Clarify import paths and module resolutions

Common Fresh debugging scenarios:

Example debugging prompt:

I'm getting 'Cannot read property of undefined' when clicking my island button. The island imports useState from preact/hooks. What could be wrong?

Claude Code analyzes your code and identifies potential causes—often related to island-client boundary issues or missing exports.

Integrating APIs and Data Fetching

Fresh handles server-side data fetching through route handlers. Use the handler export:

import { Handlers, PageProps } from "$fresh/server.ts";

interface Data {
  users: string[];
}

export const handler: Handlers<Data> = {
  async GET(_req, ctx) {
    const users = await fetchUsers(); // Your data fetching logic
    return ctx.render({ users });
  },
};

export default function Home({ data }: PageProps<Data>) {
  return (
    <ul>
      {data.users.map(user => <li>{user}</li>)}
    </ul>
  );
}

Claude Code can generate complete API integrations—database queries, external API calls, form handling—with proper error handling.

Deployment with Deno Deploy

Fresh deploys effortlessly to Deno Deploy. Claude Code helps with:

Example deployment prompt:

How do I configure Deno KV for persistent storage in my Fresh app and what permissions do I need in deno.json?

Best Practices for Fresh Development with Claude Code

  1. Use islands sparingly - Only interactive components need island hydration; everything else should be static

  2. Leverage type safety - Fresh and Deno provide excellent TypeScript support; use it fully

  3. Structure routes logically - Group related routes in directories for maintainability

  4. Test islands independently - Islands are preact components; test them in isolation

  5. Cache intelligently - Use Fresh’s built-in caching for static content

Conclusion

Claude Code and Fresh form a powerful combination for modern web development. Fresh’s island architecture delivers fast, minimal JavaScript applications, while Claude Code accelerates your workflow through intelligent code generation, debugging, and refactoring.

Start with a simple route, add an interactive island, and progressively enhance your application. Claude Code guides you through each step, ensuring you follow Fresh best practices while maintaining full control over your codebase.

Explore Fresh’s rich ecosystem—integrations with Tailwind, database adapters, and middleware—while letting Claude Code handle the boilerplate and accelerate your productivity.

Built by theluckystrike — More at zovo.one