<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://recursing.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://recursing.dev/" rel="alternate" type="text/html" /><updated>2026-10-07T19:54:41+00:00</updated><id>https://recursing.dev/feed.xml</id><title type="html">recursing.dev</title><subtitle>Jon&apos;s personal blog, CV, and portfolio</subtitle><entry><title type="html">A nix flake for ruby</title><link href="https://recursing.dev/blog/2026/10/06/a-nix-flake-for-ruby/" rel="alternate" type="text/html" title="A nix flake for ruby" /><published>2026-10-06T00:00:00+00:00</published><updated>2026-10-06T00:00:00+00:00</updated><id>https://recursing.dev/blog/2026/10/06/a-nix-flake-for-ruby</id><content type="html" xml:base="https://recursing.dev/blog/2026/10/06/a-nix-flake-for-ruby/"><![CDATA[<p>This is the nix config I use as a starting point for all Ruby projects.</p>

<p>We can’t run <code class="language-plaintext highlighter-rouge">bundle install</code> here, so instead just use it to regenerate the lock file, and use <a href="https://github.com/inscapist/bundix.git">bundix</a> to build a <code class="language-plaintext highlighter-rouge">gemset.nix</code>:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle lock <span class="o">&amp;&amp;</span> bundix <span class="o">&amp;&amp;</span> direnv reload
</code></pre></div></div>

