<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brandon Lucas</title>
    <description>The latest articles on DEV Community by Brandon Lucas (@blu).</description>
    <link>https://dev.to/blu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3624586%2F0307ebb4-443e-4fa5-ba06-e74c02868a68.jpg</url>
      <title>DEV Community: Brandon Lucas</title>
      <link>https://dev.to/blu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blu"/>
    <language>en</language>
    <item>
      <title>Nix for Fun and Profit: Programs as Lego's</title>
      <dc:creator>Brandon Lucas</dc:creator>
      <pubDate>Sun, 23 Nov 2025 23:11:30 +0000</pubDate>
      <link>https://dev.to/blu/nix-for-fun-and-profit-programs-as-legos-22e0</link>
      <guid>https://dev.to/blu/nix-for-fun-and-profit-programs-as-legos-22e0</guid>
      <description>&lt;h2&gt;
  
  
  Programs as Lego's
&lt;/h2&gt;

&lt;p&gt;Nix was made to solve the &lt;em&gt;software deployment problem&lt;/em&gt;, concisely defined by creator Eelco Dolstra thus:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[The software deployment problem] is about getting computer programs from one machine to another—and having&lt;br&gt;
them still work when they get there.&lt;/p&gt;

&lt;p&gt;The Purely Functional Software Deployment Model, Eelco Dolstra&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nix allows you to setup software on your computer in such a way that your setup is &lt;em&gt;reproducible&lt;/em&gt;, meaning your setup on machine A can be &lt;em&gt;exactly&lt;/em&gt; the same as your setup on machine B -- as long as you have Nix.&lt;/p&gt;

&lt;p&gt;To most people, learning Nix is a pain, due to the new concepts and sparse and scattered documentation.&lt;/p&gt;

&lt;p&gt;But I think Nix can make using computers &lt;em&gt;fun&lt;/em&gt; and &lt;em&gt;powerful&lt;/em&gt; and &lt;em&gt;less painful&lt;/em&gt;, once you learn how to handle its' edges.&lt;/p&gt;

&lt;p&gt;One fun way we can use Nix is to stitch together programs like Lego's and have them interact with each other in a reproducible way. Let's create an example!&lt;/p&gt;

&lt;p&gt;First &lt;a href="https://nixos.org/download/" rel="noopener noreferrer"&gt;install Nix&lt;/a&gt; if you haven't.&lt;/p&gt;

&lt;p&gt;Say we have a fun little &lt;code&gt;bash&lt;/code&gt; script like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="c"&gt;# filename: pokefortune.sh&lt;/span&gt;

&lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;pokemon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;slowking&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Silence Perl locale warnings.&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C

&lt;span class="c"&gt;# Generate a fortune if user did not pass a message.&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;fortune&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | pokemonsay &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pokemon&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It optionally takes in a message and a &lt;a href="https://pokemondb.net/pokedex/all" rel="noopener noreferrer"&gt;Pokédex&lt;/a&gt; number, and prints out that Pokémon and message using the &lt;code&gt;pokemonsay&lt;/code&gt; program. If either the message or the Pokemon aren't specified, it uses a default Pokemon and the program &lt;code&gt;fortune&lt;/code&gt; to generate the message.&lt;/p&gt;

&lt;p&gt;Save this in a file &lt;code&gt;pokefortune.sh&lt;/code&gt;, make it executable, then run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Make the bash script executable&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x pokefortune.sh

