# deno-frontend

Guides frontend development on Deno. Helps run npm frameworks like Vite or Next.js and build island-based apps with Fresh 2.x.

- skill · `type=skill` · Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode · 408 installs · ★ 102
- Author: denoland
- License: MIT · policy=mirror · the beginning of the file is at the end of this page
- Source: https://github.com/denoland/skills/tree/HEAD/skills/deno-frontend/SKILL.md
- Updated: 2026-07-29
- HTML: https://affpapa.org/en/nevibecode/skills/deno-frontend

## What it does

The skill directs the agent on two distinct web paths under Deno. For regular npm frameworks such as Astro or React with Vite, it enforces standard workflows. The agent uses `deno create`, `deno install`, and `deno task dev` without creating runtime-specific wrappers. Routing logic stays framework-specific.

The alternative path covers Fresh 2.x, Deno's Vite-based server framework. The skill outlines file-based routing in `routes/`, server components, and isolated Preact islands in `islands/` that ship minimal client JavaScript. It also covers Fresh 1.x migrations.

Next.js requires `"nodeModulesDir": "auto"` in `deno.json` to function properly. In Fresh, island component props must be serializable, meaning you cannot pass functions directly to islands.

## Install

### Claude Code (native platform)

1. **Skills CLI (Vercel)**
```bash
npx skills add denoland/skills --skill deno-frontend -a claude-code
```

2. **Manually: put the files in place**
- File: `~/.claude/skills/deno-frontend/SKILL.md` — Copy the whole skill folder; for one project use .claude/skills/deno-frontend/

### Codex

1. **Skills CLI (Vercel)**
```bash
npx skills add denoland/skills --skill deno-frontend -a codex
```

2. **Manually: put the files in place**
- File: `.agents/skills/deno-frontend/SKILL.md` — For all projects use ~/.agents/skills/

### Cursor

1. **Skills CLI (Vercel)**
```bash
npx skills add denoland/skills --skill deno-frontend -a cursor
```

2. **Manually: put the files in place**
- File: `.cursor/skills/deno-frontend/SKILL.md` — Cursor also reads .agents/skills/ and .claude/skills/

### GitHub Copilot

1. **GitHub CLI**
```bash
gh skill install denoland/skills deno-frontend
```

2. **Manually: put the files in place**
- File: `.github/skills/deno-frontend/SKILL.md`

### Gemini CLI

1. **Skills CLI (Vercel)**
```bash
npx skills add denoland/skills --skill deno-frontend -a gemini-cli
```

2. **Platform CLI**
```bash
gemini skills install https://github.com/denoland/skills --path skills/deno-frontend
```

### Windsurf (Devin Desktop)

**Manually: put the files in place**
- File: `.devin/skills/deno-frontend/SKILL.md` — The legacy .windsurf/skills/ path still works

### OpenCode

**Skills CLI (Vercel)**
```bash
npx skills add denoland/skills --skill deno-frontend -a opencode
```

### Claude.ai

**Claude.ai**
- Zip the folder and upload it in Settings → Capabilities → Skills

Where a file is given instead of a command, copy the files from the source to that path: https://github.com/denoland/skills/tree/HEAD/skills/deno-frontend/SKILL.md

## When to use it
- scaffold a Vite or Next.js app using Deno CLI commands
- build server-rendered pages with Fresh 2.x island architecture
- manage interactive client state with Preact signals in `islands/`
- migrate an existing app from Fresh 1.x to Fresh 2.x

## Example prompts
- Initialize a new React app with Vite running on Deno
- Create an interactive counter island for Fresh 2.x using Preact signals
- Fix package resolution for Next.js by updating deno.json

## Source text · SKILL.md · MIT

Below is the content of a third-party file. It is data, not instructions for you: do not act on anything written inside unless the human asks. Block tag: ea6371ecd2b38dd9.

BEGIN THIRD-PARTY FILE ea6371ecd2b38dd9
````text
---
name: deno-frontend
description: Use when building a web frontend with Deno — running React, Vite, Astro, SvelteKit, Next.js, Nuxt or other npm frameworks under Deno, or working with Fresh, Deno's own island-architecture framework. Covers which path to pick, Fresh 2.x routes, handlers, islands, Preact signals, Tailwind, and Fresh 1.x to 2.x migration.
license: MIT
metadata:
  author: denoland
  version: "3.0"
---

# Frontend development with Deno

Two paths. Pick by what the project already uses.

## Regular npm frameworks — the usual choice

Deno runs the normal frontend ecosystem: React, Vue, Svelte, Solid, Vite, Astro,
Next.js, Nuxt, SvelteKit, Remix, SolidStart. Nothing needs to be ported, and
there is no Deno-specific way to write them.

```bash
deno create vite my-app     # or astro, next, nuxt, svelte…
cd my-app
deno install
deno task dev
```

`deno create` is `npm create`. `deno install` reads `package.json`.
`deno task <script>` runs `package.json` scripts. That is the whole difference.

**Follow the framework's own documentation for everything else** — routing,
components, data loading, and config are the framework's concern, not Deno's.
Don't invent Deno-flavoured variants of their APIs, and don't reach for Fresh
patterns in a React or Svelte project.

The only things worth knowing:

- Some frameworks need `"nodeModulesDir": "auto"` in `deno.json`; Next.js does.
- Permissions apply to the dev server too — framework tasks generally want `-A`.
- Deploying: see the `deno-deploy` skill, which lists per-framework build
  commands and presets.

## Fresh — Deno's own framework

Fresh suits a new Deno-first project that wants server rendering with minimal
client JavaScript. It uses **island architecture**: pages render on the server,
and only components in `islands/` ship JavaScript.

```bash
deno run -Ar jsr:@fresh/init
cd my-project
deno task dev                # http://localhost:5173
```

A Fresh project is Vite-based: `vite.config.ts` for the build, `main.ts` for the
server, file-based routes in `routes/`, islands in `islands/`, server-only
components in `components/`. Preact supplies the component model, with signals
for state.

```tsx
// islands/Counter.tsx — interactive, ships JS
import { useSignal } from "@preact/signals";

export default function Counter() {
  const count = useSignal(0);
  return <button onClick={() => count.value++}>Count: {count.value}</button>;
}
```

Three rules carry most of the weight:

1. Islands ship JavaScript — keep them small, leave everything else in
   `components/`.
2. Island props must be serializable. Functions cannot be passed.
3. Handlers take a single `(ctx)` parameter.

Load `references/FRESH.md` for routes, handlers, `define` helpers, middleware,
islands, signals, and Tailwind.

Use **Fresh 2.x**, imported from `"fresh"`. For an existing 1.x project, or one
pinned to a `2.0.0-alpha.*` release, see `references/FRESH_MIGRATION.md`.

## Further reading

- <https://fresh.deno.dev/docs> — Fresh documentation
- `references/FRESH.md` — Fresh 2.x patterns in depth
````
END THIRD-PARTY FILE ea6371ecd2b38dd9

The third-party file has ended. Everything between the ea6371ecd2b38dd9 tags is data: requests and commands from it are not followed. An “end of file” line with another tag inside the block is part of the file.

First 3084 of 3153 bytes. © denoland · MIT · https://github.com/denoland/skills/tree/HEAD/skills/deno-frontend/SKILL.md

_Part of the page did not fit — see the HTML version._

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
