<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Of The Stars</title>
    <link rel="self" type="application/atom+xml" href="https://of-the-stars.net/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://of-the-stars.net"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-02-16T00:00:00+00:00</updated>
    <id>https://of-the-stars.net/atom.xml</id>
    <entry xml:lang="en">
        <title>02 Embedded Rust Plus Nix, pt. 1</title>
        <published>2026-02-16T00:00:00+00:00</published>
        <updated>2026-02-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Stellae
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://of-the-stars.net/blog/02-embedded-rust-plus-nix-pt-1/"/>
        <id>https://of-the-stars.net/blog/02-embedded-rust-plus-nix-pt-1/</id>
        
        <content type="html" xml:base="https://of-the-stars.net/blog/02-embedded-rust-plus-nix-pt-1/">&lt;h2 id=&quot;tl-dr&quot;&gt;TL;DR&lt;&#x2F;h2&gt;
&lt;p&gt;I made an embedded Rust workflow for the Arduino Uno (more broadly, the ATMega328p chips they use) using the Nix language. It takes the form of a flake, whose template you can use right now by using&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;nix&lt;&#x2F;span&gt;&lt;span&gt; flake init&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -t &lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;github:of-the-stars&#x2F;flake-templates#arduino&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;within your embedded Rust project! It allows you to build and deploy your project to your device automatically from a remote source with one simple command. It also allows you to enter a local development sandbox with all necessary dependencies included with &lt;code&gt;nix develop&lt;&#x2F;code&gt; command or automatically with the wonderful &lt;a href=&quot;https:&#x2F;&#x2F;direnv.net&#x2F;&quot;&gt;direnv&lt;&#x2F;a&gt; project.&lt;&#x2F;p&gt;
&lt;p&gt;My example blink project can be built from remote using the command&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;nix&lt;&#x2F;span&gt;&lt;span&gt; run &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;github:of-the-stars&#x2F;blinkyy&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Keep reading to learn about my journey on getting here!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;&#x2F;h2&gt;
&lt;p&gt;Recently I found a big huge abandoned box of DIY electronics components at my job, mostly made up of an Elegoo Mega 2560 R3 Starter Kit, plus a few extra items which included a couple of ESP32 DevKit v1s. Before this I&#x27;d bought myself an Elegoo Uno R3 Starter Kit off of Amazon a couple of years back, and I wrote some baremetal C++ and Rust for it while on Ubuntu. I&#x27;d also used it for a research experience I was a part of. However, almost immediately before finding the components that I did, I&#x27;d been running into some problems creating a Nix flake-based toolchain for my Uno to use on my NixOS machine, namely getting &lt;code&gt;rustc&lt;&#x2F;code&gt; to actually compile for the target architecture. I&#x27;d given up, but finding all these components and more than doubling my collection motivated me to actually knuckle down and figure out what was going on. Unfortunately, I decided to choose something that&#x27;s such a niche within a niche that very little documentation exists for what I&#x27;m trying to do, and I had to piece this together via various code snippets and my growing understanding of both Nix and Rust. And in the spirit of leaving things better than how I found them, I&#x27;m writing this with the hopes that I&#x27;ll be able to save other the headaches I&#x27;ve had to fight through.&lt;&#x2F;p&gt;
&lt;p&gt;Trying to get specifically a Nix &lt;em&gt;flake&lt;&#x2F;em&gt; working to cross compile Rust to the &lt;code&gt;avr-none&lt;&#x2F;code&gt; target using Nix was my main goal, and while I eventually got it working, it took about a month&#x27;s worth of trying to do so. They main goal of the project was that with the &quot;experimental&quot; &lt;code&gt;nix&lt;&#x2F;code&gt; command, it could be possible to pull an embedded project&#x27;s source code, and automatically deploy it from source with the guarantee that it&#x27;s going to be the exact same resulting artifact with every invocation of a single command, that being&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;nix&lt;&#x2F;span&gt;&lt;span&gt; run &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;github:of-the-stars&#x2F;blinkyy&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you have an Arduino Uno, try it! As long as you have Nix installed, with the &lt;code&gt;nix-command&lt;&#x2F;code&gt; and &lt;code&gt;flakes&lt;&#x2F;code&gt; experimental flags, and a stable internet connection, this will build a simple Rust program that flashes the on-board LED 10 times a second.&lt;&#x2F;p&gt;
&lt;p&gt;The beautiful part is that this eliminates the hard part of embedded deployment so that anyone wanting to flash firmware can do so easily and frictionlessly. As a developer, this simplifies the often complicated installation of embedded toolchains, managing source, and building the firmware with specific flags for my end users and collaborators.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-great-battle&quot;&gt;The Great Battle&lt;&#x2F;h2&gt;
&lt;p&gt;The Goliath of this particular fight, as it is with most niche Nix applications, is the complete lack of comprehensive up-to-date documentation. Nix has been evolving quite rapidly in recent years, especially since 2021. The core of the Nix language and package manager, the most well documented parts, haven&#x27;t changed much. But when it comes to the newer features like Nix Flakes, the best one can do is follow breadcrumbs like a sleuth to piece together an understanding. And I agree with people like &lt;a href=&quot;https:&#x2F;&#x2F;cafkafk.dev&#x2F;&quot;&gt;cafkafk&lt;&#x2F;a&gt;, a current member of the Nix Steering Committe, that the flake interfaces aren&#x27;t unstable at all and that a path to release needs to be made immediately. For many, myself included, flakes are what finally made Nix &quot;click&quot; and make sense. Before I switched my system to using flakes, fiddling with channels and various &lt;code&gt;shell.nix&lt;&#x2F;code&gt; files felt extremely weird, since they seemed to violate the whole &quot;pure derivation&quot; thing that I&#x27;d seen emphasized across the project. And pulling specific revisions from hard-coded magic number git revisions felt like an ugly hack that I did not want to deal with.&lt;&#x2F;p&gt;
&lt;p&gt;This is why a flake-based approach was so important to me. It greatly simplifies the development and deployment, and the ability to do 5 different things with 2 small files and a couple command invocations seems like magic.&lt;&#x2F;p&gt;
&lt;p&gt;For this project the main stack is:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;An Elegoo Uno R3&lt;&#x2F;li&gt;
&lt;li&gt;The &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Rahix&#x2F;avr-hal&quot;&gt;avr-hal&lt;&#x2F;a&gt; to provide Rust abstractions to interact with the hardware&lt;&#x2F;li&gt;
&lt;li&gt;Oxalica&#x27;s &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;oxalica&#x2F;rust-overlay&quot;&gt;rust-overlay&lt;&#x2F;a&gt; to use tell Nix which Rust toolchain to use&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipetkov&#x2F;crane&quot;&gt;Crane&lt;&#x2F;a&gt; as the Nix library to build the rust code&lt;&#x2F;li&gt;
&lt;li&gt;A Nix flake to create a development environment, package the code, and create a shell script to flash the firmware&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Rahix&#x2F;avr-hal&#x2F;tree&#x2F;main&#x2F;ravedude&quot;&gt;Ravedude&lt;&#x2F;a&gt; as a fancy &lt;code&gt;avrdude&lt;&#x2F;code&gt; wrapper to flash the firmware and open a console&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Seems simple enough, and minus Ravedude and the Arduino, this looks identical to a lot of others&#x27; setups for building Rust projects with Nix. The main blocker was the hardware itself. Getting a Rust toolchain declaratively set up with Nix seemed possible; &lt;code&gt;avr-none&lt;&#x2F;code&gt; was at least a supported target, albeit a tier three one. If it weren&#x27;t an officially supported target, like &lt;code&gt;xtensa-none-elf&lt;&#x2F;code&gt; which is the ESP32 target, that&#x27;s a whole other ballgame, and it warrants a part 2 in this series.&lt;&#x2F;p&gt;
&lt;p&gt;The main supervoid that ate up all my time was trying to use &lt;code&gt;nixpkgs&lt;&#x2F;code&gt;&#x27;s built-in cross compilation framework to build the package. The main reason this simply doesn&#x27;t work is because Nix isn&#x27;t running on the Arduino. While getting Nix working in an embedded context seems like an interesting exercise, the ATMega328p microcontroller on the Arduino simply doesn&#x27;t have the power to run such an overhead. Once I moved past this approach, I started to make leaps in progress towards the final goal.&lt;&#x2F;p&gt;
&lt;p&gt;The second major obstacle was getting Crane, the Nix library, to actually build for the Arduino. By this time,, I&#x27;d already gotten the pretty simple dev envrionment set up, and running &lt;code&gt;cargo build&lt;&#x2F;code&gt; or &lt;code&gt;cargo run&lt;&#x2F;code&gt; worked just fine to build and flash the artifact to the board. However with Crane, I kept hitting snags where certain dependencies couldn&#x27;t be reached when running &lt;code&gt;nix build&lt;&#x2F;code&gt;, but running &lt;code&gt;cargo build&lt;&#x2F;code&gt; in the dev shell worked just fine.&lt;&#x2F;p&gt;
&lt;p&gt;As it turns out, as part of its effort to maintain reproducibility, Crane &lt;em&gt;vendors&lt;&#x2F;em&gt; its Cargo dependencies, keeping the entire dependency graph in the Nix store. The reason this doesn&#x27;t work out of the box with the Arduino target is because &lt;code&gt;avr-none&lt;&#x2F;code&gt; is a tier three target for the Rust language. In all Rust projects targeting ATMega microcontrollers, we have to pass &lt;code&gt;-Z build-std=core&lt;&#x2F;code&gt; to the Rust compiler to build the core Rust language from scratch because the Rust Foundation does not provide pre-built artifacts for the &lt;code&gt;avr-none&lt;&#x2F;code&gt; target. So whenever Crane vendors its dependencies, including the &lt;code&gt;rust-src&lt;&#x2F;code&gt; component via the custom toolchain we provided, it can&#x27;t find the crates that &lt;code&gt;core&lt;&#x2F;code&gt; depends on. Now, when inspecting the Nix store, I found out that Rust already vendored &lt;code&gt;core&lt;&#x2F;code&gt;&#x27;s dependencies for us, and placed them together to be found locally. But Crane doesn&#x27;t automatically know that, so I figured out that I have to provide it the &lt;code&gt;core&lt;&#x2F;code&gt;&#x27;s &lt;code&gt;Cargo.lock&lt;&#x2F;code&gt; file to let Crane know that all of its dependencies are already packaged, and that it doesn&#x27;t need to look among its own vendored dependencies to find them. Unfortunately, to automatically do this from our custom Rust toolchain would result in what we in Nix circles call Import From Derivation, or IFD. Scary, no? Apparently it is, because it&#x27;s a performance boogeyman that throws a wrench in the way Nix evaluates expressions. So we have to manually update the lockfile locally, which is a bit of a dirty hack. The next major version of this workflow will need to at least update this automatically and keep it tied to the &lt;code&gt;flake.lock&lt;&#x2F;code&gt; file which dictates which cached version of the Rust toolchain we&#x27;ll use.&lt;&#x2F;p&gt;
&lt;pre data-linenos data-lang=&quot;nix&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-nix &quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;59&lt;&#x2F;td&gt;&lt;td&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Helps vendor &amp;#39;core&amp;#39; so that all its dependencies can be found
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;tr&gt;&lt;td&gt;60&lt;&#x2F;td&gt;&lt;td&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;cargoVendorDir &lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#bf616a;color:#2b303b;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;craneLib&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;vendorMultipleCargoDeps &lt;&#x2F;span&gt;&lt;span&gt;{
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;tr&gt;&lt;td&gt;61&lt;&#x2F;td&gt;&lt;td&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;inherit &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;craneLib&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;findCargoFiles src&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;cargoConfigs&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;tr&gt;&lt;td&gt;62&lt;&#x2F;td&gt;&lt;td&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;cargoLockList &lt;&#x2F;span&gt;&lt;span&gt;= [
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;tr&gt;&lt;td&gt;63&lt;&#x2F;td&gt;&lt;td&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.&#x2F;Cargo.lock
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;tr&gt;&lt;td&gt;64&lt;&#x2F;td&gt;&lt;td&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.&#x2F;toolchain&#x2F;Cargo.lock
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;tr&gt;&lt;td&gt;65&lt;&#x2F;td&gt;&lt;td&gt;&lt;span&gt;  ];
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;tr&gt;&lt;td&gt;66&lt;&#x2F;td&gt;&lt;td&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;background-color:#bf616a;color:#2b303b;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The goal is to make this automatic as a part of running &lt;code&gt;nix flake update&lt;&#x2F;code&gt;, or to just bite the bullet and just accept the IFD anyway. However, I like my builds to be completely pure, so it&#x27;ll likely take me a while before I get a breakthrough with it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Now that I&#x27;ve built this workflow, it&#x27;s gonna be time to actually put it to the test and build some projects using it. While I get the IFD situation figured out, I&#x27;ll also be looking to create the same workflow for the ESP32. However, since the chips I have aren&#x27;t officially supported &lt;code&gt;rustc&lt;&#x2F;code&gt; targets, I&#x27;ll either be waiting for the &lt;code&gt;gccrs&lt;&#x2F;code&gt; front-end to be completed, or more likely, have the Espresif-maintained forks of Rust and LLVM be merged upstream to use.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;resources-i-used&quot;&gt;Resources I Used&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;oxalica&#x2F;rust-overlay?tab=readme-ov-file#cheat-sheet-common-usage-of-rust-bin&quot;&gt;oxalica Rust overlay rust-bin cheatsheet&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;oxalica&#x2F;rust-overlay&#x2F;blob&#x2F;master&#x2F;examples&#x2F;cross-aarch64&#x2F;flake.nix&quot;&gt;oxalica Rust overlay cross compilation examples&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;oxalica&#x2F;rust-overlay&#x2F;blob&#x2F;master&#x2F;docs&#x2F;cross_compilation.md&quot;&gt;oxalica Rust overlay cross compilation docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;gburghoorn.com&#x2F;posts&#x2F;just-nix-rust-wasm&#x2F;&quot;&gt;&quot;Just a simple Nix Flake for Rust and WASM&quot; by Gijs Burghoorn&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;beta&#x2F;rustc&#x2F;platform-support&#x2F;avr-none.html&quot;&gt;The avr-none section of the rustc book&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;cargo&#x2F;reference&#x2F;environment-variables.html#environment-variables-cargo-sets-for-build-scripts&quot;&gt;Cargo environment variables&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Rahix&#x2F;avr-hal&quot;&gt;avr-hal docmentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ipetkov&#x2F;crane&#x2F;blob&#x2F;master&#x2F;examples&#x2F;cross-rust-overlay&#x2F;flake.nix&quot;&gt;Crane cross compilation docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crane.dev&#x2F;customizing_builds.html&quot;&gt;Crane build customization docs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>01 Nix and I</title>
        <published>2025-12-17T00:00:00+00:00</published>
        <updated>2025-12-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Stellae
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://of-the-stars.net/blog/01-nix-and-i/"/>
        <id>https://of-the-stars.net/blog/01-nix-and-i/</id>
        
        <content type="html" xml:base="https://of-the-stars.net/blog/01-nix-and-i/">&lt;h2 id=&quot;my-experience-with-nix&quot;&gt;My experience with Nix&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve been daily driving NixOS on my laptop since June 2025. My previous laptop was running Windows 11, then Ubuntu when Windows decided to be Windows. After that system broke (I dropped it), I had to buy a new laptop and decided it was also time for me to go distro hopping. While I&#x27;d been happy on Ubuntu and knew it well, I also had one glaring issue: packages.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;apt&lt;&#x2F;code&gt; isn&#x27;t well known for having a bunch of fresh-off-the-PR-merge packages available to install. Ubuntu specifically also had me deal with the Snap store, which I didn&#x27;t like at all. Why should I have to deal with an entirely separate marketplace just to get Firefox installed, especially one that sucked. Flatpak solved a few problems for me, but I didn&#x27;t like the idea of having to add yet another package manager to my already convoluted system. Appimages frustrated me with how manual they were, especially for a program such as Discord which shipped updates frequently. Combined with an install of QT Design Studio I couldn&#x27;t seem to get rid of, I no longer felt that I had a complete understanding and control of my system. The cord had become too tangled and Gordian in nature, and it had to be cut. Breaking my already failing little Hewlett-Packard was the blade to do so.&lt;&#x2F;p&gt;
