<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/custom-pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0"><channel><title>Kristoffer Balintona — #Guix</title><description>Entries tagged with &quot;Guix&quot;</description><link>https://kristofferbalintona.me/</link><language>en-us</language><image><url>https://kristofferbalintona.me/favicon-rss.png</url><title>Kristoffer Balintona — #Guix</title><link>https://kristofferbalintona.me</link></image><item><title>Using URLs and SWHIDs directly in “guix pull” and “guix time-machine”</title><link>https://kristofferbalintona.me/posts/202606190034/</link><guid isPermaLink="true">https://kristofferbalintona.me/posts/202606190034/</guid><description>&lt;p&gt;Today I stumbled upon a recently published (one month ago) blog post by the Guix team: &lt;a href=&quot;https://guix.gnu.org/blog/2026/time-travel-without-borders/&quot;&gt;Time travel without borders&lt;/a&gt;. It was a worthwhile read.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;guix time-machine&lt;/code&gt; is used to go back or forward in time (relative to the current Guix profile) and call other Guix subcommands. For instance, to run the &lt;code&gt;yt-dlp&lt;/code&gt; binary from the latest Guix commit:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;guix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time-machine&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-q&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yt-dlp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yt-dlp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Another example comes from my personal &lt;a href=&quot;https://codeberg.org/krisbalintona/guix-config&quot;&gt;Guix config&lt;/a&gt;: to test if my home environment configuration would build properly if I did a &lt;code&gt;guix pull&lt;/code&gt;, I do something like:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;guix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;home&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reconfigure&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-L&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--expression=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;(@ (krisb config machines MACHINE home) MACHINE-home-environment)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Both of the above are examples of going “forward” in time (i.e., forward in the Guix repository commit history), but one can just as easily go back to earlier commits.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://guix.gnu.org/blog/2026/time-travel-without-borders/&quot;&gt;The article&lt;/a&gt; goes over a recently added feature to &lt;code&gt;guix pull&lt;/code&gt; and &lt;code&gt;guix time-machine&lt;/code&gt;. I believe it comes from this PR:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://codeberg.org/guix/guix/pulls/6745&quot;&gt;#6745 - Allow `pull` and `time-machine` to download channel files - guix/guix - Codeberg.org&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;This new feature basically lets one provide a URL or SWHID (Software Hash Identifiers)&lt;sup&gt;&lt;a href=&quot;#fn-1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; to &lt;code&gt;guix pull&lt;/code&gt; or &lt;code&gt;guix time-machine&lt;/code&gt; directly. (The latter is more secure, since it involves a content hash.)&lt;/p&gt;
&lt;p&gt;So, instead of having to do something like the following, where one fetches a file via e.g. &lt;code&gt;wget&lt;/code&gt; then calls &lt;code&gt;guix time-machine&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-O&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;channels.scm&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;https://ci.guix.gnu.org/eval/latest/channels.scm?spec=master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;guix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time-machine&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-C&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;channels.scm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;or the one-line Bash equivalent:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;guix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time-machine&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-C &lt;/span&gt;&lt;span&gt;&amp;lt;(&lt;/span&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; -O https://ci.guix.gnu.org/eval/latest/channels.scm?spec=master&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;We can do the following instead, using a URL directly:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;guix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time-machine&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-C &lt;/span&gt;&lt;span&gt;https://ci.guix.gnu.org/eval/latest/channels.scm?spec=master&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;or with a SWHID&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;guix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;time-machine&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-C &lt;/span&gt;&lt;span&gt;swh:1:cnt:003e1e0c1b9b358082201332c926ae54e9549002&lt;/span&gt;&lt;span&gt;  \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;-- &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Really cool!&lt;/p&gt;
&lt;footer&gt; &lt;h2&gt;&lt;p&gt;Footnotes&lt;/p&gt;&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;  &lt;a href=&quot;#fnref-1&quot;&gt;[1]&lt;/a&gt; &lt;div&gt; &lt;p&gt;You can learn more about SWHIDs &lt;a href=&quot;https://www.swhid.org/&quot;&gt;here&lt;/a&gt;. They are basically unique IDs for software artifacts. This includes repositories, commits, source code/files, and more. The benefit of SWHIDs here is that it ensures that the content of a URL is not changed under your feet—SWHIDs have a security benefit.&lt;/p&gt;&lt;p&gt;I learned about these only until recently by another Guix resource, but as of April 23, 2025 SWHIDs are &lt;em&gt;an ISO International Standard&lt;/em&gt;!&lt;/p&gt;  &lt;a href=&quot;#fnref-1&quot;&gt;↩&lt;/a&gt; &lt;/div&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/footer&gt;</description><pubDate>Fri, 19 Jun 2026 00:34:00 GMT</pubDate><category>Guix</category><category>Tips and Tricks</category></item></channel></rss>