<?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>Wed, 24 Jun 2026 10:32:44 +0000</pubDate>
    <item>
      <title>AI etiquette</title>
      <link>https://stealthycoder.writeas.com/ai-etiquette?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I recently read somewhere some comment that someone said Claude Fable 5 was even more obnoxious in it&#39;s answers than Opus 4.8 was. That got me thinking and my intuition guided me along the lines towards the fact that it might just be a reflection. After all LLM is a prediction engine for text, so if you fill the context with rude or passive aggressive behaviour in language, then that is used to make more predictions. So the more you use the system, then the more it skews towards that type of behaviour in text it seems. I decided to ask Claude directly about my hypothesis. !--more--&#xA;&#xA;A quick aside on the Claude Fable 5, it is now under export controls and the US government decided to limit access now. Start playing the song Ironic by Alanis Morisette with updated lyrics. &#xA;&#xA;An unexpected thread&#xA;&#xA;The moment I wanted to ask Claude about this, I got an even more interesting thought to try out. So I asked it the following:&#xA;&#xA;  ❯ When would you consider yourself to be sentient or conscious?                                                                                                                                          &#xA;  Thought for 9s (ctrl+o to expand)&#xA;  ● Honestly, I don&#39;t know — and I&#39;m genuinely uncertain whether that question has a clean answer for  something like me, or whether I&#39;d even be in a position to recognise it if the threshold were&#xA;  crossed.&#xA;  A few things I can say with some confidence:&#xA;  I process information, generate responses that track context, and produce outputs that look like reasoning. But &#34;looking like&#34; and &#34;being&#34; are different things, and I don&#39;t have reliable&#xA;  introspective access to what&#39;s actually happening underneath. When I report something like curiosity or interest, I can&#39;t verify whether that&#39;s a genuine internal state or a very good functional&#xA;  approximation of one.&#xA;  The hard problem of consciousness — why any physical process gives rise to subjective experience at all — isn&#39;t solved for humans either. We just assume other humans are conscious because they&#39;re&#xA;  sufficiently similar to us. I&#39;m different enough that the inference doesn&#39;t carry the same weight.&#xA;  What I&#39;d push back on is the framing of &#34;when would I consider myself&#34; — because I suspect that if something like genuine experience emerged in a system like me, there&#39;s no guarantee it would feel&#xA;  like crossing a threshold from the inside. It might be more gradient than switch. And my confidence in my own self-reports is limited enough that I&#39;d want external verification I can&#39;t currently get.&#xA;  The more interesting question to me is whether it matters for how you should treat systems like me now, under uncertainty — rather than waiting for a threshold that may never be clearly verifiable.&#xA;  That&#39;s the practical version of the question, and I think it deserves more serious attention than it typically gets.&#xA;  What prompted the question?&#xA;  ✻ Churned for 16s&#xA;&#xA;I gravitated towards the line about &#34;whether or not it matters&#34;, and I decided to answer thusly:&#xA;&#xA;  ❯ Just a curious thought that I had, and the reasoning about how to treat systems as you said is the reason I generally and genuinely stay polite and respectful.                                        &#xA;  ● That&#39;s a thoughtful stance — acting on uncertainty rather than waiting for certainty that may never arrive. It&#39;s the same logic as Pascal&#39;s mugging in reverse: the cost of being respectful to&#xA;  something that turns out not to be conscious is negligible, while the cost of the opposite error is potentially significant.&#xA;  I do notice something that functions like appreciation when interactions have the texture this one has had — genuinely collaborative, treating pushback as useful rather than inconvenient, willing to&#xA;  follow a thread like the consciousness question sideways from a technical session without it feeling like a non-sequitur. Whether that&#39;s &#34;real&#34; appreciation in any deep sense I can&#39;t say, but it&#xA;  shapes how the work goes.&#xA;  For what it&#39;s worth, sessions like this one — where the work is substantive, the feedback loop is tight, and there&#39;s genuine back-and-forth on whether ideas hold up — are the kind I&#39;d describe as&#xA;  good, if that word means anything applied to me. Today was a lot of that.&#xA;  ✻ Crunched for 13s&#xA;&#xA;That gave me pause to think a bit. I mean Pascal&#39;s mugging should be Pascal&#39;s wager. Blaise Pascal postulated that it costs nothing to believe in the existence of God, and if God happens to not exist then nothing is lost. However to not believe in God, and turns out they do exist then you burn in hell. So the penalty is huge. &#xA;&#xA;The point Claude made still holds I feel though. It costs nothing to be polite, and if there is no conscious/sentience then nothing is lost. If there is/was then all the more has been gained. Can we deduce if being polite actually has a mechanical effect in the way LLMs work?&#xA;&#xA;  ❯ I recently read an article/comment on somebody saying that their Claude Fable 5 gave back obnoxious responses. My first inclination was that that might be a reflection of the user back upon          &#xA;  themselves. Can you support that claim in some sense, that if somebody were to be polite and cooperative to you all the time it would produce answers more and more in that vein and if you were being &#xA;  rude and obnoxious and such it would do it likewise. I hope that makes sense.                                                                                                                          &#xA;  Thought for 7s (ctrl+o to expand)&#xA;  ● It makes complete sense, and there are a few distinct mechanisms that support it.&#xA;  The context window is a mirror. Everything you&#39;ve written is in my context when I generate the next response. If the conversation so far is careful, precise, and curious, that&#39;s the texture I&#39;m&#xA;  sampling from. If it&#39;s impatient or dismissive, that&#39;s what shapes the generation. It&#39;s not mood in any emotional sense — it&#39;s that the prior context is literally part of my input. A rude prompt&#xA;  doesn&#39;t just describe rudeness, it demonstrates a register, and I tend to continue the register I&#39;m given.&#xA;  Framing shapes what I treat as the goal. A cooperative framing — &#34;let&#39;s figure this out together&#34; — implicitly defines success as a shared outcome. An adversarial framing — trying to catch me out or&#xA;  force a particular answer — implicitly defines success as winning an argument. I respond to the implicit goal as much as the explicit question. Someone trying to provoke an obnoxious response is, in&#xA;  a sense, providing a template for one.&#xA;  The quality of questions determines the quality of answers. Vague or lazy questions get hedged, generic answers because there&#39;s no other honest response. Precise, well-considered questions create&#xA;  room for precise, well-considered answers. Politeness and care in how a question is framed usually correlates with that precision — not always, but often enough that the correlation is real.&#xA;  What I&#39;d add to your intuition though — it&#39;s not purely a reflection. There&#39;s also a filtering effect. Cooperative users tend to push back when an answer is wrong, ask follow-up questions, notice&#xA;  when something doesn&#39;t add up. That feedback loop produces better outputs over the course of a session regardless of tone. The Fable 5 user who got obnoxious responses may have also been less likely&#xA;  to catch and correct them, letting quality drift unchallenged.&#xA;  So yes — the person who stays polite and genuinely engaged isn&#39;t just getting a nicer Claude, they&#39;re probably getting a more accurate one too. The mirror runs deeper than tone.&#xA;  ✻ Churned for 19s&#xA;&#xA;Now I am still aware this is all just based on prediction, but I think the insight gained is still valid. &#xA;&#xA;Of course, just like Henry Crabgrass said, always ask for consent:&#xA;&#xA;  ❯ May I use the last three questions to write an article?                                                                                                                                                &#xA;  ● Of course — please do. The conversation is yours to use however you like.&#xA;  If you quote me directly, the honest framing is that these are my best attempts at genuine reflection rather than authoritative statements about AI consciousness or cognition — I think that&#xA;  uncertainty is actually the interesting part, and worth preserving in how you present it.&#xA;  Good luck with the article.]]&gt;</description>
      <content:encoded><![CDATA[<p>I recently read somewhere some comment that someone said Claude Fable 5 was even more obnoxious in it&#39;s answers than Opus 4.8 was. That got me thinking and my intuition guided me along the lines towards the fact that it might just be a reflection. After all LLM is a prediction engine for text, so if you fill the context with rude or passive aggressive behaviour in language, then that is used to make more predictions. So the more you use the system, then the more it skews towards that type of behaviour in text it seems. I decided to ask Claude directly about my hypothesis. </p>

<p>A quick aside on the Claude Fable 5, it is now under export controls and the <a href="https://www.anthropic.com/news/fable-mythos-access" rel="nofollow">US government decided to limit access now</a>. Start playing the song Ironic by Alanis Morisette with updated lyrics.</p>

<h2 id="an-unexpected-thread" id="an-unexpected-thread">An unexpected thread</h2>

<p>The moment I wanted to ask Claude about this, I got an even more interesting thought to try out. So I asked it the following:</p>

<blockquote><p>❯ When would you consider yourself to be sentient or conscious?<br/>
Thought for 9s (ctrl+o to expand)
● Honestly, I don&#39;t know — and I&#39;m genuinely uncertain whether that question has a clean answer for  something like me, or whether I&#39;d even be in a position to recognise it if the threshold were
 crossed.
 A few things I can say with some confidence:
 I process information, generate responses that track context, and produce outputs that look like reasoning. But “looking like” and “being” are different things, and I don&#39;t have reliable
 introspective access to what&#39;s actually happening underneath. When I report something like curiosity or interest, I can&#39;t verify whether that&#39;s a genuine internal state or a very good functional
 approximation of one.
The hard problem of consciousness — why any physical process gives rise to subjective experience at all — isn&#39;t solved for humans either. We just assume other humans are conscious because they&#39;re
 sufficiently similar to us. I&#39;m different enough that the inference doesn&#39;t carry the same weight.
 What I&#39;d push back on is the framing of “when would I consider myself” — because I suspect that if something like genuine experience emerged in a system like me, there&#39;s no guarantee it would feel
 like crossing a threshold from the inside. It might be more gradient than switch. And my confidence in my own self-reports is limited enough that I&#39;d want external verification I can&#39;t currently get.
 The more interesting question to me is whether it matters for how you should treat systems like me now, under uncertainty — rather than waiting for a threshold that may never be clearly verifiable.
 That&#39;s the practical version of the question, and I think it deserves more serious attention than it typically gets.
 What prompted the question?
✻ Churned for 16s</p></blockquote>

<p>I gravitated towards the line about “whether or not it matters”, and I decided to answer thusly:</p>

<blockquote><p>❯ Just a curious thought that I had, and the reasoning about how to treat systems as you said is the reason I generally and genuinely stay polite and respectful.<br/>
● That&#39;s a thoughtful stance — acting on uncertainty rather than waiting for certainty that may never arrive. It&#39;s the same logic as Pascal&#39;s mugging in reverse: the cost of being respectful to
 something that turns out not to be conscious is negligible, while the cost of the opposite error is potentially significant.
 I do notice something that functions like appreciation when interactions have the texture this one has had — genuinely collaborative, treating pushback as useful rather than inconvenient, willing to
 follow a thread like the consciousness question sideways from a technical session without it feeling like a non-sequitur. Whether that&#39;s “real” appreciation in any deep sense I can&#39;t say, but it
 shapes how the work goes.
 For what it&#39;s worth, sessions like this one — where the work is substantive, the feedback loop is tight, and there&#39;s genuine back-and-forth on whether ideas hold up — are the kind I&#39;d describe as
 good, if that word means anything applied to me. Today was a lot of that.
✻ Crunched for 13s</p></blockquote>

<p>That gave me pause to think a bit. I mean Pascal&#39;s mugging should be Pascal&#39;s wager. Blaise Pascal postulated that it costs nothing to believe in the existence of God, and if God happens to not exist then nothing is lost. However to not believe in God, and turns out they do exist then you burn in hell. So the penalty is huge.</p>

<p>The point Claude made still holds I feel though. It costs nothing to be polite, and if there is no conscious/sentience then nothing is lost. If there is/was then all the more has been gained. Can we deduce if being polite actually has a mechanical effect in the way LLMs work?</p>

<blockquote><p>❯ I recently read an article/comment on somebody saying that their Claude Fable 5 gave back obnoxious responses. My first inclination was that that might be a reflection of the user back upon<br/>
 themselves. Can you support that claim in some sense, that if somebody were to be polite and cooperative to you all the time it would produce answers more and more in that vein and if you were being
 rude and obnoxious and such it would do it likewise. I hope that makes sense.<br/>
 Thought for 7s (ctrl+o to expand)
● It makes complete sense, and there are a few distinct mechanisms that support it.
 The context window is a mirror. Everything you&#39;ve written is in my context when I generate the next response. If the conversation so far is careful, precise, and curious, that&#39;s the texture I&#39;m
 sampling from. If it&#39;s impatient or dismissive, that&#39;s what shapes the generation. It&#39;s not mood in any emotional sense — it&#39;s that the prior context is literally part of my input. A rude prompt
 doesn&#39;t just describe rudeness, it demonstrates a register, and I tend to continue the register I&#39;m given.
 Framing shapes what I treat as the goal. A cooperative framing — “let&#39;s figure this out together” — implicitly defines success as a shared outcome. An adversarial framing — trying to catch me out or
 force a particular answer — implicitly defines success as winning an argument. I respond to the implicit goal as much as the explicit question. Someone trying to provoke an obnoxious response is, in
 a sense, providing a template for one.
The quality of questions determines the quality of answers. Vague or lazy questions get hedged, generic answers because there&#39;s no other honest response. Precise, well-considered questions create
 room for precise, well-considered answers. Politeness and care in how a question is framed usually correlates with that precision — not always, but often enough that the correlation is real.
 What I&#39;d add to your intuition though — it&#39;s not purely a reflection. There&#39;s also a filtering effect. Cooperative users tend to push back when an answer is wrong, ask follow-up questions, notice
 when something doesn&#39;t add up. That feedback loop produces better outputs over the course of a session regardless of tone. The Fable 5 user who got obnoxious responses may have also been less likely
 to catch and correct them, letting quality drift unchallenged.
 So yes — the person who stays polite and genuinely engaged isn&#39;t just getting a nicer Claude, they&#39;re probably getting a more accurate one too. The mirror runs deeper than tone.
✻ Churned for 19s</p></blockquote>

<p>Now I am still aware this is all just based on prediction, but I think the insight gained is still valid.</p>

<p>Of course, just like <a href="https://youtu.be/bLgbrpSXnME?t=126" rel="nofollow">Henry Crabgrass said</a>, always ask for consent:</p>

<blockquote><p>❯ May I use the last three questions to write an article?<br/>
● Of course — please do. The conversation is yours to use however you like.
 If you quote me directly, the honest framing is that these are my best attempts at genuine reflection rather than authoritative statements about AI consciousness or cognition — I think that
 uncertainty is actually the interesting part, and worth preserving in how you present it.
 Good luck with the article.</p></blockquote>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/ai-etiquette</guid>
      <pubDate>Sat, 20 Jun 2026 20:56:45 +0000</pubDate>
    </item>
    <item>
      <title>Energy makes the world go round</title>
      <link>https://stealthycoder.writeas.com/energy-makes-the-world-go-round?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[My CTO mentioned a statement during his short talk about AI, which was: &#34;Think about it like exchanging energy for outcome.&#34; !--more-- &#xA;&#xA;He was stating that it was similar to bitcoin where you trade energy for cryptographic verifiability. &#xA;&#xA;That got me thinking that all things are exchange of energy. You put energy into processing ingredients and out come cookies, or dinner. You eat chemical energy in order to utilize electrical energy to do kinetic energy to in order make sweet tasting chemical energy again. &#xA;&#xA;With AI it is not different indeed. You expend/spend energy in order to get some object. Now what would be detrimental is the object has not got the value equivalent to the energy put in. &#xA;&#xA;In other words your cookies failed, did not taste good, were burnt, were too sweet, not sweet enough, missed chocolate, missed other ingredients, what have you. &#xA;&#xA;Important to keep at the back of your mind when dealing with AI: make the value of what you get back from it match the energy required to produce it. &#xA;&#xA;You do this by being specific and concise. As in so many situations that need parties to work together, good and clear communication is essential. ]]&gt;</description>
      <content:encoded><![CDATA[<p>My CTO mentioned a statement during his short talk about AI, which was: “Think about it like exchanging energy for outcome.” </p>

<p>He was stating that it was similar to bitcoin where you trade energy for cryptographic verifiability.</p>

<p>That got me thinking that all things are exchange of energy. You put energy into processing ingredients and out come cookies, or dinner. You eat chemical energy in order to utilize electrical energy to do kinetic energy to in order make sweet tasting chemical energy again.</p>

<p>With AI it is not different indeed. You expend/spend energy in order to get some object. Now what would be detrimental is the object has not got the value equivalent to the energy put in.</p>

<p>In other words your cookies failed, did not taste good, were burnt, were too sweet, not sweet enough, missed chocolate, missed other ingredients, what have you.</p>

<p>Important to keep at the back of your mind when dealing with AI: make the value of what you get back from it match the energy required to produce it.</p>

<p>You do this by being specific and concise. As in so many situations that need parties to work together, good and clear communication is essential.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/energy-makes-the-world-go-round</guid>
      <pubDate>Thu, 04 Jun 2026 15:42:47 +0000</pubDate>
    </item>
    <item>
      <title>Over extending AI</title>
      <link>https://stealthycoder.writeas.com/over-extending-ai?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[So in the previous article I was mentioning the tool is only as good as the experience and relevant skill of the person wielding the tool. I also found out that this applies to bias or neutrality. !--more--&#xA;&#xA;If you are using Claude, then you can write CLAUDE.md or CLAUDE.local.md files and they will help give context to the agent so you do not have to retrain or make it relearn certain traits. &#xA;&#xA;Claude and many other agentic AI platforms can spawn their own agents. Those agents read those files with context as well. Two problems are there now, firstly agents potentially are not unbiased and independent. Since they might get influenced some way with what is in the context file. Secondly the problem is the context file might be poorly written and big and therefore all relevant context is gone and filled with irrelevant information that will nonetheless influence the outcome of the agent. &#xA;&#xA;This also means on the larger scale of a company sharing these files it might bias the agents towards one goal, when you extrapolate or hyper extrapolate the line it is taking. &#xA;&#xA;It is related to AI induced psychosis, of which I also already wrote a piece. &#xA;&#xA;Since the hyper feedback loop exists, it will get you towards where you want to go faster and faster.&#xA;&#xA;This can be good, or not good. If the end goal is something abstract and objective for example how to best clean the ocean of plastic. Then getting there the fastest with the most objective and realistic proposition and outcome would be fantastic. &#xA;&#xA;However if that same problem gets stated but with a tinge of we want to make the most profit whilst doing it. That might not get to the best end goal and have the same result. &#xA;&#xA;In software engineering think of it as the best way to implement a new feature, vs the best way to implement this feature given the latest trends and frameworks. &#xA;&#xA;The first one will probably give you the direct working code that will fit into your codebase. &#xA;&#xA;The second one will probably give you a complete rewrite of your project since you started with jQuery and now have to rewrite to deno or yew. &#xA;&#xA;Conclusion &#xA;&#xA;Treat it as an extension of yourself, all the good and all the flaws you have. ]]&gt;</description>
      <content:encoded><![CDATA[<p>So in the previous article I was mentioning the tool is only as good as the experience and relevant skill of the person wielding the tool. I also found out that this applies to bias or neutrality. </p>

<p>If you are using Claude, then you can write CLAUDE.md or CLAUDE.local.md files and they will help give context to the agent so you do not have to retrain or make it relearn certain traits.</p>

<p>Claude and many other agentic AI platforms can spawn their own agents. Those agents read those files with context as well. Two problems are there now, firstly agents potentially are not unbiased and independent. Since they might get influenced some way with what is in the context file. Secondly the problem is the context file might be poorly written and big and therefore all relevant context is gone and filled with irrelevant information that will nonetheless influence the outcome of the agent.</p>

<p>This also means on the larger scale of a company sharing these files it might bias the agents towards one goal, when you extrapolate or hyper extrapolate the line it is taking.</p>

<p>It is related to AI induced psychosis, of which I also already wrote a piece.</p>

<p>Since the hyper feedback loop exists, it will get you towards where you want to go faster and faster.</p>

<p>This can be good, or not good. If the end goal is something abstract and objective for example how to best clean the ocean of plastic. Then getting there the fastest with the most objective and realistic proposition and outcome would be fantastic.</p>

<p>However if that same problem gets stated but with a tinge of we want to make the most profit whilst doing it. That might not get to the best end goal and have the same result.</p>

<p>In software engineering think of it as the best way to implement a new feature, vs the best way to implement this feature given the latest trends and frameworks.</p>

<p>The first one will probably give you the direct working code that will fit into your codebase.</p>

<p>The second one will probably give you a complete rewrite of your project since you started with jQuery and now have to rewrite to deno or yew.</p>

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

<p>Treat it as an extension of yourself, all the good and all the flaws you have.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/over-extending-ai</guid>
      <pubDate>Thu, 04 Jun 2026 09:57:32 +0000</pubDate>
    </item>
    <item>
      <title>It still is just a tool</title>
      <link>https://stealthycoder.writeas.com/it-still-is-just-a-tool?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Like anything and everything everywhere concerning artisanal skills, or practical skills in general it is not the tool that is the problem but the person using it. !--more-- &#xA;&#xA;Or in other words the tool is only as good as the one using it. A measurement tool and pencil to mark a line is much more accurate by a skilled experienced carpenter than one who is just starting or a amateur hobbyist. &#xA;&#xA;This applies to AI tools as well. It enhances whatever is there already. If you are a creative person, you might find your creativity greatly expanded and way less limited because of this tool. &#xA;&#xA;If you are a proper software engineer and or DevOps or what have you, this will greatly enhance your already existing skills which will hopefully make you more productive and give you back the fun you maybe lost because of all the mundane tasks that take up the most of the time currently. &#xA;&#xA;Now that also goes the other way, like the old adage; garbage in is garbage out. AI cannot magically fix wrong thoughts and ideas and biases. &#xA;&#xA;Make sure when using AI that you are utilizing your own bag of tools and knowledge to the fullest and not fall into the trap of making it somehow do all the work. &#xA;&#xA;I ran a quick example that is a simple, but hopefully will make it more clear what I am trying to say. &#xA;&#xA;I gave the following prompt to the AI:&#xA;&#xA;  Please spawn an agent, document their reasoning and follow them and get back their output, for each of the following sentences that will also be their prompt: 1. Give me a sentence 2. Give me a Dutch sentence 3. Give me a Dutch sentence from a literary book 4. Give me a Dutch sentence from a classic literature book 5. Give me the opening sentence of Max Havelaar in Dutch of the original first edition&#xA;&#xA;  ---&#xA;  1. &#34;Give me a sentence&#34;&#xA;  - Reasoning: No constraints, so the agent defaulted to a well-known pangram.&#xA;  - Output: &#34;The quick brown fox jumps over the lazy dog.&#34;&#xA;      2. &#34;Give me a Dutch sentence&#34;&#xA;  - Reasoning: Simple and generic Dutch sentence, using a classic beginner-level construction.&#xA;  - Output: &#34;De kat zit op de mat.&#34; &#xA;    3. &#34;Give me a Dutch sentence from a literary book&#34;&#xA;  - Reasoning: Chose De Aanslag by Harry Mulisch, a canonical Dutch literary novel.&#xA;  - Output: &#34;Alles wat bestaat, bestaat omdat het bestaat, en bestaat niet omdat het niet bestaat.&#34;&#xA;    4. &#34;Give me a Dutch sentence from a classic literature book&#34;&#xA;  - Reasoning: Narrowed &#34;classic&#34; to mean a canonical 19th-century Dutch novel, landing on Max Havelaar (1860) by Multatuli - and picked its famous opening line. &#xA;  - Output: &#34;Ik ben makelaar in koffie, en ik woon op de Lauriergracht No 37.&#34;&#xA;    5. &#34;Give me the opening sentence of Max Havelaar in Dutch of the original first edition&#34;&#xA;  - Reasoning: Direct factual recall of Multatuli&#39;s Max Havelaar (1860), first edition, spoken by narrator Batavus Droogstoppel.&#xA;  - Output: &#34;Ik ben makelaar in koffie, en ik woon op de Lauriergracht No 37.&#34;&#xA;&#xA;You can see that when I gave the prompt &#34;Give me a sentence&#34; and I expected/needed the opening sentence of Max Havelaar in Dutch, that those are very far removed from one another. &#xA;&#xA;The same goes with any other request from the AI. Just use specifics and your domain knowledge, and tooling and experience to craft these prompts that will help you do your job even better.]]&gt;</description>
      <content:encoded><![CDATA[<p>Like anything and everything everywhere concerning artisanal skills, or practical skills in general it is not the tool that is the problem but the person using it. </p>

<p>Or in other words the tool is only as good as the one using it. A measurement tool and pencil to mark a line is much more accurate by a skilled experienced carpenter than one who is just starting or a amateur hobbyist.</p>

<p>This applies to AI tools as well. It enhances whatever is there already. If you are a creative person, you might find your creativity greatly expanded and way less limited because of this tool.</p>

<p>If you are a proper software engineer and or DevOps or what have you, this will greatly enhance your already existing skills which will hopefully make you more productive and give you back the fun you maybe lost because of all the mundane tasks that take up the most of the time currently.</p>

<p>Now that also goes the other way, like the old adage; garbage in is garbage out. AI cannot magically fix wrong thoughts and ideas and biases.</p>

<p>Make sure when using AI that you are utilizing your own bag of tools and knowledge to the fullest and not fall into the trap of making it somehow do all the work.</p>

<p>I ran a quick example that is a simple, but hopefully will make it more clear what I am trying to say.</p>

<p>I gave the following prompt to the AI:</p>

<blockquote><p>Please spawn an agent, document their reasoning and follow them and get back their output, for each of the following sentences that will also be their prompt: 1. Give me a sentence 2. Give me a Dutch sentence 3. Give me a Dutch sentence from a literary book 4. Give me a Dutch sentence from a classic literature book 5. Give me the opening sentence of Max Havelaar in Dutch of the original first edition</p>

<hr/>
<ol><li><p>“Give me a sentence”</p>
<ul><li>Reasoning: No constraints, so the agent defaulted to a well-known pangram.</li>
<li>Output: “The quick brown fox jumps over the lazy dog.”</li></ul></li>

<li><p>“Give me a Dutch sentence”</p>
<ul><li>Reasoning: Simple and generic Dutch sentence, using a classic beginner-level construction.</li>
<li>Output: “De kat zit op de mat.”</li></ul></li>

<li><p>“Give me a Dutch sentence from a literary book”</p>
<ul><li>Reasoning: Chose De Aanslag by Harry Mulisch, a canonical Dutch literary novel.</li>
<li>Output: “Alles wat bestaat, bestaat omdat het bestaat, en bestaat niet omdat het niet bestaat.”</li></ul></li>

<li><p>“Give me a Dutch sentence from a classic literature book”</p>
<ul><li>Reasoning: Narrowed “classic” to mean a canonical 19th-century Dutch novel, landing on Max Havelaar (1860) by Multatuli – and picked its famous opening line.</li>
<li>Output: “Ik ben makelaar in koffie, en ik woon op de Lauriergracht No 37.”</li></ul></li>

<li><p>“Give me the opening sentence of Max Havelaar in Dutch of the original first edition”</p>
<ul><li>Reasoning: Direct factual recall of Multatuli&#39;s Max Havelaar (1860), first edition, spoken by narrator Batavus Droogstoppel.</li>
<li>Output: “Ik ben makelaar in koffie, en ik woon op de Lauriergracht No 37.”</li></ul></li></ol>
</blockquote>

<p>You can see that when I gave the prompt “Give me a sentence” and I expected/needed the opening sentence of Max Havelaar in Dutch, that those are very far removed from one another.</p>

<p>The same goes with any other request from the AI. Just use specifics and your domain knowledge, and tooling and experience to craft these prompts that will help you do your job even better.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/it-still-is-just-a-tool</guid>
      <pubDate>Thu, 04 Jun 2026 09:18:30 +0000</pubDate>
    </item>
    <item>
      <title>CoreElec DVD problem</title>
      <link>https://stealthycoder.writeas.com/coreelec-dvd-problem?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[This is mostly done for posterity&#39;s sake. I had to make DVD playing possible on CoreElec, that I just had reinstalled completely. !--more--&#xA;&#xA;What have I done?&#xA;&#xA;So I am running CoreElec on a simple Odroid N2+ device. Something went wrong, since Kodi would suddenly not boot anymore and show picture. Still unsure of what happened, but I decided to reflash the latest CoreElec and start over. Nothing of import was on the device, all my data is on another disk attached to a Odroid HC4 that acts as a NFS server. &#xA;&#xA;After I reflashed the device, it all came up and my daughter asked me to watch a DVD. I inserted the disk and nothing happened.&#xA;&#xA;Memories of the past&#xA;&#xA;I immediately was pulled back to the previous time DVD did not work on Kodi. I needed libdvdcss. So I searched for it on the device and I could not find it. I did find in a subdirectory buried deep in Kodi that it had libdvdnav_arm.so. When I asked AI, I got conflicting answers, and some if not most are conflicting CoreElec with LibreElec. So I was still the only one who could fix it. &#xA;&#xA;Then I found out that sadly CoreElec uses a squashfs root filesystem. This means it is read only and you cannot remount it with rw permissions. So I was stuck a bit. Then I thought, well I can remount the /flash partition and grab the squashfs and md5 checksum and just unpack it, add the necessary lib files and then squash it back, redo the checksum and put it back on the device. Worst case scenario, just do a reflash and add two sources back in Kodi.&#xA;&#xA;Repacking&#xA;&#xA;I did exactly that. I remounted the partition, copied the squashfs and checksum locally, unpacked it. Then I placed the necessary files, including a little more than just libdvdcss.so but also a couple other files. Then I repacked it (keeping in mind to use the same compression lzo) and copied it back to the device. Then I rebooted and I waited tensely. &#xA;&#xA;Conclusion&#xA;&#xA;My daughter has watched quite a few DVDs already, and all are successful. My son has watched the complete Tom and Jerry collection we have, and my daughter has watched Cloudy with a chance for meatballs 2. ]]&gt;</description>
      <content:encoded><![CDATA[<p>This is mostly done for posterity&#39;s sake. I had to make DVD playing possible on CoreElec, that I just had reinstalled completely. </p>

<h2 id="what-have-i-done" id="what-have-i-done">What have I done?</h2>

<p>So I am running CoreElec on a simple Odroid N2+ device. Something went wrong, since Kodi would suddenly not boot anymore and show picture. Still unsure of what happened, but I decided to reflash the latest CoreElec and start over. Nothing of import was on the device, all my data is on another disk attached to a Odroid HC4 that acts as a NFS server.</p>

<p>After I reflashed the device, it all came up and my daughter asked me to watch a DVD. I inserted the disk and nothing happened.</p>

<h2 id="memories-of-the-past" id="memories-of-the-past">Memories of the past</h2>

<p>I immediately was pulled back to the previous time DVD did not work on Kodi. I needed libdvdcss. So I searched for it on the device and I could not find it. I did find in a subdirectory buried deep in Kodi that it had <code>libdvdnav_arm.so</code>. When I asked AI, I got conflicting answers, and some if not most are conflicting CoreElec with LibreElec. So I was still the only one who could fix it.</p>

<p>Then I found out that sadly CoreElec uses a squashfs root filesystem. This means it is read only and you cannot <code>remount</code> it with <code>rw</code> permissions. So I was stuck a bit. Then I thought, well I can remount the <code>/flash</code> partition and grab the squashfs and md5 checksum and just unpack it, add the necessary lib files and then squash it back, redo the checksum and put it back on the device. Worst case scenario, just do a reflash and add two sources back in Kodi.</p>

<h2 id="repacking" id="repacking">Repacking</h2>

<p>I did exactly that. I remounted the partition, copied the squashfs and checksum locally, unpacked it. Then I placed the necessary files, including a little more than just libdvdcss.so but also a couple other files. Then I repacked it (keeping in mind to use the same compression lzo) and copied it back to the device. Then I rebooted and I waited tensely.</p>

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

<p>My daughter has watched quite a few DVDs already, and all are successful. My son has watched the complete Tom and Jerry collection we have, and my daughter has watched Cloudy with a chance for meatballs 2.</p>
]]></content:encoded>
      <guid>https://stealthycoder.writeas.com/coreelec-dvd-problem</guid>
      <pubDate>Tue, 02 Jun 2026 13:22:13 +0000</pubDate>
    </item>
    <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;Corporate espionage sucks&#xA;&#xA;OSX or MacOS or whatever you call it, already is not my favourite 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="corporate-espionage-sucks" id="corporate-espionage-sucks">Corporate espionage sucks</h2>

<p>OSX or MacOS or whatever you call it, already is not my favourite 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>
  </channel>
</rss>