<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Jafar Uruç</title>
  <link href="https://jafarabdi.github.io/"/>
  <link rel="self" href="https://jafarabdi.github.io/atom.xml"/>
  <id>https://jafarabdi.github.io/</id>
  <updated>2026-08-16T00:00:00Z</updated>
  <author><name>Jafar Uruç</name></author>
  <entry>
    <title>Podman &amp; Ubuntu</title>
    <link href="https://jafarabdi.github.io/2026/08/16/podman/"/>
    <id>https://jafarabdi.github.io/2026/08/16/podman/</id>
    <updated>2026-08-16T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2026/08/16/podman/">&lt;p&gt;I&#x27;ve always liked the idea of rootless containerization. I think it&#x27;s even more crucial now that we have agents running all the time on our machines.&lt;/p&gt;
&lt;p&gt;I learned about Podman before the LLM era from &lt;a href=&quot;https://www.manning.com/books/podman-in-action&quot;&gt;Podman in Action&lt;/a&gt;, which I found useful. One of the most annoying things about Podman, though, is using it on Ubuntu. The version available through &lt;code&gt;apt&lt;/code&gt; is outdated, so you have to build it from source if you want a newer release.&lt;/p&gt;
&lt;p&gt;Well, now that we have AI, I decided to take a stab at it and see if I could get it to build easily so I could use it on my servers or as a sandbox for my agents.&lt;/p&gt;
&lt;p&gt;Credit goes to &lt;a href=&quot;https://github.com/mgoltzsche/podman-static&quot;&gt;podman-static&lt;/a&gt; for open-sourcing his repo. My agent definitely took a lot of things from it.&lt;/p&gt;
&lt;p&gt;I pushed it to my &lt;a href=&quot;https://github.com/JafarAbdi/myconfigs/tree/main/podman&quot;&gt;dotfiles&lt;/a&gt;. Here is how to build and install it:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;clone&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;https://github.com/JafarAbdi/myconfigs.git&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--depth&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;./myconfigs/podman
just&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;build
just&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And ta-da! You now have a fully static Podman build that you can copy to any machine, and it will work out of the box.&lt;/p&gt;
&lt;p&gt;I need to write a blog post about how much I love musl and zigbuild and how much easier they make my life by making fully static binaries possible.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Trying out Nemotron 3.5 Lightning 30B</title>
    <link href="https://jafarabdi.github.io/2026/08/14/NVIDIA-Nemotron-3.5-Lightning/"/>
    <id>https://jafarabdi.github.io/2026/08/14/NVIDIA-Nemotron-3.5-Lightning/</id>
    <updated>2026-08-14T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2026/08/14/NVIDIA-Nemotron-3.5-Lightning/">&lt;p&gt;&lt;a href=&quot;https://huggingface.co/ggml-org/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-GGUF&quot;&gt;NVIDIA Nemotron 3.5 Lightning 30B A3B GGUF&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;serve&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;-hf&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ggml-org/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-GGUF:Q4_0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;-ngl&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;auto&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;-c&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;262144&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-np&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;-ctk&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;q8_0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-ctv&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;q8_0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;-fa&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--fit&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--spec-type&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;draft-mtp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--spec-draft-n-max&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--jinja&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--kv-unified&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--temp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--top-p&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.95&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--top-k&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--min-p&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--reasoning&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--reasoning-format&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;deepseek&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--no-reasoning-preserve&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--host&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.0.0.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--port&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;--alias&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;nemotron-3.5-lightning
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I asked it to build a Rubik&#x27;s Cube game:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;attachments/20260814_103526.png&quot;&gt;&lt;img alt=&quot;image&quot; src=&quot;attachments/20260814_103526.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/JafarAbdi/myconfigs/blob/main/claude/.claude/commands/rubiks_cube.md&quot;&gt;Prompt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Anyway, Gemma4 31B is still my favorite and most useful model.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>AI failure mode #1: shelling out to Python</title>
    <link href="https://jafarabdi.github.io/2026/08/14/ai-failure-mode-1/"/>
    <id>https://jafarabdi.github.io/2026/08/14/ai-failure-mode-1/</id>
    <updated>2026-08-14T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2026/08/14/ai-failure-mode-1/">&lt;p&gt;Sometimes I look at code generated by clankers and think, WTF? I’ll start recording these failures in blog posts.&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;uv&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;run&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;python&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;-m&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cwd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_REPO_ROOT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It&#x27;s shelling out through &lt;code&gt;uv&lt;/code&gt; just to start another Python process 🤷‍♂️ to get a function’s output rather than importing that file and calling the function directly...&lt;/p&gt;
