A developer wheels app crates past a status tower: a red Deno Deploy light under a closing shutter, an amber Deno light with an hourglass, green JSR and Vite lights, and a 2027 calendar

Cloudflare and Deno: What Shuts Down and What Keeps Running

by Sarah Jane Ross Updated Reading time estimate 7m news

On October 9, 2026, the Deno team announced it’s joining Cloudflare, and it will stop developing the Deno runtime after one more year of bug fixes and security updates. Deno Deploy, Deno’s hosting service, shuts down sooner, around April 2027. Cloudflare had already announced in June that VoidZero, the company behind Vite, was joining.

If you host on Deno Deploy, that’s your nearest deadline. The runtime gives you a year, and nothing changes yet for JSR (Deno’s package registry) or Vite.

Cloudflare also published its own announcement, which is about self-hosting. Everything about Deploy, JSR, and the runtime’s year of fixes comes from Deno’s post.

Free Bonus: JavaScript Cheat Sheet

JavaScript Cheat Sheet

Variables, arrays, objects, functions, and async basics in one printable reference.

Get the Free Cheat Sheet »

The Deno Runtime Gets Fixes for a Year

On October 15, 2026, Deno’s team pinned issue #37030 on GitHub. It promises a “2.9.x LTS release every month with bug fixes and security updates” until October 2027. Proposed new features “will be closed without merging them.”

After that, copies you’ve already installed keep running, but they don’t get updates. The code stays open source, and Deno’s post says “we welcome others who want to continue its development.” The issue says the team is “considering ways to organize development” after October 2027. On October 21, a maintainer added: “We are now working on getting Deno into a foundation, but there’s no news to share at this point.”

Deno Deploy Shuts Down in About Six Months

Deno’s post says Deno Deploy “will continue operating for six months before shutting down.” Deno hasn’t published an exact date or a guide for leaving. The July 20, 2026, date in Deno’s docs was for Deploy Classic, the older version.

Deno promises “migration support” to paying customers, and it points them to Workers. Any host that runs Node.js also works once your app does. The post says nothing about Deno KV, the database built into Deno, or Subhosting, which lets other companies run their users’ code on Deno’s servers. If you use either one, ask Deno.

What Cloudflare and Deno Keep Running: JSR and Vite

JSR has no end date. Deno’s post says: “JSR will continue operating, with its infrastructure moving to Cloudflare.” It doesn’t say who will run it.

For Vite, Cloudflare’s post says “Vite remains MIT-licensed and open source,” and makes the same promise for VoidZero’s other tools, such as Vitest. It also says “Vite remains vendor-agnostic,” so you can host what you build with it anywhere. The post promises $1 million for a Vite ecosystem fund run by the Vite core team.

Why the Deno Team Is Joining

The announcement is written by Ryan Dahl, who created Deno, and Kenton Varda of Cloudflare. It says workerd, the open-source runtime behind Workers, can already run Workers apps on your own servers, but its Durable Objects support “is limited to a single instance.”

In August, the Deno team released celld, an open-source implementation of Workers and Durable Objects. It’s a single Rust binary whose only outside dependency is an object storage bucket. Cloudflare plans to merge code and ideas from celld into workerd to make self-hosting “a first-class supported way to build and run apps using the Workers programming model.” The post gives no date and promises more announcements “in the coming months.”

Moving a Deno App to Node.js or Workers

Plain JavaScript and web-standard code carries over as is. An app that mostly uses fetch(), Request, and Response may need only a few changed lines, but one built around Deno KV and Deno.cron() also needs a new home for its data and scheduled jobs.

Find the Deno-Specific Code

Start by searching your project for the Deno global and for jsr: and npm: specifiers, which Node.js and Workers don’t understand:

Language: Shell
grep -rnE 'Deno\.|jsr:|npm:' --include='*.js' --include='*.ts' \
  --exclude-dir=node_modules .

Check the imports field in deno.json too. Deno projects often map a plain name like @std/ulid to jsr:@std/ulid@1 there, so an import can look portable in your code and still point at JSR.

If your app is written in TypeScript, Deno runs it directly. Current Node.js versions also run .ts files, but only by stripping the types, so features that need compiling, such as enum, fail. Wrangler, Cloudflare’s CLI, compiles TypeScript when it bundles your app for Workers.

Replace jsr: Imports and Deno.serve()

This small Deno app uses a jsr: import and Deno.serve():

Language: JavaScript
import { ulid } from "jsr:@std/ulid@1";