<h2 id="flakenix">flake.nix</h2>
<div class="language-nix highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span>
  <span class="nv">description</span> <span class="o">=</span> <span class="s2">"Ruby on Nix"</span><span class="p">;</span>

  <span class="nv">inputs</span> <span class="o">=</span> <span class="p">{</span>
    <span class="nv">nixpkgs</span><span class="o">.</span><span class="nv">url</span> <span class="o">=</span> <span class="s2">"github:NixOS/nixpkgs/nixos-unstable"</span><span class="p">;</span>
    <span class="nv">ruby-nix</span> <span class="o">=</span> <span class="p">{</span>
      <span class="nv">url</span> <span class="o">=</span> <span class="s2">"github:inscapist/ruby-nix"</span><span class="p">;</span>
      <span class="nv">inputs</span><span class="o">.</span><span class="nv">nixpkgs</span><span class="o">.</span><span class="nv">follows</span> <span class="o">=</span> <span class="s2">"nixpkgs"</span><span class="p">;</span>
    <span class="p">};</span>
    <span class="nv">bundix</span> <span class="o">=</span> <span class="p">{</span><span class="nv">url</span> <span class="o">=</span> <span class="s2">"github:inscapist/bundix/main"</span><span class="p">;};</span>
    <span class="nv">flake-utils</span><span class="o">.</span><span class="nv">url</span> <span class="o">=</span> <span class="s2">"github:numtide/flake-utils"</span><span class="p">;</span>
    <span class="nv">bob-ruby</span> <span class="o">=</span> <span class="p">{</span>
      <span class="nv">url</span> <span class="o">=</span> <span class="s2">"github:bobvanderlinden/nixpkgs-ruby"</span><span class="p">;</span>
      <span class="nv">inputs</span><span class="o">.</span><span class="nv">nixpkgs</span><span class="o">.</span><span class="nv">follows</span> <span class="o">=</span> <span class="s2">"nixpkgs"</span><span class="p">;</span>
      <span class="nv">inputs</span><span class="o">.</span><span class="nv">flake-utils</span><span class="o">.</span><span class="nv">follows</span> <span class="o">=</span> <span class="s2">"flake-utils"</span><span class="p">;</span>
    <span class="p">};</span>
  <span class="p">};</span>

  <span class="nv">outputs</span> <span class="o">=</span> <span class="p">{</span><span class="nv">nixpkgs</span><span class="p">,</span> <span class="o">...</span><span class="p">}</span> <span class="o">@</span> <span class="nv">inputs</span><span class="p">:</span>
    <span class="kn">with</span> <span class="nv">inputs</span><span class="o">.</span><span class="nv">flake-utils</span><span class="o">.</span><span class="nv">lib</span><span class="p">;</span>
      <span class="nv">eachDefaultSystem</span> <span class="p">(</span><span class="nv">system</span><span class="p">:</span> <span class="kd">let</span>
        <span class="nv">pkgs</span> <span class="o">=</span> <span class="kr">import</span> <span class="nv">nixpkgs</span> <span class="p">{</span>
          <span class="kn">inherit</span> <span class="nv">system</span><span class="p">;</span>
          <span class="nv">overlays</span> <span class="o">=</span> <span class="p">[</span>
            <span class="nv">inputs</span><span class="o">.</span><span class="nv">bob-ruby</span><span class="o">.</span><span class="nv">overlays</span><span class="o">.</span><span class="nv">default</span>
            <span class="p">(</span><span class="nv">final</span><span class="p">:</span> <span class="nv">prev</span><span class="p">:</span> <span class="p">{</span><span class="nv">nodejs</span> <span class="o">=</span> <span class="nv">prev</span><span class="o">.</span><span class="nv">nodejs_24</span><span class="p">;})</span>
          <span class="p">];</span>
        <span class="p">};</span>

        <span class="nv">gemset</span> <span class="o">=</span>
          <span class="k">if</span> <span class="kr">builtins</span><span class="o">.</span><span class="nv">pathExists</span> <span class="sx">./gemset.nix</span>
          <span class="k">then</span> <span class="kr">import</span> <span class="sx">./gemset.nix</span>
          <span class="k">else</span> <span class="p">{};</span>

        <span class="c"># some gems need a little help with their dependencies</span>
        <span class="nv">gemConfig</span> <span class="o">=</span> <span class="p">{</span>
          <span class="nv">faiss</span> <span class="o">=</span> <span class="nv">attrs</span><span class="p">:</span> <span class="p">{</span>
            <span class="nv">buildInputs</span> <span class="o">=</span> <span class="p">[</span><span class="nv">pkgs</span><span class="o">.</span><span class="nv">llvmPackages</span><span class="o">.</span><span class="nv">openmp</span> <span class="nv">pkgs</span><span class="o">.</span><span class="nv">openblas</span><span class="p">];</span>
            <span class="nv">dontBuild</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
            <span class="nv">postPatch</span> <span class="o">=</span> <span class="s2">''</span><span class="err">
</span><span class="s2">              # Fix numo-narray detection for Nix environment</span><span class="err">
</span><span class="s2">              substituteInPlace ext/faiss/extconf.rb \</span><span class="err">
</span><span class="s2">                --replace 'numo = File.join(Gem.loaded_specs["numo-narray-alt"].require_path, "numo")' \</span><span class="err">
</span><span class="s2">                          'numo = File.join(Gem::Specification.find_by_name("numo-narray-alt").gem_dir, "ext", "numo", "narray")'</span><span class="err">
</span><span class="s2">            ''</span><span class="p">;</span>
          <span class="p">};</span>
          <span class="nv">mittens</span> <span class="o">=</span> <span class="nv">attrs</span><span class="p">:</span> <span class="p">{</span><span class="nv">buildInputs</span> <span class="o">=</span> <span class="p">[</span><span class="nv">pkgs</span><span class="o">.</span><span class="nv">libstemmer</span><span class="p">];};</span>
        <span class="p">};</span>

        <span class="nv">rubyNix</span> <span class="o">=</span> <span class="nv">inputs</span><span class="o">.</span><span class="nv">ruby-nix</span><span class="o">.</span><span class="nv">lib</span> <span class="nv">pkgs</span><span class="p">;</span>

        <span class="c"># use whatever is listed in .ruby-version</span>
        <span class="nv">rubyVersion</span> <span class="o">=</span> <span class="nv">nixpkgs</span><span class="o">.</span><span class="nv">lib</span><span class="o">.</span><span class="nv">fileContents</span> <span class="sx">./.ruby-version</span><span class="p">;</span>

        <span class="nv">ruby</span> <span class="o">=</span> <span class="nv">pkgs</span><span class="o">.</span><span class="s2">"</span><span class="si">${</span><span class="nv">rubyVersion</span><span class="si">}</span><span class="s2">"</span><span class="o">.</span><span class="nv">override</span> <span class="p">{</span><span class="nv">jemallocSupport</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;};</span>

        <span class="nv">bundixcli</span> <span class="o">=</span> <span class="nv">inputs</span><span class="o">.</span><span class="nv">bundix</span><span class="o">.</span><span class="nv">packages</span><span class="o">.</span><span class="p">${</span><span class="nv">system</span><span class="p">}</span><span class="o">.</span><span class="nv">default</span><span class="p">;</span>
      <span class="kn">in</span> <span class="kr">rec</span> <span class="p">{</span>

        <span class="kn">inherit</span>
          <span class="p">(</span><span class="nv">rubyNix</span> <span class="p">{</span>
            <span class="kn">inherit</span> <span class="nv">gemset</span> <span class="nv">ruby</span><span class="p">;</span>
            <span class="nv">name</span> <span class="o">=</span> <span class="s2">"rails"</span><span class="p">;</span>
            <span class="nv">gemConfig</span> <span class="o">=</span> <span class="nv">pkgs</span><span class="o">.</span><span class="nv">defaultGemConfig</span> <span class="o">//</span> <span class="nv">gemConfig</span><span class="p">;</span>
            <span class="c"># Use the 'toolbox' group for gems that I might use in development, but don't want loaded by the app</span>
            <span class="nv">groups</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"default"</span> <span class="s2">"development"</span> <span class="s2">"test"</span> <span class="s2">"toolbox"</span><span class="p">];</span>
          <span class="p">})</span> <span class="nv">env</span><span class="p">;</span>

        <span class="nv">devShells</span> <span class="o">=</span> <span class="p">{</span>
          <span class="nv">default</span> <span class="o">=</span> <span class="nv">pkgs</span><span class="o">.</span><span class="nv">mkShell</span> <span class="p">{</span>
            <span class="nv">buildInputs</span> <span class="o">=</span>
              <span class="p">[</span><span class="nv">env</span> <span class="nv">bundixcli</span><span class="p">]</span>
              <span class="o">++</span> <span class="p">(</span><span class="kn">with</span> <span class="nv">pkgs</span><span class="p">;</span> <span class="p">[</span>
                <span class="nv">act</span>
                <span class="nv">biome</span>
                <span class="nv">corepack_24</span>
                <span class="nv">rufo</span>
                <span class="nv">typescript</span>
                <span class="nv">typescript-language-server</span>
              <span class="p">]);</span>
          <span class="p">};</span>
        <span class="p">};</span>
      <span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="meta" /><category term="design" /><summary type="html"><![CDATA[This is the nix config I use as a starting point for all Ruby projects.]]></summary></entry></feed>