<?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: ByJonas</title>
    <description>The latest articles on DEV Community by ByJonas (@byjonas).</description>
    <link>https://dev.to/byjonas</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%2F4058044%2F478a5ded-1712-4e14-a9f0-909ec4fcc224.png</url>
      <title>DEV Community: ByJonas</title>
      <link>https://dev.to/byjonas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/byjonas"/>
    <language>en</language>
    <item>
      <title>Why Your JavaScript Toolchain Keeps Breaking (And How to Fix It with Jolter)</title>
      <dc:creator>ByJonas</dc:creator>
      <pubDate>Sat, 01 Aug 2026 13:44:11 +0000</pubDate>
      <link>https://dev.to/byjonas/why-your-javascript-toolchain-keeps-breaking-and-how-to-fix-it-with-jolter-31am</link>
      <guid>https://dev.to/byjonas/why-your-javascript-toolchain-keeps-breaking-and-how-to-fix-it-with-jolter-31am</guid>
      <description>&lt;p&gt;If you've worked with JavaScript for a while, you've probably experienced something like this:&lt;/p&gt;

&lt;p&gt;You clone a repository.&lt;/p&gt;

&lt;p&gt;You install dependencies.&lt;/p&gt;

&lt;p&gt;A few seconds later:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Unsupported engine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;"Okay, I'll switch my Node version."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You switch versions.&lt;/p&gt;

&lt;p&gt;Now &lt;code&gt;pnpm&lt;/code&gt; isn't the right version.&lt;/p&gt;

&lt;p&gt;You fix that.&lt;/p&gt;

&lt;p&gt;Then another project suddenly stops working because it expected a different Node release.&lt;/p&gt;

&lt;p&gt;Rinse and repeat.&lt;/p&gt;

&lt;p&gt;At some point you start wondering why managing JavaScript environments feels harder than actually writing JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  It's not just a Node.js problem
&lt;/h2&gt;

&lt;p&gt;For a long time I thought the issue was Node itself.&lt;/p&gt;

&lt;p&gt;It isn't.&lt;/p&gt;

&lt;p&gt;The real problem is that modern JavaScript development doesn't depend on a single runtime anymore. Every project has its own combination of tools.&lt;/p&gt;

&lt;p&gt;One project might expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 24&lt;/li&gt;
&lt;li&gt;pnpm 11&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another one might require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 22&lt;/li&gt;
&lt;li&gt;Yarn 4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe another project uses Bun.&lt;/p&gt;

&lt;p&gt;Another uses Deno.&lt;/p&gt;

&lt;p&gt;Some repositories rely on &lt;code&gt;packageManager&lt;/code&gt;, others use &lt;code&gt;.nvmrc&lt;/code&gt;, some use &lt;code&gt;.node-version&lt;/code&gt;, and some have no version information at all.&lt;/p&gt;

&lt;p&gt;If you're working across multiple repositories, it's easy to end up constantly switching runtimes and package managers just to get a project running.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "works on my machine" problem
&lt;/h2&gt;

&lt;p&gt;It gets even worse when you're working with other people.&lt;/p&gt;

&lt;p&gt;Maybe your teammate has Node 24 installed.&lt;/p&gt;

&lt;p&gt;You still have Node 22.&lt;/p&gt;

&lt;p&gt;CI downloads yet another version.&lt;/p&gt;

&lt;p&gt;Someone updates pnpm without telling anyone.&lt;/p&gt;

&lt;p&gt;Suddenly the same repository behaves differently depending on who runs it.&lt;/p&gt;

&lt;p&gt;We've all seen bugs that weren't actually bugs, they were just different environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  The current solutions
&lt;/h2&gt;

&lt;p&gt;There are already some great tools out there.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nvm&lt;/li&gt;
&lt;li&gt;fnm&lt;/li&gt;
&lt;li&gt;Volta&lt;/li&gt;
&lt;li&gt;mise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They all solve parts of the problem, and many developers use them every day.&lt;/p&gt;

&lt;p&gt;But I kept running into the same thought:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Why am I managing multiple tools just to manage my tools?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One application manages Node.&lt;/p&gt;

&lt;p&gt;Another helps with package managers.&lt;/p&gt;

