From deno-skills
Scaffolds new Deno projects with templates for Fresh web apps, CLI tools, libraries, and API servers using modern best practices. Use when starting Deno projects from scratch.
npx claudepluginhub denoland/skills --plugin deno-skillsThis skill uses the workspace's default tool permissions.
This skill provides templates for creating new Deno projects with modern best practices.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
This skill provides templates for creating new Deno projects with modern best practices.
This skill applies only when the user asks for a Deno project. Follow these rules:
Choose the appropriate template based on what you want to build:
| Type | Use Case | Key Files |
|---|---|---|
| Fresh web app | Full-stack web application with Fresh framework | main.ts, routes/, islands/ |
| CLI tool | Command-line application | main.ts with arg parsing |
| Library | Reusable package to publish on JSR | mod.ts, mod_test.ts |
| API server | Backend API without frontend | main.ts with HTTP handlers |
For full-stack web applications, use the Fresh initializer:
deno run -Ar jsr:@fresh/init my-project
cd my-project
This creates:
deno.json - Project configuration and dependenciesmain.ts - Server entry pointclient.ts - Client entry point (CSS imports)vite.config.ts - Vite build configurationroutes/ - Pages and API routes (file-based routing)islands/ - Interactive components that get JavaScript on the clientcomponents/ - Server-only components (no JavaScript shipped)static/ - Static assets like images, CSSDevelopment: Fresh uses Vite. The dev server runs at http://localhost:5173 (not port 8000).
deno task dev
Create a command-line application with argument parsing.
Template files: See assets/cli-tool/ directory.
{
"name": "my-cli",
"version": "0.1.0",
"exports": "./main.ts",
"tasks": {
"dev": "deno run --allow-all main.ts",
"compile": "deno compile --allow-all -o my-cli main.ts"
},
"imports": {
"@std/cli": "jsr:@std/cli@^1",
"@std/fmt": "jsr:@std/fmt@^1"
}
}
import { parseArgs } from "@std/cli/parse-args";
import { bold, green } from "@std/fmt/colors";
const args = parseArgs(Deno.args, {
boolean: ["help", "version"],
alias: { h: "help", v: "version" },
});
if (args.help) {
console.log(`
${bold("my-cli")} - A Deno CLI tool
${bold("USAGE:")}
my-cli [OPTIONS]
${bold("OPTIONS:")}
-h, --help Show this help message
-v, --version Show version
`);
Deno.exit(0);
}
if (args.version) {
console.log("my-cli v0.1.0");
Deno.exit(0);
}
console.log(green("Hello from my-cli"));
Create a reusable package for publishing to JSR.
Template files: See assets/library/ directory.
{
"name": "@username/my-library",
"version": "0.1.0",
"exports": "./mod.ts",
"tasks": {
"test": "deno test",
"check": "deno check mod.ts",
"publish": "deno publish"
}
}
/**
* my-library - A Deno library
*
* @module
*/
/**
* Example function - replace with your library's functionality
*
* @param name The name to greet
* @returns A greeting message
*
* @example
* ```ts
* import { greet } from "@username/my-library";
* console.log(greet("World")); // "Hello, World"
* ```
*/
export function greet(name: string): string {
return `Hello, ${name}`;
}
import { assertEquals } from "jsr:@std/assert";
import { greet } from "./mod.ts";
Deno.test("greet returns correct message", () => {
assertEquals(greet("World"), "Hello, World");
});
Remember: Replace @username with your JSR username before publishing.
Create a backend API without a frontend.
Template files: See assets/api-server/ directory.
{
"tasks": {
"dev": "deno run --watch --allow-net main.ts",
"start": "deno run --allow-net main.ts"
},
"imports": {
"@std/http": "jsr:@std/http@^1"
}
}
import { serve } from "@std/http";
const handler = (request: Request): Response => {
const url = new URL(request.url);
if (url.pathname === "/") {
return new Response("Welcome to the API", {
headers: { "Content-Type": "text/plain" },
});
}
if (url.pathname === "/api/hello") {
return Response.json({ message: "Hello from Deno" });
}
return new Response("Not Found", { status: 404 });
};
console.log("Server running at http://localhost:8000");
serve(handler, { port: 8000 });
After creating project files:
cd my-project
deno install # Install dependencies
deno fmt # Format the code
deno lint # Check for issues
| Project Type | Start Development | Build/Compile |
|---|---|---|
| Fresh | deno task dev (port 5173) | deno task build |
| CLI | deno task dev | deno task compile |
| Library | deno test | N/A |
| API | deno task dev | N/A |
When ready to deploy:
deno task build && deno deploy --proddeno task compile (creates standalone binary)deno publish (publishes to JSR)deno deploy --prodjsr: imports for Deno packages (the old URL-based imports are deprecated)deno fmt and deno lint regularly