<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>IDEA Glue Blog</title>
    <link href="https://renesat.me/atom.xml" rel="self" />
    <link href="https://renesat.me" />
    <id>https://renesat.me/atom.xml</id>
    <author>
        <name>renesat</name>
        
        <email>self@renesat.me</email>
        
    </author>
    <updated>2026-03-21T00:57:00Z</updated>
    <entry>
    <title>How to Yggdrasil with Mullvad</title>
    <link href="https://renesat.me/posts/how_to_yggdrasil_with_mullvad.html" />
    <id>https://renesat.me/posts/how_to_yggdrasil_with_mullvad.html</id>
    <published>2026-03-21T00:57:00</published>
    <updated>2026-03-21T00:57:00Z</updated>
    <summary type="html"><![CDATA[<p>Most of the time I use Mullvad as my ISP. I think Mullvad is more trustworthy than my local ISP.
I configure it through NetworkManager using a simple WireGuard config. It works fine, but I miss some cool features like <a href="https://mullvad.net/ru/blog/2022/7/11/experimental-post-quantum-safe-vpn-tunnels">Post-quantum encryption</a>, <a href="https://mullvad.net/en/vpn/daita">DITA</a>, or <a href="https://mullvad.net/ru/blog/introducing-lightweight-wireguard-obfuscation">Obfuscation</a>, like on my phone.</p>
<!--more-->
<p>So I thought, why not write this in my NixOS config:</p>
<div class="highlight"><pre><span></span>services<span class="o">.</span>mullvad-vpn<span class="o">.</span><span class="ss">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</pre></div>

<p>And… it works! With all features! But then I tried to access my server using a Yggdrasil address, and I saw this error:</p>
<div class ="highlight"><pre>ssh: connect to host 2**:****:****:****:****:****:****:**** port ***: Connection refused</pre></div>
<p>Ping is also not reachable:</p>
<div class ="highlight"><pre>> ping 2**:****:****:****:****:****:****:****
PING 2**:****:****:****:****:****:****:**** (2**:****:****:****:****:****:****:****) 56 data bytes
From 2**:****:****:****:****:****:****:**** icmp_seq=1 Destination unreachable: Port unreachable
From 2**:****:****:****:****:****:****:**** icmp_seq=2 Destination unreachable: Port unreachable</pre></div>
<p>At first I thought my server was down again, but no – all services were available. So what was wrong?
I allowed the local network for Mullvad and… wait… Yggdrasil uses 200::/7 addresses, which are not public IPv6, but also not a local subnet.</p>
<p>And this is the problem. Mullvad can’t allow specific masks. Yes, you can use mullvad tunnel set allowed-ips, but it uses an include list, not an exclude list as I want.
I searched and found a few issues about that (<a href="https://github.com/mullvad/mullvadvpn-app/issues/3878">Bug: Kill switch applies to non-global unicast IPv6 ranges</a>, <a href="https://github.com/yggdrasil-network/yggdrasil-go/issues/931">How to use yggdrasil with vpn in same time?</a>), but no solution.
However, I found one useful clue – <a href="https://mullvad.net/en/help/split-tunneling-with-linux-advanced">split tunneling</a>.</p>
<p>For per-application split tunneling, Mullvad marks packets for exclusion:</p>
<blockquote>
<p>This is achieved by having rules that check if traffic is marked with a connection tracking mark (0x00000f41) to get through the firewall and a meta mark (0x6d6f6c65) to route the traffic outside the tunnel.</p>
</blockquote>
<p>So I needed to mark all outgoing Yggdrasil connections. Fortunately, I use <code>nft</code> as firewall, so I just added this rule:</p>
<div class ="highlight"><pre>table ip6 yggdrasil-mullvad {
  # Mark all outgoing connections.
  chain output {
    type filter hook output priority 0; policy accept;

    # Use ip ranges
    ip6 saddr 200::/7 ip6 daddr 200::/7 ct mark set 0x00000f41 meta mark set 0x6d6f6c65

    # Or specific interface
    oifname "tun0" ct mark set 0x00000f41 meta mark set 0x6d6f6c65
  }
}</pre></div>
<p>For NixOS users:</p>
<div class="highlight"><pre><span></span>networking<span class="o">.</span>nftables<span class="o">.</span><span class="ss">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
networking<span class="o">.</span>nftables<span class="o">.</span>tables<span class="o">.</span><span class="ss">yggdrasil</span> <span class="o">=</span> <span class="p">{</span>
  <span class="ss">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
  <span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;yggdrasil-mullvad&quot;</span><span class="p">;</span>
  <span class="ss">family</span> <span class="o">=</span> <span class="s2">&quot;ip6&quot;</span><span class="p">;</span>
  <span class="ss">content</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline">    chain output {</span>
<span class="s s-Multiline">      type filter hook output priority 0; policy accept;</span>
<span class="s s-Multiline">      ip6 saddr 200::/7 ip6 daddr 200::/7 ct mark set 0x00000f41 meta mark set 0x6d6f6c65</span>
<span class="s s-Multiline">    }</span>
<span class="s s-Multiline">  &#39;&#39;</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>

<p>And done! Now I can use these cool technologies at the same time.</p>
<p>P.S. Mullvad App now supports DNS on localhost, and I can still use my Unbound + dnscrypt solution.</p>]]></summary>
</entry>
<entry>
    <title>How convert SVG icon to favicon in Hakyll</title>
    <link href="https://renesat.me/posts/svg_to_ico_in_hakyll.html" />
    <id>https://renesat.me/posts/svg_to_ico_in_hakyll.html</id>
    <published>2021-07-01T20:38:31Z</published>
    <updated>2021-07-01T20:38:31Z</updated>
    <summary type="html"><![CDATA[<p>I am using Hakyll for this blog. And I have a problem start script for every icon change.
And I thought: Why am I not using Hakyll to do this?</p>
<p>Icon has been created in Inkscape with SVG format.
A script like this converted SVG icon to PNG:</p>
<div class="highlight"><pre><span></span>inkscape<span class="w"> </span>-w<span class="w"> </span><span class="m">16</span><span class="w"> </span>-h<span class="w"> </span><span class="m">16</span><span class="w"> </span>-o<span class="w"> </span>icon-16.png<span class="w"> </span>icon.svg
inkscape<span class="w"> </span>-w<span class="w"> </span><span class="m">32</span><span class="w"> </span>-h<span class="w"> </span><span class="m">32</span><span class="w"> </span>-o<span class="w"> </span>icon-32.png<span class="w"> </span>icon.svg
convert<span class="w"> </span>icon-16.png<span class="w"> </span>icon-32.png<span class="w"> </span>favicon.ico
</pre></div>

<!--more-->

<p>I am not using only ImageMagick because it doesn’t convert the background correctly.
Twice start Inkscape is not a good idea. I find
parameter <strong><code>actions</code></strong> and rewrite the script for run Inkscape once:</p>
<div class="highlight"><pre><span></span>inkscape<span class="w"> </span>--without-gui<span class="w"> </span>--actions<span class="w"> </span><span class="s2">&quot;export-width:16px; export-filename:icon-16.png; export-do; export-width:32px; export-filename:icon-32.png; export-do;&quot;</span><span class="w"> </span>icon.svg
convert<span class="w"> </span>icon-16.png<span class="w"> </span>icon-32.png<span class="w"> </span>favicon.ico
</pre></div>

<p>It’s a long command but good for a script running speed (I don’t know why I need this…).</p>
<p>I create a new route in Hakyll with <strong><em>icon.svg</em></strong> depend:</p>
<div class="highlight"><pre><span></span><span class="nf">iconDep</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="n">makePatternDependency</span><span class="w"> </span><span class="s">&quot;images/icon.svg&quot;</span>
<span class="nf">rulesExtraDependencies</span><span class="w"> </span><span class="p">[</span><span class="n">iconDep</span><span class="p">]</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">create</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;favicon.ico&quot;</span><span class="p">]</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="kr">do</span>
<span class="w">    </span><span class="n">route</span><span class="w">   </span><span class="n">idRoute</span>
<span class="w">    </span><span class="n">compile</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">faviconCompiler</span><span class="w"> </span><span class="s">&quot;site/images/icon.svg&quot;</span>
</pre></div>

<p><strong><code>faviconCompiler</code></strong> create <strong><em>favicon.ico</em></strong> using <strong><em>icon.svg</em></strong>:</p>
<div class="highlight"><pre><span></span><span class="nf">faviconCompiler</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">FilePath</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Compiler</span><span class="w"> </span><span class="p">(</span><span class="kt">Item</span><span class="w"> </span><span class="kt">LBS</span><span class="o">.</span><span class="kt">ByteString</span><span class="p">)</span>
<span class="nf">faviconCompiler</span><span class="w"> </span><span class="n">svgPath</span><span class="w"> </span><span class="ow">=</span>
<span class="w">  </span><span class="kr">let</span><span class="w"> </span><span class="n">sizes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">[</span><span class="mi">32</span><span class="p">,</span><span class="w"> </span><span class="mi">16</span><span class="p">]</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="p">[</span><span class="kt">Int</span><span class="p">]</span>
<span class="w">  </span><span class="kr">in</span><span class="w"> </span><span class="kr">do</span>
<span class="w">    </span><span class="n">tmpFiles</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="n">getFaviconPngs</span><span class="w"> </span><span class="n">svgPath</span><span class="w"> </span><span class="n">sizes</span>
<span class="w">    </span><span class="n">paths</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="p">(</span><span class="kt">TmpFile</span><span class="w"> </span><span class="n">tmpPath</span><span class="p">)</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="n">tmpPath</span><span class="p">)</span><span class="w"> </span><span class="n">tmpFiles</span>
<span class="w">    </span><span class="n">ico</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="n">unixFilterLBS</span><span class="w"> </span><span class="s">&quot;convert&quot;</span><span class="w"> </span><span class="p">(</span><span class="n">paths</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;ico:-&quot;</span><span class="p">])</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="p">)</span>
<span class="w">    </span><span class="n">makeItem</span><span class="w"> </span><span class="n">ico</span>
</pre></div>