&lt;p&gt;CI needs its own setup.&lt;/p&gt;

&lt;p&gt;Documentation tells contributors what to install.&lt;/p&gt;

&lt;p&gt;There's a lot of moving pieces.&lt;/p&gt;




&lt;h2&gt;
  
  
  A different idea
&lt;/h2&gt;

&lt;p&gt;That's why I started building Jolter.&lt;/p&gt;

&lt;p&gt;The goal wasn't to replace Node.&lt;/p&gt;

&lt;p&gt;It wasn't even just to replace another version manager.&lt;/p&gt;

&lt;p&gt;The goal was much simpler:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A project should be able to describe its entire JavaScript toolchain in one place.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of asking contributors to manually install the right versions, the repository simply declares what it needs.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schemas.jolter.dev/project/v2/schema.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schemaVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"24"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pnpm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"11"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;The project says it needs Node 24 and pnpm 11.&lt;/p&gt;

&lt;p&gt;No guessing.&lt;/p&gt;

&lt;p&gt;No README instructions that slowly become outdated.&lt;/p&gt;

&lt;p&gt;No &lt;em&gt;"which version are you using?"&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Installing Jolter takes a single command.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux / macOS
&lt;/h3&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://jolter.dev/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows (Powershell)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://jolter.dev/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then initialize it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jolter setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pick your preferred defaults:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jolter use node@lts
jolter use pnpm@11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And whenever you're inside a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jolter pin node@24
jolter pin pnpm@11
jolter &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jolter creates a &lt;code&gt;jolter.json&lt;/code&gt; file that you commit to your repository, so everyone, including CI, uses the same toolchain.&lt;/p&gt;




&lt;h2&gt;
  
  
  No more switching versions manually
&lt;/h2&gt;

&lt;p&gt;One thing I always found annoying was manually changing runtimes whenever I switched projects.&lt;/p&gt;

&lt;p&gt;Jolter approaches this a little differently.&lt;/p&gt;

&lt;p&gt;Instead of relying on shell hooks, it creates lightweight command shims.&lt;/p&gt;

&lt;p&gt;Whenever you run a command like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node
pnpm
npm
yarn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jolter figures out which project you're currently in and automatically launches the correct runtime and tools for that repository.&lt;/p&gt;

&lt;p&gt;That means you can jump between completely different projects without manually switching versions every time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The same setup works in CI
&lt;/h2&gt;

&lt;p&gt;One of my biggest goals was making local development and CI behave the same way.&lt;/p&gt;

&lt;p&gt;Instead of maintaining separate setup scripts, CI can simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jolter setup-ci
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same project configuration is used to install and activate the required runtime and tools.&lt;/p&gt;

&lt;p&gt;If it works locally, it should work in CI too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Still early, but already useful
&lt;/h2&gt;

&lt;p&gt;Jolter is still a young project, and there are plenty of ideas I want to build over the coming months.&lt;/p&gt;

&lt;p&gt;But even today it already supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Bun&lt;/li&gt;
&lt;li&gt;Deno&lt;/li&gt;
&lt;li&gt;npm&lt;/li&gt;
&lt;li&gt;pnpm&lt;/li&gt;
&lt;li&gt;Yarn&lt;/li&gt;
&lt;li&gt;Automatic project switching&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;GitLab CI&lt;/li&gt;
&lt;li&gt;A plugin system for managing additional developer tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to have one place that manages your JavaScript toolchain, whether you're working alone, with a team, or inside CI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;I don't think JavaScript needs another package manager.&lt;/p&gt;

&lt;p&gt;It doesn't need another runtime either.&lt;/p&gt;

&lt;p&gt;What I think it needs is a simpler way to manage the tooling we already have.&lt;/p&gt;

&lt;p&gt;That's the problem I'm trying to solve with Jolter.&lt;/p&gt;

&lt;p&gt;If that sounds interesting, I'd love to hear what you think.&lt;/p&gt;

&lt;p&gt;Feedback, ideas, and even criticism are always welcome—it's how open source gets better.&lt;/p&gt;

&lt;p&gt;Thanks for reading. ❤️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>jolter</category>
      <category>node</category>
      <category>deno</category>
    </item>
  </channel>
</rss>
