<?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: Sumama Jamil</title>
    <description>The latest articles on DEV Community by Sumama Jamil (@sumama_jamil_173056ab0be5).</description>
    <link>https://dev.to/sumama_jamil_173056ab0be5</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3979013%2F270972d4-d44c-4b3e-84a6-1a634c06e7f7.png</url>
      <title>DEV Community: Sumama Jamil</title>
      <link>https://dev.to/sumama_jamil_173056ab0be5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sumama_jamil_173056ab0be5"/>
    <language>en</language>
    <item>
      <title>I Spent a Year Setting Up New Machines. So I Built a Tool That Does It in One Command.</title>
      <dc:creator>Sumama Jamil</dc:creator>
      <pubDate>Thu, 11 Jun 2026 08:03:22 +0000</pubDate>
      <link>https://dev.to/sumama_jamil_173056ab0be5/i-spent-a-year-setting-up-new-machines-so-i-built-a-tool-that-does-it-in-one-command-67j</link>
      <guid>https://dev.to/sumama_jamil_173056ab0be5/i-spent-a-year-setting-up-new-machines-so-i-built-a-tool-that-does-it-in-one-command-67j</guid>
      <description>&lt;p&gt;Every time I get a new laptop, the same thing happens. Day one. Fresh install. Nothing works the way I want it. No git. No Docker. No Node. No Vim config. Nothing. So I spend the next three hours Googling. "How to install Docker on Ubuntu." "How to set up WSL2 on Windows." "Why is my pacman command not found." Copy, paste, hope. Break something. Start over.&lt;/p&gt;

&lt;p&gt;By the end of the day I have a machine that sort of works, but I'm not sure what I installed or whether any of it is set up right. And I know I'll go through the exact same thing next time. If you've ever set up a new machine, you know this feeling. It's not hard. It's just tedious, repetitive, and easy to get wrong.&lt;/p&gt;

&lt;p&gt;I got tired of it. So I built "nexus-engine"(&lt;a href="https://github.com/Sumama-Jameel/nexus-engine" rel="noopener noreferrer"&gt;https://github.com/Sumama-Jameel/nexus-engine&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;You write a simple file that describes what you want on your machine. Then you run one command and it sets everything up.&lt;/p&gt;

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

&lt;p&gt;Here is what a setup file looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-setup&lt;/span&gt;
&lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;foundation&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;foundation&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tool&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nodejs&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;language&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it does the rest. Detects your OS, figures out which package manager to use, installs everything in the right order, and gives you a report when it's done.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Works The Same Everywhere
&lt;/h2&gt;

&lt;p&gt;This was the big one for me. I switch between Ubuntu, Arch, and Fedora depending on what I'm doing. Every distro has its own package manager. Different commands, different syntax, different package names.&lt;/p&gt;

&lt;p&gt;nexus-engine handles all four major Linux package managers through one interface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apt (Ubuntu, Debian)&lt;/li&gt;
&lt;li&gt;pacman (Arch, Manjaro)&lt;/li&gt;
&lt;li&gt;dnf (Fedora, RHEL)&lt;/li&gt;
&lt;li&gt;apk (Alpine)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You write your setup file once. It works everywhere. You don't need to know which command belongs to which distro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Windows Gets Linux in About a Minute
&lt;/h2&gt;

&lt;p&gt;If you're on Windows and you want a Linux environment, normally you have to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enable WSL&lt;/li&gt;
&lt;li&gt;Pick a distro&lt;/li&gt;
&lt;li&gt;Download it&lt;/li&gt;
&lt;li&gt;Import it&lt;/li&gt;
&lt;li&gt;Configure wsl.conf&lt;/li&gt;
&lt;li&gt;Set up your packages inside it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's a lot of steps and a lot of places to go wrong.&lt;/p&gt;

&lt;p&gt;With nexus-engine:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It checks if your system is ready, downloads a Linux rootfs, imports it into WSL2, configures it with secure defaults, and you're in. About sixty seconds.&lt;/p&gt;

&lt;p&gt;Then you can drop into your Linux environment anytime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nexus wsl enter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  If Something Breaks, It Cleans Up
&lt;/h2&gt;

&lt;p&gt;This is the part that always got me with manual setup. You're installing ten things. Number seven fails. Now you have six things installed, one broken, and three that never got attempted. What do you do? Uninstall manually? Start over? Just live with it?&lt;/p&gt;

&lt;p&gt;nexus-engine handles this differently. It installs things in priority order. Foundation packages first, then languages, then tools. If a foundation package fails, it removes everything it already installed that run. You're never left with a half-working setup.&lt;/p&gt;

&lt;p&gt;It also checks things before it starts. Disk space, network connectivity, whether you have the right permissions. It tells you upfront if something is going to be a problem instead of failing halfway through.&lt;/p&gt;

&lt;h2&gt;
  
  
  You Can Share and Reuse Setups
&lt;/h2&gt;

&lt;p&gt;I have a base setup that I use on every machine. Git, curl, a few essentials. Then I have specific setups for different projects. One for web development. One for data science. One for a particular client's stack.&lt;/p&gt;

&lt;p&gt;nexus-engine lets you layer these on top of each other. A data science setup can extend the base setup. You only define what's different. The rest is inherited.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data-science&lt;/span&gt;
&lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;base-dev&lt;/span&gt;
&lt;span class="na"&gt;packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python3&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;language&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jupyter&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tool&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pandas&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also share setups with other people. Your team can use the same setup file. New team member joins, they run one command, they have the same environment as everyone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  You Should Be Able to Trust It
&lt;/h2&gt;

&lt;p&gt;Here's the thing about a tool that installs stuff on your machine. You need to trust it.&lt;/p&gt;

&lt;p&gt;I thought about this a lot. So I made some decisions early on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't run whatever it wants.&lt;/strong&gt; Every command goes through a strict allowlist. If it's not on the list, it doesn't run. No shell metacharacters, no arbitrary execution, no surprises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It checks setup files for tampering.&lt;/strong&gt; Every profile gets a SHA256 integrity check. If someone modifies your setup file, nexus-engine will notice and refuse to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Downloads are verified.&lt;/strong&gt; When it downloads a Linux rootfs or a remote profile, it checks that what it received is what it expected. No man-in-the-middle surprises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your state is tracked.&lt;/strong&gt; It keeps a record of everything it installed, when, and why. You can always see what's on your machine and where it came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;It's a single binary. No dependencies. Download it and run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install with Go&lt;/span&gt;
go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/Sumama-Jameel/nexus-engine/cmd/nexus@latest

&lt;span class="c"&gt;# Or download a binary from the releases page&lt;/span&gt;
&lt;span class="c"&gt;# https://github.com/Sumama-Jameel/nexus-engine/releases&lt;/span&gt;

&lt;span class="c"&gt;# Initialize your environment&lt;/span&gt;
nexus init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows, the fastest path to Linux:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This is v1.0.0. It works for my use case and I've been using it daily. But I built it in the open because I want it to work for more people.&lt;/p&gt;

&lt;p&gt;Things I'm thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More rootfs options for WSL2&lt;/li&gt;
&lt;li&gt;A community directory of shared setups&lt;/li&gt;
&lt;li&gt;Better Windows support beyond WSL&lt;/li&gt;
&lt;li&gt;Package managers I haven't covered yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of this sounds useful to you, check it out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Sumama-Jameel/nexus-engine" rel="noopener noreferrer"&gt;github.com/Sumama-Jameel/nexus-engine&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apache 2.0, fully open source. Read the code, open an issue, tell me what's missing. I want this to be something people actually trust to run on their machines. That bar is high and I want to clear it.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