<p>Function <strong><code>getFaviconPngs</code></strong> create multiple <a href="https://hackage.haskell.org/package/hakyll-4.14.0.0/docs/Hakyll-Core-File.html#t:TmpFile">TmpFile</a> and PNG for each size.
Inkscape starts once using <a href="https://hackage.haskell.org/package/process-1.6.11.0/docs/System-Process.html">Hakyll’s process</a>.</p>
<div class="highlight"><pre><span></span><span class="nf">createFaviconExportLine</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">TmpFile</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">String</span>
<span class="nf">createFaviconExportLine</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="p">(</span><span class="kt">TmpFile</span><span class="w"> </span><span class="n">path</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span>
<span class="w">  </span><span class="s">&quot;export-width:&quot;</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="n">show</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="s">&quot;px; export-filename:&quot;</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="s">&quot;; export-do;&quot;</span>

<span class="nf">getFaviconPngs</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">FilePath</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="p">[</span><span class="kt">Int</span><span class="p">]</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="kt">Compiler</span><span class="w"> </span><span class="p">[</span><span class="kt">TmpFile</span><span class="p">]</span>
<span class="nf">getFaviconPngs</span><span class="w"> </span><span class="n">svgPath</span><span class="w"> </span><span class="n">sizes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">do</span>
<span class="w">  </span><span class="n">tmpFiles</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="n">sequence</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">map</span>
<span class="w">      </span><span class="p">(</span><span class="nf">\</span><span class="n">size</span><span class="w"> </span><span class="ow">-&gt;</span><span class="w"> </span><span class="n">newTmpFile</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="s">&quot;hakyll-blog-favicon-&quot;</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="n">show</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="s">&quot;.png&quot;</span><span class="p">)</span>
<span class="w">      </span><span class="n">sizes</span>
<span class="w">  </span><span class="n">actions</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="n">return</span>
<span class="w">    </span><span class="o">$</span><span class="w"> </span><span class="n">foldr1</span><span class="w"> </span><span class="p">(</span><span class="o">++</span><span class="p">)</span>
<span class="w">    </span><span class="o">$</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="n">uncurry</span><span class="w"> </span><span class="n">createFaviconExportLine</span><span class="p">)</span>
<span class="w">    </span><span class="o">$</span><span class="w"> </span><span class="n">zip</span><span class="w"> </span><span class="n">sizes</span><span class="w"> </span><span class="n">tmpFiles</span>
<span class="w">  </span><span class="p">(</span><span class="kr">_</span><span class="p">,</span><span class="w"> </span><span class="kr">_</span><span class="p">,</span><span class="w"> </span><span class="kr">_</span><span class="p">,</span><span class="w"> </span><span class="n">handle</span><span class="p">)</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="n">unsafeCompiler</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">createProcess</span>
<span class="w">        </span><span class="p">(</span><span class="n">proc</span><span class="w"> </span><span class="s">&quot;inkscape&quot;</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;--without-gui&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;--actions&quot;</span><span class="p">,</span><span class="w">  </span><span class="n">actions</span><span class="p">,</span><span class="w"> </span><span class="n">svgPath</span><span class="p">])</span>
<span class="w">        </span><span class="p">{</span><span class="w"> </span><span class="n">std_err</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">NoStream</span>
<span class="w">        </span><span class="p">,</span><span class="w"> </span><span class="n">std_out</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">NoStream</span>
<span class="w">        </span><span class="p">,</span><span class="w"> </span><span class="n">use_process_jobs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">True</span>
<span class="w">        </span><span class="p">}</span>
<span class="w">  </span><span class="kr">_</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="n">unsafeCompiler</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">waitForProcess</span><span class="w"> </span><span class="n">handle</span>
<span class="w">  </span><span class="n">return</span><span class="w"> </span><span class="n">tmpFiles</span>
</pre></div>

<p>Finally, I use ImageMagick for creating ICO:</p>
<div class="highlight"><pre><span></span><span class="o">...</span>
<span class="w">    </span><span class="n">ico</span><span class="w"> </span><span class="ow">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="n">unixFilterLBS</span><span class="w"> </span><span class="s">&quot;convert&quot;</span><span class="w"> </span><span class="p">(</span><span class="n">paths</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="p">[</span><span class="s">&quot;ico:-&quot;</span><span class="p">])</span><span class="w"> </span><span class="s">&quot;&quot;</span><span class="p">)</span>
<span class="o">...</span>
</pre></div>
]]></summary>
</entry>

</feed>
