<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dave</title>
    <description>The latest articles on DEV Community by Dave (@_wangcch).</description>
    <link>https://dev.to/_wangcch</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F299099%2Fe83f6963-cf37-4d45-ab2a-b52c49fa55fb.jpg</url>
      <title>DEV Community: Dave</title>
      <link>https://dev.to/_wangcch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_wangcch"/>
    <language>en</language>
    <item>
      <title>TypeScript Without Node.js in Production: What You Gain, What You Give Up</title>
      <dc:creator>Dave</dc:creator>
      <pubDate>Fri, 04 Sep 2026 16:25:49 +0000</pubDate>
      <link>https://dev.to/_wangcch/typescript-without-nodejs-in-production-what-you-gain-what-you-give-up-156f</link>
      <guid>https://dev.to/_wangcch/typescript-without-nodejs-in-production-what-you-gain-what-you-give-up-156f</guid>
      <description>&lt;p&gt;A small TypeScript service often arrives in production with much more than its application code.&lt;/p&gt;

&lt;p&gt;It may need Node.js, a package-manager layout, production dependencies, startup scripts, environment conventions, and a container assembled to hold everything together.&lt;/p&gt;

&lt;p&gt;That model is mature and flexible. It is also broader than every workload needs.&lt;/p&gt;

&lt;p&gt;I have been exploring a narrower question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if a TypeScript service could arrive in production as one executable—and bring only the authority it had explicitly requested?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question became &lt;a href="https://tysel.dev" rel="noopener noreferrer"&gt;Tysel&lt;/a&gt;, an open-source runtime for TypeScript services, workers, MCP tools, and durable agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;During development, you still write TypeScript and can use compatible npm packages.&lt;/p&gt;

&lt;p&gt;At build time, Tysel checks and bundles the application, combines it with a native runtime, and produces one executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TypeScript source
      +
validated manifest
      +
compatible dependencies
      +
native Tysel runtime
      =
one executable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The target machine does not need a separately installed Node.js runtime, V8, npm, or &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tysel does not turn TypeScript into native machine instructions. Application JavaScript runs inside an embedded QuickJS-ng isolate. A Rust host owns HTTP, storage, secrets, resource limits, execution profiles, and durable scheduling.&lt;/p&gt;

&lt;p&gt;The result is native as a deployment artifact, not as a new JavaScript execution model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in five minutes
&lt;/h2&gt;

&lt;p&gt;Install the current stable release on Linux or macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://tysel.dev/install.sh | sh
tysel doctor &lt;span class="nt"&gt;--install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create and start an HTTP service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tysel init hello-tysel &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;hello-tysel
tysel task verify
tysel dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated application uses the Web-standard Fetch model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TyselApp&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@tysel/types&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from Tysel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;satisfies&lt;/span&gt; &lt;span class="nx"&gt;TyselApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Call the URL printed by the development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://127.0.0.1:3000/hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then package and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tysel task release
./dist/hello-tysel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file in &lt;code&gt;dist/&lt;/code&gt; contains the application bundle, validated manifest, compatibility metadata, source map, and matching runtime.&lt;/p&gt;

&lt;p&gt;A release build also emits checksums, compatibility results, an SBOM, a license inventory, and build evidence. The service runs from one executable; the additional files exist for release admission and auditing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the hood
&lt;/h2&gt;

&lt;p&gt;The current implementation has a deliberately small number of layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Current implementation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application language&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript engine&lt;/td&gt;
&lt;td&gt;QuickJS-ng 0.16.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native host&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application API&lt;/td&gt;
&lt;td&gt;ECMAScript and a selected Web API surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;td&gt;One executable plus audit sidecars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native targets&lt;/td&gt;
&lt;td&gt;Linux and macOS, x64 and arm64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production isolation gate&lt;/td&gt;
&lt;td&gt;Linux isolated workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release channels&lt;/td&gt;
&lt;td&gt;stable and canary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version status&lt;/td&gt;
&lt;td&gt;pre-1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;QuickJS is an implementation choice, not the product identity. A bare embedded engine would not provide capability manifests, deployment policy, durable history, authenticated cross-target runtimes, or release evidence.&lt;/p&gt;

