<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro" -->

---
title: How to compile JavaScript into a single executable
description: A hands-on comparison walks through compiling the same small JavaScript CLI tool into a standalone executable using three built-in tools: deno compile, bun...
canonical: https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: How to compile JavaScript into a single executable | daily.dev
og:description: A hands-on comparison walks through compiling the same small JavaScript CLI tool into a standalone executable using three built-in tools: deno compile, bun...
og:url: https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro
og:image: https://api.daily.dev/og/posts/jpC9PqWrO.png
og:image:alt: How to compile JavaScript into a single executable
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# How to compile JavaScript into a single executable

**[Flavio Copes](https://daily.dev/sources/flaviocopes)** · 16 min read · 40 upvotes · 7 comments

## Summary

A hands-on comparison walks through compiling the same small JavaScript CLI tool into a standalone executable using three built-in tools: deno compile, bun build --compile, and Node.js's node --build-sea (available from Node 25.5). Each method is demonstrated end to end, including handling npm dependencies, cross-platform builds, embedding files, and macOS code signing. Bun produced the smallest (62 MB) and fastest-starting (7ms) executable with the least setup; Deno offers permission locking at compile time; Node requires bundling first (via esbuild) but suits teams wanting native Node behavior. A Rust build of the same tool is 446 KB and starts in 1.3ms, illustrating that these JS executables bundle an entire runtime rather than truly compiling to machine code. Older tools pkg and nexe are noted as largely superseded.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://flaviocopes.com/javascript-single-executable>

## Questions this post answers

### How do I build a single executable application with Node.js using --build-sea?

Node.js 25.5 and later support node --build-sea with a sea-config.json file specifying the main entry and output name, but Node doesn't bundle dependencies, so code using npm packages must first be bundled into CommonJS with a tool like esbuild. After building, macOS requires re-signing the binary with codesign --sign - because writing code into the node binary breaks its signature, causing it to exit with code 137 otherwise.

_Developers packaging Node.js CLIs can track SEA tooling changes like this on daily.dev before shipping an update._

### Which is smaller and faster for compiling a JavaScript CLI into an executable, Bun, Deno, or Node.js?

Bun produced the smallest and fastest result for a small readtime CLI: a 62 MB file starting in 7ms, compared to Deno's 68 MB at 20ms and Node's 146 MB at 24ms, mostly because Bun's underlying runtime binary is smaller than Node's roughly 147 MB base size. Rust compiles the same program to 446 KB starting in 1.3ms, far smaller than any JavaScript option.

_Teams deciding between Bun, Deno, and Node for shipping CLIs can compare trade-offs like these on daily.dev._

### Why does deno compile fail with a missing @types/node package error in a project with node_modules?

deno compile type-checks code by default, and in an npm-managed project it looks for Node type definitions inside node_modules; if @types/node isn't installed there, the build fails with 'Could not find a matching package for npm:@types/node'. The fix is either installing @types/node as a dev dependency, or skipping the check entirely with the --no-check flag for plain JavaScript projects.

_Developers hitting this exact deno compile error can find fixes like this through daily.dev before getting stuck._

## Community discussion

Top comments from developers on daily.dev.

**@thiagobezerra** · 0 upvotes

> Maybe you should try this [https://github.com/vercel-labs/scriptc](https://github.com/vercel-labs/scriptc)

**@bob72** · 0 upvotes

> That is just a script attached to a runtime binary. Not sure if it makes any sense.

**@anderspersson** · 0 upvotes

> Be aware that Deno has recently been acquired, and its future roadmap has changed significantly. Deno Deploy is scheduled to shut down within six months, and development of the Deno runtime is expected to transition to maintenance-only updates for one year.
>
> If you're building a tool that you expect to maintain for many years, Node.js is likely the safest choice due to its maturity, ecosystem, and widespread adoption

**@pdfopsdev** · 0 upvotes

> the 62MB bun number includes the full V8 + libuv runtime, so if you're shipping this in a container that's basically free since you'd pull node:alpine anyway. the real cost shows up on cold starts in serverless, where that 7ms startup is measured warm and you eat way more on first invoke.

**@markozakrajsekgeozs** · 0 upvotes

> I am not sure whether I would or will use it, but the author definitely deserves all the 👏 for a great article that explains things and provides a well-rounded overview of different approaches! Worth reading, not just scrolling...

## Similar posts on daily.dev

- [When Deno or Bun is a Better Solution than Node.js – Frontend Masters Blog](https://daily.dev/posts/when-deno-or-bun-is-a-better-solution-than-node-js-frontend-masters-blog-sg2hmfhep) · Frontend Masters · 1 upvotes · 0 comments
- [Bun: A fast JS runtime Node.js replacement with built‑in tools](https://daily.dev/posts/bun-a-fast-js-runtime-node-js-replacement-with-built-in-tools-mufqlbhlc) · Product Hunt · 0 upvotes · 0 comments
- [Node.js vs Bun vs Deno: Which JavaScript Runtime Should You Choose in 2026?](https://daily.dev/posts/node-js-vs-bun-vs-deno-which-javascript-runtime-should-you-choose-in-2026--cdpzqgies) · Medium · 2 upvotes · 0 comments

---

Tags: [#javascript](https://daily.dev/tags/javascript), [#nodejs](https://daily.dev/tags/nodejs), [#deno](https://daily.dev/tags/deno), [#bun](https://daily.dev/tags/bun)

[View this post on daily.dev](https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"How to compile JavaScript into a single executable","url":"https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro"},"datePublished":"2026-10-11T12:28:22.294Z","dateModified":"2026-10-11T12:30:01.268Z","description":"A hands-on comparison walks through compiling the same small JavaScript CLI tool into a standalone executable using three built-in tools: deno compile, bun...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d8b3360ff6f26d58bf455d67a4356420?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d8b3360ff6f26d58bf455d67a4356420?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Flavio Copes","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Flavio Copes","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/1f2dbd275797411bbd37bfdaaf0951a9","url":"https://daily.dev/sources/flaviocopes"},"commentCount":7,"discussionUrl":"https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":40},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":7}],"keywords":"javascript,nodejs,deno,bun","timeRequired":"PT16M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Flavio Copes","item":"https://daily.dev/sources/flaviocopes"},{"@type":"ListItem","position":3,"name":"How to compile JavaScript into a single executable"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro","comment":[{"@type":"Comment","text":"Maybe you should try this https://github.com/vercel-labs/scriptc","datePublished":"2026-10-11T19:26:36.128Z","url":"https://daily.dev/posts/jpC9PqWrO#c-xpp4KeuTs","author":{"@type":"Person","name":"Thiago Bezerra","url":"https://daily.dev/thiagobezerra","image":"https://lh3.googleusercontent.com/a/ACg8ocJdb2sdpZCznr6W_9whpU8OnlCCHiyRvvoiwqk4YLEOrJl6hJGY=s96-c"}},{"@type":"Comment","text":"That is just a script attached to a runtime binary. Not sure if it makes any sense.","datePublished":"2026-10-11T19:10:21.013Z","url":"https://daily.dev/posts/jpC9PqWrO#c-DfODnFg1p","author":{"@type":"Person","name":"Bob","url":"https://daily.dev/bob72","image":"https://avatars.githubusercontent.com/u/193962566?v=4"}},{"@type":"Comment","text":"Be aware that Deno has recently been acquired, and its future roadmap has changed significantly. Deno Deploy is scheduled to shut down within six months, and development of the Deno runtime is expected to transition to maintenance-only updates for one year.\nIf you’re building a tool that you expect to maintain for many years, Node.js is likely the safest choice due to its maturity, ecosystem, and widespread adoption","datePublished":"2026-10-12T07:18:52.896Z","url":"https://daily.dev/posts/jpC9PqWrO#c-JSTOzluVP","author":{"@type":"Person","name":"Anders Persson","url":"https://daily.dev/anderspersson","image":"https://avatars.githubusercontent.com/u/1372776?v=4"}},{"@type":"Comment","text":"the 62MB bun number includes the full V8 + libuv runtime, so if you’re shipping this in a container that’s basically free since you’d pull node:alpine anyway. the real cost shows up on cold starts in serverless, where that 7ms startup is measured warm and you eat way more on first invoke.","datePublished":"2026-10-12T18:01:20.697Z","url":"https://daily.dev/posts/jpC9PqWrO#c-tMfi3ijmC","author":{"@type":"Person","name":"PDFops","url":"https://daily.dev/pdfopsdev","image":"https://media.daily.dev/image/upload/s---8isRBKc--/f_auto/v1782922291/avatars/avatar_orjMeK8QKaaVZwGq7ScPz?_a=BAMAMicg0"}},{"@type":"Comment","text":"I am not sure whether I would or will use it, but the author definitely deserves all the 👏 for a great article that explains things and provides a well-rounded overview of different approaches! Worth reading, not just scrolling…","datePublished":"2026-10-13T05:08:48.879Z","url":"https://daily.dev/posts/jpC9PqWrO#c-KJ1E8A97q","author":{"@type":"Person","name":"Marko Zakrajsek","url":"https://daily.dev/markozakrajsekgeozs","image":"https://media.daily.dev/image/upload/s--slY3-STy--/f_auto/v1783585373/avatars/avatar_SbncGJHaRHf7KoebEkT1L?_a=BAMAMicg0"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/how-to-compile-javascript-into-a-single-executable-jpc9pqwro#faq","mainEntity":[{"@type":"Question","name":"How do I build a single executable application with Node.js using --build-sea?","acceptedAnswer":{"@type":"Answer","text":"Node.js 25.5 and later support node --build-sea with a sea-config.json file specifying the main entry and output name, but Node doesn't bundle dependencies, so code using npm packages must first be bundled into CommonJS with a tool like esbuild. After building, macOS requires re-signing the binary with codesign --sign - because writing code into the node binary breaks its signature, causing it to exit with code 137 otherwise. Developers packaging Node.js CLIs can track SEA tooling changes like this on daily.dev before shipping an update."}},{"@type":"Question","name":"Which is smaller and faster for compiling a JavaScript CLI into an executable, Bun, Deno, or Node.js?","acceptedAnswer":{"@type":"Answer","text":"Bun produced the smallest and fastest result for a small readtime CLI: a 62 MB file starting in 7ms, compared to Deno's 68 MB at 20ms and Node's 146 MB at 24ms, mostly because Bun's underlying runtime binary is smaller than Node's roughly 147 MB base size. Rust compiles the same program to 446 KB starting in 1.3ms, far smaller than any JavaScript option. Teams deciding between Bun, Deno, and Node for shipping CLIs can compare trade-offs like these on daily.dev."}},{"@type":"Question","name":"Why does deno compile fail with a missing @types/node package error in a project with node_modules?","acceptedAnswer":{"@type":"Answer","text":"deno compile type-checks code by default, and in an npm-managed project it looks for Node type definitions inside node_modules; if @types/node isn't installed there, the build fails with 'Could not find a matching package for npm:@types/node'. The fix is either installing @types/node as a dev dependency, or skipping the check entirely with the --no-check flag for plain JavaScript projects. Developers hitting this exact deno compile error can find fixes like this through daily.dev before getting stuck."}}]}
```