&lt;p&gt;What introduced me to and sold me on NixOS was a &lt;a href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;CwfKlX3rA6E?si=EPSb2YtQHs710WTP&quot;&gt;video by No Boilerplate&lt;&#x2F;a&gt;, which adressed ever single one of the problems I&#x27;d been facing. Before that, I was considering using Arch, by the way, or perhaps one of its derivative distros like CachyOS or Manjaro. Learning that nixpkgs had not only more packages, but fresher ones at that than the AUR completely dwarfed the Nix learning curve I&#x27;d heard about. When my new Thinkpad T14 Gen 5 arrived, I spent about 10 total minutes in the pre-installed Windows environment solely to create an installer image for NixOS. I promptly washed my hands after the encounter.&lt;&#x2F;p&gt;
&lt;p&gt;Going straight to NixOS on baremetal actually seems to be a little uncommon now that I&#x27;ve spent more time in the community, so I&#x27;m quite proud that my experience was a good one. I was pretty quick to wrap my head around the basics of the Nix language and what my &lt;code&gt;configuration.nix&lt;&#x2F;code&gt; was doing. Making use of a heavily modified version of &lt;code&gt;0atman&lt;&#x2F;code&gt;&#x27;s rebuild script was a lifesaver. Speeding up the time it took me to iterte through another Nix generation, even if it was just adding a few packages, made the whole experience lightyears better than what I&#x27;d been dealing with before.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;thoughts-on-nix-and-its-future&quot;&gt;Thoughts on Nix and its future&lt;&#x2F;h2&gt;
&lt;p&gt;I liked the guarantees presented by using NixOS, which I refer to as the &quot;Nix Promises&quot;: Immutability, Reproducibility, Reliability, enough to get past the hurdle that is using Nix. Even though NixOS isn&#x27;t &lt;em&gt;truly&lt;&#x2F;em&gt; immutable by default, it gains a lot of the benefits from playing in that space via the &lt;code&gt;&#x2F;nix&#x2F;store&#x2F;&lt;&#x2F;code&gt; directory. The reproducibility hasn&#x27;t been something I&#x27;ve used all that much yet, but I&#x27;m excited to explore it as soon as I get my hands on some more hardware. The reliability has been the biggest strength of choosing NixOS as my operating system, and it&#x27;s something I think the community would do well to emphasize.&lt;&#x2F;p&gt;
&lt;p&gt;Like with my favorite programming language, Rust, I think the Nix community often forgets some of the tool&#x27;s greatest strenghts that would help push adoption. Actually, I think that Rust and Nix are both facets of the same kind of object, and not just because of how big of an overlap in the userbase there is, or the fact that they work well together. Rust and Nix set out to solve a class of problems that can really mess things up by strictly enforcing and maintaining a certain amount of theoretical correctness that most don&#x27;t really care about. The Rust borrow checker and packaging binaries with Nix both offer some overhead for their invariants that programmers just starting out with either often clash with. When speaking to people I know in person who haven&#x27;t really interacted or heard of either, I often run into the shared question of &quot;but why tho&quot;. And it&#x27;s hard to answer! Why would someone bother with Rust and Nix when C++ and Ubuntu have served just fine. Nix  has a big problem with lacking a clear raison d&#x27;être, which Rust does have. Yes Rust can be &quot;blazingly fast&quot;, but other languages are often fast enough and easier for most applications that citing its speed as its main strength isn&#x27;t enough. But if you want low-level performance, like C, that&#x27;s memory safe without the overhead of a garbage collector, you use Rust. It&#x27;s simple, it&#x27;s clear, and it gives people the motivation to actually use Rust without relying on the intellectual curiosity many use to climb up the learning curve. It&#x27;s why Rust is a permanent part of the Linux kernel, when no other language has ever been added after it was originally written in C. In the same way, other operating systems are &quot;good enough&quot; for most. NixOS is a minority within the minority that is Linux as a PC operating system. Even ignoring the fact that Windows and MacOS all dwarf Linux&#x27;s numbers, there are plenty of alternatives that someone might choose instead of Nix: Ubuntu, Fedora, Arch. NixOS lacks the same &quot;default choice&quot; that Rust has, or at least the criteria that make it a default choice are too narrow. If one were only looking for the Nix Promises, like I was, well then Nix &lt;em&gt;is&lt;&#x2F;em&gt; the obvious choice. However, the Nix Tradeoffs are something that I was willing to deal with in exchange for the Promises. That simply isn&#x27;t true for everyone, and if Nix is going to grow its numbers and its ecosystem, it needs to be the best and hopefully only logical choice for a certain problem that people actually encounter, like Rust.&lt;&#x2F;p&gt;
&lt;p&gt;While thinking about its reliability, I realized that Nix is probably the best tool for &quot;fire and forget&quot; deployment for the space between general PCs and embedded systems that still needs to be user-customizable. Something where you really don&#x27;t need to be doing much outside a specific usecase, but not so specific that you tailor and lock it down to one specific function as you do with an embedded system, and where it needs to work every single time. A kind of system where for whatever reason, you don&#x27;t want it to ever break from a software bug. Update break your system at a critical time? Just roll back and deal with it when you&#x27;re not depending on it. You get all of the benefit from the latest software, but you don&#x27;t need to worry about your system breaking. As long as it works in your tests, it&#x27;ll just work identically in production.&lt;&#x2F;p&gt;
&lt;p&gt;Admittedly, I think this is a pretty small use case. Besides a personal project of mine that is nowhere near finished enough to share details about, I&#x27;m having a hard time thinking of a usecase for such a system that isn&#x27;t already filled in by some kind of embedded system. Servers and hosting for large companies are the only other one I can really think of, and &lt;a href=&quot;https:&#x2F;&#x2F;determinate.systems&#x2F;&quot;&gt;Determinate Systems&lt;&#x2F;a&gt; seems to have already thought of this before me. Eelco Dolstra, the inventor of Nix, is one of its cofounders, so I&#x27;ll be watching to see if Nix&#x27;s adoption grows in that space over the next few years via their efforts. However, I personally would much prefer to see a growth in Nix&#x27;s usage come from innovations brought about by its community, and not any single corporate entity, regardless who&#x27;s a part of the corporation. Perhaps especially because of who&#x27;s a part of the corporation.&lt;&#x2F;p&gt;
&lt;p&gt;I quite hope that Nix grows, not just because I like the technology, but because I think that Nix solves a lot of the problems inherent to the way we currently use computers and I because I believe that using Nix will make things easier. I personally am itching to help it get to this point. I need to figure out a lot about the lnguage and how packaging works, but I have a few programs I&#x27;m hoping to help get on Nixpkgs and become a contributor. Getting to where I am with only 6 months of experience at the time of writing feels like an extremely good place to be, and I imagine 6 months from now I&#x27;ll be well beyond where I want to be when it comes to Nix.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>00 Blogging</title>
        <published>2025-12-12T00:00:00+00:00</published>
        <updated>2025-12-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Stellae
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://of-the-stars.net/blog/00-blogging/"/>
        <id>https://of-the-stars.net/blog/00-blogging/</id>
        
        <content type="html" xml:base="https://of-the-stars.net/blog/00-blogging/">&lt;p&gt;I must admit this whole endeavor is a bit intimidating.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve only been writing consistently for about a year and a half now. Leading up to now, I&#x27;ve been trying to journal on a daily basis. Writing about myself and for myself has been an enlightening experience, which I treasure dearly. To be honest, I wouldn&#x27;t have this perspective if it weren&#x27;t for a writing class I took my first semester of college that changed how I viewed the actual writing process. It helped make me comfortable with the idea of writing as an actual process, as opposed to something you just do. Since then, I&#x27;ve beein toying with the idea of creating and publishing more long form content. This blog is an experiment and learning experience designed to do exactly that.&lt;&#x2F;p&gt;