&lt;p&gt;Tysel is the contract around the engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the binary is not the main point
&lt;/h2&gt;

&lt;p&gt;Node.js, Bun, and Deno already provide ways to reduce deployment complexity. Producing one file is not, by itself, a unique runtime model.&lt;/p&gt;

&lt;p&gt;The more important Tysel decision is that host effects pass through an explicit application contract.&lt;/p&gt;

&lt;p&gt;For example, a service that needs one API and one secret can request exactly those resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[permissions]&lt;/span&gt;
&lt;span class="py"&gt;fetch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"api.example.com"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;secrets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"API_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These declarations are requests, not unconditional authority.&lt;/p&gt;

&lt;p&gt;Effective access is constrained by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;manifest request
∩ deployment policy
∩ execution profile
∩ runtime support
= effective capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding a permission to the application manifest cannot override a stricter deployment or execution profile.&lt;/p&gt;

&lt;p&gt;This does not make every Tysel application a hostile-code sandbox. The default &lt;code&gt;service&lt;/code&gt; profile is designed for trusted first-party code and shares a process with the native host.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;isolated&lt;/code&gt; profile moves JavaScript into a separate worker process. On Linux, it adds Landlock filesystem rules, seccomp syscall filtering, resource limits, and best-effort cgroup enforcement.&lt;/p&gt;

&lt;p&gt;Capability restriction, process isolation, container policy, and infrastructure egress controls remain separate security layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Durable work is part of the runtime
&lt;/h2&gt;

&lt;p&gt;Agents and background workflows frequently call an external service, wait, retry, sleep, or pause for human approval.&lt;/p&gt;

&lt;p&gt;Tysel exposes explicit durable boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;create-draft&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;createDraft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;approval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a restart, completed boundaries return their persisted results and execution continues against recorded history.&lt;/p&gt;

&lt;p&gt;A completed model call or external write does not need to run again simply because the process restarted while waiting for approval.&lt;/p&gt;

&lt;p&gt;This is not an “exactly once” claim. External systems still need idempotency keys. Durable storage remains operational state. Deployed code must preserve the meaning and ordering of boundaries used by in-flight tasks.&lt;/p&gt;

&lt;p&gt;The goal is a visible recovery model, not pretending distributed failure has disappeared.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the current numbers show
&lt;/h2&gt;

&lt;p&gt;Tysel publishes benchmark evidence with its releases instead of presenting one number as a universal performance claim.&lt;/p&gt;

&lt;p&gt;For the small v0.2.0 reference HTTP service:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Published evidence&lt;/th&gt;
&lt;th&gt;Linux x64&lt;/th&gt;
&lt;th&gt;Linux arm64&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Executable size&lt;/td&gt;
&lt;td&gt;19.81 MiB&lt;/td&gt;
&lt;td&gt;16.04 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold-start p50&lt;/td&gt;
&lt;td&gt;6.29 ms&lt;/td&gt;
&lt;td&gt;4.36 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle memory, PSS&lt;/td&gt;
&lt;td&gt;7.31 MiB&lt;/td&gt;
&lt;td&gt;6.72 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These measurements were collected on GitHub-hosted Ubuntu 24.04 runners. Cold start measures process launch until the service reports readiness. It is not HTTP latency or throughput.&lt;/p&gt;

&lt;p&gt;The application is intentionally tiny, so these numbers should not be generalized to arbitrary bundles or dependencies. Their purpose is narrower: they show that the named v0.2.0 reference artifacts remain within the project’s release admission limits.&lt;/p&gt;

&lt;p&gt;The raw evidence is public for &lt;a href="https://github.com/wangcch/tysel/releases/download/v0.2.0/benchmark-evidence-linux-x64.json" rel="noopener noreferrer"&gt;Linux x64&lt;/a&gt; and &lt;a href="https://github.com/wangcch/tysel/releases/download/v0.2.0/benchmark-evidence-linux-arm64.json" rel="noopener noreferrer"&gt;Linux arm64&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “stable” means before 1.0
&lt;/h2&gt;