Deno.serve({ port: 8000 }, () => {
  return new Response(`Hello! Your id: ${ulid()}\n`);
});

Node.js and Workers don’t understand the jsr: prefix, so the import fails before anything runs. Install JSR packages through npm with npx jsr add, which writes an .npmrc file that tells npm where JSR packages live. After that, you import the package by its plain name.

Deno.serve() doesn’t exist outside Deno either. On Node.js, the same app starts its server with createServer() from node:http:

Language: JavaScript
import { createServer } from "node:http";
import { ulid } from "@std/ulid";

createServer((req, res) => {
  res.end(`Hello! Your id: ${ulid()}\n`);
}).listen(8000);

On Workers, the app exports an object with a fetch() method instead of starting a server. Workers calls fetch() for each request, and the Response code carries over unchanged:

Language: JavaScript
import { ulid } from "@std/ulid";

export default {
  fetch(request) {
    return new Response(`Hello! Your id: ${ulid()}\n`);
  },
};

Wrangler bundles your packages from node_modules when you deploy, so the npx jsr add install works on Workers too.

Replace Deno Deploy Features

If you’re on Deploy, two more features need a replacement on your new host:

Deploy feature On Workers On Node.js
Deno KV Workers KV, D1, or Durable Objects The @deno/kv package with a self-hosted denokv server
Deno.cron() Cron Triggers Not built in

On Deploy, a scheduled job lives in your code:

Language: JavaScript
Deno.cron("clean up sessions", "0 * * * *", async () => {
  await cleanUpSessions();
});

On Workers, the schedule moves into your Wrangler config file, wrangler.jsonc:

Language: JSON
{
  "triggers": {
    "crons": ["0 * * * *"]
  }
}

The job itself goes in a scheduled() handler, next to fetch() in the same exported object:

Language: JavaScript
export default {
  async scheduled(controller, env, ctx) {
    await cleanUpSessions();
  },
};

On Node.js, you’d run the job from your system’s cron or with a package such as node-cron.

Move Your Deno KV Data

No published tool moves Deno KV data off Deploy, and Deno’s docs say outside access to KV on the current Deploy is “not currently exposed.” You can still get a copy through continuous backup and the open-source denokv server:

  1. In the Deno Deploy dashboard, open your project’s KV tab and set up a backup to an S3 or Google Cloud Storage bucket in the Backup section. The status changes to Active once the first copy is done.
  2. Set AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_REGION to your bucket’s credentials, and pull the backup into a local SQLite file:

    Language: Shell
    denokv --sqlite-path ./denokv.sqlite pitr sync \
      --s3-bucket <bucket> --s3-prefix <prefix>/<database-id>/
    

    Replace the placeholders with your bucket name, the prefix you set in the dashboard, and your database’s ID.

  3. Run denokv --sqlite-path ./denokv.sqlite pitr list to see the recovery points, and denokv --sqlite-path ./denokv.sqlite pitr checkout <point> to load the latest one into the file.

  4. Start the server with denokv --sqlite-path ./denokv.sqlite serve --access-token <token>.

On Node.js, your app then connects with @deno/kv, which reads the token from the DENO_KV_ACCESS_TOKEN environment variable:

Language: JavaScript
import { openKv } from "@deno/kv";

const kv = await openKv("http://localhost:4512");

The protocol that denokv speaks doesn’t include enqueue() or listenQueue(), so if your app uses KV queues, you’ll need a separate queue, such as Cloudflare Queues on Workers. If you’re moving to Workers KV or D1 rather than a self-hosted server, a one-off Node.js script can read every entry with kv.list() and write it into the new store.

Free Bonus: JavaScript Cheat Sheet

Get a JavaScript Cheat Sheet (PDF), a printable reference to variables, types, strings, arrays, objects, functions, classes, modules, and async basics:

RealJS JavaScript Cheat Sheet pages stacked on top of each other

About Sarah Jane Ross

Sarah Jane runs content operations at RealJS and Real Python. With over a decade in remote operations, she builds the workflows and processes that help a distributed team publish clear, reliable JavaScript and Python learning resources.

» More about Sarah Jane

Master Real-World JavaScript Skills With Unlimited Access to RealJS

Locked learning resources

Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert JavaScript developers:

Level Up Your JavaScript Skills »

Master Real-World JavaScript Skills
With Unlimited Access to RealJS

Locked learning resources

Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert JavaScript developers:

Level Up Your JavaScript Skills »

What Do You Think?

Rate this article:

Keep Learning

Related Topics: news