How to Install Deno on Ubuntu: The Secure JavaScript and TypeScript Runtime
Deno is a secure runtime for JavaScript and TypeScript from Ryan Dahl, who also created Node.js. Built in Rust on top of the V8 engine, it corrects several of Node’s early design decisions: TypeScript runs natively, code is sandboxed unless you explicitly grant permissions, and a complete toolchain — formatter, linter, test runner and bundler — is baked into the single deno executable.
The official Ubuntu repositories do not package Deno, and its rapid release cadence would leave any archived version quickly outdated. The upstream shell installer works but drops a binary into your home directory outside of APT, which makes upgrades and removal a manual affair.
The unofficial deb.griffo.io repository offers a cleaner option: a current, prebuilt Deno package installed with apt and kept up to date through your usual system upgrades.
Install the Latest Deno on Ubuntu: The Short Version
If you only came for the commands, this adds the repository and installs the latest Deno .deb package on Ubuntu:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt update
sudo apt install deno
The rest of this guide explains what each command does, how to verify the install, how to keep Deno up to date, and what to check when something goes wrong.
What Makes Deno Special?
- 🔒 Secure by default - filesystem, network and environment access are denied until you grant them
- 🟦 Native TypeScript - runs
.tsfiles directly, no build step required - 🧰 Batteries-included tooling - formatter, linter, test runner and bundler all built in
- 🌐 Web-standard APIs -
fetch,URL,WebSocketand more available out of the box - 📦 Modern module system - import by URL or via
deno.json, with a built-in dependency cache - 🟢 npm compatibility - pull in npm packages through
npm:specifiers when needed - ⚙️ Single executable output -
deno compileproduces standalone self-contained binaries - 📚 Audited standard library - a well-maintained standard library from the Deno team
Why Use the deb.griffo.io Repository?
- Easy installation and updates through the standard APT workflow
- Automatic dependency management courtesy of Debian-style packaging
- Always tracks upstream releases so new Deno versions land without delay
- No shell installer leaving an unmanaged binary in your home directory
- Works across supported Ubuntu releases including the current LTS versions
Prerequisites
Before starting, make sure you have:
- An Ubuntu system (Jammy 22.04 LTS, Noble 24.04 LTS, or newer)
sudoprivilegescurlinstalled (install it withsudo apt install curlif needed)
Step 1: Add the deb.griffo.io Repository
Add the GPG key and source entry with the commands below:
# Create the keyrings directory
sudo install -d -m 0755 /etc/apt/keyrings
# Download and install the repository GPG key
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
# Add the repository (auto-detects your distro codename)
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
# Update the package list
sudo apt update
Step by step:
- Create the keyrings directory with permissions suitable for the signing key.
- Install the GPG key, dearmoring it into a keyring APT uses for verification.
- Add the repository, letting
lsb_release -scfill in your Ubuntu codename automatically. - Update the index so APT can see the packages the repository provides.
Step 2: Update the Package List
If you have not already refreshed the index, do it now:
sudo apt update
Step 3: Install Deno
Install the package directly:
sudo apt install deno
APT fetches the latest packaged Deno and installs any dependencies it needs.
Step 4: Verify the Installation
Confirm Deno is available and reporting versions for its components:
deno --version
The output shows the Deno, V8 and TypeScript versions:
deno 2.4.2
v8 13.7.152.6
typescript 5.8.3
Getting Started with Deno
Here are the workflows to get you going.
Managing Dependencies and Tasks
Modern Deno projects lean on a deno.json file for imports and tasks:
# Initialise a new project
deno init my-app
cd my-app
# Add a dependency from JSR or npm
deno add jsr:@std/http
deno add npm:express
# Run a task defined in deno.json
deno task dev
# Pre-cache dependencies
deno cache main.ts
Running Code
Deno runs JavaScript and TypeScript directly and asks for permissions as required:
# Run a local script
deno run main.ts
# Run a remote script from a URL
deno run https://docs.deno.com/examples/scripts/hello_world.ts
# Grant only what the program needs
deno run --allow-net --allow-read server.ts
# Grant all permissions (use sparingly)
deno run -A main.ts
Those --allow-* flags are central to Deno’s security model: without them a script cannot touch the network or the filesystem.
The Built-in Toolchain
Deno provides the tools most projects would otherwise install separately:
# Format your code
deno fmt
# Lint for common issues
deno lint
# Run the test suite
deno test
# Type-check without executing
deno check main.ts
A test relies on the standard library’s assertions:
import { assertEquals } from "jsr:@std/assert";
Deno.test("adds numbers", () => {
assertEquals(2 + 2, 4);
});
Installing Tools and Compiling Binaries
Deno can install scripts as global commands and compile projects into standalone executables:
# Install a script as a global command
deno install --global --allow-net -n serve jsr:@std/http/file-server
# Compile a project into a single self-contained binary
deno compile --allow-net --output myserver server.ts
./myserver
Keeping Deno Updated
Since Deno comes from an APT repository, updating it is part of your normal routine:
sudo apt update && sudo apt upgrade
Newly packaged releases are pulled in automatically. There is no need for deno upgrade, which applies only to shell-script installations.
Other Tools from deb.griffo.io
The deb.griffo.io repository packages plenty of other developer tools for Ubuntu:
- bun - a fast all-in-one JavaScript runtime and toolkit
- eza - a modern, maintained replacement for
ls - starship - a fast, minimal prompt for any shell
- lazygit - a friendly terminal UI for Git
Troubleshooting
Package Not Found
If APT cannot find the deno package after you add the repository:
- Confirm you ran
sudo apt updateonce the source was in place. - Check that your Ubuntu release is supported (Jammy, Noble or newer).
- Inspect the source entry:
cat /etc/apt/sources.list.d/deb.griffo.io.list
GPG or Key Issues
A NO_PUBKEY or signature error means the signing key needs re-adding:
# Re-download and install the repository GPG key
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
# Refresh the package list
sudo apt update
A Script Fails with a Permission Error
Because Deno is locked down by default, a PermissionDenied error almost always means you are missing an --allow-* flag. Add --allow-net for network access, --allow-read for file reads, or --allow-env for environment variables, and prefer the smallest set that works over the blanket -A flag.
Uninstalling
Remove Deno with:
sudo apt remove deno
To remove the repository as well:
sudo rm /etc/apt/sources.list.d/deb.griffo.io.list
sudo rm /etc/apt/keyrings/deb.griffo.io.gpg
sudo apt update
Conclusion
Deno is a modern take on the JavaScript runtime: native TypeScript, an opt-in security model and a full toolchain in one binary strip away much of the ceremony that has built up around Node.js. Whether you are writing a quick script, a web server or a command-line tool, there is less to configure and less to install.
Installed via the deb.griffo.io repository, Deno on Ubuntu stays under APT’s management: one command to install, and future releases arriving with your normal upgrades. It is a cleaner setup than a shell installer writing into your home directory, and it keeps Deno current for you automatically.
Frequently Asked Questions
How do I install the latest Deno on Ubuntu?
Add the deb.griffo.io APT repository and its signing key, then run sudo apt install deno. The repository tracks upstream Deno releases, so you get the latest packaged version rather than a build frozen when your distribution was released.
Is there a .deb package for Deno?
Yes. deb.griffo.io publishes Deno as a signed .deb for Ubuntu. You could download that .deb and install it by hand, but adding the repository is the better option: APT then resolves dependencies and picks up new versions on its own.
How do I update Deno to the latest version?
Run sudo apt update && sudo apt upgrade. Once Deno is installed from APT there is no separate updater to remember, since new releases arrive with the rest of your system updates.
How do I install Deno on Debian?
Exactly the same way; lsb_release -sc simply resolves to a different codename. There is a companion guide with the Debian specifics: How to install Deno on Debian.
Which Ubuntu releases are supported?
Jammy 22.04 LTS, Noble 24.04 LTS and newer. Because the repository line is built from lsb_release -sc, the matching suite is selected for you.
Resources
Disclaimer: The deb.griffo.io repository is an unofficial community project and is not affiliated with the official Debian or Ubuntu projects, or with the upstream Deno project.