&lt;p&gt;Another instance I have seen a lot is when it tries to use &lt;a href=&quot;https://docs.ros.org/en/rolling/index.html&quot;&gt;ros2&lt;/a&gt; cli interface rather than just importing &lt;code&gt;ros2cli&lt;/code&gt; or using &lt;code&gt;rclpy&lt;/code&gt;. This is an actual piece of code that was pushed...&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;completed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;ros2&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;topic&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;echo&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;--once&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;--no-arr&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEVNULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;stderr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEVNULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TimeoutExpired&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can &lt;a href=&quot;https://github.com/search?q=subprocess.run+ros2&amp;amp;type=code&quot;&gt;search github&lt;/a&gt; to see how much slop is being pushed.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Muse Glimmer 30B</title>
    <link href="https://jafarabdi.github.io/2026/08/10/Muse-Glimmer-30B/"/>
    <id>https://jafarabdi.github.io/2026/08/10/Muse-Glimmer-30B/</id>
    <updated>2026-08-10T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2026/08/10/Muse-Glimmer-30B/">&lt;p&gt;Meta released the weights for its Muse Glimmer model, following up on Muse Spark 1.2. One of my hobbies these days is trying out different models and wasting electricity and a few brain cells on them.&lt;/p&gt;
&lt;p&gt;The server configuration below follows Meta&#x27;s &lt;a href=&quot;https://huggingface.co/meta-models/Muse-Glimmer-30B-GGUF&quot;&gt;Muse Glimmer 30B model card&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;serve&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-hf&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;meta-models/Muse-Glimmer-30B-GGUF:17gb&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--spec-type&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;draft-dflash&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--spec-draft-n-max&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-ngl&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;all&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-ngld&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;all&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-c&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;131072&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-np&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-fa&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--fit&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--jinja&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--temp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--top-p&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.95&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--top-k&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--min-p&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--host&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.0.0.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--alias&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;muse-glimmer&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--kv-unified&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--reasoning-preserve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;serve&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-hf&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;meta-models/Muse-Glimmer-30B-GGUF:dynamic&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--spec-type&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;draft-dflash&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--spec-draft-n-max&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-ngl&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;all&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-ngld&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;all&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-c&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;131072&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-np&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-fa&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--fit&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--jinja&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--temp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--top-p&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.95&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--top-k&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--min-p&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--host&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.0.0.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--alias&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;muse-glimmer&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--kv-unified&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--reasoning-preserve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;17gb&lt;/code&gt;: 57.95 tokens/s, using about 20 GB of VRAM with a 128K-token context.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dynamic&lt;/code&gt;: 56.84 tokens/s, using about 23 GB of VRAM with a 128K-token context.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In initial testing, Muse Glimmer is noticeably faster than Gemma 4, uses less memory, and comfortably handles four agents in parallel. I also did not notice much difference between the &lt;code&gt;17gb&lt;/code&gt; and &lt;code&gt;dynamic&lt;/code&gt; variants. The former may be slightly faster, but I could not tell in practice.&lt;/p&gt;
&lt;p&gt;I will try Muse Glimmer for a few days to see whether it can replace Gemma 4 and Qwen 3.6 in my workflow. For reference, here is my current Gemma 4 configuration:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;serve&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-hf&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ggml-org/gemma-4-31B-it-GGUF:Q4_0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--spec-type&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;draft-mtp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--spec-draft-n-max&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-ngl&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;all&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-ngld&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;all&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-c&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;65536&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-np&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-fa&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--fit&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--jinja&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--temp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--top-k&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--reasoning&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--chat-template-kwargs&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;{&amp;quot;preserve_thinking&amp;quot;:true}&amp;#39;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--host&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.0.0.0&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--port&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--alias&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;gemma4&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;--kv-unified
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content>
  </entry>
  <entry>
    <title>I Don&#x27;t Want Smarter Models</title>
    <link href="https://jafarabdi.github.io/2026/08/09/standup-67/"/>
    <id>https://jafarabdi.github.io/2026/08/09/standup-67/</id>
    <updated>2026-08-09T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2026/08/09/standup-67/">&lt;p&gt;Well... at least for now.&lt;/p&gt;
