grepular.comhttps://www.grepular.com2026-04-10T17:31:32ZDevelopment AI vs Runtime AIhttps://www.grepular.com/Development_AI_vs_Runtime_AI2026-04-10T17:31:32Z<p>I have a Tesla Powerwall (bought before Elon completely lost the plot and
started openly supporting and funding far right, populist, shit stains, across
the World). I received an update for the Tesla app on my phone today, which came
with a new, "Home Status," summary option. When you request it, after a few
seconds, it gives you a human readable summary of the status of your solar +
battery situation. I'm guessing it would also talk about Tesla car charge status
if I had one.</p>
<p><img src="https://www.grepular.com/blog/tesla-powerwall-ai.jpg" alt="Tesla App Screenshot"></p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>Protecting Your Host from Malicious Dependencieshttps://www.grepular.com/Protecting_Your_Host_from_Malicious_Dependencies2026-04-01T20:26:20Z<p>This isn't limited to NodeJS, but it seems to happen a lot more frequently in
that ecosystem. A commonly used dependency gets compromised, developers install
it when doing an npm install, or updating packages, and they now have a trojan
running on their host. A trojan that gives the attacker access to run arbitrary
code, e.g keyloggers to steal passwords as they are entered, theft of bitcoin
wallets and ssh keys etc.</p>
<p>The latest widely publicised version of this is in the <a href="https://www.axios.com/2026/03/31/north-korean-hackers-implicated-in-major-supply-chain-attack">Axios node
library</a>,
which prompted me to write this blog post.</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>Stadia Maps Privacy Failhttps://www.grepular.com/Stadia_Maps_Privacy_Fail2026-03-20T23:21:13Z<p>This is a tale as old as email, but it made me laugh so I thought I'd share it.
I have an account with <a href="https://stadiamaps.com">https://stadiamaps.com</a>. I don't
even remember setting it up, so it's certainly not something I've used in a long time.</p>
<p>Anyway, I received an email from them today:</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>Cert Authorities Check for DNSSEC From Todayhttps://www.grepular.com/Cert_Authorities_Check_for_DNSSEC_From_Today2026-03-15T09:00:00Z<p>About 14 years ago <a href="https://www.grepular.com/Cert_Authorities_Check_for_DNSSEC_From_Today">I set up
DNSSEC</a>. I've been running it on
all of my domains ever since, without issue. First using
<a href="https://www.isc.org/bind/">bind9</a> and then later using <a href="https://doc.powerdns.com/authoritative/index.html">PowerDNS</a>.</p>
<p>From today, all Certificate Authorities (CAs) <a href="https://cabforum.org/2025/06/18/ballot-sc-085v2-require-validation-of-dnssec-when-present-for-caa-and-dcv-lookups/">must validate
DNSSEC</a>
when a domain has it enabled.</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>Website Testing on Steroidshttps://www.grepular.com/Website_Testing_on_Steroids2026-03-08T18:58:25Z<p>In a recent post, <a href="https://www.grepular.com/New_Website_New_Technology#browser-tests">here</a> I spoke
briefly about how I use browser tests to test this website. This has come a long
way since I wrote that post so I thought I would detail exactly what I'm doing
and why.</p>
<p>I wanted to be able to confidently change CSS and JavaScript and templates and
code on this website without breaking anything. I wanted to be able to detect
regressions due to code changes, or just the simple passage of time (e.g broken
external links).</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>ParseMailhttps://www.grepular.com/ParseMail2026-02-22T15:37:00Z<p>I have a project that I first started building over 10 years ago and it occurred
to me recently that I have never blogged about it. It is a website called
<a href="https://www.parsemail.org">ParseMail</a>. I have been running email systems
personally, and at different points during my career, for going on 25 years now.
I built ParseMail, because I wanted to be able to view email content
differently. Email clients hide a lot of information, and viewing emails in mail
queues using tools like <code>cat</code> and <code>vim</code> and <code>less</code> isn't that useful when you're
staring at a blob of
<a href="https://wikipedia.org/wiki/Quoted-printable">quoted-printable</a> encoded HTML.</p>
<p>Before I describe what ParseMail does, one of the things I'm proud about is how
easy it is to run a local copy. You don't need to trust my website with your
data at all. Just run <code>docker run --rm -p 8000:8000 grepular/parsemail</code> and
you'll find a full local copy of the website running (minus language
translation) at <a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a>. It is released
under the
<a href="https://gitlab.com/grepular/parsemail/-/raw/master/COPYING.txt">GPL-3.0</a> and
you'll find the source at
<a href="https://gitlab.com/grepular/parsemail">https://gitlab.com/grepular/parsemail</a>.
If you don't trust <a href="https://hub.docker.com/r/grepular/parsemail">my docker image
build</a>, then clone the repo, read
the source code (it's a simple <a href="https://www.python.org/">Python</a>
<a href="https://www.djangoproject.com/">Django</a> app), and then run <code>docker build -t parsemail ./</code> If you want to enable language translation of email content,
you'll just need to pass in an environment variable specifying where it should
store downloaded language models inside the container. E.g: <code>-e TRANSLATE_MODELS_DIR=/tmp/translation-models</code>. It will download and cache
different models from <a href="https://www.argosopentech.com">Argos Translate</a> on
demand, for entirely local language translation.</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>New Website, New Technologyhttps://www.grepular.com/New_Website_New_Technology2026-02-18T22:12:00Z<p>If you come here occasionally, you may have noticed that the style of my website
has changed completely. I've built a new website using <a href="https://go.dev/">Go</a>.
The old website was a bloated custom <a href="https://nodejs.org/">Node.js</a> app that was
probably <a href="https://gitlab.com/grepular/safernode">full of keyloggers and bitcoin
stealers</a>. It was also difficult to work
on, and stored blog posts in <a href="https://www.mongodb.com/">MongoDB</a> <svg
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 88 16" height="1em"
style="vertical-align:-0.15em;display:inline-block" role="img" aria-label="It's
webscale!"><rect width="88" height="16" rx="2" fill="#00684a"/><text x="4"
y="12" font-family="monospace" font-size="9" fill="#00ed64"
font-weight="bold">webscale!</text><polyline points="66,13 70,9 74,10 78,6 82,7
86,2" stroke="#00ed64" stroke-width="1.5" fill="none" stroke-linecap="round"
stroke-linejoin="round"/></svg>.</p>
<p>This one keeps all of my blog posts in markdown files, making it much easier to
write and edit. You will even see a "<a href="https://www.grepular.com/New_Website_New_Technology.md">View as raw
markdown</a>" link at the top of each blog post.
Hopefully this will give me a little more impetus to post on a regular basis.</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>Apple's "Protect Mail Activity" Doesn't Workhttps://www.grepular.com/Apples_Protect_Mail_Activity_Doesnt_Work2026-01-19T21:37:05Z<p>If you have an iPhone, in the settings for the Mail app, there is a "Privacy
Protection" section, and inside that it has a "Protect Mail Activity" option.
This does not work as advertised and actively worsens your privacy. I told Apple
about this early 2025. They discarded the bug, said it works as expected and
closed the case.</p>
<p>It's described
<a href="https://www.apple.com/uk/legal/privacy/data/en/mail-privacy-protection/">here</a>.
Basically, they claim that when this option is turned on, they hide your IP by
loading remote content via their proxy (true), and also the following:</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>Immortal SSH Sessionshttps://www.grepular.com/Immortal_SSH_Sessions2025-08-01T10:57:43Z<p>For years now, I've been using a combination of <a href="https://mosh.org/">mosh</a> and
<a href="https://www.gnu.org/software/screen/manual/screen.html">screen</a> to make my ssh
sessions immortal. Here's how, and why:</p>
<p>On your server:</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>Fun with Gzip Bombs and Email Clientshttps://www.grepular.com/Fun_with_Gzip_Bombs_and_Email_Clients2025-07-22T17:59:55Z<p>Gzip/Zip bombs have been a thing for decades. Lets create a 10MB gzip file which
decompresses to 10GB:</p>
<pre><code class="language-text">dd if=/dev/zero bs=1G count=10 | gzip > 10gb.gz
</code></pre>
<p>This is called a Gzip bomb, because when it is decompressed, it blows up to a
much larger size (~1000 larger). Add it your website document root and configure
<a href="https://nginx.org/">Nginx</a> to serve it up as an image, with gzip Content-Encoding:</p><hr><p>Support my work: <a href="https://www.paypal.me/grepular">PayPal</a>   <a href="https://patreon.com/grepular">Patreon</a>   <a href="bitcoin:1PQLtWnjUi1itHLG6QCQeHM3Nxua8pRsq1">Bitcoin</a></p>