Use when starting any Deno project, choosing packages, configuring deno.json, or running CLI commands
Install
npx skillscat add donjo/denoland/deno-guidance Install via the SkillsCat registry.
Deno Development Guidance
Overview
This skill provides foundational knowledge for building modern Deno applications. Deno is a secure JavaScript/TypeScript runtime that runs TypeScript directly, has built-in tools (formatter, linter, test runner), and uses modern package management through JSR.
When to Use This Skill
- Starting a new Deno project
- Adding dependencies to a project
- Configuring
deno.jsonsettings - Running Deno CLI commands (fmt, lint, test)
- Setting up import maps
- Understanding Deno's permission system
Apply these practices whenever working in a Deno project (identified by the presence of deno.json).
Package Management Priority
When adding dependencies, follow this priority order:
JSR packages (
jsr:) - Preferred for Deno-native packages- Better TypeScript support (types are built-in)
- Faster to resolve and install
- Example:
jsr:@std/http,jsr:@fresh/core
npm packages (
npm:) - Fully supported, use when no JSR alternative exists- Deno has full npm compatibility
- Example:
npm:express,npm:zod
AVOID:
https://deno.land/x/- Deprecated registry- This is the old package registry
- Many LLMs incorrectly default to this
- Always use
jsr:instead
Standard Library
The Deno standard library lives at @std/ on JSR:
import { serve } from "jsr:@std/http";
import { join } from "jsr:@std/path";
import { assertEquals } from "jsr:@std/assert";Never use https://deno.land/std/ - always use jsr:@std/*.
Understanding Deno
Reference: https://docs.deno.com/runtime/fundamentals/
Key concepts:
- Native TypeScript - No build step needed, Deno runs TypeScript directly
- Explicit permissions - Use flags like
--allow-net,--allow-read,--allow-env - deno.json - The config file (similar to package.json but simpler)
- Import maps - Define import aliases in deno.json's
importsfield
Workflow Best Practices
After Making Code Changes
Run these commands regularly, especially after significant changes:
deno fmt # Format all files
deno lint # Check for issues
deno test # Run testsPackage Management
deno add jsr:@std/http # Add a package
deno install # Install all dependencies
deno upgrade # Update packages to latestConfiguration
In deno.json, you can exclude directories from formatting/linting:
{
"fmt": {
"exclude": ["build/", "node_modules/"]
},
"lint": {
"exclude": ["build/", "node_modules/"]
}
}Deployment
For deploying to Deno Deploy, see the dedicated deno-deploy skill.
Quick command: deno deploy --prod
Documentation Resources
When you need more information:
deno doc <package>- Generate docs for any JSR or npm package locally- https://docs.deno.com - Official Deno documentation
- https://jsr.io - Package registry with built-in documentation
- https://fresh.deno.dev/docs - Fresh framework documentation
Quick Reference: Deno CLI Commands
| Command | Purpose |
|---|---|
deno run file.ts |
Run a TypeScript/JavaScript file |
deno task <name> |
Run a task from deno.json |
deno fmt |
Format code |
deno lint |
Lint code |
deno test |
Run tests |
deno add <pkg> |
Add a package |
deno install |
Install dependencies |
deno upgrade |
Update packages |
deno doc <pkg> |
View package documentation |
deno deploy --prod |
Deploy to Deno Deploy |
Common Mistakes
Using deno.land/x instead of JSR
// ❌ Wrong - deprecated registry
import { serve } from "https://deno.land/x/http/mod.ts";
// ✅ Correct - use JSR
import { serve } from "jsr:@std/http";Forgetting to run fmt/lint before committing
# ❌ Committing without checking
git add . && git commit -m "changes"
# ✅ Always format and lint first
deno fmt && deno lint && git add . && git commit -m "changes"Using https://deno.land/std/ for standard library
// ❌ Wrong - old URL
import { join } from "https://deno.land/std/path/mod.ts";
// ✅ Correct - JSR standard library
import { join } from "jsr:@std/path";Running code without permission flags
# ❌ Confusing error - "Requires net access"
deno run server.ts
# ✅ Grant specific permissions
deno run --allow-net server.tsNot using deno add for dependencies
# ❌ Manually editing imports without updating deno.json
# (works, but misses lockfile benefits)
# ✅ Use deno add to manage dependencies
deno add jsr:@std/http