&lt;p&gt;I really enjoy listening to &lt;a href=&quot;https://thestanduppod.com/&quot;&gt;The Standup Pod&lt;/a&gt; while vibe coding things that I regret two hours later. Anyway, I was listening to &lt;a href=&quot;https://www.youtube.com/watch?v=bPcf00mcMTk&quot;&gt;Offsite: Pi | Standup #67&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quoting Dillon Mulroy:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&#x27;t want smarter models. I don&#x27;t want models are getting like RL on these like long horizon tasks. Like I don&#x27;t use agents that way. I haven&#x27;t seen agents be successful that way. They&#x27;re okay. Let me backtrack. They&#x27;re good for the long horizon stuff for like debugging and triaging.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have the same feeling. I still miss the models we had between February and April 2026. Here is a plot of how I felt:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;attachments/20260809_120049.png&quot;&gt;&lt;img alt=&quot;image&quot; src=&quot;attachments/20260809_120049.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For me, their usefulness peaked during that period. Newer models remain useful and powerful, but they surprise me less.&lt;/p&gt;
&lt;p&gt;Long-horizon agents have worked beautifully for me when debugging. I used to flex my ability to debug and SSH into machines to find issues. Holy cow, these models are so good at it. They know all the right commands, and when I give a model a way to receive feedback, it helps me fix all kinds of bugs, including hardware issues.&lt;/p&gt;
&lt;p&gt;Outside debugging and triaging, however, I haven&#x27;t had much success with agents handling very long-horizon tasks without my interaction.&lt;/p&gt;
&lt;p&gt;The newer models also feel less steerable. Fable/Opus 5 always thinks it&#x27;s better than you and takes ages to do a task, only to do everything except what you asked it to do. GPT-5.6 Sol feels more steerable, but it still sometimes runs for more than 50 turns. My guess is that they tried to make these models tackle long, &lt;a href=&quot;https://github.com/karpathy/autoresearch&quot;&gt;autoresearch&lt;/a&gt; style runs, but now the models overrun tasks. I would rather have an autoresearch plugin that I can control than models that default to long runs. But that is just me 🤷‍♂️&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Hello, world!</title>
    <link href="https://jafarabdi.github.io/2026/08/08/hello-world/"/>
    <id>https://jafarabdi.github.io/2026/08/08/hello-world/</id>
    <updated>2026-08-08T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2026/08/08/hello-world/">&lt;p&gt;One of the main reasons I had friction with blogging was the existing workflow. Until now, I had been using Jekyll with the &lt;a href=&quot;https://github.com/alshedivat/al-folio/&quot;&gt;al-folio&lt;/a&gt; theme. While it&#x27;s amazing and beautiful, the workflow never clicked for me. Anyway, now with LLMs around, I asked my best friend Claude to build a &lt;a href=&quot;https://suckless.org/&quot;&gt;suckless&lt;/a&gt; blog in simple Python.&lt;/p&gt;
&lt;p&gt;The solution is very opinionated and built for my own constraints: two Python files, ~250 LOC. On top sit an unnecessary &lt;a href=&quot;https://pi.dev/&quot;&gt;pi&lt;/a&gt; extension (&lt;a href=&quot;https://github.com/JafarAbdi/JafarAbdi.github.io/blob/main/.pi/extensions/title.ts&quot;&gt;&lt;code&gt;.pi/extensions/title.ts&lt;/code&gt;&lt;/a&gt;) to feel good about myself, plus a proofread skill (&lt;a href=&quot;https://github.com/JafarAbdi/JafarAbdi.github.io/blob/main/.claude/skills/proofread/SKILL.md&quot;&gt;&lt;code&gt;.claude/skills/proofread/SKILL.md&lt;/code&gt;&lt;/a&gt;) to make sure I didn&#x27;t ship a stupid typo. All posts will be written entirely by me: no AI slop bullshit.&lt;/p&gt;
&lt;p&gt;Let&#x27;s see how it goes!&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Local Inference Models</title>
    <link href="https://jafarabdi.github.io/2026/08/08/local-models/"/>
    <id>https://jafarabdi.github.io/2026/08/08/local-models/</id>
    <updated>2026-08-08T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2026/08/08/local-models/">&lt;p&gt;One of the most exciting thing in AI is not just that powerful models can solve a fair number of tasks in a single attempt. It is that more of these models can now run locally.&lt;/p&gt;