&lt;p&gt;Tysel has stable and canary delivery channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;final SemVer releases enter &lt;code&gt;stable&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;versions with a prerelease suffix enter &lt;code&gt;canary&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stable does not mean the API is frozen.&lt;/p&gt;

&lt;p&gt;Tysel remains pre-1.0, and APIs may change between minor releases. Stable means a final release has passed the complete compatibility, security, packaging, signing, reproducibility, and supported-platform gates.&lt;/p&gt;

&lt;p&gt;It describes release qualification and delivery—not permanent API compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not use Node.js, Bun, or Deno?
&lt;/h2&gt;

&lt;p&gt;You probably should if broad Node.js compatibility is the primary requirement.&lt;/p&gt;

&lt;p&gt;Tysel intentionally does not support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js built-ins;&lt;/li&gt;
&lt;li&gt;native addons;&lt;/li&gt;
&lt;li&gt;child processes;&lt;/li&gt;
&lt;li&gt;dynamic libraries;&lt;/li&gt;
&lt;li&gt;CommonJS loader hooks;&lt;/li&gt;
&lt;li&gt;arbitrary ambient operating-system access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An npm package works only when its assumptions fit the supported ECMAScript and Web API surface.&lt;/p&gt;

&lt;p&gt;The CLI can identify known dependency assumptions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tysel compat &lt;span class="nt"&gt;--strict&lt;/span&gt; &lt;span class="nt"&gt;--deny-unknown&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That report is an admission signal, not proof that every path through a dependency will work. Application tests remain necessary.&lt;/p&gt;

&lt;p&gt;Tysel is a better candidate when the workload benefits from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one executable as the deployment unit;&lt;/li&gt;
&lt;li&gt;explicit network, secret, database, and filesystem access;&lt;/li&gt;
&lt;li&gt;Fetch-style HTTP APIs;&lt;/li&gt;
&lt;li&gt;durable sleep, retry, effects, and signals;&lt;/li&gt;
&lt;li&gt;a reduced execution profile;&lt;/li&gt;
&lt;li&gt;release evidence tied to the artifact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a trade, not a free upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current limitations
&lt;/h2&gt;

&lt;p&gt;Tysel is still young, and the limitations matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs can change between minor releases.&lt;/li&gt;
&lt;li&gt;npm compatibility is intentionally narrower than Node.js.&lt;/li&gt;
&lt;li&gt;The production isolation gate is Linux-specific.&lt;/li&gt;
&lt;li&gt;macOS isolation is a development check, not the production sandbox target.&lt;/li&gt;
&lt;li&gt;Native Windows archives are not available; Windows currently requires WSL.&lt;/li&gt;
&lt;li&gt;Wasm Component tasks remain experimental.&lt;/li&gt;
&lt;li&gt;There is no claim of an independent security audit.&lt;/li&gt;
&lt;li&gt;A service using the in-process profile must still be trusted first-party code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of those are disqualifying, Tysel is probably not the right runtime for that application today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feedback I need
&lt;/h2&gt;

&lt;p&gt;A runtime cannot discover its real compatibility boundary using only examples written by its author.&lt;/p&gt;

&lt;p&gt;I need applications with unexpected dependencies, deployment environments with different assumptions, and developers willing to identify where the contract is useful—or unnecessarily restrictive.&lt;/p&gt;

&lt;p&gt;If the idea is relevant to you, start with the small service and then try the dependency or workload you actually care about.&lt;/p&gt;

&lt;p&gt;I would especially value answers to these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which Node.js APIs or npm packages prevent you from trying a narrower runtime?&lt;/li&gt;
&lt;li&gt;Does explicit capability configuration improve deployment review?&lt;/li&gt;
&lt;li&gt;Is one-executable delivery operationally useful if you already deploy containers?&lt;/li&gt;
&lt;li&gt;Which part of the development or deployment path creates the most friction?&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tysel.dev" rel="noopener noreferrer"&gt;Try Tysel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tysel.dev/docs/getting-started/" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wangcch/tysel" rel="noopener noreferrer"&gt;Source code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wangcch/tysel/releases/tag/v0.2.0" rel="noopener noreferrer"&gt;v0.2.0 release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>typescript</category>
      <category>rust</category>
      <category>node</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
