<?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/" xmlns:media="http://search.yahoo.com/mrss/">
 <channel>
  <title>Cybolic.me</title>
  <description>Personal Website of Christian Dannie Storgaard</description>
  <atom:link href="https://staging.cybolic.me/feed-rss.xml" rel="self" type="application/rss+xml"/>
  <link>https://staging.cybolic.me/</link>
  <language>en</language>
  <pubDate>Fri, 14 Dec 2007 15:39:00 GMT</pubDate>
  <lastBuildDate>Fri, 19 Sep 2025 00:36:15 GMT</lastBuildDate>
  <image>
    <link>https://staging.cybolic.me/</link>
    <title>Cybolic.me</title>
    <url>https://staging.cybolic.me//assets/images/favicon.png</url>
    <height>16</height>
    <width>16</width>
  </image>
  <item>
    <title>EVE Online Trinity - in Linux</title>
    <link>https://staging.cybolic.me/posts/eve-online-trinity-in-linux</link>
    <pubDate>Fri, 14 Dec 2007 15:39:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/eve-online-trinity-in-linux</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Games</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/eveonline.jpg" />
    <description>&lt;p&gt;I&#39;ve just begun my venture into the world of &lt;a href=&quot;http://eve-online.com/&quot; title=&quot;EVE Online Website&quot;&gt;EVE Online&lt;/a&gt; and find it quite intriguing. However, since the &amp;quot;port&amp;quot; to Linux was poorly done by &lt;a href=&quot;http://www.transgaming.com/&quot; title=&quot;Transgaming Website&quot;&gt;Transgaming&lt;/a&gt; I was having quite some problems with parts of the game, namely it&#39;s locking of the soundcard and it&#39;s often crashing. Here is a (rather hold-in-hand style, sorry to those who find it boring) guide on how to set up EVE in Linux so you can listen to music while playing and run the game in a window so it won&#39;t leave your system unusable when the client freezes (and so you can minimise it and switch to other tasks, this is Linux, remember?).&lt;/p&gt;&lt;h3 id=&quot;1-installing-the-client&quot;&gt;1. Installing the client&lt;/h3&gt;&lt;p&gt;Last I downloaded EVE for Linux, it wouldn&#39;t even install properly, set wrong permissions and no amount of tweaking would get it running, so I was a bit hesitive this time, but to my surprise Trinity installed without a problem (as a single user install (on Mint (that is based on Ubuntu))). You can download EVE for Linux here: &lt;a href=&quot;http://www.eve-online.com/download/linux.asp&quot;&gt;http://www.eve-online.com/download/linux.asp&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;2-setting-its-preferences-for-shared-audio&quot;&gt;2. Setting its preferences (for shared audio)&lt;/h3&gt;&lt;p&gt;As standard, Transgaming (the company responsible for &amp;quot;porting&amp;quot; EVE to Linux (it&#39;s not a port, it&#39;s just EVE and Cedega in single package)) has set Trinity to be the only program allowed to use the soundcard - to fix this, open a terminal and type the following:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; CEDEGA_PATH=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.cedega&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; $HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.cedega/.ui/runGUI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to get to the Cedega user interface.&lt;/p&gt;&lt;p&gt;Click on &amp;quot;&lt;em&gt;EVE Online&lt;/em&gt;&amp;quot; to your left, and then right click on &amp;quot;&lt;em&gt;Play EVE&lt;/em&gt;&amp;quot; on your right and select &amp;quot;&lt;em&gt;Edit Settings for this Shortcut&lt;/em&gt;&amp;quot; &lt;span style=&quot;font-size:xx-small;&quot;&gt;(the window that pops up is also accessable from the &amp;quot;EVE Online Configuration&amp;quot; launcher in your desktop environments application menu, as &amp;quot;Configure Options&amp;quot;, but this method has a few extra possibilites we&#39;ll use in a moment).&lt;img src=&quot;https://staging.cybolic.me/posts/Hbe8fg31kq-456.jpeg&quot; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You should now see this:&lt;img src=&quot;https://staging.cybolic.me/posts/NrPDyqNt6e-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;Switch to the audio tab, and edit the text fields so it says &amp;quot;&lt;em&gt;default&lt;/em&gt;&amp;quot;, like so:&lt;img src=&quot;https://staging.cybolic.me/posts/9__evBUT89-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;Other programs can now also use the soundcard while you&#39;re playing EVE. If that was all you wanted to do, you can stop reading now.&lt;/p&gt;&lt;h3 id=&quot;3-setting-it-to-window-mode&quot;&gt;3. Setting it to window-mode&lt;/h3&gt;&lt;p&gt;Now, Transgaming didn&#39;t do a very good job in my oppinion in the &amp;quot;porting&amp;quot;, as the client crashes often, and also has the same &amp;quot;inactivity bug&amp;quot; as WoW suffers from in Cedega, being that the program freezes if left untouched for a few minutes (even sometimes just when there&#39;s not much action in the game). Since Transgaming haven&#39;t bothered giving us the option to run EVE in a window (like it seems the Windows client can), this causes your computer to become unreachable as Cedega also grabs the keyboard focus, so you can&#39;t get out of the game if (when) it crashes.&lt;/p&gt;&lt;p&gt;To remedy this, we can force EVE to run in a window, so we can at least kill it when it freezes.&lt;/p&gt;&lt;p&gt;Let&#39;s go back to the Cedega window. Right click on &amp;quot;EVE Online&amp;quot; to your left, and select &amp;quot;&lt;em&gt;Add Shortcut&lt;/em&gt;&amp;quot;:&lt;img src=&quot;https://staging.cybolic.me/posts/n8Gzbw13sS-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;In the window that appears we need to do a few things. First we have to give the shortcut a name, I suggest you call it &amp;quot;EVE&amp;quot; to make it easier to follow my example. Then, we need to tell Cedega where the EVE executable is. Instead of just giving it the standard EVE executable, we&#39;re going to give it the one that the standard EVE executable executes &lt;em&gt;(if we don&#39;t we&#39;ll end up with two windows instead of one - the EVE window and the EVE splash-window (and no, the splash-window does not go away until you exit the game))&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;So, type &amp;quot;&lt;strong&gt;/home/&lt;em&gt;YOURUSERNAME&lt;/em&gt;/.cedega/EVE Online/c_drive/Program Files/CCP/EVE/bin/ExeFile.exe&lt;/strong&gt;&amp;quot; (replacing YOURUSERNAME with your username) next to &amp;quot;&lt;em&gt;Path to Program&lt;/em&gt;&amp;quot;. Also, I suggest you click the &amp;quot;&lt;em&gt;Extract Icon&lt;/em&gt;&amp;quot; button, as the Windows icon for EVE is much nicer than the one Transgaming has supplied for Linux - don&#39;t ask why.&lt;/p&gt;&lt;p&gt;Set the &amp;quot;&lt;em&gt;Working Directory&lt;/em&gt;&amp;quot; to &amp;quot;&lt;strong&gt;/home/&lt;em&gt;YOURUSERNAME&lt;/em&gt;/.cedega/EVE Online/c_drive/Program Files/CCP/EVE&lt;/strong&gt;&amp;quot; (again replacing YOURUSERNAME). We also have to pass it some arguments, one to stop it from trying to display a splash screen that won&#39;t display, and one to make it start a bit faster, so write &amp;quot;&lt;strong&gt;/nosplash /noconsole&lt;/strong&gt;&amp;quot; next to &amp;quot;Command Line Options:&amp;quot;.&lt;/p&gt;&lt;p&gt;Next, select &amp;quot;EVE Online&amp;quot; as the GDDB Profile to make Cedega run the game correctly.&lt;/p&gt;&lt;p&gt;The window should now look much like this:&lt;img src=&quot;https://staging.cybolic.me/posts/JNWLccHnWN-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;Before we can go further and edit the settings (to make it run in a window), we need to click the &amp;quot;&lt;em&gt;Ok&lt;/em&gt;&amp;quot; button first to make Cedega save this shortcut - so go ahead and click it.&lt;/p&gt;&lt;p&gt;Now, let&#39;s make it run in a window.&lt;/p&gt;&lt;p&gt;Much like before, right click on the EVE icon we just created and select &amp;quot;&lt;em&gt;Edit Settings for this Shortcut&lt;/em&gt;&amp;quot;. I suggest you repeat the steps from before to make Cedega play nicely with other audio programs, so go back to see how we did that.&lt;/p&gt;&lt;p&gt;Back in the &amp;quot;&lt;em&gt;General&lt;/em&gt;&amp;quot; tab, simply select your desired window size at &amp;quot;&lt;em&gt;Run in Window&lt;/em&gt;&amp;quot; to your right, and uncheck &amp;quot;&lt;em&gt;DXGrab&lt;/em&gt;&amp;quot; to make your mouse able to leave the window (you really want that, you really do).&lt;/p&gt;&lt;p&gt;Your window should now look much like this:&lt;img src=&quot;https://staging.cybolic.me/posts/J6hw8HJwIW-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;Now that we have configured Cedega to be able to run EVE in window mode, we need to configure EVE to run in the window., so let&#39;s start her up. With our &amp;quot;&lt;em&gt;EVE&lt;/em&gt;&amp;quot; selected in the list to right in the Cedega window, click the play button in the top of the window to start EVE.&lt;/p&gt;&lt;p&gt;When EVE has loaded (you don&#39;t need to log in), press the Escape key on the keyboard and a settings window will appear.&lt;/p&gt;&lt;p&gt;Select the same &amp;quot;&lt;em&gt;Adapter Resolution&lt;/em&gt;&amp;quot; as you did in the Cedega Settings window and click apply:&lt;img src=&quot;https://staging.cybolic.me/posts/bIWpmJXowh-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;EVE is now configured.&lt;/p&gt;&lt;p&gt;Now, our windowed EVE isn&#39;t much good if we can&#39;t run it, so here&#39;s the command to do so:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; CEDEGA_PATH=/home/YOURUSERNAME/.cedega&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /home/YOURUSERNAME/.cedega/.ui/runGUI&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -run&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;EVE Online&quot;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;EVE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;(again, replace YOURUSERNAME with your username)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;To add this as a shortcut to your panel in Gnome (if that&#39;s what you&#39;re running), I suggest you locate the original EVE icon under Games, right click on it and select &amp;quot;&lt;em&gt;Add this launcher to panel&lt;/em&gt;&amp;quot;. Then right click on the newly added icon on your panel, select &lt;em&gt;Properties&lt;/em&gt; and replace whatever is in &lt;em&gt;Command&lt;/em&gt; with the command above. I&#39;ll leave finding our fancy icon from Windows as an exercise for the reader ;)&lt;/p&gt;&lt;p&gt;You now have a nice and easy access to running EVE on Linux without it freezing your system or stealing your soundcard. Enjoy.&lt;/p&gt;</description>
  </item>
  <item>
    <title>EVE Icons</title>
    <link>https://staging.cybolic.me/posts/eve-icons</link>
    <pubDate>Fri, 14 Dec 2007 23:13:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/eve-icons</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Games</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/eveonline.jpg" />
    <description>&lt;p&gt;Well, turns out I&#39;m not really a fan of the Windows icons for EVE either, so I set about finding a replacement icon, and what&#39;d&#39;you&#39;know - there aren&#39;t really any (please correct me, and &lt;em&gt;direct&lt;/em&gt; me, if I&#39;m wrong). So I made my own.&lt;/p&gt;&lt;p&gt;I made two simple versions of the Trinity logo, and I encourage anyone who knows how to flip a pixel to try and make their own - EVE really needs custom icons (IMO anyway).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; I found a tool that could extract the high quality icons from the EVE executable, so I&#39;ve added them here as well. Turns out I was VERY close to the official icon with my 16x16 version... funny.&lt;/p&gt;&lt;table border=&quot;0&quot; cellspacing=&quot;1&quot; cellpadding=&quot;1&quot; summary=&quot;Two sets of icons for EVE Online Trinity&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;border:medium none;&quot;&gt;&lt;/td&gt;&lt;td&gt;Official&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Basic&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;Basic with planet&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;128px&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/ldDUapEiAi-128.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/WuLw8dsP37-128.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/HpVQP12ycB-128.jpeg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;48px&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/yoCxbuW0dQ-48.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/G1dfVgZ_NZ-48.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/QgDSPt-4If-48.jpeg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;32px&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/vfVAiuIntr-32.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/zBru3kaTRh-32.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/1-QPLjHOgN-32.jpeg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;24/22px&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/kRKNupfQnJ-24.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/lEaKiOvsTs-22.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/cle990huqe-22.jpeg&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;16px&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/8R2wfUonVk-16.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/AO-e8cfPD_-16.jpeg&quot; /&gt;&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;(note: All &quot;Basic&quot; (and &quot;Basic with planet&quot;) icons were done from scratch in Inkscape (16x16 in Gimp) - they are not derivative works)</description>
  </item>
  <item>
    <title>More about EVE (in Wine)</title>
    <link>https://staging.cybolic.me/posts/more-about-eve-in-wine</link>
    <pubDate>Thu, 20 Dec 2007 01:34:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/more-about-eve-in-wine</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Games</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/eveonline.jpg" />
    <description>&lt;p&gt;Okay, annoyed with the choppiness of EVE in Cedega (the official &amp;quot;client&amp;quot; on Linux) I set out to get EVE running in Wine.&lt;/p&gt;&lt;p&gt;The instructions for setting it up are on the EVE forum, but &lt;a href=&quot;http://myeve.eve-online.com/ingameboard.asp?a=topic&amp;amp;threadID=30457&quot;&gt;the thread&lt;/a&gt; is 60 pages long, so I&#39;ve added it as steps here instead (for Debianish systems (Debian, Ubuntu, Mint, etc)).&lt;/p&gt;&lt;p&gt;Since the install works fine in vanilla Wine, I&#39;ll just skip that bit as it is really point and click (check winehq.org if you have doubts about how to install wine - you&#39;ll at least need to add their repository).&lt;/p&gt;&lt;p&gt;Open a terminal and let&#39;s go! (just copy-paste this stuff line for line)&lt;/p&gt;&lt;h3 id=&quot;1-creating-a-patched-wine-package&quot;&gt;1. Creating a patched Wine package&lt;/h3&gt;&lt;p&gt;First, we need the sourcecode to Wine:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;apt-get&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; source&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; wine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Go to the newly created directory containing the sourcecode:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; wine-0.9.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Get and apply the patch (developed by aturkin and stefand from #winehackers@FreeNod): This adds support for some advanced network operations that vanilla Wine currently doesn&#39;t have and EVE Trinity require.&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;wget&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; http://stud4.tuwien.ac.at/~e0526822/0001-implement-BindIoCompletionCallback.patch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;patch&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -p1&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; 0001-implement-BindIoCompletionCallback.patch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Get the packages required to compile Wine: This might take some time to finish.&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; build-dep&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; wine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Change the version number of our Wine-package: This makes it easier to keep of track of what version we have installed.&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;cp&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; debian/changelog&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; debian/changelog.backup&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt; echo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -e&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;wine (&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;dpkg-parsechangelog&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Version: &#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; cut&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;&#92; &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -f2-&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;eve) &#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;dpkg-parsechangelog&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Distribution: &#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; cut&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;&#92; &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -f2-&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;; urgency=low&#92;n&#92;n  * Small patch to make EVE work&#92;n&#92;n -- &#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; dpkg-parsechangelog&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Maintainer: &#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; cut&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;&#92; &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -f2-&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;  &#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;dpkg-parsechangelog&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Date: &#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; cut&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;&#92; &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -f2-&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;&#92;n&#92;n&#39;&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; debian/changelog&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; debian/changelog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Compile Wine and make a package of it: Put on a movie while this command finishes, it&#39;s going to take a while.&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;dpkg-buildpackage&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -rfakeroot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, install the package:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; dpkg&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -B&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ../wine_0.9.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;eve&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;.deb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-running-eve&quot;&gt;2. Running EVE&lt;/h3&gt;&lt;p&gt;Run:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;~/.wine/drive_c/Program Files/CCP/EVE/&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; wine&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; eve.exe&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(If you get a black screen, or can&#39;t get passed the login screen, try pressing Escape and see if you can get further from there)&lt;/p&gt;&lt;h3 id=&quot;if-you-still-have-problems&quot;&gt;If you still have problems&lt;/h3&gt;&lt;p&gt;You might need to upgrade EVE to Premium by downloading and running the &lt;a href=&quot;http://www.eve-online.com/patches/patches.asp?s=&amp;amp;system=win&amp;amp;edition=classic&amp;amp;n=45017&quot;&gt;patch located here&lt;/a&gt; (in Wine).&lt;/p&gt;&lt;h4 id=&quot;the-following-is-made-obsolete-by-the-patching-above-but-included-here-still-in-case-you-have-any-problems&quot;&gt;The following is made obsolete by the patching above, but included here still in case you have any problems:&lt;/h4&gt;&lt;p&gt;Since EVE tries to communicate with a specific server on startup in a way that Wine currently doesn&#39;t support, we need to block that server&#39;s IP address:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; sh&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;echo &quot;87.237.39.199 localhost&quot; &gt;&gt; /etc/hosts&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Restart the network (is not always necessary):&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /etc/init.d/networking&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; restart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voice chat seems to cause problems with Wine, so you can turn that off too. Open &lt;strong&gt;~/.wine/drive_c/windows/profiles/&lt;em&gt;YOURUSERNAME&lt;/em&gt;/Local Settings/Application Data/CCP/EVE/settings/prefs.ini&lt;/strong&gt; and add the following line:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;voiceenabled=0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Also, you might as well set &lt;strong&gt;eulaagreed&lt;/strong&gt; to &lt;strong&gt;1&lt;/strong&gt; so you can skip the license agreement.&lt;/p&gt;&lt;p&gt;That&#39;s it! If you have any problems with the steps, feel free to leave a comment.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Windows are for breaking</title>
    <link>https://staging.cybolic.me/posts/windows-are-for-breaking</link>
    <pubDate>Sat, 05 Jan 2008 13:39:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/windows-are-for-breaking</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/microsoft.jpg" />
    <description>&lt;h3 id=&quot;automated-breakage&quot;&gt;Automated breakage&lt;/h3&gt;&lt;p&gt;Yesterday I wanted to boot into my Windows XP Professional partition to see if &lt;em&gt;Perfect World&lt;/em&gt; ran better in Windows than in Wine, but what was this? Windows refused to boot. Now, this has happened to me before, and I have read lots and lots of post online about the dreaded Mup.sys problem, but this time - I just could not get it to go away and get into Windows.&lt;/p&gt;&lt;p&gt;It was time for &lt;em&gt;the reinstall&lt;/em&gt;.&lt;/p&gt;&lt;h3 id=&quot;more-reinstall-part-one&quot;&gt;Reinstall part one&lt;/h3&gt;&lt;p&gt;So, I dig out my original Windows XP CD, pop it in the PC and reboot. 5-10 minutes later I&#39;m at the installation program where it tells me that it&#39;s not happy about installing over the old XP installation and that I should pick another partition, so I go back, delete the old XP partition and tell it to create a new one. It can&#39;t. Sigh.&lt;/p&gt;&lt;h3 id=&quot;reinstall-2-now-with-training-wheels&quot;&gt;Reinstall 2: Now with training wheels&lt;/h3&gt;&lt;p&gt;Reboot again with an Ubuntu live CD (notice that the adventure would just be over now if it wasn&#39;t for Linux). It appears the Windows setup has somehow changed to order of my partitions, and generally corrupted the partition table, but Linux let&#39;s me read my data anyhow, and I backup everything important to an external drive and clear the entire disk. As I now don&#39;t trust the Windows installer, I create the NTFS partition forehand, so it won&#39;t choke on it next time. Reboot.&lt;/p&gt;&lt;p&gt;After many minutes, I&#39;m finally in the installation again, I can select the NTFS partition and start the installation. I lean back and let it do it&#39;s &amp;quot;magic&amp;quot; and after some time it reboots, supposedly having copied all required files. After the reboot I get a nice message telling me that it can&#39;t find a required file, and won&#39;t boot. Sigh again. Reboot.&lt;/p&gt;&lt;h3 id=&quot;third-times-a-charm-right&quot;&gt;Third time&#39;s a charm - right?&lt;/h3&gt;&lt;p&gt;Now, in the setup program I select the same options as before, let it finish copying the files, reboot, and for some reason it works this time - hurray! Now I put on a movie and wait the about 40-50 minutes the Windows install takes.&lt;/p&gt;&lt;p&gt;... The install is finished, and I now have a shiny, newly installed Windows XP! Yay! All should be good from now on, right? Wrong. It doesn&#39;t recognise my network card, so I&#39;m left with a VESA display driver and no programs. Luckily I still have the CD that came with my motherboard, so I pop that in and install the network driver. Reboot again.&lt;/p&gt;&lt;h3 id=&quot;one-driver-down-two-more-to-go&quot;&gt;One driver down, two more to go...&lt;/h3&gt;&lt;p&gt;After the reboot I am online and go straight to Nvidia.com, since I have an nForce2 motherboard and would like proper drivers, but to my surprise the driver for it isn&#39;t that easy to find. I eventually find it through Google (it&#39;s under &amp;quot;Legacy&amp;quot; at Nvidia.com), download it and install it. Reboot again again.&lt;/p&gt;&lt;p&gt;Next boot is starting very, very slowly.... after about 15 minutes, I finally get a desktop, but it freezes after a couple of seconds. What now?&lt;/p&gt;&lt;p&gt;I turn off the computer on the switch, since Ctrl+Alt+Del doesn&#39;t work, restart it and start Windows in Safe Mode. ...it stops at Mup.sys... Come on! I let it run for about 20 minutes before I turn it off again.&lt;/p&gt;&lt;p&gt;I try again and can start the desktop, but it still freezes after a couple of seconds.&lt;/p&gt;&lt;p&gt;This is the last straw. After it having corrupted my partition, installed faulty, not having any drivers and then just not working when it gets the only official driver available, I walk away from Windows.&lt;/p&gt;&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;&lt;p&gt;I am writing this post from the Ubuntu Live CD, where it is installing in the background (it&#39;s finished now - it started just before I started writing this post), and I&#39;m also downloading an ISO of xubuntu and Sabayon at the same time, so I can try them as well - this all took me about 15 minutes in all, as opposed to my 2 1/2 hours wasted on NOT getting Windows to install (but enjoying 7 wonderful reboots; Microsoft knows how we love those reboots).&lt;/p&gt;&lt;p&gt;XP might be a dated system, but the motherboard is two years older than XP SP2 (which is the version I installed), so there&#39;s really no excuse for it working so poorly.&lt;/p&gt;&lt;p&gt;I think I&#39;ll try and install Vista at some point, just for the lulz.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Default video player in Linux</title>
    <link>https://staging.cybolic.me/posts/default-video-player-in-linux</link>
    <pubDate>Sun, 06 Jan 2008 20:26:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/default-video-player-in-linux</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;Just a quick memo on how to make mplayer the default videoplayer in Linux:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;xdg-mime&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; mplayer.desktop&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; application/vnd.rn-realmedia&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; application/x-extension-mp4&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; application/x-flash-video&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; application/x-matroska&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; application/x-quicktime-media-link&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; application/x-quicktimeplayer&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; text/google-video-pointer&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; text/x-google-video-pointer&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/3gpp&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/dv&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/fli&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/flv&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/mp4&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/mp4v-es&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/mpeg&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/msvideo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/quicktime&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/vivo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/vnd.divx&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/vnd.rn-realvideo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/vnd.vivo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-anim&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-avi&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-flc&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-fli&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-flic&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-m4v&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-matroska&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-mpeg&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-ms-asf&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-msvideo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-ms-wm&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-ms-wmv&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-ms-wmx&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-ms-wvx&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-nsv&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-ogm+ogg&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; video/x-theora+ogg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This of course depends on your system actually having a desktop file for MPlayer (which the &lt;em&gt;mplayer-nogui&lt;/em&gt; package in Ubuntu doesn&#39;t), so if your system doesn&#39;t have it (check /usr/share/applications/), you can copy the following to &lt;strong&gt;.local/share/applications/mplayer.desktop&lt;/strong&gt; in your home directory:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;Desktop Entry&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Version&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;1.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Type&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;Application&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Encoding&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;MPlayer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Comment&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;Play multimedia files and media&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;GenericName&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;Media Player&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Exec&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;mplayer %U&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Icon&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;mplayer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;NoDisplay&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;MimeType&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;application/vnd.rn-realmedia&lt;/span&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;;application/x-extension-mp4;application/x-flash-video;application/x-matroska;application/x-quicktime-media-link;application/x-quicktimeplayer;text/google-video-pointer;text/x-google-video-pointer;video/3gpp;video/dv;video/fli;video/flv;video/mp4;video/mp4v-es;video/mpeg;video/msvideo;video/quicktime;video/vivo;video/vnd.divx;video/vnd.rn-realvideo;video/vnd.vivo;video/x-anim;video/x-avi;video/x-flc;video/x-fli;video/x-flic;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-ms-asf;video/x-msvideo;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvx;video/x-nsv;video/x-ogm+ogg;video/x-theora+ogg;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afterwards, you might need to run&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;update-desktop-database&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ~/.local/share/applications&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and log out and in again.... mimetypes are a bit magic...&lt;/p&gt;</description>
  </item>
  <item>
    <title>The future of Ubuntu and the desktop internet</title>
    <link>https://staging.cybolic.me/posts/the-future-of-ubuntu-and-the-desktop-internet</link>
    <pubDate>Tue, 16 Sep 2008 07:56:06 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/the-future-of-ubuntu-and-the-desktop-internet</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;I&#39;ve just read &lt;a href=&quot;https://lists.ubuntu.com/archives/ubuntu-devel-announce/2008-September/000481.html&quot;&gt;Mark Shuttleworths post&lt;/a&gt; to the Ubuntu Development mailing-list and I must say it got me a bit excited.&lt;/p&gt;&lt;p&gt;In his post he mentions that the focus of the next release of Ubuntu, the one after Intreprid Ibex, namely 9.04 &amp;quot;Jaunty Jackalope&amp;quot; will, amongst other things, focus on &amp;quot;&lt;em&gt;the blurring of web services and desktop applications&lt;/em&gt;&amp;quot; which, if done right, will be extremely cool and also give Ubuntu a real edge over OS X and Vista.&lt;/p&gt;&lt;p&gt;It also got me thinking about projects such as &lt;a href=&quot;http://live.gnome.org/Empathy&quot;&gt;Empathy&lt;/a&gt;, &lt;a href=&quot;http://beatniksoftware.com/gimmie/&quot;&gt;Gimmie&lt;/a&gt; and &lt;a href=&quot;http://live.gnome.org/Soylent&quot;&gt;Soylent&lt;/a&gt;. Just imagine the things these programs can do, implemented properly in an Ubuntu Gnome kind of way... pure bliss.&lt;/p&gt;&lt;p&gt;When I think of this, I immediately also think that we should try to step away from the program analogy and focus on tasks instead.&lt;/p&gt;&lt;p&gt;You shouldn&#39;t have to locate F-Spot in the menu, but click &amp;quot;Pictures&amp;quot;; if you prefer something other than F-Spot, change it in the preferences (and yes, this should include a way to &amp;quot;launch&amp;quot; Photobucket, Flickr, etc.). The same with instant messaging, you shouldn&#39;t have to start Pidgin, you should have a &amp;quot;People&amp;quot; or &amp;quot;Contacts&amp;quot; entry in the main menubar with all your IM contacts, email contacts, heck, even Facebook contacts listed, each with a submenu giving you the option to contact them in different ways: video, chat, email - like Soylent in a menu.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://labs.mozilla.com/2008/08/introducing-ubiquity/&quot;&gt;Ubiquity&lt;/a&gt; already implements a lot of what I have in mind, but it&#39;s still inside the browser, it should be part of the desktop, also it uses English language to do the task, it should use the desktop interface (though language based operation shouldn&#39;t be ignored, it should still be an option - like in &lt;a href=&quot;http://do.davebsd.com/&quot;&gt;GNOME Do&lt;/a&gt;, which has a nice graphical way of showing what you are requesting).&lt;/p&gt;&lt;p&gt;Ideas such as this have been posted numerous times, but have yet to be included in any standard desktop - I sincerely hope Jaunty Jackalope will change this.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Linux Mint - Wow!</title>
    <link>https://staging.cybolic.me/posts/linux-mint-wow</link>
    <pubDate>Thu, 18 Sep 2008 04:04:01 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/linux-mint-wow</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;After having my partitions mangled once again, again, again by Windows, I decided I had to clean up my Linux - and by clean up, I mean reinstall, though I still use the same config files for my program - I love how you can do that in Linux.&lt;/p&gt;&lt;p&gt;But anyway, instead of reinstalling Ubuntu Hardy, which has given me so many problems with my notepad&#39;s ATI graphic card, I figured I might as well try &lt;a href=&quot;http://www.linuxmint.com/&quot;&gt;Mint&lt;/a&gt; again, since it was a very enjoyable ride last time, and it sure still is!&lt;/p&gt;&lt;p&gt;So far I like practically everything about &lt;a href=&quot;http://www.linuxmint.com/edition.php?id=25&quot;&gt;the new Mint&lt;/a&gt;! Their funky little menu-ting (though it makes setting preferences slightly slower than the standard Gnome menu, though that&#39;s not really an issue since it not something one should have to anyway), their theme (and the &lt;span style=&quot;text-decoration:underline;&quot;&gt;excellent&lt;/span&gt; included themes), how everything is automated, from video codecs to software installation and checking, and most of all because it let me boot into CompizFusion without any configuration &lt;span style=&quot;text-decoration:underline;&quot;&gt;at all&lt;/span&gt; - with working video none the less (something I never got working right in Ubuntu).&lt;/p&gt;&lt;p&gt;I don&#39;t know how on earth the &lt;a href=&quot;http://www.linuxmint.com/&quot;&gt;Mint&lt;/a&gt; team has achieved this, since it should function exactly like Ubuntu in regards to drivers, but for some reason &lt;a href=&quot;http://www.linuxmint.com/&quot;&gt;Mint&lt;/a&gt; just works.&lt;/p&gt;&lt;p&gt;If I gave out stars, Mint would get five out five (or maybe 4.9 because of the redundant, and slighly ugly, welcome setup) - if you haven&#39;t already tried &lt;a href=&quot;http://www.linuxmint.com/&quot;&gt;Linux Mint&lt;/a&gt;, I recommend you give it a go - especially if you&#39;ve never tried Linux before and want to see what alle the hype is about ;)&lt;/p&gt;</description>
  </item>
  <item>
    <title>GLM Extractor for Tabula Rasa</title>
    <link>https://staging.cybolic.me/posts/glm-extractor-for-tabula-rasa</link>
    <pubDate>Tue, 30 Dec 2008 21:21:41 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/glm-extractor-for-tabula-rasa</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Games</category>
    <category>Audio</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/music.jpg" />
    <description>&lt;p&gt;Now that Tabula Rasa is entering its final death rattle I wanted to make sure I got the soundtrack by Tracy Bush, Curse Mackey and Chris Vrenna with Clint Walsh, so I wrote a small extractor for the GLM format.&lt;/p&gt;&lt;p&gt;Now, as far as I can tell, a GLM file is just a sequence of either Ogg Vorbis or MP3 files put together, so my extractor only looks for those two file formats and splits them up into single files in the sequence it finds them in. There might be more to the format than that, and so I don&#39;t guarantee that it works correctly, but at least I&#39;ve got my soundtrack to listen to.&lt;/p&gt;&lt;p&gt;Anyhow, here it is: &lt;a href=&quot;http://dl.getdropbox.com/u/278272/TabulaRasaGLMExtractor.py&quot;&gt;http://dl.getdropbox.com/u/278272/TabulaRasaGLMExtractor.py&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Just run it in a terminal and it should tell you how to use it.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Linux Memory Management</title>
    <link>https://staging.cybolic.me/posts/linux-memory-management</link>
    <pubDate>Wed, 11 Feb 2009 15:59:29 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/linux-memory-management</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;I have 3gbs of memory in my system and a fast processor, yet my system would start choking when I used too much memory, so I sat out to fix it.&lt;/p&gt;&lt;p&gt;What I learned is that there&#39;s a setting in &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; called &lt;code&gt;vm.swappiness&lt;/code&gt; that controls to what level the Linux kernel should use disk based virtual memory from 1-100.&lt;/p&gt;&lt;p&gt;In Ubuntu, this is set to 60 by default, which roughly translates to 60% of all virtual memory being disk based, and therefore, slow.&lt;/p&gt;&lt;p&gt;To change the value simply edit the file (e.g. &lt;code&gt;gksu gedit /etc/sysctl.conf&lt;/code&gt;) and add the line &lt;code&gt;vm.swappiness = 1&lt;/code&gt; (change &lt;code&gt;1&lt;/code&gt; to what you think is appropriate) - the change will take effect on next reboot.&lt;/p&gt;&lt;p&gt;If you want the effect now, you can run &lt;code&gt;sudo sysctl vm.swappiness=1&lt;/code&gt; in a terminal.&lt;/p&gt;&lt;p&gt;A very welcome effect of this change is that Nautilus is now many, many, many times faster!&lt;/p&gt;</description>
  </item>
  <item>
    <title>Wine integration in Nautilus</title>
    <link>https://staging.cybolic.me/posts/wine-integration-in-nautilus</link>
    <pubDate>Tue, 13 Oct 2009 05:46:21 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/wine-integration-in-nautilus</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/vineyard.jpg" />
    <description>&lt;p&gt;As very few people apart from &lt;a href=&quot;http://yokozar.org/blog/&quot; title=&quot;Scott Rotchie&quot;&gt;Scott Ritchie&lt;/a&gt; probably know, I&#39;ve been working on integrating Wine more closely with Gnome for a few months now, and though I&#39;ve had a break from the development for some time, I managed to finally create a little more for the project today.&lt;/p&gt;&lt;p&gt;More specifically, I made the first version of the integration of Wine&#39;s preferences into Nautilus.&lt;/p&gt;&lt;p&gt;So far, this is what&#39;s possible:&lt;img src=&quot;https://staging.cybolic.me/posts/r4qmhlQecs-426.jpeg&quot; /&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/soRCfXiy9E-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;Now, Wine also has options for setting some options for DirectSound emulation and library (DLL) overrides for a specific program, and while I intend to add support for library overrides, I don&#39;t think I&#39;ll include the options for setting DirectSound emulation levels. The reasons for this are that, first of all, the options would take up a lot of space visually and make the usually small properties dialog huge, but more importantly, I&#39;ve never seen any howto, guide or anything where a program would work better after toggling DirectSound emulation or changing the bit depth of the audio, so I&#39;m assuming that those options are pretty safe to exclude.&lt;/p&gt;&lt;p&gt;If you want this on your own system, this is what you have to do (this will be much easier soon as Scott is in the process of packaging this stuff up for Ubuntu):&lt;/p&gt;&lt;p&gt;We&#39;ll be needing two things: My Wine library for Python and the properties file for Nautilus and we&#39;ll be getting both from bzr, so if you don&#39;t have bzr installed you should do a &lt;strong&gt;sudo aptitude install bzr&lt;/strong&gt; (if you are on Ubuntu or another Debian based system) before doing the next steps.&lt;/p&gt;&lt;p&gt;First, let&#39;s get all the files from the bzr project: &lt;code&gt;bzr branch lp:~ubuntu-wine/+junk/wine-helper&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Next, we&#39;ll install the Wine library for Python (UPDATE: There&#39;s a debian package further down the page, if you prefer that route): &lt;code&gt;sudo cp -R wine-helper/wine /usr/lib/python2.6/wine&lt;/code&gt;&lt;/p&gt;&lt;p&gt;And finally we&#39;ll install the Wine properties page for Nautilus: &lt;code&gt;sudo cp wine-helper/wine-property-page.py /usr/lib/nautilus/extensions-2.0/python/&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Now everything is installed and you can either log out and in again or restart Nautilus by pressing Alt+F2 and typing &lt;strong&gt;nautilus -q&lt;/strong&gt; for the changes to have effect.&lt;/p&gt;&lt;p&gt;Let me know how things went :)&lt;/p&gt;&lt;p&gt;UPDATE: For those of you that prefer not to &amp;quot;hack&amp;quot; your system, say by copying files directly into the directory of a specific Python version, I&#39;ve made a deb package of the Wine library. &lt;a href=&quot;http://dl.getdropbox.com/u/278272/Linux/python-wine_0.1_all.deb&quot;&gt;It&#39;s available here.&lt;/a&gt;&lt;/p&gt;</description>
  </item>
  <item>
    <title>Launchpad and PPA - here we go!</title>
    <link>https://staging.cybolic.me/posts/launchpad-and-ppa-here-we-go</link>
    <pubDate>Tue, 13 Oct 2009 20:12:42 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/launchpad-and-ppa-here-we-go</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/vineyard.jpg" />
    <description>&lt;p&gt;So, after having build a debian package of python-wine, I thought it would be an easy thing to set up a PPA and start actually distributing my work on the Wine/Gnome integration... Well, turns out it was a bit trickier than I thought and I consequently had to rebuild the python-wine package from scratch, but at least it should now follow the Ubuntu/Debian Packaging Guidelines! :D (though lintian still complains about stuff the guideline says is correct... hmm...)&lt;/p&gt;&lt;p&gt;Anywho! The PPA is set up and the first package is being build so now you should be able to add my PPA and have automatic updates to python-wine, and hopefully the rest of my work in the near future.&lt;/p&gt;&lt;p&gt;While I&#39;m on the subject I have to comment on how annoying the documentation is for building packages. I&#39;m sure it&#39;s just dandy if you are building a package from someone else&#39;s work and it&#39;s coded in a compiled language, but it only gives an example on how build a package of a python application, no word on how a module or extension would work, or how something like a Nautilus extension or other single-file-or-small-script-package would have to be build. I&#39;m sure I&#39;ll figure this stuff out eventually, but it&#39;s going to be by trial and error and by looking at other people&#39;s packages, not by reading documentation, which is sad. I hear good things about Ubuntu&#39;s &lt;a href=&quot;https://wiki.ubuntu.com/Quickly&quot;&gt;Quickly&lt;/a&gt; project, but so far it seems a bit too &amp;quot;magical&amp;quot; for me since there&#39;s very little documentation on what it actually does behind the scenes to make me trust that it won&#39;t make a mess of things for me instead. Of course, I could stop complaining and publish some documentation instead, but to be honest I don&#39;t fee I know enough of the subject yet to do so... maybe in the future.&lt;/p&gt;&lt;p&gt;Anyway, enough rambling! &lt;a href=&quot;https://launchpad.net/~cybolic/+archive/ppa&quot;&gt;Here&#39;s my PPA.&lt;/a&gt;&lt;/p&gt;</description>
  </item>
  <item>
    <title>More tools for Wine management</title>
    <link>https://staging.cybolic.me/posts/more-tools-for-wine-management</link>
    <pubDate>Wed, 14 Oct 2009 06:35:03 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/more-tools-for-wine-management</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/vineyard.jpg" />
    <description>&lt;p&gt;Okay, this is actually fairly exciting... I&#39;ve packaged and uploaded nautilus-wine and wine-preferences to my PPA, so now you can install both the Nautilus Wine properties page I showed two posts ago, and my fancy &amp;quot;new&amp;quot; (it&#39;s been in ubuntu-wine&#39;s bzr forever) graphical configuration tool for Wine directly from your package manager (if you&#39;re running Ubuntu).&lt;/p&gt;&lt;p&gt;Yes, this is the so called gtk-port of winecfg that so many have been dreaming about for the last couple of years, only this one also throws in bottle support (though you have to launch it with &amp;quot;--enable-bottles&amp;quot; to use that the first time, after you&#39;ve created a bottle it figures you might want to use the functionality again by default), running and uninstalling installed Windows programs and a few commonly used &amp;quot;tricks&amp;quot; like setting how much video card ram you have or how offscreen images should be rendered (FBO, PixelBuffer or BackBuffer) all nicely wrapped in a Gnome System Tools -like program.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/984PRgaXpS-456.jpeg&quot; /&gt;&lt;/p&gt;&lt;p&gt;Next on the packaging schedule are the helper tools that offer to install Wine the first time you try to open a Windows executable without Wine installed, scans the file for virus and offer to set the executable bit for you, oh and also does this for Java and .desktop files, more Nautilus integration in the form of the &amp;quot;Run in new Wine configuration&amp;quot; right click option you may have noticed earlier and the command line version of wine-preferences which should come very handy for you script makers out there.&lt;/p&gt;&lt;p&gt;On the development front I think I still need to figure out a clever way of exposing the bottle structure to Nautilus. As it is now, bottles are saved as fake home directory in ~/.winebottles/$BOTTLENAME - why the fake home directory you ask? Since I discovered that Windows programs just love to put stuff in My Documents, which defaults to the users home, so this is to avoid programs spamming your home folder, unfortunately it also means that if you open ~/.winebottles/$BOTTLENAME in Nautilus you won&#39;t see anything since everything is in hidden directories. I&#39;m thinking some kind of symlinking could make this accessible, but I still have to work out the details.&lt;/p&gt;&lt;p&gt;So, now I&#39;m off to bed (finally) so I&#39;m ready for helping my beautiful Greek fiancee move into her new flat here in Denmark tomorrow :D - which is bad news for the rest of you since this means no time for coding or packaging the next couple of days ;)&lt;/p&gt;&lt;p&gt;Cheerios!&lt;/p&gt;&lt;p&gt;EDIT: Oh, almost forgot, in case you missed my last post, &lt;a href=&quot;https://launchpad.net/~cybolic/+archive/ppa&quot;&gt;my PPA is here&lt;/a&gt;.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Vineyard update</title>
    <link>https://staging.cybolic.me/posts/vineyard-update</link>
    <pubDate>Fri, 23 Oct 2009 03:00:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/vineyard-update</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/vineyard.jpg" />
    <description>&lt;p&gt;Sorry for the lack of updates lately, lot&#39;s of stuff to take care of lately, but at least Vineyard is shaping up nicely! It took a bit longer than I expected to rewrite Vineyard, most of it was due to the code redesigning but the porting from Glade to code definitely also took longer than anticipated. What you can expect from the next version is much, much, much faster start up time, &amp;quot;lazy loading&amp;quot; of pages and better error handling. So far the only pages that need work are Drives and Programs - the last one needs some more redesign on the python-wine end as well, so it&#39;ll take a little while, but it should prove much faster when done (it already is). I&#39;ve reorganised the pages a bit, to hopefully make it easier to navigate.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Christmas release!</title>
    <link>https://staging.cybolic.me/posts/christmas-release</link>
    <pubDate>Thu, 24 Dec 2009 19:21:15 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/christmas-release</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/vineyard.jpg" />
    <description>&lt;p&gt;This is just a quick post to tell you all that I&#39;ve updated wine-preferences in my PPA. There are lots of new goodies and a nice graphical overhaul. More details later, now for the eating!&lt;/p&gt;&lt;p&gt;Remember, you can install all the Vineyard packages (wine-preferences, nautilus-wine and python-wine) by running the following commands:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; add-apt-repository&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ppa:cybolic/ppa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; aptitude&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; aptitude&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; wine-preferences&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; nautilus-wine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
  </item>
  <item>
    <title>Just a quick note about network connections</title>
    <link>https://staging.cybolic.me/posts/just-a-quick-note-about-network-connections</link>
    <pubDate>Sun, 14 Mar 2010 21:15:29 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/just-a-quick-note-about-network-connections</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;I&#39;ve been working on some new functionality for Vineyard and I needed to test if the user is connected to the internet or not. After some Google scouting I didn&#39;t come up with anything that did what I needed so I ended up writing this little function and thought it might be useful for others.&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; test_internet_connection&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;	info &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; subprocess&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;Popen&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;ifconfig&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;-a&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt; stdout&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;subprocess&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;PIPE&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;communicate&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;()[&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;	for&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; interface &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; info&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;nn&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;		if&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;UP BROADCAST RUNNING&#39;&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; interface &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;and&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;inet addr:&#39;&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;			return&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;	return&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Internet connection... Vineyard... what could I be up to? Any guesses (or requests)?&lt;/p&gt;</description>
  </item>
  <item>
    <title>Vineyard: What&#39;s going on?</title>
    <link>https://staging.cybolic.me/posts/vineyard-whats-going-on</link>
    <pubDate>Fri, 19 Mar 2010 23:24:23 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/vineyard-whats-going-on</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/vineyard.jpg" />
    <description>&lt;p&gt;After the hinting I did in my &lt;a href=&quot;http://cybolic.wordpress.com/2010/03/14/just-a-quick-note-about-network-connections/&quot;&gt;last post&lt;/a&gt; and the lack of any new features being released for Vineyard, I though I&#39;d let you people know what&#39;s actually going on with the development.&lt;/p&gt;&lt;p&gt;As some may have noticed, the last release had the Programs-page split into a separate file loaded as a plugin/module. This was done since the code for it is the largest piece of related code in Vineyard and it made sense to separate it, but also because I&#39;ve been wanting to make Vineyard more modular. The result of starting to split out the different pages into modules (and stumbling on to &lt;a href=&quot;http://www.jonobacon.org/2010/03/15/download-files-async-with-gio-and-python/&quot;&gt;Jono Bacon&#39;s recent post&lt;/a&gt;) however left me wishing that I had structured Vineyard differently from the start, so I sat down, did some thinking and decided to reprogram vinyard-preferences from scratch. Yup, that&#39;s right, from scratch.&lt;/p&gt;&lt;p&gt;I know this means that you&#39;ll have to wait somewhat longer for the next version, but fear not, I will still release bug fixes when necessary for the 1.4 series. What this also means is that the next version (the one brewing on my harddrive) loads completely asynchronously (in less than a second on my computer right now), has every page split into modules/plugins that load on demand, supports loading parts of the interface into other programs as widgets (!), supports theming Wine (including installing themes from archive files), has rudimentary support for colour-settings, and.... you guessed it Luke... basic AppDB integration. It also means that maintaining and extending Vineyard should be a lot easier in the future, good news for me.&lt;/p&gt;&lt;p&gt;So, sorry to keep you waiting, but I promise I&#39;m cooking up something good ;) Oh, and feel free to keep requesting functionality!&lt;/p&gt;&lt;p&gt;Before I sign out I&#39;ll leave you with a quick screenshot of the new (possible) layout of some of the options:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/TKtkrrO4XH-447.jpeg&quot; /&gt;&lt;/p&gt;</description>
  </item>
  <item>
    <title>Thoughts on The Piracy Logic Problem</title>
    <link>https://staging.cybolic.me/posts/thoughts-on-the-piracy-logic-problem</link>
    <pubDate>Thu, 25 Mar 2010 22:13:08 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/thoughts-on-the-piracy-logic-problem</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/tech.jpg" />
    <description>&lt;p&gt;I just thought of something that I can&#39;t get to make sense...&lt;/p&gt;&lt;p&gt;&lt;em&gt;DISCLAIMER: I am in no way a lawyer, just a confused consumer.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;It is (in Denmark at least, and I assume in most other countries) legal to make a safety copy of a legally purchased movie or album for yourself. I presume it is also legal to get a friend to make the copy for you, provided they don&#39;t make one for themself as well (quite likely to happen given the time and computing power it takes to make a digital copy / transcoding) But, it is not legal for me to &lt;em&gt;download&lt;/em&gt; a &amp;quot;safety copy&amp;quot; of a movie or album I have legally purchased.&lt;/p&gt;&lt;p&gt;How exactly is that different from getting a friend to make the copy, and how is it supposed to be proven that it was actually downloaded? And what about if I make backups of all my movies and albums on my home computer and my physical collection then get stolen or my house burns down? Will it be assumed that everything was downloaded illegally and if not, am I even entitled to &lt;em&gt;keep&lt;/em&gt; my backups - and if not, why allow me to make backups in the first place?&lt;/p&gt;&lt;p&gt;Furthermore, even if it is proven that my collection was downloaded off the internet, how can it be proven that the copy I downloaded was not ripped from my own original (in the case that your backup-friend lives far away and sending the file is quicker than getting it physically - and, for the sake of argument, that your physical collection is nearer to your friend)?&lt;/p&gt;&lt;p&gt;Also, in the case of someone downloading something off BitTorrent, Rapidshare or another service - how can it be proven that the &amp;quot;leaked&amp;quot; copy didn&#39;t originate from, but wasn&#39;t spread by, the person downloading it? Isn&#39;t that still a personal backup, even though others &amp;quot;stole&amp;quot; copies of it?&lt;/p&gt;&lt;p&gt;I&#39;m having a great deal of trouble seeing how it&#39;s possible to separate legal from non-legal copies (except for the case of watermarks, but even then you have the possible after-market sale to deal with) and how you can prove that any downloading/ripping/transcoding is illegal, provided that backups are legal - and I strongly believe they should keep being legal! I don&#39;t want to lose my copy of Ghostbusters to scratches on the disc :(.&lt;/p&gt;&lt;p&gt;What are your thoughts on the subject?&lt;/p&gt;</description>
  </item>
  <item>
    <title>&quot;Fixing&quot; a Banshee music database</title>
    <link>https://staging.cybolic.me/posts/fixing-a-banshee-music-database</link>
    <pubDate>Wed, 21 Apr 2010 03:00:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/fixing-a-banshee-music-database</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Audio</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/music.jpg" />
    <description>&lt;p&gt;NOTE: This is a bit verbose in the description, but maybe you can learn something from the process. If you just want to know how to fix the Banshee database after changing user-name or moving your library to a different location, scroll down.&lt;/p&gt;&lt;p&gt;I recently reinstalled Ubuntu and in the process changed my user-name to my more commonly used &#39;cybolic&#39;, however after copying the &lt;code&gt;~/.config/banshee-1&lt;/code&gt; directory to my new home-dir, I realised that Banshee had all my music indexed by absolute path, meaning that it was looking for my old home-dir and so couldn&#39;t play any tracks.&lt;/p&gt;&lt;p&gt;To fix it I assumed I would have to do a search and replace on its database, but I needed the filetype, so a quick &lt;code&gt;file ~/.config/banshee-1/banshee.db&lt;/code&gt; later I now knew that it was in SQLite 3.x format.&lt;/p&gt;&lt;p&gt;Now on to a tool to do the search and replace on the database...&lt;/p&gt;&lt;p&gt;Ubuntu has a tool in its repos called &lt;code&gt;sqlitebrowser&lt;/code&gt;, that sounded about right, so I installed it and yes, it allowed me to browse the database and perform SQL queries - just what I needed.&lt;/p&gt;&lt;p&gt;So, long story short, to change the location of your music files in the Banshee database, here&#39;s what you do (close Banshee first):&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; aptitude&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; sqlitebrowser&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sqlitebrowser&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ~/.config/banshee-1/banshee.db&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now change to the tab labelled &amp;quot;Execute SQL&amp;quot; and write something like the following:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; CoreTracks &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; Uri &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(Uri, &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;/home/&amp;#x3C;olduser&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;/home/&amp;#x3C;newuser&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; PodcastEnclosures &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; LocalPath &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; replace&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(LocalPath, &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;/home/&amp;#x3C;olduser&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;/home/&amp;#x3C;newuser&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You are now done and can start Banshee again :)&lt;/p&gt;</description>
  </item>
  <item>
    <title>A quiet little game</title>
    <link>https://staging.cybolic.me/posts/a-quiet-little-game</link>
    <pubDate>Thu, 29 Apr 2010 20:38:57 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/a-quiet-little-game</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Games</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/osmos.jpg" />
    <description>&lt;p&gt;Normally I blog about Wine and Vineyard, but while the meaning behind these two projects are getting an existing Windows program running on Linux, thankfully this is not always necessary.&lt;/p&gt;&lt;p&gt;Now, I&#39;m not much of a gamer, when I actually play something it&#39;s usually not for more than an hour, at most. I tend to launch a game, play it for about 10 minutes and then get back to something else, so most of the Hollywood fps-shooter/rpg/mmo-hybrids that are released these days never really get the attention they need from me for their mood and storyline to really grab me, luckily I stumbled upon another type of game a while back - for Windows.&lt;/p&gt;&lt;p&gt;You may have heard of or tried the initial stages of Spore or the simple fun of Flow and the game I&#39;m talking about is very much in the same category as these, but in my opinion, a much more capturing and relaxing experience. The good news is that even though this was previously very possible to run through Wine, there is now a dedicated, very-well-ported, Linux version!&lt;/p&gt;&lt;p&gt;The game is, if you haven&#39;t guessed it: Osmos.&lt;/p&gt;&lt;p&gt;In Osmos you play a small blob (or mote) that has to eat smaller blobs in order to grow and become the largest in the &amp;quot;blobiverse&amp;quot; and while this idea in itself isn&#39;t new, the half-cosmos, half-biology visuals and the great galaxy inspired physics certainly are and give the game a great twist, placing it both in the tranquil, meditative genre and at the same time, due to the physics, the other intelligent blobs and depending on how you play, in the same kind of hectic, tilt-your-entire-body-to-move-your-avatar frenzy that is usually associated with action games. Another point worth mentioning is that Osmos contains music by several artists, with the name of the artist and the track printed at the bottom of the screen at all times. This is a great move by Hemisphere Games and is a welcome show of respect towards musicians that is seldom seen in the game world.&lt;/p&gt;&lt;p&gt;All in all, while getting Windows-only games to run on Linux is great, supporting properly ported games and programs (and trust me, this is a fantastic port) is extremely important if Linux is to be taken seriously on the desktop and helps prove to companies that Linux is worth supporting.&lt;/p&gt;&lt;p&gt;If you haven&#39;t done so already, hurry up and download the Osmos demo and if you like what you see, purchase a copy and support a company that has done a great job at porting a great game to a great platform.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.hemispheregames.com/Osmos/&quot;&gt;Osmos website is here.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;UPDATE: I forgot to link to the &lt;a href=&quot;http://createdigitalmusic.com/2009/09/24/music-physics-space-in-perfect-fusion-interview-creators-of-game-osmos/&quot;&gt;article that actually introduced me to Osmos&lt;/a&gt;. It&#39;s a good read, so don&#39;t be afraid of the length.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Facebook chat flaw?</title>
    <link>https://staging.cybolic.me/posts/facebook-chat-flaw</link>
    <pubDate>Thu, 03 Jun 2010 11:29:21 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/facebook-chat-flaw</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/facebook.jpg" />
    <description>&lt;p&gt;I just received a chat message from someone on Facebook whom I am not friends with, and went to investigate... Though I couldn&#39;t find anything online, and I&#39;m not going to test it by spamming random people, it seems that if you add a buddy/friend in your desktop chat client with a username such as &lt;code&gt;-PROFILEID@chat.facebook.com&lt;/code&gt; (and &lt;code&gt;profileid&lt;/code&gt;s can be read from any profile) you&#39;ll be able to chat to that person, &lt;em&gt;even if you are not friends&lt;/em&gt;!&lt;/p&gt;&lt;p&gt;This might only work if the person you are chatting up also uses a desktop client, since Facebook did not store the message I received, but it&#39;s still a flaw - especially considering that adding a person from &lt;code&gt;UNIQUENAME@chat.facebook.com&lt;/code&gt; clearly claims that you are not authorised, so they do have some security in place.&lt;/p&gt;&lt;p&gt;&lt;em&gt;sigh&lt;/em&gt; ...when will Google free up Buzz from GMail so we can start migrating?&lt;/p&gt;</description>
  </item>
  <item>
    <title>How to get sound in Shadowgrounds in Ubuntu Maverick x64</title>
    <link>https://staging.cybolic.me/posts/how-to-get-sound-in-shadowgrounds-in-ubuntu-maverick-x64</link>
    <pubDate>Sat, 02 Oct 2010 02:55:39 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/how-to-get-sound-in-shadowgrounds-in-ubuntu-maverick-x64</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Games</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;Yeah, so here we go, my third issue with the Linux port of Shadowgrounds... anyway, it turned out to not be that difficult to fix.&lt;/p&gt;&lt;p&gt;Shadowgrounds only really plays well with OSS, so you should run it through aoss, but that won&#39;t work in 64 bit. So here&#39;s the solution:&lt;/p&gt;&lt;p&gt;First, install &lt;code&gt;alsa-oss&lt;/code&gt; (&lt;code&gt;sudo apt-get install alsa-oss&lt;/code&gt;), then download this archive, extract it your game directory and run &lt;code&gt;shadowgrounds-x64&lt;/code&gt; from now on - easy as that. &lt;a href=&quot;http://dl.dropbox.com/u/278272/Linux/shadowgrounds-x64-fix.tar.bz2&quot;&gt;Download me&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you prefer to do this by hand, first download the &lt;code&gt;alsa-oss&lt;/code&gt; package for i386 (&lt;a href=&quot;http://packages.ubuntu.com/maverick/i386/alsa-oss/download&quot;&gt;from here&lt;/a&gt;), extract it (&lt;code&gt;dpkg --extract alsa-oss_1.0.17-4_i386.deb alsa-oss&lt;/code&gt;) and copy the files in &lt;code&gt;usr/lib/&lt;/code&gt; to &lt;code&gt;/usr/lib32/&lt;/code&gt; (&lt;code&gt;sudo cp alsa-oss/usr/lib/* /usr/lib32/&lt;/code&gt;). Now when you want to run the game, you should run it as:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;LD_PRELOAD&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;/usr/lib32/libaoss.so&quot;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; aoss&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ./shadowgrounds-bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
  </item>
  <item>
    <title>Switch to bottom pane plugin for GEdit</title>
    <link>https://staging.cybolic.me/posts/switch-to-bottom-pane-plugin-for-gedit</link>
    <pubDate>Thu, 09 Dec 2010 21:19:00 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/switch-to-bottom-pane-plugin-for-gedit</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;So, I&#39;ve been reconsidering GEdit as a quick development environment, but I was really missing a way to switch to the bottom pane and back (for using the embedded terminal).&lt;/p&gt;&lt;p&gt;I couldn&#39;t find an existing plugin to do this, so I took a look at Elia Sarti&#39;s TabSwitch plugin - that uses Ctrl+Tab to switch tabs - and edited it to switch back and forth between the bottom pane and the editor view and I must say that GEdit has a rather comfortable work flow now :)&lt;/p&gt;&lt;p&gt;Plugin is &lt;a href=&quot;http://dl.dropbox.com/u/278272/Linux/gedit-focusbottompane.tar.bz2&quot;&gt;here&lt;/a&gt; for Gedit 2 and &lt;a href=&quot;https://dl.dropboxusercontent.com/u/278272/Linux/gedit3-focusbottompane.tar.bz2&quot;&gt;here&lt;/a&gt; for Gedit 3.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Find the 32bit deb package from your 64bit system</title>
    <link>https://staging.cybolic.me/posts/find-the-32bit-deb-package-from-your-64bit-system</link>
    <pubDate>Thu, 13 Jan 2011 16:46:46 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/find-the-32bit-deb-package-from-your-64bit-system</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/linux.jpg" />
    <description>&lt;p&gt;I&#39;m sure I&#39;m not the only one that has had to install a 32bit version of some package to get a game or other program not designed for 64bit to work in 64bit Linux/Ubuntu/Debian and I&#39;m sure others will nod in agreement at how difficult it can be to find the 32bit version, especially if you need a bunch and don&#39;t really have the time to wade through packages.ubuntu.com (or packages.debian.org for that matter), so I&#39;ve cooked up a little Python script to find the URL for the 32bit version of a package for you.&lt;/p&gt;&lt;p&gt;It&#39;s &lt;a href=&quot;http://dl.dropbox.com/u/278272/Utils/apt-get-i386-package.py&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;You just run it with the name of the package you want to find as the first argument, like so:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ./apt-get-i386-package.py&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; libpulse0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;http://ppa.launchpad.net/ubuntu-audio-dev/ppa/ubuntu/pool/main/p/pulseaudio/libpulse0_0.9.22-0ubuntu1_i386.deb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;See? Easy.&lt;/p&gt;&lt;p&gt;Also note that it found it in a PPA - it uses your package database, so everything you can theoretically install can be found in a 32bit version.&lt;/p&gt;</description>
  </item>
  <item>
    <title>GStreamer, MIDI (and Ubuntu)</title>
    <link>https://staging.cybolic.me/posts/gstreamer-midi-and-ubuntu</link>
    <pubDate>Tue, 26 Apr 2011 05:41:57 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/gstreamer-midi-and-ubuntu</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Audio</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/music.jpg" />
    <description>&lt;p&gt;So, you have all your old MIDI files lying around and you decide to play them through Totem or another GStreamer based player. What happens? They sound... flat.&lt;/p&gt;&lt;p&gt;Ah, no problem you think, I&#39;ll just set up Timidity to use the neat soundfont I have lying around that sounds like my old SoundBlaster card and everything will be peachy, but no, GStreamer doesn&#39;t support soundfonts cause it doesn&#39;t use timidity but wildmidi - what to do?&lt;/p&gt;&lt;p&gt;Or: &lt;strong&gt;How to convert soundfonts to GUS patches for use in wildmidi/gstreamer.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There&#39;s a neat little tool called &lt;a href=&quot;http://alsa.opensrc.org/Unsf&quot;&gt;Unsf&lt;/a&gt; included in Greg Lee&#39;s gt - a stripped down version of Timidity - that can convert a soundfont to a GUS patch usable by wildmidi and therefore GStreamer, so let&#39;s get started with the conversion!&lt;/p&gt;&lt;p&gt;First, go to where you want the GUS patch (and its files) - this path shouldn&#39;t contain spaces - then download the latest version of gt (I hear there&#39;s a version 1.0, but 0.4 is the latest I can find):&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /where/you/want/the/GUS/files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;wget&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ftp://ling.lll.hawaii.edu/pub/greg/gt-0.4.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, let&#39;s extract it somewhere and build it:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;tar&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -xzf&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; gt-0.4.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; gt-0.4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;./configure&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; utils&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;make&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, let&#39;s convert the soundfont to a GUS patch (remember to replace /path/to/your/soundfont.sf2 with the actual path to your soundfont):&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; ../../GUS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;./utils/unsf&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -F&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /path/to/your/soundfont.sf2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now we need to fix the config file that unsf wrote to include the path to where your GUS patch is:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -e&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;dir &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$PWDn&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; &amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; wildmidi&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; cat&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;.cfg&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; &gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; wildmidi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now let&#39;s &amp;quot;install&amp;quot; that config file:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; cp&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; wildmidi&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /etc/wildmidi.cfg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There! You&#39;re done!&lt;/p&gt;&lt;p&gt;For a nice athentic old school midi sound, I recommend the following soundfont (you need to register to download though): http://www.sf2midi.com/soundfonts/file-detail/roland-sc-55-sf2-3033.html&lt;/p&gt;</description>
  </item>
  <item>
    <title>Howto: Deus Ex: Human Revolution in Ubuntu/Linux</title>
    <link>https://staging.cybolic.me/posts/howto-deus-ex-human-revolution-in-ubuntu-linux</link>
    <pubDate>Sat, 07 Jan 2012 02:09:43 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/howto-deus-ex-human-revolution-in-ubuntu-linux</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <category>Vineyard</category>
    <category>Games</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/vineyard_deusexhr.jpg" />
    <description>&lt;p&gt;I just bought &lt;em&gt;Deus Ex: Human Revolution&lt;/em&gt;, and if you did too, or are contemplating it, don&#39;t let the bad rating on WineHQ scare you off - it runs near perfectly. Now, the in-game tutorials are a bit wonky, but if you can live without those (I know I didn&#39;t have much of a problem without them), here&#39;s how you can install and run DE:HR in Ubuntu/Linux.&lt;/p&gt;&lt;p&gt;You are going to need &lt;a href=&quot;http://vineyardproject.org&quot;&gt;Vineyard&lt;/a&gt;, so install that first if you haven&#39;t already, also we are going to use the terminal a bit, but don&#39;t worry, it&#39;s not scary, just quicker.&lt;/p&gt;&lt;h2 id=&quot;first-off-lets-install-the-game&quot;&gt;First off, let&#39;s install the game.&lt;/h2&gt;&lt;p&gt;Do whatever you would normally do; run the installer from the DVD or download it from Steam - just make sure you do it in a new prefix in Vineyard.&lt;/p&gt;&lt;h2 id=&quot;secondly-install-a-custom-version-of-wine-with-rawinput2-patch&quot;&gt;Secondly, install a custom version of Wine (with rawinput2 patch).&lt;/h2&gt;&lt;p&gt;We&#39;re going to use one provided by &lt;a href=&quot;http://www.playonlinux.com/&quot;&gt;PlayOnLinux&lt;/a&gt;, so if you have &lt;em&gt;PlayOnLinux&lt;/em&gt; installed, just install Wine 1.3.34 rawinput2 from there, otherwise, either go to &lt;a href=&quot;http://www.playonlinux.com/wine/binaries/linux-x86/&quot;&gt;http://www.playonlinux.com/wine/binaries/linux-x86/&lt;/a&gt;, download the one called &lt;em&gt;PlayOnLinux-wine-1.3.34-rawinput2-linux-x86.pol&lt;/em&gt;, rename it to have a &lt;em&gt;.tar.bz2&lt;/em&gt; ending and then extract from it the folder called &amp;quot;&lt;em&gt;wineversion/1.3.34-rawinput2&lt;/em&gt;&amp;quot; to &lt;em&gt;$HOME/.local/share/wineversions/1.3.34-rawinput2&lt;/em&gt; - &lt;strong&gt;or run the following command&lt;/strong&gt;:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; $HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.local/share/wineversions&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  wget&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -q&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -O&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;http://www.playonlinux.com/wine/binaries/linux-x86/PlayOnLinux-wine-1.3.34-rawinput2-linux-x86.pol&#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  tar&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --wildcards&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --transform&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;s/wineversion///&#39;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --bzip2&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -xvf&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -C&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; $HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.local/share/wineversions/&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;wineversion/*&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;setup-vineyard-to-use-it&quot;&gt;Setup Vineyard to use it&lt;/h2&gt;&lt;p&gt;Now we need to edit the prefix configuration so Vineyard knows to run this version of Wine, so if you know where that directory is, just go and open the file &lt;em&gt;wrapper.cfg&lt;/em&gt;, otherwise open Vineyard Preferences, select the prefix and under &amp;quot;&lt;em&gt;Tools&lt;/em&gt;&amp;quot;, click &amp;quot;&lt;em&gt;Open Main Drive&lt;/em&gt;&amp;quot; and then navigate one directory up, there&#39;s your &lt;em&gt;wrapper.cfg&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Add the following lines to this file:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_wine&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.local/share/wineversions/1.3.34-rawinput2/bin/wine&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_wineloader&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.local/share/wineversions/1.3.34-rawinput2/bin/wine&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_wineserver&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.local/share/wineversions/1.3.34-rawinput2/bin/wineserver&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_winedllpath&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.local/share/wineversions/1.3.34-rawinput2/lib/wine&quot;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or, if you installed the Wine version through PlayOnLinux:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_wine&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.PlayOnLinux/wine/linux-x86/1.3.34-rawinput2/bin/wine&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_wineloader&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.PlayOnLinux/wine/linux-x86/1.3.34-rawinput2/bin/wine&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_wineserver&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.PlayOnLinux/wine/linux-x86/1.3.34-rawinput2/bin/wineserver&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;ww_winedllpath&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/.PlayOnLinux/wine/linux-x86/1.3.34-rawinput2/lib/wine&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;done-or-do-you-have-sound&quot;&gt;Done! (or do you have sound?)&lt;/h2&gt;&lt;p&gt;Now you actually might be able to run &lt;em&gt;Deus Ex: Human Revolution&lt;/em&gt; just fine! For me though, I needed to go to &lt;em&gt;Vineyard Preferences&lt;/em&gt; again and make sure the &lt;em&gt;Deus Ex: Human Revolution&lt;/em&gt; launcher had &amp;quot;&lt;em&gt;Disable PulseAudio whilst running&lt;/em&gt;&amp;quot; checked on, and then it was smooth sailing.&lt;/p&gt;&lt;p&gt;Hope this little guide was helpful, comments are very welcome.&lt;/p&gt;</description>
  </item>
  <item>
    <title>I&#39;ve moved!</title>
    <link>https://staging.cybolic.me/posts/i-ve-moved</link>
    <pubDate>Mon, 19 Mar 2012 03:08:56 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/i-ve-moved</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/internet.jpg" />
    <description>&lt;p&gt;This blog has moved!&lt;/p&gt;&lt;p&gt;The new url is &lt;a href=&quot;http://cybolic.me&quot; title=&quot;Cybolic.me&quot;&gt;http://cybolic.me&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;All comments are now transferred and while the new site still has a few issues, it works well enough for now.&lt;/p&gt;&lt;p&gt;Everyone update your bookmarks, feed sources, rolodexes and fridge magnet spell-outs!&lt;/p&gt;</description>
  </item>
  <item>
    <title>Mail Mirror on NAS</title>
    <link>https://staging.cybolic.me/posts/mail-mirror-on-nas</link>
    <pubDate>Sat, 17 Apr 2021 15:08:56 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/mail-mirror-on-nas</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Tech</category>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/tech.jpg" />
    <description>&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;&lt;p&gt;In the past, I used to mirror my email accounts locally and use &lt;a href=&quot;https://notmuchmail.org/&quot;&gt;Notmuch&lt;/a&gt; with the &lt;a href=&quot;https://github.com/pazz/alot&quot;&gt;alot email client&lt;/a&gt;. Every email was tagged appropriately, I would only see the tags I wanted in &lt;code&gt;alot&lt;/code&gt; and it was generally a pretty smooth system that got me very, very close to &lt;a href=&quot;https://www.youtube.com/watch?v=z9UjeTMb3Yk&quot;&gt;inbox zero&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The problem was that this was only the case on my desktop PC. Every time I was out of the house or wanted to try out a new distro, the email I would see anywhere else was still a cluttered mess as the tagging was only local to that one machine.&lt;/p&gt;&lt;h2 id=&quot;the-solution&quot;&gt;The solution&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Move from Notmuch tags to folders&lt;/li&gt;&lt;li&gt;Move the email mirroring off my main PC&lt;/li&gt;&lt;li&gt;(bonus) Get Notmuch back, but not locally&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;My NAS is by definition always on and - should I want - I can access it from anywhere in the world (though the setup I chose doesn&#39;t depend on this at all). This also provides me with a place to keep backups of email that I might need in the future, but serve no purpose taking up space on my email provider&#39;s drive.&lt;/p&gt;&lt;p&gt;So, with a solution planned, let&#39;s get started.&lt;/p&gt;&lt;h3 id=&quot;part-1-move-from-notmuch-tags-to-folders&quot;&gt;Part 1: Move from Notmuch tags to folders&lt;/h3&gt;&lt;p&gt;Tags are great, but we want every client to have access to organised email, so IMAP folders are the way to go here. &lt;a href=&quot;https://github.com/lefcha/imapfilter&quot;&gt;IMAPFilter&lt;/a&gt; is a pretty well-established tool for moving email around on IMAP servers; it provides a good amount of filter options for selecting those emails and the fact that its configuration is done in Lua allows us to customise the procedure anyway we like.&lt;/p&gt;&lt;h4 id=&quot;installing-imapfilter&quot;&gt;Installing IMAPFilter&lt;/h4&gt;&lt;p&gt;Since this is going to run on my NAS, a Docker container is the obvious way to go.&lt;/p&gt;&lt;p&gt;I&#39;ve prepared a &lt;a href=&quot;https://hub.docker.com/r/cybolic/imapfilter-isync&quot;&gt;Docker image for IMAPFilter&lt;/a&gt;. Normally, I would use &lt;a href=&quot;https://www.alpinelinux.org/&quot;&gt;Alpine Linux&lt;/a&gt; as a base, but &lt;code&gt;IMAPFilter&lt;/code&gt; is not yet in a stable release of Alpine (&lt;a href=&quot;https://pkgs.alpinelinux.org/packages?name=imapfilter&amp;amp;branch=edge&quot;&gt;it&#39;s in edge, so it should happen eventually&lt;/a&gt;), because of this, the Docker image uses &lt;code&gt;Debian&lt;/code&gt; as a base. This doesn&#39;t affect its use, but is good to know.&lt;/p&gt;&lt;p&gt;This image is set up to be able to run IMAPFilter on a schedule. Now, IMAPFilter &lt;em&gt;can&lt;/em&gt; stay connected to all defined IMAP accounts and listen for either &lt;code&gt;RECENT&lt;/code&gt; or &lt;code&gt;EXISTS&lt;/code&gt; events, which normally indicate that new mail has arrived. In theory, this would be the ideal way to run as we wouldn&#39;t have to keep polling the email server(s) and could just run our filters when needed. Unfortunately, many email providers only send these events once and only to one connected client, meaning IMAPFilter wouldn&#39;t get the notification if, for example, my email client on Android also happened to be connected at the time.&lt;/p&gt;&lt;p&gt;Instead, I&#39;m using &lt;a href=&quot;https://github.com/aptible/supercronic&quot;&gt;Supercronic&lt;/a&gt; to schedule IMAPFilter to be run every few minutes. I also set flags on messages that have already been seen by IMAPFilter so we don&#39;t have to check all mail in the inbox every time, but that&#39;s a setup detail for later.&lt;/p&gt;&lt;p&gt;I&#39;m using the following &lt;code&gt;crontab&lt;/code&gt; setup. You may chose to run less often, if you get less promotional email than I do:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Run every 2 minutes, starting from 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;0/2&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/sync.sh imapfilter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;/workdir/sync.sh&lt;/code&gt; script can just be &lt;code&gt;export IMAPFILTER_HOME=/workdir/.imapfilter; imapfilter -c /workdir/.imapfilter/config.lua&lt;/code&gt;, but we&#39;ll return to that later.&lt;/p&gt;&lt;p&gt;Create two bind mounts for Docker, mounting the crontab to &lt;code&gt;/etc/crontab&lt;/code&gt; and your configuration directory to &lt;code&gt;/workdir/.imapfilter&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; mail-imapfilter&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/confs/crontab&quot;,target=/etc/crontab,readonly&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/confs/imapfilter&quot;,target=/workdir/.imapfilter,readonly&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  cybolic/imapfilter-isync:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This command is just to test and give a quick overview. Ideally you wouldn&#39;t run the &lt;code&gt;docker&lt;/code&gt; command like this, but use a &lt;a href=&quot;https://docs.docker.com/compose/compose-file/compose-file-v3/&quot;&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/a&gt; file or something like &lt;a href=&quot;https://www.portainer.io/&quot;&gt;Portainer&lt;/a&gt; instead.&lt;/p&gt;&lt;h4 id=&quot;setting-up-imapfilters-filters&quot;&gt;Setting up IMAPFilter&#39;s filters&lt;/h4&gt;&lt;p&gt;IMAPFilter filters are usually written directly in &lt;a href=&quot;https://www.lua.org/&quot;&gt;Lua&lt;/a&gt;, but I like to keep my &lt;code&gt;data&lt;/code&gt; separate from my &lt;code&gt;code&lt;/code&gt; and filter definitions definitely fall under &lt;code&gt;data&lt;/code&gt; for me. Instead, I wrote a small module that lets me write filters as Lua tables instead of code. This allows me to write some things more succinctly and also opens up the possibility to write an exporter for the filter rules, should I move away from IMAPFilter down the line.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://git.sr.ht/~cybolic/Dotfiles/tree/master/item/imapfilter/.imapfilter/_rules.lua&quot;&gt;Here&#39;s the module&lt;/a&gt; and here&#39;s an example of how I use it:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; rulesrunner.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;run_rules&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(messages, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  -- PayPal Subscription receipts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  { subscription_paypal &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    { match_subject &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;receipt.*to Dropbox&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    { match_subject &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;receipt.*to Humble Bundle&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, contain_body &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;Humble Choice&quot; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  }, from &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; { contain_from &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;@paypal&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;}, move_to &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Official/Receipts/Subscription&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  -- Google Play Subscription receipts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  { subscription_googleplay &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    { contain_subject &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;receipt&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    { contain_body &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;subscription&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  }, from &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; { contain_from &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Google Play&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, contain_subject &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Your Google Play&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;}, move_to &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Official/Receipts/Subscription&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  -- Game purchases&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  { purchase_games &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    { contain_from &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;@steampowered.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, contain_subject &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;Steam purchase&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;thank you&quot; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;} }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  }, move_to &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;Official/Purchase/Games&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  -- Crowdfunding direct messages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  { crowdfunding_messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    { contain_from &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;@kickstarter.com&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, match_utf8_field &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;subject&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;response needed|sent you a message|new message&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;} }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  }, flag &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ED8796&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;}, accounts.posteo)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;Each rule in the main table passed to &lt;code&gt;run_rules&lt;/code&gt; is run in order and given the &lt;code&gt;messages&lt;/code&gt; table with any results from previous rules subtracted.&lt;/li&gt;&lt;li&gt;Each filter (e.g. &lt;code&gt;match_subject&lt;/code&gt;) is logically ANDed with the rest in the rule.&lt;/li&gt;&lt;li&gt;Multiple filters of the same type can be defined by providing their values in a table (e.g. &lt;code&gt;contain_subject = { &amp;quot;Hello&amp;quot;, &amp;quot;World&amp;quot; }&lt;/code&gt;) and are ANDed.&lt;/li&gt;&lt;li&gt;Filters that take more than one argument (like &lt;code&gt;match_field&lt;/code&gt; and &lt;code&gt;match_utf8_field&lt;/code&gt;) have their arguments defined in a table.&lt;/li&gt;&lt;li&gt;Two custom matchers, &lt;code&gt;match_utf8_field&lt;/code&gt; and &lt;code&gt;match_utf8_body&lt;/code&gt; decode Base64-encoded UTF8 text before matching (necessary for a lot of modern email).&lt;/li&gt;&lt;li&gt;The &lt;code&gt;move_to&lt;/code&gt; key triggers moving the matches to the given destination (the account to move to is given in the final argument to &lt;code&gt;run_rules&lt;/code&gt;). &lt;code&gt;delete&lt;/code&gt; and &lt;code&gt;flag&lt;/code&gt; are also supported.&lt;/li&gt;&lt;li&gt;The returned value is a table of all matches so I can subtract them from &lt;code&gt;messages&lt;/code&gt; so the next &lt;code&gt;run_rules&lt;/code&gt; block skips them.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you want to do the same filtering without my module, this would be the code for just the PayPal example above:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;local&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; results&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;local&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; subresults&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;-- PayPal Subscription receipts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;local&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; _messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt; messages&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;contain_from&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;@paypal&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;-- for Dropbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;subresults &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt; _messages&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;match_subject&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;receipt.*to Dropbox&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;_messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; _messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; subresults&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;results &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; Set&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(subresults)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;-- for Humble Choice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;subresults &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt; _messages&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;match_subject&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;receipt.*to Humble Bundle&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt; _messages&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;contain_body&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;Humble Choice&quot;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;_messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; _messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; subresults&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;results &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; results &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; subresults&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt;results&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;move_messages&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(accounts.posteo[&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;Official/Receipts/Subscription&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Personally, I find the table version easier to read.&lt;/p&gt;&lt;p&gt;At the end of the filtering, I add a &lt;code&gt;filtered&lt;/code&gt; flag to all messages that were matched so they aren&#39;t processed next time IMAPFilter runs:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt;results&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;add_flags&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;Filtered&#39; &lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And I get the initial list of messages to process as so (messages from the last 24 hours that haven&#39;t been processed):&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;local&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; messages &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; (accounts.posteo.&lt;/span&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt;INBOX&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;is_newer&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; accounts.gmail.&lt;/span&gt;&lt;span style=&quot;color:#EED49F;font-style:italic&quot;&gt;INBOX&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;is_newer&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)):&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;has_unkeyword&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;Filtered&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can find my full setup and rules &lt;a href=&quot;https://git.sr.ht/~cybolic/Dotfiles/tree/master/item/imapfilter/.imapfilter&quot;&gt;here&lt;/a&gt;. Do note that this is the first time I&#39;ve written anything in Lua, so this setup is not necessarily production quality, but it works for my use. The files in that repo are also not the exact ones I use on my NAS; these are my local dotfiles for my main PC, so consider it more of a staging area.&lt;/p&gt;&lt;h3 id=&quot;part-2-move-the-email-mirroring-off-my-main-pc-setting-up-isync-mbsync&quot;&gt;Part 2: Move the email mirroring off my main PC (setting up isync / mbsync)&lt;/h3&gt;&lt;p&gt;The Docker image used above also has &lt;a href=&quot;https://isync.sourceforge.io/&quot;&gt;isync&lt;/a&gt; (also known as &lt;code&gt;mbsync&lt;/code&gt;) installed, so we can just throw a config file in there and add it to the &lt;code&gt;crontab&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;I&#39;ve set this up to do the synchronisation in stages:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Every 2 minutes: The inbox gets synced&lt;/li&gt;&lt;li&gt;Every 7 minutes: Sync mail sorted by IMAPFilter into folders that I care about every&lt;/li&gt;&lt;li&gt;Every 15 minutes: A full sync of all email&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You&#39;ll see that IMAPFilter runs every two minutes (:00, :02, etc.) and isync runs every 2 + 1 minutes (:01, :03, etc.). This gives IMAPFilter time to sort the email before isync fetches it.&lt;/p&gt;&lt;p&gt;&lt;code&gt;mbsyncrc&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Generic defaults&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Create&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; Slave&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;SyncState&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;CopyArrivalDate&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Accounts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;IMAPAccount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;CertificateFile&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /etc/ssl/certs/ca-certificates.crt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;SSLType&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; IMAPS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Host&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo.de&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;User&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; username@posteo.net&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;PassCmd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/get_passwd.sh&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;IMAPStore&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-remote&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Account&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;MaildirStore&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# The trailing &quot;/&quot; is important&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Path&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/data/posteo-account/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Inbox&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/data/posteo-account/inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Subfolders&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; Verbatim&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Channels&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Master&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-remote:INBOX&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Slave&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-local:inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Sync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; All&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-sorted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Master&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-remote:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Slave&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-local:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Patterns&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !archived&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !drafts&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !sent&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !trash&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !Inbox&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !&quot;Unimportant*&quot;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !&quot;Official/Backups*&quot;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; !&quot;Promotional*&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Sync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; All&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-non-urgent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Master&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-remote:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Slave&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-local:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Patterns&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;Unimportant*&quot;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;Official/Backups*&quot;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;Promotional*&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Sync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; All&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-archived&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Master&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-remote:Archived&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Slave&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-local:archived&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Sync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; All&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Master&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-remote:Sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Slave&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-local:sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Sync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; All&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-drafts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Master&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-remote:Drafts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Slave&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-local:drafts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Sync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; All&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-trash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Master&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-remote:Trash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Slave&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; :posteo-local:trash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Sync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; All&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Groups&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Group&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Group&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; sorted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-sorted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Group&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; full-without-inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-non-urgent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-drafts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-sent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-trash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;Channel&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; posteo-archived&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;crontab&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Run every 2 minutes, starting from 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;0/2&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/sync.sh imapfilter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Run every 2 minutes, starting from 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;1/2&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/sync.sh isync inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Run every 7 minutes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;*/7&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/sync.sh isync sorted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# Run every 15 minutes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;*/15&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/sync.sh isync full-without-inbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;sync.sh&lt;/code&gt;:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5BDE6;font-style:italic&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; [[&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt;$1&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;isync&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; ]];&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  mbsync&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --config&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/.mbsyncrc&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt; $2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;elif&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; [[&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt;$1&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;imapfilter&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; ]];&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;  export&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; IMAPFILTER_HOME&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;/workdir/.imapfilter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  imapfilter&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /workdir/.imapfilter/config.lua&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Our Docker setup should now look something like this:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; mail-imapfilter&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/confs/crontab&quot;,target=/etc/crontab,readonly&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/confs/imapfilter&quot;,target=/workdir/.imapfilter,readonly&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/confs/mbsyncrc&quot;,target=/workdir/.mbsyncrc,readonly&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/email/storage&quot;,target=/workdir/data&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  cybolic/imapfilter-isync:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;part-3-get-notmuch-back-but-not-locally&quot;&gt;Part 3: Get Notmuch back, but not locally&lt;/h3&gt;&lt;p&gt;Even though I&#39;m no longer using Notmuch to sort my email, that doesn&#39;t mean it&#39;s not still a great program for very quickly searching one&#39;s email. Since Notmuch reads through all the email files, it&#39;s not really something you&#39;d want reading the files over a networked connection to your NAS. Instead, it&#39;s much faster to run an instance of Notmuch on your NAS, let that create it&#39;s database and then let your local Notmuch instance just use that database.&lt;/p&gt;&lt;p&gt;For that, I&#39;ve created another Docker image, &lt;code&gt;cybolic/notmuch&lt;/code&gt;. Just like the previous one, it uses Supercronic, so you can set it up to run Notmuch every 30 minutes or so, depending on how fresh you want your search results.&lt;/p&gt;&lt;p&gt;Dockerfile:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --name&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; mail-imapfilter&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/confs/crontab&quot;,target=/etc/crontab,readonly&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/confs/notmuch&quot;,target=/workdir/notmuch-config,readonly&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  --mount&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; type=bind,source=&quot;/path/to/your/email/storage&quot;,target=/workdir/data&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;  cybolic/notmuch:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;crontab:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# 15 and 45 past&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;15/30&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; notmuch new&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;notmuch-config:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;database&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;/workdir/data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;user&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;Christian Dannie Storgaard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;primary_email&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;address@host.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;other_email&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;semicolon@separated.com&lt;/span&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;;list@of.com;other@addresses.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;new&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;ignore&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;/[.]*.(off|old|bak)$/&lt;/span&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;;/[.]*.json$/;.lock;/.*[.]mbsyncstate.*$/;.uidvalidity&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;search&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;exclude_tags&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;deleted&lt;/span&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;;spam;trash;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;maildir&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;synchronize_flags&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;headers.List&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;List-Id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Everything will just work as long as your local Notmuch config file&#39;s &lt;code&gt;path&lt;/code&gt; variable points to the same files as your NAS instance uses. My email storage is mounted using NFS, so is set to &lt;code&gt;/mnt/nas-mail&lt;/code&gt; in the local Notmuch config.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;That&#39;s it!&lt;/strong&gt; Your email is now sorted, backed up, searchable and available from your NAS.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Installing Arch for my use</title>
    <link>https://staging.cybolic.me/posts/installing-arch-for-my-use</link>
    <pubDate>Wed, 06 Apr 2022 22:09:50 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/installing-arch-for-my-use</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Tech</category>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/tech.jpg" />
    <description>&lt;h2 id=&quot;or-how-i-learned-to-re-install-without-thinking&quot;&gt;...or, how I learned to re-install without thinking&lt;/h2&gt;&lt;p&gt;I recently wanted to re-install my Arch Linux setup due to a couple of hard-to-debug issues that had cropped up after switching from NVIDIA to AMD for my GPU. What I really didn&#39;t want, however, was to spend hours getting back to the setup I had previously, so this time, I dove into the new official installer, &lt;a href=&quot;https://python-archinstall.readthedocs.io/&quot;&gt;arch-install&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Now, the &lt;code&gt;arch-install&lt;/code&gt; part of this whole thing is actually pretty simple. &lt;code&gt;arch-install&lt;/code&gt; lets you set up configuration files from within your existing installation, so you don&#39;t have to make hard choices while you&#39;re in the bare environment of the installer image.&lt;/p&gt;&lt;p&gt;To do this, install &lt;code&gt;arch-install&lt;/code&gt; using your prefered method - the package name is &lt;code&gt;archinstall&lt;/code&gt; - and then just run the following and go through the options:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; archinstall&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --dry-run&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&#39;ll end up with three configuration files that you can edit to your preference and put on a separate partition of your install media (e.g. USB stick) to pass to &lt;code&gt;arch-install&lt;/code&gt; when you&#39;re ready to install. This takes care of the basics of partitioning your drive, installing a bootloader, setting up your network, sound and graphics drivers, and installing the base packages for your choice of system (minimal Xorg, KDE, Gnome, etc.).&lt;/p&gt;&lt;p&gt;For my use, I let &lt;code&gt;arch-install&lt;/code&gt; pick its default partition layout and then tweaked the file afterwards so it didn&#39;t use the entirety of my 1TB NVMe drive for the root system.&lt;/p&gt;&lt;p&gt;What follows is the general setup of the system. This will vary based on what you need for your system, but for me, it boils down to the following list, which I&#39;ve created scripts for:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall/tree/main/item/setup-system.sh&quot;&gt;setup-system.sh&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Update the pipewire install to use wireplumber (not needed on &lt;code&gt;archinstall&lt;/code&gt; &amp;gt; 2.3.2)&lt;/li&gt;&lt;li&gt;Set up sudo for my user (&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall/tree/main/item/config/sudoers.example&quot;&gt;example config file in repo&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Add my NAS to &lt;code&gt;/etc/hosts&lt;/code&gt; (&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall/tree/main/item/config/hosts.example&quot;&gt;example config file in repo&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Add my NAS mounts to &lt;code&gt;/etc/fstab&lt;/code&gt; (&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall/tree/main/item/config/fstab.example&quot;&gt;example config file in repo&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall/tree/main/item/setup-amdgpu.sh&quot;&gt;setup-amdgpu.sh&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Add the Vulkan packages for my AMD GPU&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall/tree/main/item/setup-ecryptfs.sh&quot;&gt;setup-ecryptfs.sh&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Set up an encrypted directory in my home directory&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall/tree/main/item/setup-packages.sh&quot;&gt;setup-packages.sh&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Install the &lt;code&gt;paru&lt;/code&gt; pacman helper and various packages I use&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you need any of the above functionality, feel free to take a look at these scripts (&lt;a href=&quot;https://git.sr.ht/~cybolic/ArchInstall&quot;&gt;the full repo is here&lt;/a&gt;) and adapt them how you see fit. For me - together with &lt;a href=&quot;https://git.sr.ht/~cybolic/Dotfiles&quot;&gt;my stow setup&lt;/a&gt; for configuration files - all this means I can have a working re-install, with no need to think or remember commands, set up in no time.&lt;/p&gt;&lt;p&gt;With the repo - plus my config files - on a flash drive, a re-install is just:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ED8796;font-style:italic&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /run/media/&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/flash_drive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;./install.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;./setup.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; If you want to quickly get a list of the packages you&#39;ve manually installed on your own system, here&#39;s a convoluted one-liner for just that:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;pacman&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -Qi&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -ett&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -E&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;^(Name|Description)&#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; sed&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;:a;N;$!ba;s/&#92;nDescription *: / # /g;s/Name *: //g&#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; column&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;#&#39;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;#&#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -vE&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;^(&#39;&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;pacman&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; -Qq -g base -g base-devel &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;2&gt;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/dev/null &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; sed&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;:a;N;$!ba;s/&#92;n/ |/g&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&#39;)&#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; sort&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
  </item>
  <item>
    <title>Kitty with Nerd Font icons thanks to Nix</title>
    <link>https://staging.cybolic.me/posts/kitty-with-nerd-font-icons-thanks-to-nix</link>
    <pubDate>Mon, 14 Jul 2025 04:10:54 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/kitty-with-nerd-font-icons-thanks-to-nix</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Tech</category>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/tech.jpg" />
    <description>&lt;p&gt;Kitty has a nice way of showing Nerd Font characters, even if your current font hasn&#39;t been patched with them. Normally though, the recommended way of setting this up, is to go to &lt;a href=&quot;https://github.com/ryanoasis/nerd-fonts/wiki/Glyph-Sets-and-Code-Points&quot;&gt;the Nerd Fonts wiki&lt;/a&gt;, copy one column from the table of codepoints at the bottom of the page and then adjust the formatting to fit Kitty&#39;s options for the &lt;a href=&quot;https://sw.kovidgoyal.net/kitty/faq/#kitty-is-not-able-to-use-my-favorite-font&quot;&gt;symbol_map configuration option&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Now, you have to remember to do this every time Nerd Fonts updates this table, which isn&#39;t really announced, so you&#39;ll just have to check manually once in a while. Honestly, this isn&#39;t ideal and after doing it again recently, I thought this shouldn&#39;t really be necessary at all; I&#39;m running NixOS - surely there must be a way for this to be auto-generated?&lt;/p&gt;&lt;p&gt;My first thought was to parse the wiki page from within my Nix config, but considering that Nix is very much a functional language, the codepoints really should come from the &lt;em&gt;input&lt;/em&gt;, not an external source that may be out of date (as the git log shows that the wiki has occasionally been). Instead, what if we could get the list of codepoints from the font file itself, format it to fit what Kitty expects and have it be a part of our configuration build?&lt;/p&gt;&lt;p&gt;Luckily, &lt;code&gt;nixpkgs&lt;/code&gt; already contains a build of Nerd Fonts that only includes the symbols, so we have everything we need ready to go and &lt;code&gt;fontconfig&lt;/code&gt; provides tools that can extract the codepoints.&lt;/p&gt;&lt;p&gt;So, with all the preamble out of the way, I present a Nerd Font configuration for Kitty that will always stay in sync with the version of Nerd Font that&#39;s actually installed:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;  programs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;kitty = &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;    extraConfig&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; let&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;      fontFile&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;nerd-fonts&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;symbols-only&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/share/fonts/truetype/NerdFonts/Symbols/SymbolsNerdFontMono-Regular.ttf&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;      codepoints&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ED8796&quot;&gt; builtins&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;readFile &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;runCommandLocal &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;get-nerdfont-codepoints&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;        ${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;fontconfig&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/bin/fc-query --format=&#39;%{charset}&#39; &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;fontFile&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;        | &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;gnused&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/bin/sed &#39;s/&#92;b&#92;([0-9a-f]&#92;+&#92;)&#92;b/U+&#92;U&#92;1/g&#39; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;        | &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;coreutils&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/bin/tr &#39; &#39; &#39;,&#39; &#92;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;        &gt; $out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;      &#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;      fontName&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#ED8796&quot;&gt; builtins&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;readFile &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;runCommandLocal &lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;get-nerdfont-name&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;        ${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;fontconfig&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/bin/fc-query --format=&#39;%{fullname}&#39; &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;fontFile&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &gt; $out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;      &#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;    in&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;      # Use additional nerd symbols&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;      # https://sw.kovidgoyal.net/kitty/faq/#kitty-is-not-able-to-use-my-favorite-font&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;      symbol_map &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;codepoints&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; ${&lt;/span&gt;&lt;span style=&quot;color:#B7BDF8&quot;&gt;fontName&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;    &#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;  home&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;packages&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; pkgs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;nerd-fonts&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;symbols-only &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Another lovely example of Nix allowing me to stop worrying about yet another thing.&lt;/p&gt;&lt;p&gt;NOTE: I know this blog hasn&#39;t been updated in a while, and the last post mentions Arch Linux, but in the meantime Nix has slowly but surely taken over most of my tech, and it&#39;s been &lt;em&gt;lovely&lt;/em&gt;.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Rebuilding my site with Eleventy</title>
    <link>https://staging.cybolic.me/posts/rebuilding-my-site-with-eleventy</link>
    <pubDate>Tue, 29 Jul 2025 16:16:50 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/rebuilding-my-site-with-eleventy</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Tech</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/internet.jpg" />
    <description>&lt;h2 id=&quot;preamble-or-third-timess-the-charm&quot;&gt;Preamble or Third times&#39;s the charm?&lt;/h2&gt;&lt;p&gt;The original version of this site was based on Markdown files that were processed through &lt;a href=&quot;https://gulpjs.com/&quot;&gt;Gulp&lt;/a&gt; and placed inside &lt;a href=&quot;https://github.com/dscape/jade&quot;&gt;Jade&lt;/a&gt; templates, with &lt;a href=&quot;https://sass-lang.com/&quot;&gt;SASS&lt;/a&gt; used for the CSS.&lt;/p&gt;&lt;p&gt;The first rewrite was — purely to appease recruiters who kept asking to &lt;em&gt;see&lt;/em&gt; React projects — based on React by way of &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;, &lt;a href=&quot;https://graphql.org/&quot;&gt;GraphQL&lt;/a&gt; through &lt;a href=&quot;https://www.apollographql.com/&quot;&gt;Apollo&lt;/a&gt;, and &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind&lt;/a&gt; for the CSS. The blog posts were still Markdown, but this time served through the local GraphQL server (which is a hugely overengineered way of doing it for a site of this size).&lt;/p&gt;&lt;p&gt;Now a couple of years later, after hearing time and time again from recruiters that they didn&#39;t actually check my site, I&#39;ve decided to go back to a nice statically built site, as there really is little technical reason for the overengineering of the previous version.&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-outline/note&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-outline/note&quot;&gt;&lt;/use&gt;&lt;/svg&gt;Tip of the iceberg&lt;/p&gt;&lt;p&gt;Only three versions of this site have ever been public:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://old-web.cybolic.me&quot;&gt;the no libraries, no JS, Gulp pipeline version&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://react-web.cybolic.me&quot;&gt;the previous Next.js/GraphQL/React version&lt;/a&gt;&lt;/li&gt;&lt;li&gt;this new Eleventy version&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;But over the years, I&#39;ve actually rebuilt it with Chyrp, &lt;a href=&quot;https://github.com/srid/Feather&quot;&gt;Feather&lt;/a&gt;, &lt;a href=&quot;http://roots.cx&quot;&gt;roots&lt;/a&gt;, &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;, and even WordPress, just to see if the grass was greener elsewhere.&lt;/p&gt;&lt;/div&gt;&lt;h2 id=&quot;eleventy&quot;&gt;Eleventy&lt;/h2&gt;&lt;p&gt;After deciding to rebuild the site once again, I started looking at the available static site generators (I could have re-used Gulp, but discovering new projects and workflows is part of the fun!). I tried sketching out the basic functionality needed in a couple different generators, including &lt;a href=&quot;https://github.com/rochacbruno/marmite&quot;&gt;Marmite&lt;/a&gt;, &lt;a href=&quot;https://dalgona.github.io/Serum/&quot;&gt;Serum&lt;/a&gt; and even a fully Nix flake based approach, but what I really wanted was a solid foundation with a structure that allowed extending the build process without having to resort to hacks or building &amp;quot;outside&amp;quot; the generator&#39;s intended workflow. The one I found that best suited these goals, was &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Eleventy is pretty simple to set up, and it allows plugging in new functionality, both at various steps of its build-process, but also — in a wonderfully granular approach — through its lovely &lt;a href=&quot;https://www.11ty.dev/docs/data-cascade/&quot;&gt;data-cascade structure&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This means that the data used on pages can come, not just from the Markdown frontmatter, but also from various data files, that can be standard static YAML but also have the option to use actual logic through JavaScript. Through this, I don&#39;t have to extend any root part of the build system to supplement the basic data in the blog posts, I can just add an extra file that provides this exact data, or, if it&#39;s short enough, even just add that data (or computation!) to the frontmatter itself!&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-note&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-outline/note&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-outline/note&quot;&gt;&lt;/use&gt;&lt;/svg&gt;Eleventy Data Cascade Example&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;blog-post.md&lt;/code&gt; can have static data in its frontmatter YAML (or use dynamic data through &lt;a href=&quot;https://www.11ty.dev/docs/data-frontmatter/#java-script-front-matter&quot;&gt;JS frontmatter&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;code&gt;blog-post.11ty.js&lt;/code&gt; can extend it with dynamic data in JavaScript&lt;/li&gt;&lt;li&gt;&lt;code&gt;posts/posts.11ty.js&lt;/code&gt; can extend &lt;em&gt;all&lt;/em&gt; blog posts with dynamic data in JavaScript&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2 id=&quot;tailwind-css&quot;&gt;Tailwind CSS&lt;/h2&gt;&lt;p&gt;Tailwind is a CSS framework that basically moves CSS rules from separate CSS files into short, descriptive class names that can be used directly in HTML, which will then be detected, optimised and re-used as well as possible in the final generated CSS output. It can be quite convenient for a component based site, as the style of each component is clearly linked to its HTML markup and the need to consider class names is practically non-existent.&lt;/p&gt;&lt;h3 id=&quot;built-for-spa&quot;&gt;Built for SPA&lt;/h3&gt;&lt;p&gt;However, Tailwind is primarily designed to be used in single-page applications. Yes, it will do its best to de-duplicate CSS selector rules and properties, but it has evolved to practically have no concept of using multiple CSS files, and any inlining of CSS is left to the framework it&#39;s used in. While you &lt;em&gt;can&lt;/em&gt; make Tailwind build multiple CSS files, each of them will contain &lt;em&gt;every&lt;/em&gt; rule it has found for the page(s) you have pointed it at, as well as Tailwind&#39;s own initialisation and reset rules, meaning you&#39;re missing out on any de-duplication benefit you might have otherwise gotten.&lt;/p&gt;&lt;p&gt;If you&#39;re not using a framework to get Tailwind&#39;s output into a better shape, what you get is honestly not very performant for anything with more than one page.&lt;/p&gt;&lt;h3 id=&quot;teaching-a-new-dog-old-tricks-critical-above-the-fold-css&quot;&gt;Teaching a new dog old tricks (critical / above-the-fold CSS)&lt;/h3&gt;&lt;p&gt;The main idea behind &amp;quot;critical&amp;quot; or &amp;quot;above the fold&amp;quot; CSS, is basically to ensure that the browser has enough of the styles used on a page, to display the initially viewable content as fast as possible. Usually this means including this minimal CSS directly in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of the page, but for this rewrite that&#39;s not what I ended up doing.&lt;/p&gt;&lt;p&gt;See, Tailwind makes it somewhat difficult to separate &lt;em&gt;what&lt;/em&gt; a specific styling rule is used for in the CSS it outputs, so figuring out which are necessary for the initial page-load is usually done by loading the page into a headless browser and reading out the rules that are currently visible. However, for this site, that would still mean a rather large amount of CSS, which would also change for each page, meaning each and every page would be larger than it needs to be, and no CSS would be shared between the pages. While this is in line with Tailwind&#39;s approach, I decided on a different method.&lt;/p&gt;&lt;h4 id=&quot;split-up-tailwinds-output&quot;&gt;Split up Tailwind&#39;s output&lt;/h4&gt;&lt;p&gt;The first step is to actually create seperate css files instead of using one big one, but with that we also have to disable Tailwind&#39;s automatic source detection system (for fun, try counting the amount of issues surrounding it on the project&#39;s GitHub) and instead define the sources per page, since otherwise, each CSS file would detect every class on every page.&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-code&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-outline/code&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-outline/code&quot;&gt;&lt;/use&gt;&lt;/svg&gt;Individual Tailwind sources for each page&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;details&gt;&lt;summary&gt;main.css&lt;/summary&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;/* the `source(none)` tells Tailwind not to automatically look for source files */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;@import&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;tailwindcss&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; source&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;/* instead it should only look in these paths (relative to the input CSS file) */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;@source&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; &quot;../../../_site/blog/index.html&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;@source&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; &quot;../../../_site/tag/&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;@source&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; &quot;../../../_site/category&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;&lt;details&gt;&lt;summary&gt;blog-post.css&lt;/summary&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;@import&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;tailwindcss&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; source&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;/* let Tailwind refer to classes and theme values defined in main.css */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;@reference&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; &quot;./main.css&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;/* and only look for classes in this directory */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;@source&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; &quot;../../../_site/posts&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;&lt;/div&gt;&lt;p&gt;Next, what I needed was a representative CSS file for the site, that could be used as a kind of source-of-truth I could then use to cut down the rest of the files.&lt;/p&gt;&lt;p&gt;Here&#39;s the build process I decided on for this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Use the CSS of the blog overview page as the starting point (&lt;code&gt;main.css&lt;/code&gt;), as it contains few extra rules outside of the grid display.&lt;/li&gt;&lt;li&gt;Remove any rules in other CSS files that are already defined in &lt;code&gt;main.css&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now, I &lt;em&gt;could&lt;/em&gt; use the resulting &lt;code&gt;main.css&lt;/code&gt; directly in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of each page, but that wouldn&#39;t utilise the browser&#39;s cache, and since those base rules are unlikely to change between pages, why make every page larger than it needed to be?&lt;/p&gt;&lt;p&gt;Instead, the &lt;code&gt;main.css&lt;/code&gt; file is loaded on every page (but will be cached by the browser) and every other page then loads their unique CSS file &lt;em&gt;as well&lt;/em&gt;. Sure, it&#39;s an extra request, but in testing, this doesn&#39;t actually show any real slowdown.&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-code&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-outline/code&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-outline/code&quot;&gt;&lt;/use&gt;&lt;/svg&gt;The code for the `postcssRemoveExistingClasses` plugin that generates `main.css` and filters the other files&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;details&gt;&lt;summary&gt;postcss-remove-existing-classes.js&lt;/summary&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; fs &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;node:fs&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; path &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &quot;node:path&quot;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; postcss &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;postcss&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; DEBUG &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; process&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;DEBUG&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;true&#39;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; process&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;DEBUG&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;1&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;// the arguments here are the `main.css` output file path, followed by its input file path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt;criticalCSSPath&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt; criticalCSSInputPath&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    postcssPlugin&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;remove-existing-classes&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;    Once&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;      // abort if current file is criticalCSSPath (i.e. don&#39;t filter main.css from main.css)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; absoluteCriticalCSSPath &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;resolve&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EE99A0&quot;&gt;criticalCSSInputPath&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;      if&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; (root&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;file &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;color:#EE99A0&quot;&gt; absoluteCriticalCSSPath&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;      DEBUG &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; console&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;`Removing classes from &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; that exist in &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#EE99A0&quot;&gt;criticalCSSPath&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; criticalCSS &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;readFileSync&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EE99A0&quot;&gt;criticalCSSPath&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;utf8&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; criticalAST &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; postcss&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EE99A0&quot;&gt;criticalCSS&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;      const&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; criticalSelectors &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6;font-weight:bold&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt; Set&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;      criticalAST&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;walkRules&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt;rule&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        criticalSelectors&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(rule&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;selector)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;      }&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;      root&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;walkRules&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#EE99A0;font-style:italic&quot;&gt;rule&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; (criticalSelectors&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;has&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(rule&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;selector)) &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;          DEBUG &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; console&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;&#92;t&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;Removing duplicate rule: &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;rule&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;selector&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;          rule&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;      }&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;&lt;/div&gt;&lt;h3 id=&quot;optimising-the-css-loading-further&quot;&gt;Optimising the CSS loading further&lt;/h3&gt;&lt;p&gt;Since we have access to an actual build system now, instead of relying on the automatic behaviour of Tailwind&#39;s Vite plugin, we can add on yet another trick. We&#39;re trying to get the &lt;em&gt;inital&lt;/em&gt; display of the page up as fast as possible, so we can filter out all styling rules that target interactive behaviour! On this site, that&#39;s mostly the navigation drawers on the side and the tech icons (but one could extend it to &lt;code&gt;:hover&lt;/code&gt; classes and the likes), so let&#39;s add another step to our build process:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Take all rules that only affect interactive components (the navigation drawers, the tech icons on &amp;quot;Previous Projects&amp;quot;, email obfuscation clean-up), split those into &lt;code&gt;.async.css&lt;/code&gt; files and load them after the initial page load.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To do this, I&#39;m (mis-)using the PostCSS plugin &lt;a href=&quot;https://github.com/mrnocreativity/postcss-critical-split&quot;&gt;postcss-critical-split&lt;/a&gt;. This plugin is actually intended to extract the &lt;em&gt;critical&lt;/em&gt; CSS, but I&#39;m instead using it to extract the &lt;em&gt;non-critical&lt;/em&gt; parts (since we already handled the critical parts above).&lt;/p&gt;&lt;p&gt;To define which rules this plugin should operate on, we need to add comments to the built CSS. Luckily, there&#39;s another plugin built precisely for this purpose, &lt;a href=&quot;https://github.com/elchininet/postcss-comments/tree/master&quot;&gt;postcss-comments&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Together, these two plugins first surround the matching rules with comments and then split these parts off into a separate &lt;code&gt;.async.css&lt;/code&gt; file, which is then loaded asynchronously on the page.&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-code&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-outline/code&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-outline/code&quot;&gt;&lt;/use&gt;&lt;/svg&gt;Our full PostCSS build configuration&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;details&gt;&lt;summary&gt;postcss-build.js (partial)&lt;/summary&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;postcss&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  // Use Tailwind to compile the initial CSS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  postcssTailwind&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    base&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;src/assets/css&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    optimize&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;      minify&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; process&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;ELEVENTY_RUN_MODE&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;build&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  // Add markers around the &quot;interactive&quot; rules so we can split them later&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  postcssComments&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    rulesMatchers&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        matcher&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;/&#92;.&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;pagefind&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        prepend&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;critical:start:pagefind&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        append&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;critical:end&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        matcher&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;          /&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;#tabs-activator-links-&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;          /&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;(#&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;&#92;.&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;peer&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;)drawer-(left&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;right)&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;          /&#92;.&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;email-filter &lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;          /&#92;.&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;(group-target-tech&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;tech-list)&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;:hover&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        ]&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        prepend&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;critical:start:interactive&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        append&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;critical:end&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  // Now split these interactive rules into a separate `.async.css` file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  postcssCriticalSplit&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;    // bundleName is the current file, e.g. `main`, `main.async`, `page-about`, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    output&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt; /&#92;.&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(bundleName) &lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;        postcssCriticalSplit&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;output_types&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;CRITICAL_CSS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;      :&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; postcssCriticalSplit&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;output_types&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#F5A97F&quot;&gt;REST_CSS&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;    modules&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;pagefind&#39;&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;interactive&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;  // Remove any classes that are defined in `main.css` from other files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;  postcssRemoveExistingClasses&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;outputDir&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/main.css`&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; `&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;/main.css`&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;&lt;/div&gt;&lt;p&gt;Now that we have our &lt;code&gt;.async.css&lt;/code&gt; files, let&#39;s make sure they only load &lt;em&gt;after&lt;/em&gt; the initial page load:&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-code&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-outline/code&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-outline/code&quot;&gt;&lt;/use&gt;&lt;/svg&gt;Load our CSS file asynchronously in the HTML&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;details&gt;&lt;summary&gt;page.html (partial)&lt;/summary&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;link&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;  rel&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;preload&quot;&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;/assets/css/page-name.async.css&quot;&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;style&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#EED49F&quot;&gt;  onload&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#ED8796&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;onload&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#ED8796&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;rel&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&#39;stylesheet&#39;&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;noscript&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;link&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt;&lt;span style=&quot;color:#EED49F&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt;&quot;/assets/css/page-name.async.css&quot;&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;noscript&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;small&gt;Note: it would be nice if the &lt;code&gt;defer&lt;/code&gt; or &lt;code&gt;async&lt;/code&gt; attributes from the &lt;code&gt;script&lt;/code&gt; tag existed on &lt;code&gt;link&lt;/code&gt; as well, so the &lt;code&gt;onload&lt;/code&gt; trick wouldn&#39;t be necessary, but alas, this is what we have for now.&lt;/small&gt;&lt;/details&gt;&lt;/div&gt;&lt;h3 id=&quot;before-and-after&quot;&gt;Before and After&lt;/h3&gt;&lt;p&gt;Let&#39;s take a look — using Chromium&#39;s Lighthouse testing — at how the previous Next.js / React / Tailwind version compares to our new handcrafted build process on a typical blog page:&lt;/p&gt;&lt;table aria-label=&quot;Test results for the old version&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Next.js / Tailwind Metric&lt;/th&gt;&lt;th style=&quot;text-align:right&quot;&gt;Result&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;First Contentful Paint&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0.5 s&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Largest Contentful Paint&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;1.3 s&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Total Blocking Time&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;90 ms&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cumulative Layout Shift&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0.136&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Speed Index&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0.8 s&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;vs the following for our new build solution that directly uses PostCSS:&lt;/p&gt;&lt;table aria-label=&quot;Test results for the new version&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;PostCSS / Tailwind Metric&lt;/th&gt;&lt;th style=&quot;text-align:right&quot;&gt;Result&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;First Contentful Paint&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0.4 s&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Largest Contentful Paint&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0.4 s&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Total Blocking Time&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0 ms&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cumulative Layout Shift&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0.001&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Speed Index&lt;/td&gt;&lt;td style=&quot;text-align:right&quot;&gt;&lt;code&gt;0.4 s&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;That&#39;s scraping off almost an entire second for LCP, a whole lot less layout shifting and &lt;em&gt;half the time&lt;/em&gt; for the general speed index (how quickly the page is generally displayed). Of course, we have to take into account that the Next.js version also has to load React and is hosted on Vercel, while the Eleventy version is running on Apache, so it&#39;s not &lt;em&gt;quite&lt;/em&gt; apples to apples, but still nice numbers to see!&lt;/p&gt;&lt;h2 id=&quot;permalinks&quot;&gt;Permalinks&lt;/h2&gt;&lt;p&gt;The first version of this site had my post URIs organised by a year/month/title scheme, but during my last rewrite I decided to cut the unnecessary parts and keep my URIs focused on better readability for humans.&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-info&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-filled/info-circle&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-filled/info-circle&quot;&gt;&lt;/use&gt;&lt;/svg&gt;My post URIs before and after&lt;/p&gt;&lt;p&gt;From this: &lt;code&gt;/2025/07/the-posts-title&lt;/code&gt;&lt;br&gt;To this: &lt;code&gt;/posts/the-post-s-title&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;However, due to the low amount of traffic I get, I didn&#39;t prioritise (and never got around to) implementing redirects to the new URI scheme (which I could have done using &lt;a href=&quot;https://nextjs.org/docs/pages/guides/redirecting&quot;&gt;Next.js&#39;s redirect configuration&lt;/a&gt;). I&#39;ve kinda felt bad about not having &lt;a href=&quot;https://www.w3.org/Provider/Style/URI&quot;&gt;cool URIs [that] don&#39;t change&lt;/a&gt; since then, so I made sure to have it this time.&lt;/p&gt;&lt;p&gt;This is another case where the data-cascade comes in handy. I could have just added the aliases to each blog post and use them directly, but I chose to use a &lt;a href=&quot;https://www.11ty.dev/docs/data-template-dir/&quot;&gt;directory data file&lt;/a&gt; in the directory of my blog posts, which computes the URI each post would have had on the original site which is then stored as an &lt;code&gt;aliases&lt;/code&gt; array in the data of that post. Those aliases (as well as any others that have manually been set in the frontmatter, like I do for &lt;code&gt;/previous-projects&lt;/code&gt;, which used to be &lt;code&gt;/previous-work&lt;/code&gt;) are then collected using &lt;a href=&quot;https://www.11ty.dev/docs/collections-api/&quot;&gt;Eleventy&#39;s CollectionAPI&lt;/a&gt; and used in a template that writes them out as redirect rules in a hypertext access file.&lt;/p&gt;&lt;div class=&quot;markdown-alert markdown-alert-info&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-filled/info-circle&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-filled/info-circle&quot;&gt;&lt;/use&gt;&lt;/svg&gt;This is how easy it now is to create a .htaccess redirect&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; Previous Projects&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;permalink&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /previous-projects/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4&quot;&gt;aliases&lt;/span&gt;&lt;span style=&quot;color:#8BD5CA&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; /previous-work/index.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F5BDE6&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;markdown-alert markdown-alert-code&quot;&gt;&lt;p class=&quot;markdown-alert-title&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;h-4 mr-2 icon icon-outline/code&quot; role=&quot;img&quot; fill=&quot;currentColor&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;use href=&quot;#icon-outline/code&quot;&gt;&lt;/use&gt;&lt;/svg&gt;Here&#39;s how this is handled in the htaccess template&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;details&gt;&lt;summary&gt;htaccess.njk (partial)&lt;/summary&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;permalink: /.htacccess&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;eleventyExcludeFromCollections: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;{% &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; alias &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; collections&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;aliases %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;# {{ alias&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;title &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; safe }}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;RewriteRule ^{{ alias&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;from &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; safe }}/(.*)$ {{ alias&lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;to &lt;/span&gt;&lt;span style=&quot;color:#939AB7&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; safe }} [R=301,NC,L]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt;{% &lt;/span&gt;&lt;span style=&quot;color:#C6A0F6&quot;&gt;endfor&lt;/span&gt;&lt;span style=&quot;color:#CAD3F5&quot;&gt; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;&lt;/div&gt;&lt;h2 id=&quot;further-thoughts-and-gotchas&quot;&gt;Further Thoughts and Gotchas&lt;/h2&gt;&lt;p&gt;While my current setup with Eleventy and Tailwind works pretty well, there are certainly areas of the development workflow where the different ways the two frameworks handle their build process don&#39;t quite mesh; most notably:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Chicken and Egg / The Dependency Graph&lt;/strong&gt;: Eleventy favours having assets ready during the build, while Tailwind requires pages to already be built in order to detect class-names.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cache busting&lt;/strong&gt;: Similarly, to generate the unique revision string commonly used for cache busting, Eleventy must be able to read the generated CSS file while it&#39;s generating the output HTML, tying back into the first point.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;My current solution for when to build the CSS, is to simply wait for Eleventy to finish generating its output before running Tailwind. I&#39;ve done this using &lt;a href=&quot;https://www.11ty.dev/docs/events/#eleventy-after&quot;&gt;Eleventy&#39;s &lt;code&gt;after&lt;/code&gt; event&lt;/a&gt;. There are more options available, such as using a &lt;a href=&quot;https://www.11ty.dev/docs/languages/javascript/&quot;&gt;JavaScript template&lt;/a&gt; in the CSS directory to build each CSS file when it&#39;s requested, but it&#39;s easy to run into dependency and synchronisation issues doing things this way, as, again, Tailwind needs to be able to read all the HTML files you&#39;ve pointed it at and they might not all be available when a specific CSS file is requested.&lt;/p&gt;&lt;p&gt;For cache busting, since the output CSS doesn&#39;t exist when the HTML is being generated, I have taken a slightly unusual approach and added a filter that generates a hash of &lt;em&gt;all the input CSS files&lt;/em&gt; in the directory of the requested file. This way, when adding a CSS resource like this: &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;{{ &amp;quot;/assets/css/page-about.css&amp;quot; |&amp;gt; await withDirRevHash }}&amp;quot; /&amp;gt;&lt;/code&gt; , the resulting URI (with a simple &lt;code&gt;?rev=hash&lt;/code&gt; appended to it) won&#39;t have a unique hash for &lt;em&gt;that&lt;/em&gt; file, but the hash &lt;em&gt;will&lt;/em&gt; match the current &amp;quot;collection&amp;quot; of CSS code.&lt;/p&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;p&gt;All-in-all, I&#39;ve now got a site with the exact same functionality as before, without any JavaScript dependencies, no need to keep a server process running, an easier way to add any additional data or markup (like the alert boxes on display in this very post) and all that with roughly twice the page-load performance.&lt;/p&gt;&lt;p&gt;Now, some of these optimisations could also have been achieved with Next.js (the PostCSS build system &lt;em&gt;is&lt;/em&gt; still an option there), but unlike with Eleventy — where everyone is expected to pick their preferred solution — the world of Tailwind on Next.js is very much in the philosophy of &amp;quot;just don&#39;t think about it, it&#39;s all plug&#39;n&#39;play&amp;quot;. I don&#39;t know about you, but I quite like that the framework I use encourages thinking about how each piece of the project is implemented.&lt;/p&gt;</description>
  </item>
  <item>
    <title>mpd control by way of rofi</title>
    <link>https://staging.cybolic.me/posts/mpd-control-by-way-of-rofi</link>
    <pubDate>Fri, 19 Sep 2025 00:36:15 GMT</pubDate>
    <guid>https://staging.cybolic.me/posts/mpd-control-by-way-of-rofi</guid>
    <dc:creator>Christian Dannie Storgaard</dc:creator>
    <category>Linux</category>
    <media:thumbnail url="https://staging.cybolic.me/assets/images/thumbs/music.jpg" />
    <description>&lt;h2 id=&quot;first-off-whats-mpd&quot;&gt;First off, what&#39;s mpd?&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://mpd.readthedocs.io/en/latest/&quot;&gt;&lt;code&gt;mpd&lt;/code&gt;&lt;/a&gt; is a server application for playing music, which you can connect to using a &lt;a href=&quot;https://www.musicpd.org/clients/&quot;&gt;variety of clients&lt;/a&gt;. You can use it to have access to your music files from anywhere on your network (and beyond, of course, depending on your network setup), or to set up a local streaming server for smart speakers around your home, or use it as centralised source for playlists or scrobbling.&lt;/p&gt;&lt;p&gt;Generally, it allows you to decouple &lt;em&gt;what&lt;/em&gt; you do with your music from &lt;em&gt;where&lt;/em&gt; it&#39;s stored. Personally, I use it to have my music on my NAS and be able to easily play it from anywhere, using whichever client best fits the device I&#39;m using.&lt;/p&gt;&lt;p&gt;So, the minimum dependencies for using this little script are that you have an &lt;code&gt;mpd&lt;/code&gt; server running somewhere and the basic &lt;a href=&quot;https://www.musicpd.org/clients/mpc/&quot;&gt;&lt;code&gt;mpc&lt;/code&gt;&lt;/a&gt; CLI client installed (which is generally recommended). &lt;em&gt;Technically&lt;/em&gt;, you&#39;ll also need &lt;code&gt;awk&lt;/code&gt; installed, but I suspect you already do; and, of course, &lt;code&gt;rofi&lt;/code&gt; (or &lt;code&gt;wofi&lt;/code&gt; or whichever your preferred fork may be).&lt;/p&gt;&lt;h2 id=&quot;so-why-not-use-one-of-the-other-clients&quot;&gt;So, why not use one of the other clients?&lt;/h2&gt;&lt;p&gt;I actually do mostly use &lt;a href=&quot;https://mierak.github.io/rmpc/&quot;&gt;&lt;code&gt;rmpc&lt;/code&gt;&lt;/a&gt; when listening to music, as I often have a few favourite albums queued up, and having a playlist queue that I can jump around is convenient. However, its library navigation is a bit clunky and I don&#39;t always want to switch away from whatever I&#39;m doing, just to quickly start some music or throw on an album.&lt;/p&gt;&lt;p&gt;So, I thought: what if I could have something like &lt;code&gt;Telescope&lt;/code&gt; and &lt;code&gt;fzf&lt;/code&gt; in &lt;code&gt;Vim&lt;/code&gt;, but for my music - and preferably with a nice little interface? And also, shouldn&#39;t it be as quick and easy to play or add music to my playlist, as it is to find files?&lt;/p&gt;&lt;p&gt;I&#39;m already used to piping &lt;a href=&quot;https://github.com/ngirard/lolcate-rs&quot;&gt;lolcate&lt;/a&gt; into &lt;code&gt;rofi&lt;/code&gt; to quickly pull up files from my NAS, so why not do something similar for &lt;code&gt;mpd&lt;/code&gt;?&lt;/p&gt;&lt;h2 id=&quot;presenting-rofi-mpd-control&quot;&gt;Presenting: rofi-mpd-control&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://staging.cybolic.me/posts/Jwd9f39opi-456.avif 456w, https://staging.cybolic.me/posts/Jwd9f39opi-720.avif 720w, https://staging.cybolic.me/posts/Jwd9f39opi-1000.avif 1000w&quot; sizes=&quot;(max-width: 40em) 300px, (max-width: 64em) 600px, (max-width: 88em) 1200px, 2400px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://staging.cybolic.me/posts/Jwd9f39opi-456.webp 456w, https://staging.cybolic.me/posts/Jwd9f39opi-720.webp 720w, https://staging.cybolic.me/posts/Jwd9f39opi-1000.webp 1000w&quot; sizes=&quot;(max-width: 40em) 300px, (max-width: 64em) 600px, (max-width: 88em) 1200px, 2400px&quot;&gt;&lt;img data-pagefind-meta=&quot;image[src], image_alt[alt]&quot; src=&quot;https://staging.cybolic.me/posts/Jwd9f39opi-456.jpeg&quot; alt=&quot;the main rofi window&quot; title=&quot;The main &lt;code&gt;rofi&lt;/code&gt; window shown by
&lt;code&gt;rofi-mpd-control&lt;/code&gt;&quot; width=&quot;1000&quot; height=&quot;324&quot; srcset=&quot;https://staging.cybolic.me/posts/Jwd9f39opi-456.jpeg 456w, https://staging.cybolic.me/posts/Jwd9f39opi-720.jpeg 720w, https://staging.cybolic.me/posts/Jwd9f39opi-1000.jpeg 1000w&quot; sizes=&quot;(max-width: 40em) 300px, (max-width: 64em) 600px, (max-width: 88em) 1200px, 2400px&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;The main &lt;code&gt;rofi&lt;/code&gt; window shown by &lt;code&gt;rofi-mpd-control&lt;/code&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://git.sr.ht/~cybolic/nix-system/tree/main/item/packages/scripts/rofi/scripts/mpd-control.sh&quot;&gt;&lt;code&gt;rofi-mpd-control&lt;/code&gt;&lt;/a&gt; is basically just piping the output of &lt;code&gt;mpc&lt;/code&gt; into &lt;code&gt;rofi&lt;/code&gt; and a helper script to search the music library, with some nice parsing of &lt;code&gt;mpc&lt;/code&gt;&#39;s output to make it look nice in rofi.&lt;/p&gt;&lt;p&gt;The parsing of output is rather basic: we ask &lt;code&gt;mpc&lt;/code&gt; to output the current status information, each part deliminated by four tab-characters (an easily parsable deliminator that&#39;s also simple to debug and unlikely to appear naturally) and then ask &lt;code&gt;awk&lt;/code&gt; for each part.&lt;/p&gt;&lt;p&gt;Search and adding an album or track is a separate script that&#39;s called by &lt;code&gt;rofi-mpd-control&lt;/code&gt;, called &lt;a href=&quot;https://git.sr.ht/~cybolic/nix-system/tree/main/item/packages/scripts/rofi/scripts/mpd-search.sh&quot;&gt;&lt;code&gt;rofi-mpd-search&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/ceR7BmXLwo-456.jpeg&quot; /&gt;&lt;figcaption&gt;&lt;code&gt;rofi&lt;/code&gt; showing a search for an album&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://staging.cybolic.me/posts/HZBmyFe5VT-456.jpeg&quot; /&gt;&lt;figcaption&gt;&lt;code&gt;rofi&lt;/code&gt; showing a search for a track&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;You can find the code for it in &lt;a href=&quot;https://git.sr.ht/~cybolic/nix-system/tree/main/item/packages/scripts/rofi/scripts/mpd-control.sh&quot;&gt;my NixOS flake repo&lt;/a&gt;. In order to run it, you&#39;ll also need the following scripts:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://git.sr.ht/~cybolic/nix-system/tree/main/item/packages/scripts/rofi/scripts/mpd-search.sh&quot;&gt;rofi-mpd-search.sh&lt;/a&gt;: to find and add tracks and albums.&lt;br&gt;Depends on: &lt;code&gt;rofi&lt;/code&gt;, &lt;code&gt;mpc&lt;/code&gt; and &lt;code&gt;awk&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;rofi-themed&lt;/code&gt;: to launch rofi with the my preferred theme.&lt;br&gt;You can replace that with just &lt;code&gt;rofi&lt;/code&gt; without breaking anything.&lt;br&gt;My definition is just: &lt;code&gt;rofi -theme ${&lt;/code&gt;&lt;a href=&quot;https://github.com/newmanls/rofi-themes-collection&quot;&gt;&lt;code&gt;inputs.rofi-themes-newmanls&lt;/code&gt;&lt;/a&gt;&lt;code&gt;}/themes/rounded-purple-dark.rasi -theme-str &#39;* { bg3: #43069af2; }&#39; &amp;quot;$@&amp;quot;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Also worth noting is that the background cover image will be much faster to load, if you have &lt;a href=&quot;https://mierak.github.io/rmpc/&quot;&gt;rmpc&lt;/a&gt; installed, as the default mpc client is quite slow at fetching cover-art.&lt;/p&gt;&lt;h3 id=&quot;nix&quot;&gt;Nix&lt;/h3&gt;&lt;p&gt;If you have Nix installed or are on NixOS, you can also just run the script directly from my repo, without having to worry about dependencies or themes - like this:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;nix&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; shell&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;sourcehut:~cybolic/nix-system#rofi&#39;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --command&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; rofi-mpd-control&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or if you want to try just the search script:&lt;/p&gt;&lt;pre class=&quot;shiki catppuccin-macchiato&quot; style=&quot;background-color:#24273a;color:#cad3f5&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# to find and add an album&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;nix&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; shell&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;sourcehut:~cybolic/nix-system#rofi&#39;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --command&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; rofi-mpd-search&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#939AB7;font-style:italic&quot;&gt;# or, to just find a track&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#8AADF4;font-style:italic&quot;&gt;nix&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; shell&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; &#39;sourcehut:~cybolic/nix-system#rofi&#39;&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; --command&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; rofi-mpd-search&lt;/span&gt;&lt;span style=&quot;color:#A6DA95&quot;&gt; track&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The scripts just use &lt;code&gt;mpc&lt;/code&gt;, so if you already have &lt;code&gt;mpd&lt;/code&gt; working, they should just work without any configuration needed.&lt;/p&gt;&lt;h2 id=&quot;how-i-usually-use-it&quot;&gt;How I usually use it&lt;/h2&gt;&lt;p&gt;I launch the script from a shortcut through &lt;a href=&quot;https://github.com/xremap/xremap&quot;&gt;xremap&lt;/a&gt;, so my most common use-cases are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Play/Pause&lt;/strong&gt;: [shortcut] &lt;code&gt;Enter&lt;/code&gt; (it&#39;s nice to see what&#39;s currently paused before playing)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Adding an album&lt;/strong&gt;: [shortcut] &lt;code&gt;b&lt;/code&gt; &lt;code&gt;Enter&lt;/code&gt; (for &amp;quot;al &lt;strong&gt;b&lt;/strong&gt; um&amp;quot;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Adding a track&lt;/strong&gt;: [shortcut] &lt;code&gt;c&lt;/code&gt; &lt;code&gt;Enter&lt;/code&gt; (for &amp;quot;tra &lt;strong&gt;c&lt;/strong&gt; k&amp;quot;)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;small&gt;(I also have direct xremap bindings for launching &lt;code&gt;rofi-mpd-search&lt;/code&gt;, as that&#39;s usually faster than finding things through rmpc)&lt;/small&gt;&lt;/p&gt;&lt;h2 id=&quot;in-closing&quot;&gt;In closing&lt;/h2&gt;&lt;p&gt;I invite you to take a look at the linked scripts. Not just for the nice (in my opinion) styling of rofi, but also as a reminder of how simple it can be to build something that looks and behaves like a real application, using nothing more than commands piped into each other. The UNIX philosophy still looks good 50 years later 😎.&lt;/p&gt;</description>
  </item>
 </channel>
</rss>