&lt;p&gt;Here are some local models I currently use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ggml-org/whisper.cpp/&quot;&gt;Whisper&lt;/a&gt;: I use it with my personal assistant when I cannot be bothered to type. It generally works very well.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/ggml-org/GLM-OCR-GGUF&quot;&gt;GLM-OCR&lt;/a&gt;: This is an excellent model for turning screenshots of equations or text from PDFs and images into copyable text. Here is my &lt;a href=&quot;https://github.com/JafarAbdi/myconfigs/blob/main/scripts/.local/bin/eq2latex&quot;&gt;script&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/unsloth/Qwen3.6-27B-MTP-GGUF&quot;&gt;Qwen3.6&lt;/a&gt;: I used it for coding, but these days I prefer Gemma4, especially after the latest fixes to the chat template.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/ggml-org/gemma-4-31B-it-GGUF&quot;&gt;Gemma4&lt;/a&gt;: I use it for my personal assistant and simple coding tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today, I experimented with &lt;a href=&quot;https://www.minimax.io/blog/minimax-h3&quot;&gt;MiniMax-H3&lt;/a&gt;. I asked Fable, using its &lt;code&gt;xhigh&lt;/code&gt; effort setting, to write an optimized inference script. MiniMax-H3 fits easily in the VRAM of my RTX 3090 and takes about 22 minutes to generate a 124-frame video at 864x480 resolution.&lt;/p&gt;
&lt;p&gt;I am looking forward to trying Qwen3.8 when it is released.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Using Pixi as a Development Environment for ROS 2</title>
    <link href="https://jafarabdi.github.io/2025/08/23/ros2-pixi-dev/"/>
    <id>https://jafarabdi.github.io/2025/08/23/ros2-pixi-dev/</id>
    <updated>2025-08-23T00:00:00Z</updated>
    <content type="html" xml:base="https://jafarabdi.github.io/2025/08/23/ros2-pixi-dev/">&lt;p&gt;When starting a new ROS 2 project with multiple team members, establishing a reproducible development environment is crucial for success. Without it, you&#x27;ll inevitably face the classic &quot;works on my machine&quot; problem, where code that runs perfectly for one developer fails mysteriously for another.&lt;/p&gt;
