<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>StealthyCoder</title>
    <link>https://stealthycoder.writeas.com/</link>
    <description>Making code ninjas out of everyone</description>
    <pubDate>Tue, 02 Jun 2026 01:14:37 +0000</pubDate>
    <item>
      <title>Sway towards hyprland</title>
      <link>https://stealthycoder.writeas.com/sway-towards-hyprland?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I recently started to think about my workflows and UI aesthetics and I wanted to try Hyprland again !--more--.&#xA;&#xA;Hyprland works outside of the box&#xA;&#xA;I run GNOME Boxes to test out different Linux distros and what have you. So I thought let me do an Arch build, and install Hyprland on it. Well the install works fine, that is not the issue, but running it is a pain in the ass since it needs 3D acceleration. I switched it on on GNOME Boxes setting and it did not run the entire VM anymore. So I decided to ditch that option.&#xA;&#xA;Sway&#xA;&#xA;I heard of sway but I never ran it. It is fast, resource efficient and easy to config. It is helpful in it&#39;s messages. There is a lot of tooling around it that helps you. For instance one thing I liked is that I set it to run swaybg to have a nice wallpaper background, but I never downloaded one yet to the location specified. No problem, nothing crashed and I just saw a blank grey background. The kind of mentality HTML had when saying we will try to do the best we can to render something to the user so that there is at least that feedback. It might not be what they expect but they can then fix it themselves. &#xA;&#xA;Now one drawback is you have to configure everything. Every action, every keybind and so on. It is also nice since it forces you to write the stuff you will actually use and not have any thing superfluous but how do you know what you need if you do not even know all that is possible. You do not know what you do not know, is the problem here.&#xA;&#xA;However I did get up and running quite quickly and the config language is easy enough. The documentation helps a lot too. &#xA;&#xA;Another problem I find that Hyprland has these days is it is Lua based. The function names and syntax is not to my liking and seems like it would be quite the hassle to maintain.&#xA;&#xA;For my work setup I think I would run Sway on Debian, since it is much more stable and I cannot break something that quickly. &#xA;&#xA;Lastly I need to spend some time making the whole look and feel way more cozy, because right now it is really bland and dull. ]]&gt;</description>
      <content:encoded><![CDATA[<p>I recently started to think about my workflows and UI aesthetics and I wanted to try Hyprland again .</p>

<h2 id="hyprland-works-outside-of-the-box" id="hyprland-works-outside-of-the-box">Hyprland works outside of the box</h2>

<p>I run GNOME Boxes to test out different Linux distros and what have you. So I thought let me do an Arch build, and install Hyprland on it. Well the install works fine, that is not the issue, but running it is a pain in the ass since it needs 3D acceleration. I switched it on on GNOME Boxes setting and it did not run the entire VM anymore. So I decided to ditch that option.</p>

<h2 id="sway" id="sway">Sway</h2>

<p>I heard of sway but I never ran it. It is fast, resource efficient and easy to config. It is helpful in it&#39;s messages. There is a lot of tooling around it that helps you. For instance one thing I liked is that I set it to run <code>swaybg</code> to have a nice wallpaper background, but I never downloaded one yet to the location specified. No problem, nothing crashed and I just saw a blank grey background. The kind of mentality HTML had when saying we will try to do the best we can to render something to the user so that there is at least that feedback. It might not be what they expect but they can then fix it themselves.</p>

<p>Now one drawback is you have to configure everything. Every action, every keybind and so on. It is also nice since it forces you to write the stuff you will actually use and not have any thing superfluous but how do you know what you need if you do not even know all that is possible. You do not know what you do not know, is the problem here.</p>

<p>However I did get up and running quite quickly and the config language is easy enough. The documentation helps a lot too.</p>

<p>Another problem I find that Hyprland has these days is it is Lua based. The function names and syntax is not to my liking and seems like it would be quite the hassle to maintain.</p>

<p>For my work setup I think I would run Sway on Debian, since it is much more stable and I cannot break something that quickly.</p>

<p>Lastly I need to spend some time making the whole look and feel way more cozy, because right now it is really bland and dull.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/sway-towards-hyprland</guid>
      <pubDate>Fri, 29 May 2026 19:27:20 +0000</pubDate>
    </item>
    <item>
      <title>AI overlords</title>
      <link>https://stealthycoder.writeas.com/ai-overlords?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I was commanded to start using AI at work, and it is a version of Claude CLI. !--more--&#xA;&#xA;First thoughts&#xA;&#xA;Firstly I thought, let me just try it. I am not sure what it can and cannot do. I was unsure of what I should use it for, and then came a use case in mind.&#xA;&#xA;MacOS sucks&#xA;&#xA;OSX or MacOS or whatever you call it, sucks for development. Even more so when you have some sort of SSL intercepting corporate policy tool in there. All, and I mean all, CLI tools fail to work and every time you solve it, then a simple upgrade will make it all broken again. So I decided the first task the AI could assist me in is getting a Dockerfile ready to go with all the tools I want/need. Of course I asked it to make it cozy, use Rose Pine everywhere it could in terms of palette and colorschemes and it did so quite well I must say. &#xA;&#xA;I currently have a nice minimal and cozy Docker container running with all the tools and I can finally run all the things I needed to run. &#xA;&#xA;Conclusion&#xA;&#xA;I think the current setup is still far removed from a fully functional hard to discern from a real human artificial intelligence. It still hallucinates stuff, makes stuff up and so on, but in terms of getting jump started or rubber ducking stuff it is quite amazing tool. Back in the day you had cookie cutter, apparently it still exists, which tried to make it so you could easily start new projects and have a template by which it should be generated/seeded. &#xA;&#xA;Now though with AI you can get even more easily started and have it do things you know you could do given the time but it can do it for you way faster. &#xA;&#xA;One thing I must mention is the fact I burned through 23 million tokens just for this small project. So token usage gets quite high quite fast I must say. ]]&gt;</description>
      <content:encoded><![CDATA[<p>I was commanded to start using AI at work, and it is a version of Claude CLI. </p>

<h2 id="first-thoughts" id="first-thoughts">First thoughts</h2>

<p>Firstly I thought, let me just try it. I am not sure what it can and cannot do. I was unsure of what I should use it for, and then came a use case in mind.</p>

<h2 id="macos-sucks" id="macos-sucks">MacOS sucks</h2>

<p>OSX or MacOS or whatever you call it, sucks for development. Even more so when you have some sort of SSL intercepting corporate policy tool in there. All, and I mean all, CLI tools fail to work and every time you solve it, then a simple upgrade will make it all broken again. So I decided the first task the AI could assist me in is getting a <code>Dockerfile</code> ready to go with all the tools I want/need. Of course I asked it to make it cozy, use Rose Pine everywhere it could in terms of palette and colorschemes and it did so quite well I must say.</p>

<p>I currently have a nice minimal and cozy Docker container running with all the tools and I can finally run all the things I needed to run.</p>

<h2 id="conclusion" id="conclusion">Conclusion</h2>

<p>I think the current setup is still far removed from a fully functional hard to discern from a real human artificial intelligence. It still hallucinates stuff, makes stuff up and so on, but in terms of getting jump started or rubber ducking stuff it is quite amazing tool. Back in the day you had cookie cutter, apparently it still <a href="https://github.com/cookiecutter/cookiecutter" rel="nofollow">exists</a>, which tried to make it so you could easily start new projects and have a template by which it should be generated/seeded.</p>

<p>Now though with AI you can get even more easily started and have it do things you know you could do given the time but it can do it for you way faster.</p>

<p>One thing I must mention is the fact I burned through 23 million tokens just for this small project. So token usage gets quite high quite fast I must say.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/ai-overlords</guid>
      <pubDate>Fri, 29 May 2026 19:19:12 +0000</pubDate>
    </item>
    <item>
      <title>Local LLMs, dark forests and echo chambers</title>
      <link>https://stealthycoder.writeas.com/local-llms-dark-forests-and-echo-chambers?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[This post is going into how I ran a cool Claw product, then thinking a bit on what it all means for running AI services yourself these days and what that might mean for society. !--more--&#xA;&#xA;NullClaw&#xA;&#xA;After Clawdbot/Moltbot/OpenClaw gained popularity because it introduced channels like e-mail and WhatsApp to contact your AI assistant was very attractive, I wanted to see what it would take to run your own offline personal AI agent. The downside of OpenClaw is you still need to connect it to models that do the AI features and where you were running the bot it had full access and further more, anyone could hijack your AI assistant by invoking along the same channels. &#xA;&#xA;So if you really want to run your models offline and on own hardware, you need a beefy machine that will do so. However that brings other problems I will detail later on in the post. For now I wanted to run a secure and low resources process that would give me free access to start playing around with this and get a better feel for things. &#xA;&#xA;Enter NullClaw. It is a wonderful small binary that just connects to OpenRouter. So on OpenRouter there are plenty of free models to choose from, so just connect one that fits your use case best (mine was mainly coding, therefore I went with Qwen: Qwen3 Coder 480B A35B (free)*). Then you just connect for example Zed editor to your NullClaw instance and then you can code with your &#34;own&#34; AI assistant. &#xA;&#xA;Local offline LLMs&#xA;&#xA;Of course you can also run the entire model for free for yourself. That requires a serious investment of hardware though. Not only that, you might need to train it more (inference it more is a better term) to better fit you. &#xA;&#xA;Therein also lies the problem. Something that exists in Machine Learning is the fact that you can overfit a model/function. That means it exactly fits the model but that leaves no room for actual learning, doing actual useful things. For example, let us say you are training a model to respond to textual input and provide meaningful output. So you have a bunch of text that represents dialogue with questions, answers or maybe even chat transcripts between two people to make it more organic. The problem with overfitting is that if you use this model it will only respond ever to the exact sentences that were given as part of the inference stage and it will always respond exactly with whatever comes next in that set of data. &#xA;&#xA;Not exactly useful. So now think back to the models that might do inference as you use them in order for them to &#34;learn&#34; to do their job better. It might make your model overfit to you. So it will not give you best practices for example, since you do it your own way and it will adjust to that. It might not give you information that might be new and factually correct to you because you never looked for that particular piece of information, one cannot know their own incompetence. &#xA;&#xA;Echo chambers&#xA;&#xA;This will lead to super echo chambers where a virtual text prediction generator is feeding you the idea that you are the centre of the universe and are the best human that ever was made. Especially now with all this &#34;great idea&#34;, &#34;that sounds wonderful&#34;, and other positive lead ins of answers given back by the likes of ChatGPT. &#xA;&#xA;There is a reason something called AI induced psychosis now exists. &#xA;&#xA;Dark forests&#xA;&#xA;So now even more dark forests might be coming up, as lots of people will run their own model of something that will be tailored to themselves and people will be disconnecting from social structures more and more.]]&gt;</description>
      <content:encoded><![CDATA[<p>This post is going into how I ran a cool *Claw product, then thinking a bit on what it all means for running AI services yourself these days and what that might mean for society. </p>

<h2 id="nullclaw" id="nullclaw">NullClaw</h2>

<p>After Clawdbot/Moltbot/OpenClaw gained popularity because it introduced channels like e-mail and WhatsApp to contact <em>your</em> AI assistant was very attractive, I wanted to see what it would take to run your own offline personal AI agent. The downside of OpenClaw is you still need to connect it to models that do the AI features and where you were running the bot it had full access and further more, anyone could hijack your AI assistant by invoking along the same channels.</p>

<p>So if you really want to run your models offline and on own hardware, you need a beefy machine that will do so. However that brings other problems I will detail later on in the post. For now I wanted to run a secure and low resources process that would give me free access to start playing around with this and get a better feel for things.</p>

<p>Enter <a href="https://github.com/nullclaw/nullclaw" rel="nofollow">NullClaw</a>. It is a wonderful small binary that just connects to OpenRouter. So on OpenRouter there are plenty of free models to choose from, so just connect one that fits your use case best (mine was mainly coding, therefore I went with <em>Qwen: Qwen3 Coder 480B A35B (free)</em>). Then you just connect for example Zed editor to your NullClaw instance and then you can code with your “own” AI assistant.</p>

<h2 id="local-offline-llms" id="local-offline-llms">Local offline LLMs</h2>

<p>Of course you can also run the entire model for free for yourself. That requires a serious investment of hardware though. Not only that, you might need to train it more (inference it more is a better term) to better fit you.</p>

<p>Therein also lies the problem. Something that exists in Machine Learning is the fact that you can overfit a model/function. That means it exactly fits the model but that leaves no room for actual learning, doing actual useful things. For example, let us say you are training a model to respond to textual input and provide meaningful output. So you have a bunch of text that represents dialogue with questions, answers or maybe even chat transcripts between two people to make it more organic. The problem with overfitting is that if you use this model it will only respond ever to the exact sentences that were given as part of the inference stage and it will always respond exactly with whatever comes next in that set of data.</p>

<p>Not exactly useful. So now think back to the models that might do inference as you use them in order for them to “learn” to do their job better. It might make your model overfit to you. So it will not give you best practices for example, since you do it your own way and it will adjust to that. It might not give you information that might be new and factually correct to you because you never looked for that particular piece of information, one cannot know their own incompetence.</p>

<h2 id="echo-chambers" id="echo-chambers">Echo chambers</h2>

<p>This will lead to super echo chambers where a virtual text prediction generator is feeding you the idea that you are the centre of the universe and are the best human that ever was made. Especially now with all this “great idea”, “that sounds wonderful”, and other positive lead ins of answers given back by the likes of ChatGPT.</p>

<p>There is a reason something called <a href="https://en.wikipedia.org/wiki/Chatbot_psychosis" rel="nofollow">AI induced psychosis</a> now exists.</p>

<h2 id="dark-forests" id="dark-forests">Dark forests</h2>

<p>So now even more dark forests might be coming up, as lots of people will run their own model of something that will be tailored to themselves and people will be disconnecting from social structures more and more.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/local-llms-dark-forests-and-echo-chambers</guid>
      <pubDate>Sat, 28 Feb 2026 19:30:17 +0000</pubDate>
    </item>
    <item>
      <title>What a work to do system monitoring at scale</title>
      <link>https://stealthycoder.writeas.com/what-a-work-to-do-system-monitoring-at-scale?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Recently I started a small adventure to implement the following process:&#xA; &#xA; Log statistics of devices across a bunch of metrics like CPU, memory, Network and Disk I/O, etc. &#xA; Aggregate these in a central place&#xA; Make forecast / anomaly detection on this data&#xA;&#xA;The reason for this was the relative recent SSH backdoor that almost was not caught. The reason it was caught was because of a developer was excessively testing a PostgreSQL lab and noticed significant sudden increase in SSH login. !--more--&#xA;&#xA;This is written more like a reference for myself to look back on, rather than a suggestion to implement it this way or stating it is the only || best way to do this. &#xA;&#xA;My work loved this as a feature&#xA;&#xA;In order to implement this feature a process was needed that would harvest the data, send it somewhere to aggregate and then visualize and potentially let loose some Machine Learning on it. Because of my interests I knew of tools that were used in this space; Fluentbit, Prometheus, OpenTelemetry, Grafana, Kibana, and some more. I decided to start with making a mock up of sorts. A flow of how things would look hooked up. &#xA;&#xA;Prometheus&#xA;&#xA;Prometheus did not operate the way I expected. I thought it would expose a port / URI / API that you could connect to or send your, structured, data to. This is not how it works. It does so by getting the data from places and ingesting it that way. So rather than waiting for an agent to send data in ( á la DataDog, New Relic and their ilk), it goes out to what is configured and gets the data from endpoints. &#xA;&#xA;This did not necessarily throw a wrench in the works, but it did cause a pause. So I wanted to see if a central place could be used. Prometheus also supports something called remotewrite and remoteread, so using that I found a place to store data: Google Cloud Spanner. This is a relatively cheap service that makes it so all data can be sent  in a central store and multiple Prometheus instances can read from the data store, and write to it. &#xA;&#xA;Fluentbit&#xA;&#xA;Fluentbit can be configured to immediately do a remotewrite, so that made it nicer to work with. In this case I went with truestreet by Google. It was running in a container and would send the data to the central place from each device. Then in essence all that is needed to run the Prometheus and rest anywhere is another one of these exactly the same truestreet containers and use it to do remoteread against. &#xA;&#xA;Also it has a nice Node exporter to automatically export almost all statistics that were relevant or interesting. &#xA;&#xA;Grafana&#xA;&#xA;I went with Grafana to visualize the data. It can also run anomaly detection and custom scripts, but that is for later. What I did encounter was installing, configuring and running Grafana in a secure manner is an ungodly amount of work. So I went with just running it locally on my dev machine for now. That seemed to be the easiest. &#xA;&#xA;Recap&#xA;&#xA;To recap what I ended up doing was running fluentbit as a process on the device itself, talking to a container running truestreet that sent the data to a Google Cloud Spanner instance. Then anywhere else I wanted to have the data available to look into, all I needed was a docker compose file that spun up:&#xA; truestreet container&#xA; Prometheus configured to do remote_read of the truestreet container&#xA; Grafana with Prometheus as the data source]]&gt;</description>
      <content:encoded><![CDATA[<p>Recently I started a small adventure to implement the following process:</p>
<ul><li>Log statistics of devices across a bunch of metrics like CPU, memory, Network and Disk I/O, etc.</li>
<li>Aggregate these in a central place</li>
<li>Make forecast / anomaly detection on this data</li></ul>

<p>The reason for this was the relative recent SSH backdoor that almost was not caught. The reason it was caught was because of <a href="https://lwn.net/ml/oss-security/20240329155126.kjjfduxw2yrlxgzm@awork3.anarazel.de/" rel="nofollow">a developer was excessively testing a PostgreSQL lab</a> and noticed significant sudden increase in SSH login. </p>

<p>This is written more like a reference for myself to look back on, rather than a suggestion to implement it this way or stating it is the only || best way to do this.</p>

<h2 id="my-work-loved-this-as-a-feature" id="my-work-loved-this-as-a-feature">My work loved this as a feature</h2>

<p>In order to implement this feature a process was needed that would harvest the data, send it somewhere to aggregate and then visualize and potentially let loose some Machine Learning on it. Because of my interests I knew of tools that were used in this space; Fluentbit, Prometheus, OpenTelemetry, Grafana, Kibana, and some more. I decided to start with making a mock up of sorts. A flow of how things would look hooked up.</p>

<h2 id="prometheus" id="prometheus">Prometheus</h2>

<p>Prometheus did not operate the way I expected. I thought it would expose a port / URI / API that you could connect to or send your, structured, data to. This is not how it works. It does so by getting the data from places and ingesting it that way. So rather than waiting for an agent to send data in ( á la DataDog, New Relic and their ilk), it goes out to what is configured and gets the data from endpoints.</p>

<p>This did not necessarily throw a wrench in the works, but it did cause a pause. So I wanted to see if a central place could be used. Prometheus also supports something called <code>remote_write</code> and <code>remote_read</code>, so using that I found a place to store data: Google Cloud Spanner. This is a relatively cheap service that makes it so all data can be sent  in a central store and multiple Prometheus instances can read from the data store, and write to it.</p>

<h2 id="fluentbit" id="fluentbit">Fluentbit</h2>

<p>Fluentbit can be configured to immediately do a <code>remote_write</code>, so that made it nicer to work with. In this case I went with <code>truestreet</code> by Google. It was running in a container and would send the data to the central place from each device. Then in essence all that is needed to run the Prometheus and rest anywhere is another one of these exactly the same <code>truestreet</code> containers and use it to do <code>remote_read</code> against.</p>

<p>Also it has a nice Node exporter to automatically export almost all statistics that were relevant or interesting.</p>

<h2 id="grafana" id="grafana">Grafana</h2>

<p>I went with Grafana to visualize the data. It can also run anomaly detection and custom scripts, but that is for later. What I did encounter was installing, configuring and running Grafana in a secure manner is an ungodly amount of work. So I went with just running it locally on my dev machine for now. That seemed to be the easiest.</p>

<h1 id="recap" id="recap">Recap</h1>

<p>To recap what I ended up doing was running <code>fluentbit</code> as a process on the device itself, talking to a container running <code>truestreet</code> that sent the data to a Google Cloud Spanner instance. Then anywhere else I wanted to have the data available to look into, all I needed was a docker compose file that spun up:
 – <code>truestreet</code> container
 – Prometheus configured to do <code>remote_read</code> of the <code>truestreet</code> container
 – Grafana with Prometheus as the data source</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/what-a-work-to-do-system-monitoring-at-scale</guid>
      <pubDate>Sat, 28 Feb 2026 19:09:06 +0000</pubDate>
    </item>
    <item>
      <title>IPv6 only adventures</title>
      <link>https://stealthycoder.writeas.com/ipv6-only-adventures?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I recently wanted to get a project up and running quite quickly and cheaply, so I opted to go for a server over at Hetzner. They are great providers of affordable dedicated servers. I also saw they charge for IPv4 addresses to dissuade people from using them and move on to IPv6, which I strongly support. So I went ahead with just a IPv6 public address. That is when the adventure started. !--more--&#xA;&#xA;Github.com&#xA;&#xA;So it is 2026 as I write this post and still GitHub.com does not have a AAAA record resolving to a public IPv6 address. This means if you are on a server, like the one I got, that only has IPv6 egress networking capabilities, then you are screwed. Since you cannot connect over IPv4 to any service. Luckily for us there exists a very nice service that resolves to public NAT addresses for IPv4 only services like GitHub. So that was solved.&#xA;&#xA;Every other process&#xA;&#xA;So two problems why networks fail, are either it is DNS or it is BGP. Well in my case it is DNS. The problem is that by default systemd-resolved runs on local loopback 127.0.0.1 which is IPv4. That got settled quickly with just running the following config in /etc/system/resolved.conf.d/ipv6.conf:&#xA;&#xA;[Resolve]&#xA;DNS=2a00:1098:2c::1 2a01:4f8:c2c:123f::1 2a00:1098:2b::1&#xA;FallbackDNS=2a01:4ff:ff00::add:2 2a01:4ff:ff00::add:1&#xA;Domains=&#xA;DNSSEC=no&#xA;DNSOverTLS=no&#xA;MulticastDNS=no&#xA;LLMNR=no&#xA;Cache=no-negative&#xA;CacheFromLocalhost=no&#xA;DNSStubListener=no&#xA;DNSStubListenerExtra=[::1]:53&#xA;ReadEtcHosts=yes&#xA;ResolveUnicastSingleLabel=no&#xA;StaleRetentionSec=0&#xA;This will run the process listening only on the local loopback IPv6 address. However it still resolves A records if you ask it to of course.&#xA;&#xA;The actual problem I ran into was that a Node instance wanting to send mails with nodemailer resolved the service I was using to an IPv4 address.&#xA;&#xA;I tried to give the --dns-result-order=ipv6first to the node process but that did nothing, even though my test code within that loaded instance resolved the IPv6 address. Well the culprit is actually nodemailer itself. It just always resolves the IPv4 address first and if it got an address then it went with that. This was version 6 however and they are at version 8 nowadays. So I looked at the latest code and it does combine the addresses in total, but does not respect the option you gave to Node for what to do first. &#xA;&#xA;I just hacked the code to resolve only IPv6 addresses and it was &#34;solved&#34;.&#xA;&#xA;Problem not solved&#xA;&#xA;The problem was not really solved because there is still no way to give to every process only IPv6 addresses by default. You can edit the /etc/gai.conf file. Then you need to have IPv6 addresses for your DNS servers only and then you still need to potentially configure NetworkManager to prefer IPv6 first. Even so, after all that work, every language has libraries and implementations that let&#39;s you bypass that. &#xA;&#xA;Like we saw with nodemailer and NodeJS. It is nigh impossible to have an IPv6 only setup in the real world, rather than in just a homelab situation where you control everything. ]]&gt;</description>
      <content:encoded><![CDATA[<p>I recently wanted to get a project up and running quite quickly and cheaply, so I opted to go for a server over at <a href="https://www.hetzner.com/" rel="nofollow">Hetzner</a>. They are great providers of affordable dedicated servers. I also saw they charge for IPv4 addresses to dissuade people from using them and move on to IPv6, which I strongly support. So I went ahead with just a IPv6 public address. That is when the adventure started. </p>

<h1 id="github-com" id="github-com">Github.com</h1>

<p>So it is 2026 as I write this post and still GitHub.com does not have a AAAA record resolving to a public IPv6 address. This means if you are on a server, like the one I got, that only has IPv6 egress networking capabilities, then you are screwed. Since you cannot connect over IPv4 to any service. Luckily for us there exists a very <a href="https://nat64.net/" rel="nofollow">nice service</a> that resolves to public NAT addresses for IPv4 only services like GitHub. So that was solved.</p>

<h1 id="every-other-process" id="every-other-process">Every other process</h1>

<p>So two problems why networks fail, are either it is DNS or it is BGP. Well in my case it is DNS. The problem is that by default <code>systemd-resolved</code> runs on local loopback 127.0.0.1 which is IPv4. That got settled quickly with just running the following config in <code>/etc/system/resolved.conf.d/ipv6.conf</code>:</p>

<pre><code class="language-TOML">[Resolve]
DNS=2a00:1098:2c::1 2a01:4f8:c2c:123f::1 2a00:1098:2b::1
FallbackDNS=2a01:4ff:ff00::add:2 2a01:4ff:ff00::add:1
#Domains=
#DNSSEC=no
#DNSOverTLS=no
#MulticastDNS=no
#LLMNR=no
#Cache=no-negative
#CacheFromLocalhost=no
DNSStubListener=no
DNSStubListenerExtra=[::1]:53
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no
#StaleRetentionSec=0
</code></pre>

<p>This will run the process listening only on the local loopback IPv6 address. However it still resolves A records if you ask it to of course.</p>

<p>The actual problem I ran into was that a Node instance wanting to send mails with <code>nodemailer</code> resolved the service I was using to an IPv4 address.</p>

<p>I tried to give the <code>--dns-result-order=ipv6first</code> to the node process but that did nothing, even though my test code within that loaded instance resolved the IPv6 address. Well the culprit is actually <code>nodemailer</code> itself. It just always resolves the IPv4 address first and if it got an address then it went with that. This was version 6 however and they are at version 8 nowadays. So I looked at the latest code and it does combine the addresses in total, but does not respect the option you gave to Node for what to do first.</p>

<p>I just hacked the code to resolve only IPv6 addresses and it was “solved”.</p>

<h1 id="problem-not-solved" id="problem-not-solved">Problem not solved</h1>

<p>The problem was not really solved because there is still no way to give to every process only IPv6 addresses by default. You can edit the <code>/etc/gai.conf</code> file. Then you need to have IPv6 addresses for your DNS servers only and then you still need to potentially configure NetworkManager to prefer IPv6 first. Even so, after all that work, every language has libraries and implementations that let&#39;s you bypass that.</p>

<p>Like we saw with <code>nodemailer</code> and NodeJS. It is nigh impossible to have an IPv6 only setup in the real world, rather than in just a homelab situation where you control everything.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/ipv6-only-adventures</guid>
      <pubDate>Mon, 23 Feb 2026 10:51:30 +0000</pubDate>
    </item>
    <item>
      <title>Over the moon</title>
      <link>https://stealthycoder.writeas.com/over-the-moon?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I recently switched to Rosé Pine as my theme. I just only had the GNOME Shell being Catppuccin. I forgot how I did it back then, but I discovered in my history of searching the following Colloid GTK Theme repo. That saved me. I cloned it locally, then added the necessary files. They even supplied rendering the assets for us. &#xA;&#xA;What I think I will do is in the coming days is either make a full fledged PR for Rosé Pine or just have it on my own GitHub with a fork, so I can just maintain it there. I am not sure yet. &#xA;&#xA;My DE looks very nice though currently. The last thing I need to figure out is the default background for things like the file manager and such. &#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>I recently switched to <a href="https://rosepinetheme.com" rel="nofollow">Rosé Pine</a> as my theme. I just only had the GNOME Shell being Catppuccin. I forgot how I did it back then, but I discovered in my history of searching the following <a href="https://github.com/vinceliuice/Colloid-gtk-theme" rel="nofollow">Colloid GTK Theme repo</a>. That saved me. I cloned it locally, then added the necessary files. They even supplied rendering the assets for us.</p>

<p>What I think I will do is in the coming days is either make a full fledged PR for Rosé Pine or just have it on my own GitHub with a fork, so I can just maintain it there. I am not sure yet.</p>

<p>My DE looks very nice though currently. The last thing I need to figure out is the default background for things like the file manager and such.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/over-the-moon</guid>
      <pubDate>Wed, 06 Aug 2025 10:09:45 +0000</pubDate>
    </item>
    <item>
      <title>While I am at it</title>
      <link>https://stealthycoder.writeas.com/while-i-am-at-it?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Another short and sweet post. I decided I wanted to change up my theme again. Once every so often it is good to do this. However I do like everything to be as consistent as possible. I understand not everything can be done that way, but a one off theme for NeoVim that has no counterparts in Terminal, GNOME Shell, and the like will not be one I choose. I settled on Rosé Pine Moon. It is quite lovely, whenever I fully have time I will use this as my base but make it all dark purples and oranges and golden yellows. ]]&gt;</description>
      <content:encoded><![CDATA[<p>Another short and sweet post. I decided I wanted to change up my theme again. Once every so often it is good to do this. However I do like everything to be as consistent as possible. I understand not everything can be done that way, but a one off theme for NeoVim that has no counterparts in Terminal, GNOME Shell, and the like will not be one I choose. I settled on <a href="https://rosepinetheme.com/" rel="nofollow">Rosé Pine Moon</a>. It is quite lovely, whenever I fully have time I will use this as my base but make it all dark purples and oranges and golden yellows.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/while-i-am-at-it</guid>
      <pubDate>Tue, 05 Aug 2025 13:22:57 +0000</pubDate>
    </item>
    <item>
      <title>Really learning NeoVim</title>
      <link>https://stealthycoder.writeas.com/really-learning-neovim?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I started using Vi, Vim and NeoVim a while ago already. At least 10 years already or so. I just realise I was at the start of NeoVim. In the meantime I used some different NeoVim distros:&#xA;&#xA; SpaceVim&#xA; NvChad&#xA; LunarVim&#xA; AstroVim -  AstroNvim&#xA;&#xA;I did that meme of the graph where noob uses little to no stuff, in the middle you do all this fancy stuff and then at the right you are at the other extreme and you use little to no stuff again. I am at the right side again. &#xA;&#xA;When I started I found the fact you had to learn the config and use Plug or Vundle. Then in recent years the Lazy.nvim came to the market, and everyone is using that now. Well with NeoVim 0.12 release we get native package manager. &#xA;&#xA;So I decided to redo my config from scratch and instead of having a tonne of extra features that I will never use, just pull in the features I like and actually use and whenever I run into a problem of how do I this or how should do I that, just implement it at that time. &#xA;&#xA;My current config of init.lua for my NeoVim is about 145 lines long and most of that is enabling different LSPs and TreeSitters.  These are the plugins I use currently:&#xA;&#xA;vim.pack.add({&#xA;  { src = &#34;https://github.com/catppuccin/nvim&#34; },&#xA;  { src = &#34;https://github.com/stevearc/oil.nvim&#34; },&#xA;  { src = &#34;https://github.com/echasnovski/mini.pick&#34; },&#xA;  { src = &#34;https://github.com/echasnovski/mini.comment&#34; },&#xA;  { src = &#34;https://github.com/echasnovski/mini.pairs&#34; },&#xA;  { src = &#34;https://github.com/echasnovski/mini.icons&#34; },&#xA;  { src = &#34;https://github.com/nvim-treesitter/nvim-treesitter&#34; },&#xA;  { src = &#34;https://github.com/folke/twilight.nvim&#34; },&#xA;  { src = &#34;https://github.com/folke/todo-comments.nvim&#34; },&#xA;  { src = &#34;https://github.com/MeanderingProgrammer/render-markdown.nvim&#34; },&#xA;  { src = &#34;https://github.com/michaelrommel/nvim-silicon&#34; },&#xA;})&#xA;These are the bare minimum I feel I use to do my programming in a nice flow. As you can see, there is no Mason, one can just follow the instructions contained in the LSP config lua files I feel. I rarely setup a complete dev flow to test out a new language. Usually in that case I just run a simple Docker container that has the config and tools I need. ]]&gt;</description>
      <content:encoded><![CDATA[<p>I started using Vi, Vim and NeoVim a while ago already. At least 10 years already or so. I just realise I was at the start of NeoVim. In the meantime I used some different NeoVim distros:</p>
<ul><li>SpaceVim</li>
<li>NvChad</li>
<li>LunarVim</li>
<li>AstroVim –&gt; AstroNvim</li></ul>

<p>I did that meme of the graph where noob uses little to no stuff, in the middle you do all this fancy stuff and then at the right you are at the other extreme and you use little to no stuff again. I am at the right side again.</p>

<p>When I started I found the fact you had to learn the config and use <code>Plug</code> or <code>Vundle</code>. Then in recent years the <code>Lazy.nvim</code> came to the market, and everyone is using that now. Well with <code>NeoVim</code> 0.12 release we get native package manager.</p>

<p>So I decided to redo my config from scratch and instead of having a tonne of extra features that I will never use, just pull in the features I like and actually use and whenever I run into a problem of how do I this or how should do I that, just implement it at that time.</p>

<p>My current config of <code>init.lua</code> for my NeoVim is about 145 lines long and most of that is enabling different <code>LSP</code>s and <code>TreeSitter</code>s.  These are the plugins I use currently:</p>

<pre><code class="language-lua">vim.pack.add({
  { src = &#34;https://github.com/catppuccin/nvim&#34; },
  { src = &#34;https://github.com/stevearc/oil.nvim&#34; },
  { src = &#34;https://github.com/echasnovski/mini.pick&#34; },
  { src = &#34;https://github.com/echasnovski/mini.comment&#34; },
  { src = &#34;https://github.com/echasnovski/mini.pairs&#34; },
  { src = &#34;https://github.com/echasnovski/mini.icons&#34; },
  { src = &#34;https://github.com/nvim-treesitter/nvim-treesitter&#34; },
  { src = &#34;https://github.com/folke/twilight.nvim&#34; },
  { src = &#34;https://github.com/folke/todo-comments.nvim&#34; },
  { src = &#34;https://github.com/MeanderingProgrammer/render-markdown.nvim&#34; },
  { src = &#34;https://github.com/michaelrommel/nvim-silicon&#34; },
})
</code></pre>

<p>These are the bare minimum I feel I use to do my programming in a nice flow. As you can see, there is no <code>Mason</code>, one can just follow the instructions contained in the LSP config lua files I feel. I rarely setup a complete dev flow to test out a new language. Usually in that case I just run a simple Docker container that has the config and tools I need.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/really-learning-neovim</guid>
      <pubDate>Tue, 05 Aug 2025 07:57:42 +0000</pubDate>
    </item>
    <item>
      <title>Can you just focus on more important things PHP?</title>
      <link>https://stealthycoder.writeas.com/can-you-just-focus-on-more-important-things-php?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[This will be a short and sweet post. I just read about the fact they announced the pipe operator |  for PHP. This means you can flow the data through functions to modify it and such. That is fantastic for the few times you may have a need for it. The other times you will use it because you feel obligated or just are enticed to do so. You cannot help yourself, it is there so you will use it. &#xA;&#xA;Meanwhile, one still cannot send a application/json mimetype request to PHP server out of the box and get the variables in:&#xA;&#xA;function auth() {&#xA;    $username = $POST[&#34;username&#34;];&#xA;   // The rest&#xA;}&#xA;&#xA;Whereas, as far as I can tell the only change needed is right here. Just add the handler for the JSON one based on the example code that is already there. They did not do this for the last 15 years, where application/json has definitely become of the main stays of web development. No let us focus on bringing functional programming to PHP of all things. At least these days you cannot use the argument anymore that PHP is not a compiled language. ]]&gt;</description>
      <content:encoded><![CDATA[<p>This will be a short and sweet post. I just read about the fact they announced the pipe operator <em>|&gt;</em> for PHP. This means you can flow the data through functions to modify it and such. That is fantastic for the few times you may have a need for it. The other times you will use it because you feel obligated or just are enticed to do so. You cannot help yourself, it is there so you will use it.</p>

<p>Meanwhile, one still cannot send a <code>application/json</code> mimetype request to PHP server out of the box and get the variables in:</p>

<pre><code class="language-php">function auth() {
    $username = $_POST[&#34;username&#34;];
   // The rest
}
</code></pre>

<p>Whereas, as far as I can tell the only change needed is right <a href="https://github.com/php/php-src/blob/master/main/php_content_types.c#L23C1-L29" rel="nofollow">here</a>. Just add the handler for the JSON one based on the example code that is already there. They did not do this for the last 15 years, where <code>application/json</code> has definitely become of the main stays of web development. No let us focus on bringing functional programming to PHP of all things. At least these days you cannot use the argument anymore that PHP is not a compiled language.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/can-you-just-focus-on-more-important-things-php</guid>
      <pubDate>Tue, 05 Aug 2025 07:27:19 +0000</pubDate>
    </item>
    <item>
      <title>Always forgetting something</title>
      <link>https://stealthycoder.writeas.com/always-forgetting-something?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I always have this sensation that I am forgetting to take something with me, or leaving something behind whenever I leave a restaurant, tourist attraction, a friend&#39;s house or going home from the vacation. Well it also happens when I move systems, distros or what have you. !--more--&#xA;&#xA;Pop!\OS shenanigans&#xA;&#xA;So I ran Pop!\OS from System76 for years now. I had a brief stint with Arch in the form of EndeavourOS again, but like I said in the past; You need a stable driver for your work life. So I ran this for quite some time, being quite content with it. They opted to go and make their own Desktop Environment (DE) named Cosmic. Which has been in alpha state for years now, it is slowly coming out to a beta point though. I am also using ghostty these days and I wanted to update it. I reran my zig command to build it and it failed. It needed a newer version of zig. No problem. I installed the newer version of zig. It failed again with the build but now it was a compile error. Something to do with libadwaita in the end, it needed to be a higher version. It is what is being used to make the actual widgets on screen in GTK based systems. Well I tried to compile newer libadwaita version from the repo, but it needed a newer glib version. I could not begin to compile that. &#xA;&#xA;New plan. I happened to look at the Pop!\OS repositories and saw they now had noble alongside jammy. I switched everything to noble in the /etc/apt/sources.list.d/ and started my upgrade journey. Well 1000s of packages, and about 5 hrs of running apt --fix-broken install followed by dpkg --force-breaks install, dpkg --force-depends remove and dpkg --configure -a later, I had a working system again. In the meantime I rebooted, and did not even get a screen. It was just black, luckily Pop!OS has a old kernel entry in Grub and even a recovery partition. &#xA;&#xA;Then I was greeted with the Cosmic desktop. I did not ask for this, but as part of the upgrade to noble you get Cosmic DE for free. Well needless to say it did not work smoothly all of it. The one thing that was possible now though, was to upgrade ghostty, only to find out it did not work anymore in this DE. When I switch tabs now, it crashes. Fantastic. Okay back to kitty, that also does not work anymore. Even worse. I find out Alt+\ does not work anymore. I tried to dconf` editor new short cuts for things, but the fact is Cosmic just did not code it in. So it won&#39;t work. Now I thought I could live without that, but no it turns out I use that shortcut all the time. It is to switch to other windows of the same group essentially. So between all your Firefox windows, or for me, all the terminal windows I have open. &#xA;&#xA;Cosmic&#xA;&#xA;It did look nice though. I cannot remember this now anymore, but I believe it did support different scaling on two monitors. Something I found out X11 does not do. It felt snappy, but also with a hint of uneasiness about it. I think they severely underestimated what it takes to write/implement a DE. &#xA;&#xA;Before the big move&#xA;&#xA;Well I wanted to keep all my important data. So I copied everything over to a spare server with some room and SSHFS mounted a directory to copy stuff over. Well actually I mv-ed things over first. That failed and then that made me lose some data already. Next I forgot the two most important things to copy:&#xA; SSH keys&#xA; GPG keys&#xA;&#xA;Luckily I had my GPG key from my EndeavourOS disaster, and my SSH keys are not being used anywhere else other than my own servers which I can log in to and GitHub which is easily fixed. &#xA;&#xA;So when I was installing my new system and setting it all up, that feeling of forgetting something crept up and manifested itself nicely and then you have that sinking pit in your stomach feeling of will this be horrible or not. It all turned out okay in the end. &#xA;&#xA;Budgie&#xA;&#xA;I tried out Solus Budgie a while back and I loved it. It felt so snappy, clean, and good. I thought if I ever have to move to another system, it will be that one. So now was the time. Sadly Budgie is not on Wayland yet. So that meant X11. I did not see the harm in this. Turns out X11 cannot handle different scaling factors on different monitors. So either my 4k laptop screen looks fine and my monitor is absolutely huge, or my monitor looks great but my 4k laptop screen is absolutely tiny and illegible. So I turn to Solus GNOME. It is wayland after install. I have customised it again to be all Catppuccin and I am cozy and calm again behind my laptop. The only thing I did not get to work on either ghostty or kitty again here are the italics. So then I stuck with the GNOME terminal, and it seems to be working now. I still like VictorMono as a font and I configured AstroNvim to have comments be italicized so they look all nice and cursive. You can extend this to function definitions and what have you. &#xA;&#xA;Conclusion&#xA;&#xA;I will probably always forget something, but next time I really need to save my keys. I am currently looking at my nice icons and cozyness that makes working at least a little nicer. An added benefit is that my Firefox is working again normally too. It can finally not stop breaking when I wanted to skip to a section in the video. &#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>I always have this sensation that I am forgetting to take something with me, or leaving something behind whenever I leave a restaurant, tourist attraction, a friend&#39;s house or going home from the vacation. Well it also happens when I move systems, distros or what have you. </p>

<h2 id="pop-os-shenanigans" id="pop-os-shenanigans">Pop!_OS shenanigans</h2>

<p>So I ran Pop!_OS from System76 for years now. I had a brief stint with Arch in the form of EndeavourOS again, but like I said in the past; You need a stable driver for your work life. So I ran this for quite some time, being quite content with it. They opted to go and make their own Desktop Environment (DE) named Cosmic. Which has been in alpha state for years now, it is slowly coming out to a beta point though. I am also using <code>ghostty</code> these days and I wanted to update it. I reran my <code>zig</code> command to build it and it failed. It needed a newer version of <code>zig</code>. No problem. I installed the newer version of <code>zig</code>. It failed again with the build but now it was a compile error. Something to do with <code>libadwaita</code> in the end, it needed to be a higher version. It is what is being used to make the actual widgets on screen in GTK based systems. Well I tried to compile newer <code>libadwaita</code> version from the repo, but it needed a newer <code>glib</code> version. I could not begin to compile that.</p>

<p>New plan. I happened to look at the Pop!_OS repositories and saw they now had <code>noble</code> alongside <code>jammy</code>. I switched everything to <code>noble</code> in the <code>/etc/apt/sources.list.d/</code> and started my upgrade journey. Well 1000s of packages, and about 5 hrs of running <code>apt --fix-broken install</code> followed by <code>dpkg --force-breaks install</code>, <code>dpkg --force-depends remove</code> and <code>dpkg --configure -a</code> later, I had a working system again. In the meantime I rebooted, and did not even get a screen. It was just black, luckily Pop!_OS has a old kernel entry in Grub and even a recovery partition.</p>

<p>Then I was greeted with the Cosmic desktop. I did not ask for this, but as part of the upgrade to <code>noble</code> you get Cosmic DE for free. Well needless to say it did not work smoothly all of it. The one thing that was possible now though, was to upgrade <code>ghostty</code>, only to find out it did not work anymore in this DE. When I switch tabs now, it crashes. Fantastic. Okay back to <code>kitty</code>, that also does not work anymore. Even worse. I find out <strong>Alt+`</strong> does not work anymore. I tried to <code>dconf</code> editor new short cuts for things, but the fact is Cosmic just did not code it in. So it won&#39;t work. Now I thought I could live without that, but no it turns out I use that shortcut all the time. It is to switch to other windows of the same group essentially. So between all your Firefox windows, or for me, all the terminal windows I have open.</p>

<h2 id="cosmic" id="cosmic">Cosmic</h2>

<p>It did look nice though. I cannot remember this now anymore, but I believe it did support different scaling on two monitors. Something I found out X11 does not do. It felt snappy, but also with a hint of uneasiness about it. I think they severely underestimated what it takes to write/implement a DE.</p>

<h2 id="before-the-big-move" id="before-the-big-move">Before the big move</h2>

<p>Well I wanted to keep all my important data. So I copied everything over to a spare server with some room and SSHFS mounted a directory to copy stuff over. Well actually I <code>mv</code>-ed things over first. That failed and then that made me lose some data already. Next I forgot the two most important things to copy:
 – SSH keys
 – GPG keys</p>

<p>Luckily I had my GPG key from my EndeavourOS disaster, and my SSH keys are not being used anywhere else other than my own servers which I can log in to and GitHub which is easily fixed.</p>

<p>So when I was installing my new system and setting it all up, that feeling of forgetting something crept up and manifested itself nicely and then you have that sinking pit in your stomach feeling of will this be horrible or not. It all turned out okay in the end.</p>

<h2 id="budgie" id="budgie">Budgie</h2>

<p>I tried out Solus Budgie a while back and I loved it. It felt so snappy, clean, and good. I thought if I ever have to move to another system, it will be that one. So now was the time. Sadly Budgie is not on Wayland yet. So that meant X11. I did not see the harm in this. Turns out X11 cannot handle different scaling factors on different monitors. So either my 4k laptop screen looks fine and my monitor is absolutely huge, or my monitor looks great but my 4k laptop screen is absolutely tiny and illegible. So I turn to Solus GNOME. It is wayland <strong>after install</strong>. I have customised it again to be all Catppuccin and I am cozy and calm again behind my laptop. The only thing I did not get to work on either <code>ghostty</code> or <code>kitty</code> again here are the italics. So then I stuck with the GNOME terminal, and it seems to be working now. I still like VictorMono as a font and I configured AstroNvim to have comments be italicized so they look all nice and cursive. You can extend this to function definitions and what have you.</p>

<h2 id="conclusion" id="conclusion">Conclusion</h2>

<p>I will probably always forget something, but next time I really need to save my keys. I am currently looking at my nice icons and cozyness that makes working at least a little nicer. An added benefit is that my Firefox is working again normally too. It can finally not stop breaking when I wanted to skip to a section in the video.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/always-forgetting-something</guid>
      <pubDate>Thu, 24 Apr 2025 08:48:03 +0000</pubDate>
    </item>
  </channel>
</rss>