Skip to main content
Deno supports configuration through a deno.json (or deno.jsonc) file in your project root. This file allows you to customize TypeScript compiler options, define tasks, configure linting and formatting, manage imports, and more.

Basic Configuration

Create a deno.json file in your project root:
deno.json
{
  "name": "my-project",
  "version": "1.0.0",
  "exports": "./mod.ts"
}

Compiler Options

The compilerOptions field instructs the TypeScript compiler how to compile .ts files:
deno.json
{
  "compilerOptions": {
    "strict": true,
    "allowJs": true,
    "checkJs": false,
    "lib": ["deno.window", "deno.unstable"],
    "jsx": "react-jsx",
    "jsxImportSource": "react"
  }
}

Common Compiler Options

  • strict - Enable all strict type checking options (default: true)
  • noImplicitAny - Error on expressions with implied any type (default: true)
  • strictNullChecks - Consider null and undefined in type checking (default: true)
  • noUnusedLocals - Error when local variables aren’t read (default: false)
  • noUnusedParameters - Error when function parameters aren’t read (default: false)
  • jsx - Specify JSX code generation: "preserve", "react", "react-jsx", "react-jsxdev", "react-native", or "precompile"
  • jsxFactory - JSX factory function (default: "React.createElement")
  • jsxFragmentFactory - JSX Fragment reference (default: "React.Fragment")
  • jsxImportSource - Module specifier for JSX factory functions (default: "react")
  • lib - Bundled library declaration files (default: ["deno.window", "deno.unstable", "node"])
  • module - Module code generation: "esnext", "nodenext", or "preserve"
  • moduleResolution - Module resolution strategy: "nodenext" or "bundler"

Tasks

Define custom commands that can be run with deno task:
deno.json
{
  "tasks": {
    "dev": "deno run --watch main.ts",
    "test": "deno test --allow-all",
    "build": {
      "description": "Build the project",
      "command": "deno compile --output=dist/app main.ts",
      "dependencies": ["test"]
    }
  }
}
Run tasks with:
deno task dev
deno task build

Permissions

Define named permission sets that can be referenced in test, bench, or compile configurations:
deno.json
{
  "permissions": {
    "default": {
      "read": true,
      "write": ["./data"],
      "net": ["api.example.com"],
      "env": ["DATABASE_URL"]
    },
    "restricted": {
      "read": ["./public"],
      "net": false
    }
  },
  "test": {
    "permissions": "default"
  }
}

Permission Types

  • all - Allow all permissions (run unrestricted)
  • read - File system read access
  • write - File system write access
  • net - Network access
  • env - Environment variable access
  • run - Subprocess execution
  • ffi - Foreign function interface
  • sys - System information access
  • import - Dynamic import permissions
Permissions can be:
  • Boolean: true (allow all) or false (deny all)
  • Array: specific allowed items ["./data", "./config"]
  • Object: with allow, deny, and/or ignore fields

Lint and Format Configuration

Linting

deno.json
{
  "lint": {
    "include": ["src/"],
    "exclude": ["src/generated/"],
    "rules": {
      "tags": ["recommended"],
      "include": ["ban-untagged-todo"],
      "exclude": ["no-unused-vars"]
    },
    "report": "pretty"
  }
}

Formatting

deno.json
{
  "fmt": {
    "include": ["src/"],
    "exclude": ["src/generated/"],
    "useTabs": false,
    "lineWidth": 80,
    "indentWidth": 2,
    "singleQuote": false,
    "proseWrap": "always",
    "semiColons": true
  }
}

Node Modules Directory

Configure how Deno manages npm packages:
deno.json
{
  "nodeModulesDir": "auto"
}
Options:
  • "auto" - Automatically create node_modules when needed
  • "manual" - Only use node_modules if it exists
  • "none" - Never use node_modules (default)
  • true - Enable node_modules (legacy, equivalent to "auto")
  • false - Disable node_modules (legacy)

Lock File

Configure dependency integrity checking:
deno.json
{
  "lock": {
    "path": "deno.lock",
    "frozen": true
  }
}
Or simply:
deno.json
{
  "lock": true
}

Test and Bench Configuration

deno.json
{
  "test": {
    "include": ["src/**/*_test.ts"],
    "exclude": ["src/testdata/"],
    "permissions": {
      "read": true,
      "net": ["localhost:8000"]
    }
  },
  "bench": {
    "include": ["benches/"],
    "exclude": ["benches/fixtures/"]
  }
}

Compile Configuration

Set default permissions for compiled executables:
deno.json
{
  "compile": {
    "permissions": {
      "read": true,
      "net": true
    }
  }
}

Publish Configuration

Configure what gets published to JSR:
deno.json
{
  "name": "@scope/package",
  "version": "1.0.0",
  "exports": {
    ".": "./mod.ts",
    "./utils": "./utils.ts"
  },
  "publish": {
    "include": ["mod.ts", "utils.ts", "README.md"],
    "exclude": ["**/*_test.ts"]
  }
}
To disable publishing:
deno.json
{
  "publish": false
}

Deploy Configuration

Configure Deno Deploy settings:
deno.json
{
  "deploy": {
    "org": "my-org",
    "app": "my-app",
    "runtime": {
      "mode": "dynamic",
      "entrypoint": "main.ts"
    },
    "include": ["main.ts", "routes/"],
    "exclude": ["tests/"]
  }
}

Unstable Features

Enable specific unstable features:
deno.json
{
  "unstable": [
    "kv",
    "cron",
    "ffi",
    "webgpu"
  ]
}

Workspaces

Define workspace members for monorepos:
deno.json
{
  "workspace": ["./packages/*", "./apps/*"]
}
Or with explicit configuration:
deno.json
{
  "workspace": {
    "members": ["./packages/*", "./apps/*"]
  }
}

Exclude Files

Exclude files or directories from all Deno operations:
deno.json
{
  "exclude": [
    "node_modules",
    "dist",
    "**/*_test.ts"
  ]
}

Full Example

Here’s a comprehensive configuration example:
deno.json
{
  "name": "@myorg/myapp",
  "version": "1.0.0",
  "exports": "./mod.ts",
  
  "tasks": {
    "dev": "deno run --watch --allow-net --allow-read main.ts",
    "test": "deno test --allow-all",
    "lint": "deno lint",
    "fmt": "deno fmt"
  },
  
  "compilerOptions": {
    "strict": true,
    "lib": ["deno.window"],
    "jsx": "react-jsx",
    "jsxImportSource": "react"
  },
  
  "lint": {
    "rules": {
      "tags": ["recommended"],
      "exclude": ["no-explicit-any"]
    }
  },
  
  "fmt": {
    "lineWidth": 100,
    "singleQuote": true,
    "semiColons": false
  },
  
  "test": {
    "include": ["src/"],
    "exclude": ["src/testdata/"]
  },
  
  "lock": true,
  "nodeModulesDir": "auto"
}

Build docs developers (and LLMs) love