&lt;p&gt;Being an experiment, I expect a lot of what I do and how I go about it to change. I&#x27;m likely to tweak my text editor, &lt;a href=&quot;https:&#x2F;&#x2F;neovim.io&#x2F;&quot;&gt;neovim&lt;&#x2F;a&gt; to be more comfortable with writing long-form english language content. Having an autocomplete with suggested words would be quite nice, beyond the ones I do get as &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Saghen&#x2F;blink.cmp&quot;&gt;blink.cmp&lt;&#x2F;a&gt; scrambles to predict what I&#x27;m typing using what I&#x27;ve written elsewhere in the file. I may incorporate &lt;a href=&quot;https:&#x2F;&#x2F;obsidian.md&#x2F;&quot;&gt;Obsidian&lt;&#x2F;a&gt; and turn this place into more of a &#x27;digital garden&#x27;. Then again, I might simply migrate to a different static site generator besides &lt;a href=&quot;https:&#x2F;&#x2F;gohugo.io&#x2F;&quot;&gt;Hugo&lt;&#x2F;a&gt; and stick with it till the day no one is left to speak time&#x27;s name. I know that the only reason I&#x27;m not using &lt;a href=&quot;https:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; is because of its Ruby-forged dependency hell.&lt;&#x2F;p&gt;
&lt;p&gt;Expect this site to change often. That is a good thing. Publishing a new post is change. I will certainly tweak the colorscheme and the layout incrementally. As I become more comfortable with my workflow, I foresee this whole blogging thing to become a big part of my online activity, which would be desireable. Much better than doomscrolling. Until then, may the stars shine favorably on you, dear reader.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