&lt;h2 id=&quot;what-is-robostack&quot;&gt;What is RoboStack?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://robostack.github.io/index.html&quot;&gt;RoboStack&lt;/a&gt; brings the Robot Operating System (ROS) to any platform - Linux, macOS, and Windows - using the Conda package manager. Unlike traditional ROS installations that are Linux-specific and require system-level packages, RoboStack packages ROS distributions (like Humble and Jazzy) as Conda packages that can be installed without root access.&lt;/p&gt;
&lt;p&gt;This approach enables easy integration of ROS with machine learning libraries like PyTorch and Flax in the same environment, making it perfect for robotics research that combines traditional robotics with modern AI workflows.&lt;/p&gt;
&lt;h2 id=&quot;enter-pixi-a-unified-development-solution&quot;&gt;Enter Pixi: A Unified Development Solution&lt;/h2&gt;
&lt;p&gt;One approach I used in the past was to create a Docker image that encapsulated all the dependencies and configurations needed for the project. This worked well for ensuring consistency across machines, but it also introduced significant complexity and frustration (see &lt;a href=&quot;#appendix-docker-challenges-in-ros-2-development&quot;&gt;Appendix: Docker Challenges&lt;/a&gt; for details).&lt;/p&gt;
&lt;p&gt;In this post, I&#x27;ll introduce pixi as a modern alternative for creating reproducible ROS 2 development environments.&lt;/p&gt;
&lt;h3 id=&quot;what-pixi-brings-to-the-table&quot;&gt;What Pixi Brings to the Table&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Three tools in one&lt;/strong&gt;: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Task runner (Replaces Makefile) &lt;/li&gt;
&lt;li&gt;Dependency management (combines conda and PyPI through uv) with a lock file &lt;/li&gt;
&lt;li&gt;Multi-environments management.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ROS 2 integration&lt;/strong&gt; through &lt;a href=&quot;https://robostack.github.io/&quot;&gt;RoboStack&lt;/a&gt; project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple multi-distro support&lt;/strong&gt;: Easy switching between ROS 2 distributions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python integration&lt;/strong&gt;: Ensuring ROS 2 and Python dependencies are compatible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For comprehensive documentation, visit &lt;a href=&quot;https://pixi.sh/latest/&quot;&gt;pixi.sh&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;getting-started-initial-setup&quot;&gt;Getting Started: Initial Setup&lt;/h3&gt;
&lt;p&gt;Begin by initializing Pixi in your project directory:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Next, configure the appropriate channels. The channel selection depends on your target ROS 2 distribution. You can either manually edit your &lt;code&gt;pixi.toml&lt;/code&gt; file or use the CLI:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Add RoboStack channel for your desired ROS 2 distribution&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;workspace&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;channel&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;https://prefix.dev/robostack-jazzy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will update your &lt;code&gt;pixi.toml&lt;/code&gt; file with:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;conda-forge&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;https://prefix.dev/robostack-jazzy&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Replace &lt;code&gt;robostack-jazzy&lt;/code&gt; with your desired ROS 2 distribution (e.g., &lt;code&gt;robostack-humble&lt;/code&gt; for Humble).&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;ros-2-base-dependencies&quot;&gt;ROS 2 Base Dependencies&lt;/h3&gt;
&lt;p&gt;Add ROS 2 dependencies using the CLI:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Add one of the following based on your project needs:&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ros-jazzy-ros-core&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Minimal core functionality&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ros-jazzy-ros-base&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Standard base installation (recommended)&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ros-jazzy-desktop&lt;span class=&quot;w&quot;&gt;         &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Desktop environment with GUI tools&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ros-jazzy-desktop-full&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Complete desktop installation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip&lt;/strong&gt;: Use the &lt;a href=&quot;https://prefix.dev/&quot;&gt;prefix.dev&lt;/a&gt; package explorer to browse available packages and their dependencies. For CLI users, run: &lt;code&gt;pixi search --channel https://prefix.dev/robostack-jazzy ros-jazzy-desktop&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For common development tools, add them with:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;colcon-common-extensions&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;colcon-mixin&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cmake&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ninja&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mold&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sccache
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;dependency-management-strategy&quot;&gt;Dependency Management Strategy&lt;/h3&gt;
&lt;p&gt;I&#x27;m not aware of a tool that automatically extracts dependencies from &lt;code&gt;package.xml&lt;/code&gt; files and updates the &lt;code&gt;pixi.toml&lt;/code&gt; file. Hence, you will need to either manually add the required packages to your &lt;code&gt;pixi.toml&lt;/code&gt; through the &lt;code&gt;pixi add &amp;lt;package-name&amp;gt;&lt;/code&gt; command or by creating a script that parses &lt;code&gt;package.xml&lt;/code&gt; files and updates the &lt;code&gt;pixi.toml&lt;/code&gt; file accordingly with &lt;code&gt;pixi add $(my-cool-vibe-coded-script)&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;task-automation&quot;&gt;Task Automation&lt;/h3&gt;
&lt;p&gt;Define your tasks using the CLI:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;task&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;build&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;colcon build&amp;quot;&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;task&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;colcon test&amp;quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--depends-on&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Execute tasks with simple commands:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;run&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Automatically runs build first, then test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Advanced Task Features Worth Exploring:&lt;/strong&gt;
- &lt;a href=&quot;https://pixi.sh/latest/workspace/advanced_tasks/#task-arguments&quot;&gt;Task arguments&lt;/a&gt; for parameterized execution
- &lt;a href=&quot;https://pixi.sh/latest/workspace/advanced_tasks/#caching&quot;&gt;Task caching&lt;/a&gt; for improved performance&lt;/p&gt;
&lt;h3 id=&quot;multi-environment-support&quot;&gt;Multi-Environment Support&lt;/h3&gt;
&lt;p&gt;One of Pixi&#x27;s most powerful features is seamless multi-environments support. You can set this up using CLI commands:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Setup Humble environment&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;workspace&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;channel&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;https://prefix.dev/robostack-humble&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;humble
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;workspace&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;environment&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;humble&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;humble
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ros-humble-ros-base&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;humble

&lt;span class=&quot;c1&quot;&gt;# Setup Jazzy environment&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;workspace&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;channel&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;https://prefix.dev/robostack-jazzy&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jazzy
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;workspace&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;environment&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jazzy&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jazzy
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;ros-jazzy-ros-base&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jazzy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This creates the following configuration in your &lt;code&gt;pixi.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;[feature.jazzy.dependencies]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ros-jazzy-ros-base&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;*&amp;quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[feature.humble.dependencies]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ros-humble-ros-base&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;*&amp;quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[environments]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;humble&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;humble&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;jazzy&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;jazzy&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Switch between environments effortlessly:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;shell&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-e&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;jazzy&lt;span class=&quot;w&quot;&gt;   &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Enter Jazzy environment&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;shell&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-e&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;humble&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Switch to Humble environment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can also create specialized environments for different purposes:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Setup linting environment&lt;/span&gt;
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pre-commit&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lint
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;workspace&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;environment&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lint&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lint&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--no-default-feature
pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;task&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lint&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;pre-commit run --all-files&amp;quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--feature&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;run&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This eliminates the need for multiple Docker containers.&lt;/p&gt;
&lt;h3 id=&quot;pypi-dependencies&quot;&gt;PyPi dependencies&lt;/h3&gt;
&lt;p&gt;Pixi uses &lt;a href=&quot;https://docs.astral.sh/uv/&quot;&gt;uv&lt;/a&gt; for managing PyPI dependencies alongside Conda packages. To add PyPI packages, use:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--pypi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;numpy&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;scipy&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;matplotlib
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It also supports extras. For example, to add Flask with async support:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pixi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--pypi&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;flask&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;async&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will update your &lt;code&gt;pixi.toml&lt;/code&gt; file with:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;[pypi-dependencies]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;flask&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&amp;gt;=3.1.2, &amp;lt;4&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extras&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;async&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you want to add a source python package, you can do so by specifying the path:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;[pypi-dependencies]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;my_cool_library&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;./my_cool_library&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;editable&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extras&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;dev&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;cross-platform-support&quot;&gt;Cross-Platform Support&lt;/h3&gt;
&lt;p&gt;Most of the RoboStack packages are available in &lt;code&gt;linux-64&lt;/code&gt;, &lt;code&gt;linux-aarch64&lt;/code&gt;, &lt;code&gt;osx-64&lt;/code&gt;, &lt;code&gt;osx-arm64&lt;/code&gt;, and &lt;code&gt;win-64&lt;/code&gt;. If you are lucky enough and all your other dependencies are available on these platforms, you can use Pixi to create a cross-platform ROS 2 development environment.&lt;/p&gt;
&lt;h3 id=&quot;streamlined-cicd-workflows&quot;&gt;Streamlined CI/CD Workflows&lt;/h3&gt;
&lt;p&gt;This part is what I&#x27;m mostly excited about when using Pixi. Pixi ensures that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Local development environments match CI exactly&lt;/li&gt;
&lt;li&gt;Failed tests can be debugged locally with identical conditions&lt;/li&gt;
&lt;li&gt;No more &quot;works on my machine&quot; scenarios&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While tools like &lt;a href=&quot;https://github.com/ros-industrial/industrial_ci&quot;&gt;industrial_ci&lt;/a&gt; remain valuable, Pixi&#x27;s reproducibility makes debugging significantly more straightforward.&lt;/p&gt;
&lt;h3 id=&quot;example-implementation&quot;&gt;Example Implementation&lt;/h3&gt;
&lt;p&gt;For a practical demonstration, explore this complete ROS 2 project using Pixi: &lt;a href=&quot;https://github.com/JafarAbdi/pixi_ros2_example&quot;&gt;pixi_ros2_example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The project showcases:
- Dual support for Humble and Jazzy distributions
- Clean, self-contained structure
- Automated CI/CD integration&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Project Structure:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;project_root/
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;.github/workflows/ci.yaml&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# CI/CD configuration&lt;/span&gt;
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pixi.toml&lt;span class=&quot;w&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Project configuration&lt;/span&gt;
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pixi.lock&lt;span class=&quot;w&quot;&gt;                    &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Dependency lock file&lt;/span&gt;
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;colcon_defaults.yaml&lt;span class=&quot;w&quot;&gt;         &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Colcon settings&lt;/span&gt;
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;build/&lt;span class=&quot;w&quot;&gt;                       &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Build artifacts&lt;/span&gt;
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;install/&lt;span class=&quot;w&quot;&gt;                     &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Installation directory&lt;/span&gt;
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pkg1/&lt;span class=&quot;w&quot;&gt;                        &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# ROS 2 package 1&lt;/span&gt;
├──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pkg2/&lt;span class=&quot;w&quot;&gt;                        &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# ROS 2 package 2&lt;/span&gt;
└──&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id=&quot;bonus-git-worktree-integration&quot;&gt;Bonus: Git Worktree Integration&lt;/h3&gt;
&lt;p&gt;I&#x27;m a big fan of &lt;a href=&quot;https://git-scm.com/docs/git-worktree&quot;&gt;git-worktree&lt;/a&gt;. With this approach, I can easily manage multiple branches of the same repository without needing to clone it multiple times or stash changes when switching branches. This is particularly useful for ROS 2 development, where you might want to work on multiple features or bug fixes simultaneously.&lt;/p&gt;
&lt;p&gt;Simply running &lt;code&gt;git worktree add ../worktree_dirname branch_name&lt;/code&gt; creates a new directory with the specified branch checked out, allowing you to work on it independently.&lt;/p&gt;
&lt;h3 id=&quot;current-limitations-and-considerations&quot;&gt;Current Limitations and Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Synchronizing dependencies from package.xml&lt;/strong&gt;: You will need to manually add dependencies from &lt;code&gt;package.xml&lt;/code&gt; to the &lt;code&gt;pixi.toml&lt;/code&gt; file. This is a bit of a hassle, but manageable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ros-testing packages&lt;/strong&gt;: Currently, RoboStack does not provide packages from the &lt;a href=&quot;https://docs.ros.org/en/humble/Installation/Testing.html#deb-testing-repository&quot;&gt;&lt;code&gt;ros-testing&lt;/code&gt; repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stability concerns&lt;/strong&gt;: Pixi is still not stable, and some features are experimental. For example, in previous versions of pixi, having an environment variable in the &lt;code&gt;activation&lt;/code&gt; section of &lt;code&gt;pixi.toml&lt;/code&gt; would cause the value to be expanded, but it stopped working in v0.51.0 and was reverted in v0.52.0. This can lead to unexpected behaviors. Fortunately, you can pin the pixi version in your &lt;code&gt;pixi.toml&lt;/code&gt; file to avoid such issues using &lt;a href=&quot;https://pixi.sh/latest/reference/pixi_manifest/#requires-pixi-optional&quot;&gt;requires-pixi&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;[activation.env]&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# In v0.51.0 the expansion is not performed, so the value is literally &amp;quot;$CONDA_PREFIX/my_env_var&amp;quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MY_ENV_VAR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$CONDA_PREFIX/my_env_var&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Specialized hardware support&lt;/strong&gt;: For Jetson machines, NVidia provides custom builds for PyTorch/TorchVision that require specific handling. Using standard PyPI/Conda packages would cause segfaults or crashes. The best solution I&#x27;m aware of for this specific case is still using Docker.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;update-experimental-build-backends-for-ros-packages&quot;&gt;Update: Experimental Build Backends for ROS Packages&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/blooop&quot;&gt;Austin Gregg-Smith&lt;/a&gt; and &lt;a href=&quot;https://github.com/traversaro&quot;&gt;Silvio Traversaro&lt;/a&gt; told me about an exciting new feature in Pixi, it now includes experimental &lt;a href=&quot;https://github.com/prefix-dev/pixi-build-backends&quot;&gt;build backends&lt;/a&gt; that can build ROS 2 packages directly from source code.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://github.com/ruben-arts/ros_workspace/&quot;&gt;ros_workspace&lt;/a&gt; for an example of how to use this feature.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As someone who has been working in robot learning where projects require a mix of Python and C++ codebases alongside complex dependency management spanning both ROS 2 and ML frameworks, Pixi has been a game-changer. The ability to seamlessly manage conda-forge packages for ROS 2 components alongside PyPI packages for machine learning dependencies in a single, reproducible environment has dramatically reduced development friction and allowed me to iterate much faster.&lt;/p&gt;
&lt;h2 id=&quot;appendix-advanced-pixi-usage&quot;&gt;Appendix: Advanced Pixi Usage&lt;/h2&gt;
&lt;p&gt;Beyond ROS 2, I&#x27;ve successfully used Pixi to build complex projects like OMPL, MuJoCo, MuJoCo MPC, and llama.cpp from source - you can find these configurations in my &lt;a href=&quot;https://github.com/JafarAbdi/pixi_workspaces&quot;&gt;pixi_workspaces&lt;/a&gt; repository.&lt;/p&gt;
&lt;h2 id=&quot;appendix-docker-challenges-in-ros-2-development&quot;&gt;Appendix: Docker Challenges in ROS 2 Development&lt;/h2&gt;
&lt;p&gt;Having worked with Docker for ROS 2 development, the typical workflow involves three files: a Dockerfile with several stages (base image with ROS 2 installed, dependency installation, build stage to compile ROS packages, and final dev stage with necessary tools), a docker-compose file defining services like the dev environment and CI/CD testing that mount the workspace and set environment variables, and finally a Makefile that orchestrates the build and run commands.&lt;/p&gt;
&lt;p&gt;However, this approach has several significant drawbacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reproducibility issues: To truly ensure reproducibility, you need to pin every dependency version in the Dockerfile: system &amp;amp; ROS 2 packages (via apt), Python packages (via pip). While ROS 2 provides a snapshot repository after each release and distro (&lt;a href=&quot;http://wiki.ros.org/SnapshotRepository&quot;&gt;snapshot repository&lt;/a&gt;), you still need to create custom scripts to scrape package.xml files and requirements.txt files to generate lock files containing all dependencies and their versions. As far as I know, no tool does this automatically for ROS 2 packages. You also need to ensure PyPI dependencies are compatible and won&#x27;t cause runtime errors due to version mismatches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slow build times: If you are not careful with your docker build&#x27;s context, you can end up with invalidating the Docker cache for every build, leading to long build times and slow development cycles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://imgs.xkcd.com/comics/compiling.png&quot;&gt;&lt;img alt=&quot;xkcd: Compiling&quot; src=&quot;https://imgs.xkcd.com/comics/compiling.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Typical xkcd developer waiting for Docker to build a ROS 2 workspace.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Image size bloat: Docker images become massive, especially when adding CUDA and other heavy dependencies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disk space consumption: Docker images can take up a lot of disk space, just run &lt;code&gt;docker system df&lt;/code&gt; to see how much space is consumed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;heaviest_objects_in_the_universe.jpg&quot;&gt;&lt;img alt=&quot;Heaviest objects in the universe&quot; src=&quot;heaviest_objects_in_the_universe.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Heaviest objects in the universe: neutron stars, black holes, and Docker images. &lt;a href=&quot;https://bsky.app/profile/xeiaso.net/post/3lglgdrjzfs22&quot;&gt;(Source: Bluesky post)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Development Workflow Friction: This might be specific to robot learning + ROS 2 workflows. It&#x27;s often much simpler to create a virtual environment with uv or poetry for ML code, install dependencies directly, and run your models. However, this approach creates two separate environments: one for ROS 2 packages and another for machine learning code. This split leads to integration challenges when you finally want to deploy your trained model on the robot. (Note that Conda isn&#x27;t a viable solution here either, as both apt-provided ROS 2 and Conda modify environment variables in conflicting ways.)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;acknowledgments&quot;&gt;Acknowledgments&lt;/h3&gt;
&lt;p&gt;Thanks to Sam Pfeiffer and Sebastian Castro for reviewing this post and providing helpful feedback.&lt;/p&gt;</content>
  </entry>
</feed>