./pokefortune.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're like most people, you probably don't have &lt;code&gt;pokemonsay&lt;/code&gt; or &lt;code&gt;fortune&lt;/code&gt; installed on your system, so you'll likely see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./pokefortune.sh: line 6: fortune: &lt;span class="nb"&gt;command &lt;/span&gt;not found
./pokefortune.sh: line 7: pokemonsay: &lt;span class="nb"&gt;command &lt;/span&gt;not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore this script, which works on my system because I have these programs installed, isn't &lt;em&gt;reproducible&lt;/em&gt; on your system. Let's create a Nix &lt;em&gt;derivation&lt;/em&gt; to make it so. Create a file called &lt;code&gt;pokefortune.nix&lt;/code&gt; and copy the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# filename: pokefortune.nix&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;fetchTarball&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/NixOS/nixpkgs/archive/nixos-24.05.tar.gz"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt;
&lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;writeShellScriptBin&lt;/span&gt; &lt;span class="s2"&gt;"pokefortune"&lt;/span&gt; &lt;span class="s2"&gt;''&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="s2"&gt;message="&lt;/span&gt;&lt;span class="se"&gt;''$&lt;/span&gt;&lt;span class="s2"&gt;{1:-}"&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;pokemon="&lt;/span&gt;&lt;span class="se"&gt;''$&lt;/span&gt;&lt;span class="s2"&gt;{2:-slowking}"&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="s2"&gt;# Silence Perl locale warnings.&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;export LC_ALL=C&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="s2"&gt;# Generate a fortune if user did not pass a message.&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;if [[ -z "$message" ]]; then&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;  message=&lt;/span&gt;&lt;span class="se"&gt;''$&lt;/span&gt;&lt;span class="s2"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;fortune&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/bin/fortune)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;fi&lt;/span&gt;&lt;span class="err"&gt;

&lt;/span&gt;&lt;span class="s2"&gt;echo $message | &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;pokemonsay&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/bin/pokemonsay -p "$pokemon" -n&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;''&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix-build pokefortune.nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may take awhile, especially if this is your first time running Nix. Let's look at the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix-build src/scripts/nix/pokefortune.nix
unpacking &lt;span class="s1"&gt;'https://github.com/NixOS/nixpkgs/archive/nixos-24.05.tar.gz'&lt;/span&gt; into the Git cache...
this derivation will be built:
  /nix/store/vg4zmghqcnhjbs8kqhx04xixvm36d3ik-pokefortune.drv
these 9 paths will be fetched &lt;span class="o"&gt;(&lt;/span&gt;2.65 MiB download, 26.91 MiB unpacked&lt;span class="o"&gt;)&lt;/span&gt;:
  /nix/store/0vdf5mpd762bw53rgl5nkmhvzq8n4m0d-file-5.45
  /nix/store/77cdqhqprqbciyhzsnzmsk7azbk2xv6r-fortune-mod-3.20.0
  /nix/store/d0i8idmbb4jji9ml01xsqgykrbvm7dss-gnu-config-2024-01-01
  /nix/store/0554jm1l1qw1pcfqsliw91hnifn11w8m-gnumake-4.4.1
  /nix/store/2wp235bg03gykpixd9v2nyxp08w8xq8a-patchelf-0.15.0
  /nix/store/c5x32idp600dklz9n25q38lk78j5vwxb-pokemonsay-1.0.0
  /nix/store/pba53n11na87fs4c20mp8yg4j7qx1by2-recode-3.7.14
  /nix/store/zix67r268ihi4c362zw7c0989z12jmy7-stdenv-linux
  /nix/store/2329271b42wh6b6yhl7jmjyi0cs4428b-update-autotools-gnu-config-scripts-hook
