First steps

This page contains some examples to teach you about the fundamentals of Deno.

This document assumes that you have some prior knowledge of JavaScript, especially about async/await. If you have no prior knowledge of JavaScript, you might want to follow a guide on the basics of JavaScript before attempting to start with Deno.

Hello World

Deno is a runtime for JavaScript/TypeScript which tries to be web compatible and use modern features wherever possible.

Browser compatibility means a Hello World program in Deno is the same as the one you can run in the browser:

console.log("Welcome to Deno!");

Try the program:

deno run https://deno.land/std@0.130.0/examples/welcome.ts

Making an HTTP request

Many programs use HTTP requests to fetch data from a webserver. Let’s write a small program that fetches a file and prints its contents out to the terminal.

Just like in the browser you can use the web standard fetch API to make HTTP calls:

const url = Deno.args[0];
const res = await fetch(url);

const body = new Uint8Array(await res.arrayBuffer());
await Deno.stdout.write(body);

Let’s walk through what this application does:

  1. We get the first argument passed to the application, and store it in the url constant.
  2. We make a request to the url specified, await the response, and store it in the res constant.
  3. We parse the response body as an ArrayBuffer, await the response, and convert it into a Uint8Array to store in the body constant.
  4. We write the contents of the body constant to stdout.

Try it out:

deno run https://deno.land/std@0.130.0/examples/curl.ts https://example.com

You will see this program returns an error regarding network access, so what did we do wrong? You might remember from the introduction that Deno is a runtime which is secure by default. This means you need to explicitly give programs the permission to do certain ‘privileged’ actions, such as access the network.

Try it out again with the correct permission flag:

deno run --allow-net=example.com https://deno.land/std@0.130.0/examples/curl.ts https://example.com

Reading a file

Deno also provides APIs which do not come from the web. These are all contained in the Deno global. You can find documentation for these APIs on doc.deno.land.

Filesystem APIs for example do not have a web standard form, so Deno provides its own API.

In this program each command-line argument is assumed to be a filename, the file is opened, and printed to stdout.

import { copy } from "https://deno.land/std@0.130.0/streams/conversion.ts";
const filenames = Deno.args;
for (const filename of filenames) {
  const file = await Deno.open(filename);
  await copy(file, Deno.stdout);

The copy() function here actually makes no more than the necessary kernel→userspace→kernel copies. That is, the same memory from which data is read from the file, is written to stdout. This illustrates a general design goal for I/O streams in Deno.

Try the program:

# macOS / Linux
deno run --allow-read https://deno.land/std@0.130.0/examples/cat.ts /etc/hosts

# Windows
deno run --allow-read https://deno.land/std@0.130.0/examples/cat.ts "C:\Windows\System32\Drivers\etc\hosts"

TCP server

This is an example of a server which accepts connections on port 8080, and returns to the client anything it sends.

import { copy } from "https://deno.land/std@0.130.0/streams/conversion.ts";
const hostname = "";
const port = 8080;
const listener = Deno.listen({ hostname, port });
console.log(`Listening on <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>h</mi><mi>o</mi><mi>s</mi><mi>t</mi><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi></mrow><mo>:</mo></mrow><annotation encoding="application/x-tex">{hostname}:</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="mord mathnormal">os</span><span class="mord mathnormal">t</span><span class="mord mathnormal">nam</span><span class="mord mathnormal">e</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span></span></span></span>{port}`);
for await (const conn of listener) {
  copy(conn, conn);

For security reasons, Deno does not allow programs to access the network without explicit permission. To allow accessing the network, use a command-line flag:

deno run --allow-net https://deno.land/std@0.130.0/examples/echo_server.ts

To test it, try sending data to it with netcat (or telnet on Windows):

Note for Windows users: netcat is not available on Windows. Instead you can use the built-in telnet client. The telnet client is disabled in Windows by default. It is easy to enable however: just follow the instructions on Microsoft TechNet

# Note for Windows users: replace the `nc` below with `telnet`
$ nc localhost 8080
hello world
hello world

Like the cat.ts example, the copy() function here also does not make unnecessary memory copies. It receives a packet from the kernel and sends it back, without further complexity.

More examples

You can find more examples, like an HTTP file server, in the Examples chapter.