<?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>Sat, 04 Apr 2026 07:35:15 +0000</pubDate>
    <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>
    <item>
      <title>Ghosts in the shell</title>
      <link>https://stealthycoder.writeas.com/ghosts-in-the-shell?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[This post will be short and sweet. I had heard about Ghostty already before it publicly made a 1.0 release. Sometimes at first you cannot quite understand or grasp why something should be an improvement or what the purpose of something is or what it is trying to solve. &#xA;&#xA;Docker, Rust, WASM, and many other things are on that list for me. Some I have figured out, some maybe not yet really. &#xA;&#xA;Well the big selling point that Ghostty has is it is fast, feature rich and native. That last part is really important. Kitty is sort of native, but not when it concerns it tabs for instance. They are a non-native widget. &#xA;&#xA;This means that if you install Ghostty on Windows, Linux and MacOS you can re-use your configuration and get the same experience. &#xA;&#xA;So I am switching to Ghostty with everything. On a side-note I am still debating if using tmux improves my flow or not. ]]&gt;</description>
      <content:encoded><![CDATA[<p>This post will be short and sweet. I had heard about <a href="https://ghostty.org/" rel="nofollow">Ghostty</a> already before it publicly made a 1.0 release. Sometimes at first you cannot quite understand or grasp why something should be an improvement or what the purpose of something is or what it is trying to solve.</p>

<p>Docker, Rust, WASM, and many other things are on that list for me. Some I have figured out, some maybe not yet really.</p>

<p>Well the big selling point that Ghostty has is it is fast, feature rich and <strong>native</strong>. That last part is really important. Kitty is sort of native, but not when it concerns it tabs for instance. They are a non-native widget.</p>

<p>This means that if you install Ghostty on Windows, Linux and MacOS you can re-use your configuration and get the same experience.</p>

<p>So I am switching to Ghostty with everything. On a side-note I am still debating if using <code>tmux</code> improves my flow or not.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/ghosts-in-the-shell</guid>
      <pubDate>Tue, 31 Dec 2024 19:31:40 +0000</pubDate>
    </item>
    <item>
      <title>Nostalgia tour</title>
      <link>https://stealthycoder.writeas.com/nostalgia-tour?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I decided on making a useless side project. The reason? I needed a win and a distraction and it is just something that bubbles up every once in a while. !--more--&#xA;&#xA;What is it?&#xA;&#xA;Well the project is making palette for all kinds of niche/esoteric platforms. Like make one for Windows 3.11, YSMenu for the Nintendo DS or MS-DOS. Those types of situations where you have to use the platform, I like it to be personalised. It is really difficult to make it all cohesive. This is because for example for Windows 3.11, you only have 8-bit 256 colors. However that relies on dithering and on a modern monitor dithering does not do the same as on a CRT monitor for example.&#xA;&#xA;CRT and AI&#xA;&#xA;I tried asking some AI LLMs out there (Gemini, Claude, ChatGPT and the like) if you can have a VM running Windows 3.11 emulate a CRT monitor. Options that came back were pipe the video output into ffmpeg, no it is not possible and use VBoxManage to control the framebuffer output, maybe script it with Python.&#xA;&#xA;Of those mentioned, one kind of worked. I did record my session from VirtualBox, then pipe it into ffmpeg with some filters and streamed that into VLC. It showed me some nice video and it worked albeit with a slight delay, but I thought there has to be a better way. Luckily for me there are more emulation setups our there, then just VirtualBox. I looked at DosBox and DosBox-X etc, but it did not allow me to do simple things to the video output. &#xA;&#xA;Then I remembered PCem as a project. It was very difficult to get going. I could not compile it and I gave up on this. I did not want to spend my time fixing compiler errors in my spare time. Props to them for making an awesome emulator, but I cannot get it to work in a jiffy on Linux. &#xA;&#xA;Then somebody mentioned 86Box, and I remembered that one as well. I had all those things already bookmarked, but never was able to actually work on it. &#xA;&#xA;86Box to the rescue&#xA;&#xA;Well it was not easy to get this one going, but at least they supplied a working binary out the gate. I downloaded a release, then the mandatory romset and nothing worked yet. Turned out you also need a nice manager to run everything. I went with 86BoxManager that could run cross platform. &#xA;&#xA;Now I had my manager that could create VMs and then I could configure that to be hyper specific. That is so overwhelming. I just tried to get going, and I got a working system after clicking around just a bit. I installed MS-DOS 6.22 first and then went on installing Windows 3.11. &#xA;&#xA;This was grand. I felt like I was right back in my childhood again, just clicking away in Windows 3.11. Barely understanding what I was doing but I could open Paint and I could change the way everything looked and I could run a calculator on my machine. &#xA;&#xA;Back then I already fell in love of personalizing the computer. That was one of my first creative outlets I think. I always love tinkering with the settings, seeing what looked nice and trying out stuff.&#xA;&#xA;  I also recently learned there is such a thing as #DOSCember so maybe next year I will participate. &#xA;&#xA;CRT&#xA;&#xA;Okay but now the story isn&#39;t ready yet, because I needed CRT. Well there exist another great wonderful project from libretro. It contains all the shaders you ever wanted to make something emulate something else. Lots of people contributed their best versions of what they think is the best one. &#xA;&#xA;The moment I applied on the shaders to my machine that sort of worked, was this one, it immediately looked better. It felt like home. The colors blended already nicely. The contrast with the modern looking VirtualBox I had running alongside it was stark indeed. &#xA;&#xA;Conclusion&#xA;&#xA;I am just happy I live in an age where I can relatively easily go back in time to my childhood and try out things again. I can also close off certain chapters again, by completing some task I might have had in my head for years on end. &#xA;&#xA;Also AI is nice and all, but it definitely has its limitations. Sometimes you just got to work stuff out yourself. ]]&gt;</description>
      <content:encoded><![CDATA[<p>I decided on making a useless side project. The reason? I needed a win and a distraction and it is just something that bubbles up every once in a while. </p>

<h1 id="what-is-it" id="what-is-it">What is it?</h1>

<p>Well the project is making <a href="https://github.com/StealthyCoder/palette" rel="nofollow">palette</a> for all kinds of niche/esoteric platforms. Like make one for Windows 3.11, YSMenu for the Nintendo DS or MS-DOS. Those types of situations where you have to use the platform, I like it to be personalised. It is really difficult to make it all cohesive. This is because for example for Windows 3.11, you only have 8-bit 256 colors. However that relies on dithering and on a modern monitor dithering does not do the same as on a CRT monitor for example.</p>

<h2 id="crt-and-ai" id="crt-and-ai">CRT and AI</h2>

<p>I tried asking some AI LLMs out there (Gemini, Claude, ChatGPT and the like) if you can have a VM running Windows 3.11 emulate a CRT monitor. Options that came back were pipe the video output into <code>ffmpeg</code>, no it is <strong>not</strong> possible and use <code>VBoxManage</code> to control the framebuffer output, maybe script it with Python.</p>

<p>Of those mentioned, one kind of worked. I did record my session from VirtualBox, then pipe it into <code>ffmpeg</code> with some filters and streamed that into <code>VLC</code>. It showed me some nice video and it worked albeit with a slight delay, but I thought there has to be a better way. Luckily for me there are more emulation setups our there, then just VirtualBox. I looked at <a href="https://www.dosbox.com/" rel="nofollow">DosBox</a> and <a href="https://dosbox-x.com/" rel="nofollow">DosBox-X</a> etc, but it did not allow me to do simple things to the video output.</p>

<p>Then I remembered <a href="https://pcem-emulator.co.uk/" rel="nofollow">PCem</a> as a project. It was very difficult to get going. I could not compile it and I gave up on this. I did not want to spend my time fixing compiler errors in my spare time. Props to them for making an awesome emulator, but I cannot get it to work in a jiffy on Linux.</p>

<p>Then somebody mentioned <a href="https://86box.readthedocs.io/" rel="nofollow">86Box</a>, and I remembered that one as well. I had all those things already bookmarked, but never was able to actually work on it.</p>

<h2 id="86box-to-the-rescue" id="86box-to-the-rescue">86Box to the rescue</h2>

<p>Well it was not easy to get this one going, but at least they supplied a working binary out the gate. I downloaded a release, then the mandatory romset and nothing worked yet. Turned out you also need a nice manager to run everything. I went with <a href="https://github.com/RetBox/86BoxManagerX/releases/tag/v1.7.6.0e" rel="nofollow">86BoxManager</a> that could run cross platform.</p>

<p>Now I had my manager that could create VMs and then I could configure that to be hyper specific. That is so overwhelming. I just tried to get going, and I got a working system after clicking around just a bit. I installed MS-DOS 6.22 first and then went on installing Windows 3.11.</p>

<p>This was grand. I felt like I was right back in my childhood again, just clicking away in Windows 3.11. Barely understanding what I was doing but I could open Paint and I could change the way everything looked and I could run a calculator on my machine.</p>

<p>Back then I already fell in love of personalizing the computer. That was one of my first creative outlets I think. I always love tinkering with the settings, seeing what looked nice and trying out stuff.</p>

<blockquote><p>I also recently learned there is such a thing as <code>#DOSCember</code> so maybe next year I will participate.</p></blockquote>

<h2 id="crt" id="crt">CRT</h2>

<p>Okay but now the story isn&#39;t ready yet, because I needed CRT. Well there exist another great wonderful project from <a href="https://github.com/libretro/glsl-shaders/" rel="nofollow">libretro</a>. It contains all the shaders you ever wanted to make something emulate something else. Lots of people contributed their best versions of what they think is the best one.</p>

<p>The moment I applied on the shaders to my machine that sort of worked, was <a href="https://github.com/libretro/glsl-shaders/blob/master/crt/shaders/crt-easymode.glsl" rel="nofollow">this one</a>, it immediately looked better. It felt like home. The colors blended already nicely. The contrast with the modern looking VirtualBox I had running alongside it was stark indeed.</p>

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

<p>I am just happy I live in an age where I can relatively easily go back in time to my childhood and try out things again. I can also close off certain chapters again, by completing some task I might have had in my head for years on end.</p>

<p>Also AI is nice and all, but it definitely has its limitations. Sometimes you just got to work stuff out yourself.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/nostalgia-tour</guid>
      <pubDate>Tue, 31 Dec 2024 19:16:52 +0000</pubDate>
    </item>
  </channel>
</rss>