copying path &lt;span class="s1"&gt;'/nix/store/d0i8idmbb4jji9ml01xsqgykrbvm7dss-gnu-config-2024-01-01'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/c5x32idp600dklz9n25q38lk78j5vwxb-pokemonsay-1.0.0'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/0vdf5mpd762bw53rgl5nkmhvzq8n4m0d-file-5.45'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/0554jm1l1qw1pcfqsliw91hnifn11w8m-gnumake-4.4.1'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/2wp235bg03gykpixd9v2nyxp08w8xq8a-patchelf-0.15.0'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/pba53n11na87fs4c20mp8yg4j7qx1by2-recode-3.7.14'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/2329271b42wh6b6yhl7jmjyi0cs4428b-update-autotools-gnu-config-scripts-hook'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/zix67r268ihi4c362zw7c0989z12jmy7-stdenv-linux'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
copying path &lt;span class="s1"&gt;'/nix/store/77cdqhqprqbciyhzsnzmsk7azbk2xv6r-fortune-mod-3.20.0'&lt;/span&gt; from &lt;span class="s1"&gt;'https://cache.nixos.org'&lt;/span&gt;...
building &lt;span class="s1"&gt;'/nix/store/vg4zmghqcnhjbs8kqhx04xixvm36d3ik-pokefortune.drv'&lt;/span&gt;...
/nix/store/vsv2spw517cwq791fl3f8iymm6hshhyq-pokefortune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nix fetched the packages we specified in our &lt;code&gt;.nix&lt;/code&gt; file: &lt;code&gt;pokemonsay&lt;/code&gt;, &lt;code&gt;fortune&lt;/code&gt;, and some we didn't specify: such as &lt;code&gt;file&lt;/code&gt;, &lt;code&gt;patchelf&lt;/code&gt;, and &lt;code&gt;recode&lt;/code&gt;, which one or both of the other two packages depends on. Then it copied them locally, built a binary, and placed it at &lt;code&gt;/nix/store/vsv2spw517cwq791fl3f8iymm6hshhyq-pokefortune/bin&lt;/code&gt;. We can confirm this by running it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/nix/store/vsv2spw517cwq791fl3f8iymm6hshhyq-pokefortune/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8g7w0i5dwhbf9dva1mo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8g7w0i5dwhbf9dva1mo.png" alt="Pokefortune Output" width="800" height="1239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To be reproducible, Nix ensures that it knows about every single dependency needed to create a package at all times. Because of that, you can do fun things like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quickly enter a shell with the dependencies to create and display images.&lt;/span&gt;
nix-shell &lt;span class="nt"&gt;-p&lt;/span&gt; graphviz chafa

&lt;span class="c"&gt;# Query the derivation's dependency graph, create a .png from it and display it:&lt;/span&gt;
    nix-store &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;nix-build pokefortune.nix&lt;span class="si"&gt;)&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
    dot &lt;span class="nt"&gt;-Tpng&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; pokefortune-dependency-graph.png &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chafa pokefortune-dependency-graph.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resulting in a view of every single dependency (the "closure") that our &lt;code&gt;pokefortune&lt;/code&gt; program requires:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6fwu0m2p43cs32nu6pk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh6fwu0m2p43cs32nu6pk.png" alt="Pokefortune Dependency Graph" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How cool is that! We can see the whole dependency tree for anything packaged with Nix!&lt;/p&gt;

&lt;p&gt;You have just done something very powerful with Nix: You've created a reproducible derivation that anyone who has the package manager installed on their system can use, which they couldn't before.&lt;/p&gt;

&lt;p&gt;This is just a taste of what Nix can do, but I hope that the potential is clear. As Farid Zakaria says in his blog post "Learn Nix the Fun Way":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hopefully, seeing the fun things you can do with Nix might inspire you to push through the hard parts.&lt;/p&gt;

&lt;p&gt;There is a golden pot 💰 at the end of this rainbow 🌈 awaiting you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fzakaria.com/2024/07/05/learn-nix-the-fun-way" rel="noopener noreferrer"&gt;https://fzakaria.com/2024/07/05/learn-nix-the-fun-way&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article is directly inspired by Farid Zakaria's blog post &lt;a href="https://fzakaria.com/2024/07/05/learn-nix-the-fun-way" rel="noopener noreferrer"&gt;&lt;em&gt;Learn Nix the Fun Way&lt;/em&gt;&lt;/a&gt;. Check out his excellent blog &lt;a href="https://fzakaria.com/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href="https://github.com/russweas" rel="noopener noreferrer"&gt;Russell Weas&lt;/a&gt; and &lt;a href="https://veracius.dev" rel="noopener noreferrer"&gt;veracius&lt;/a&gt; for their input to this article and code&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://edolstra.github.io/pubs/phd-thesis.pdf" rel="noopener noreferrer"&gt;https://edolstra.github.io/pubs/phd-thesis.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20171017151526/http://aptitude.alioth.debian.org/doc/en/pr01s02.html" rel="noopener noreferrer"&gt;https://web.archive.org/web/20171017151526/http://aptitude.alioth.debian.org/doc/en/pr01s02.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fzakaria.com/2024/07/05/learn-nix-the-fun-way" rel="noopener noreferrer"&gt;https://fzakaria.com/2024/07/05/learn-nix-the-fun-way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zero-to-nix.com/start/nix-run/" rel="noopener noreferrer"&gt;https://zero-to-nix.com/start/nix-run/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nix</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
