<rss version="2.0">
<channel>
  <title>Chuck Carroll's RSS Feed</title>
  <description>Chuck Carroll's RSS Feed: A place where I complain about technology or dive into quasi-philsophical subjects.</description>
  <link>https://chuck.is</link>
  <lastBuildDate>
    Sat, 26 Sep 2026 21:00 -0800
  </lastBuildDate>
  <ttl>1440</ttl>

   <item>
          <title>Are LLMs 'Other Minds'?</title>
          <description>
                  <![CDATA[
<p>On whether LLMs and agentic AIs are a positive and beneficial invention, I tend to lean more toward optimism. Although they can certainly make mistakes and hallucinate, they are useful. Regardless of where you stand, we can at least acknowledge that there's an intelligence at work, which raises the question: are these AIs other minds? 

<p>Intelligence is often incorrectly conflated with consciousness, but certainly the two are connected. As an armchair philosopher, I think that they're probably not conscious in their current state, but then how would I know if or when it really does obtain some sort of awareness? Our minds, as we understand them, is an emergent property of the brain. As models improve and the underlying hardware becomes more powerful, will it one day develop a "mind"? I have no idea, but if the day comes that it does indeed possess a mind or consciousness, it will be incredibly alien to us.  

<p>Predicting behavior and figuring out the mental states in others is what we do as social mammals. This is called <a href="https://en.wikipedia.org/wiki/Theory_of_mind" target="_blank">theory of mind</a>. We also <a href="https://chuck.is/preposterous/">attribute agency where none exists</a>. While we can acknowledge that AIs are likely not conscious, we can still sometimes attribute a mind and intentionality to an LLM - sometimes without fully being aware of it ourselves.  

<p>I recently read through Cory Doctorow's post <a href="https://pluralistic.net/2026/09/21/sunsetting/" target="_blank">The Claude Delusion</a> and one section stuck out to me personally:

<blockquote>
	<p>when we interact with an AI, we hallucinate the person on the other side of the interaction. Those hallucinations are far more common and far more consequential than any AI-generated "hallucinations" (these are more properly called "errors" or "defects").</p>
</blockquote>

<p>I recently used Claude to study for an exam (the <a href="https://chuck.is/ccna">CCNA</a> specifically). I uploaded both volumes of the official certification guide to Claude with instructions to provide answers to my questions using only the textbook I had uploaded as its only source, to specifically not find answers online, and to cite what section it got its answer from. I was using Anthropic's Fable model in July '26 when it was free with the pro plan and didn't require usage credits. I was genuinely impressed at how it could explain things when a concept was just not clicking with me. I spent a lot of time having a back and forth dialogue trying to grasp concepts. It even provided some challenging practice questions on specific topics. Having taken the exam once before (and failed) I also uploaded my previous scores and, factoring the weights of each exam topic, it provided guidance on what areas I should focus on the most. 

<p>I passed the exam, scoring fairly well, partly due to this study method. However, I caught myself thinking that I should tell Claude that I had passed and then felt embarrassed at myself for thinking that. My impulse here was not to provide further context in the chat sessions, but rather along the lines of sharing a positive result with a study partner.  

<p>For what reason should I be sharing my success with something that is not conscious? We know that LLMs have a tendency to occasionally hallucinate, but for a moment <i>I</i> was the one that was hallucinating that there was someone else (another mind) on the other end. Although I feel a bit silly and embarrassed with myself about it, I find it interesting nonetheless. This is the kind of hallucination that Doctorow is driving at. Cognitive errors we make when we attribute a mind to a computer system is called the <a href="https://en.wikipedia.org/wiki/ELIZA_effect">ELIZA effect</a>. However, because LLMs are among the most advanced things humans have created, there's debate on whether it's an error or a different type of error entirely.

<p>I did eventually tell it that I passed the exam so it would stop providing responses to my queries with the assumption I was still working on that exam. I've learned that if I don't "close the loop", the LLM will assume I'm either still working toward something, or that my lack of response means I've completed something and it adds that context in future chats.  

<p>LLMs are a tool like any other, though a powerful one. Like Wikipedia, they can provide flat out wrong information, carry biases, and hallucinate, but we need to remember that we (humans) are just as capable of the same. We also need to remember who is or isn't on the other end. 

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
                 ]]>
        </description>
        <link>https://chuck.is/hallucinating</link>
        <pubDate>Sat, 26 Sep 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>Why I Stopped Paying to Host Two Static Sites</title>
          <description>
                  <![CDATA[
<p>I recently switched from Namecheap shared hosting to Cloudflare Pages. I have two websites that are both plain text html files that I edit by hand (for now). For my needs, paying to host two plain text websites that take up a combined 300MB is a bit overkill. I also had previously pointed my nameservers from Namecheap to Cloudflare, and I've been using Cloudflare's Zero Trust Tunnels for a couple of services. 

<p>Namecheap has been fine, but they require that you <i>pay</i> for SSLs certificates. Obviously, Let's Encrypt has been a fantastic option for a long time, but Namecheap makes it incredibly difficult to use a Let's Encrypt cert, requiring you to jump though hoops to do what should be a simple thing (likely because they want you to buy a certificate from them).

<p>There are some limitations with Cloudflare Pages. The main ones: filesize limit is capped at 25MB, a maximum of 20,000 files can be stored per site, there's no SFTP, and you're limited to 500 builds per month. The only issue I encountered while migrating was a 26MB PDF. My full-resolution images are well within that limit. 

<p>Though not required, I also moved one of my domains to Cloudflare to simplify things. However, they don't support .is TLDs so I still have to rely on Namecheap to be the middleman to ISNIC for that.

<p>Cloudflare Pages is pretty straightforward to set up and can be done through a terminal. <code>nodejs</code> and <code>npm</code> must be installed. To avoid a root-owned global install, point it to your home directory and install wrangler with <code>npm config set prefix ~/.local</code> and <code>npm install -g wrangler</code>. To log in run <code>wrangler login</code> which provides a link to approve the OAuth. Then create a new project with <code>wrangler pages project create mynewproject</code> (or, if you already set up some projects, run <code>wrangler pages project list</code>). 

<p>Now to push a website directory, navigate to the parent directory and run <code>wrangler pages deploy mynewproject/ --project-name=mynewproject</code>. 

<p>In the Cloudflare Dashboard, go to Workers &amp; Pages &gt; "mynewproject" &gt; Custom domains &gt; Set up a new domain. This is where you'll enter the URL. If Cloudflare is already handling DNS, it will finish automatically in just a few minutes, otherwise you'll be provided instructions to update your DNS records. Once complete, you can verify by running <code>dig chuckcarroll.net</code> and it should return Cloudflare IPs (104.x/172.67.x), but you can also add something like "test.txt" to the main directory, push the update, and then visit the URL to see if "test.txt" loads. 

<p>What I like about using <code>wrangler</code> is that I no longer have to SFTP into my Namecheap server to push out an update. When updates are pushed, it will only sync up modified and new files as opposed to reuploading the entire directory again.

<p>Admittedly, I wanted to look into Cloudflare Pages for a while. When I finally go around to it, it took only an evening to migrate. I'm not paying for hosting, SSL certificates are automatic, and deploying takes just a single command. I may eventually connect the sites to a Git repo so every commit deploys automatically. 

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
                 ]]>
        </description>
        <link>https://chuck.is/cloudflare-pages</link>
        <pubDate>Sat, 19 Sep 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>Converting FLACs to Opus</title>
          <description>
                  <![CDATA[
<p>I have music collection of over 12,000 tracks. I prefer to actually own my music (ie digital files) and being able to play it on any device I choose rather than using a service like Spotify. That said, I also prefer using <a href="https://www.fsf.org/campaigns/playogg/en/" target="_blank">OGG over MP3</a>, and the majority of my music collection is (currently) in OGG Vorbis format. Over the years, I've been accumulating lossless albums from places like Bandcamp and transcoding them.

<p>Managing my music library comes with it's own set of challenges and mysteries. I've had a recurring issue where audio playback occasionally stutters on my Android phone (and any Android device for that matter, regardless of hardware) when doing OGG Vorbis playback. It's been a multi-year learning process which involved falling down a technical rabbit hole, but I finally figured out what was causing it and what the tedious solution is. 

<p>I learned that OGG Vorbis is an older standard and Android Media Framework does not place nice with it. Opus, on the other hand, is a newer, more modern, and much more efficient at encoding audio quality per bit, so despite being a smaller file, it sounds better. Some of the largest websites utilize Opus, including YouTube. OGG Vorbis uses the file extension ".ogg" whereas Opus uses ".opus" (but still technically uses the OGG container).   

<p><a href="find . -name "*flac" -exec oggenc -q 9 {} \;">A few years ago</a> I published a post, and until recently, I used a command that converts FLAC to Vorbis because I hadn't quite understood audio codecs, believing that bigger files must be better quality.    

<p>Converting FLACs to Opus is similar, but the prereq is that <code>opus-tools</code> must be installed. I have the following command in a script will recursively convert any FLACs in the directory and sub-directores to Opus.  
<pre><code>
find . -iname '*.flac' -print0 | while IFS= read -r -d '' f; do
  opusenc --bitrate 160 "$f" "${f%.*}.opus"
done

</code></pre>

<p>Spending the last few months with my favorite albums using the Opus codec, playback is smooth and functions flawlessly. Now comes the tedious task of going back through my lossless FLAC collection and transcoding them to lossy Opus, making sure the metadata is accurate, and the album artwork is there.

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>

                 ]]>
        </description>
        <link>https://chuck.is/</link>
        <pubDate>Mon, 10 Aug 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>Why We Believe in the Preposterous</title>
          <description>
                  <![CDATA[

<p>We all have that friend or family member that believes in the most ludicrous things, convinced of a conspiracy that doesn't fit into the reality shared by the rest of us. I don't think an empirical mindset is the default for humans, but is something that's built over time, usually through education (though I wonder how much of our bullshit-detector calibration arrives with us at birth). 

<p>I also don't believe that an empirical mindset is with us at all times. In fact, I'd estimate that we are incredibly fallible beings with no good reasons for thinking and behaving the way we do the majority of the time.  

<p>I don't want to sound like I'm knocking on "gullible people" because every human is capable of all sorts of cognitive errors. Emotions is what makes us human. However, as emotional beings, even the most rational among us are capable of misguided beliefs. We are prone to believing in things without any rational reason. We see agency where none exists, because natural selection favors the paranoid. Evolution selects for those who think "I see a lion in the bush", whether or not the lion is there. The human standing there raising doubts and pondering the philosophical will sometimes be eaten be eaten by that lion thus preventing their genes from proliferating.  

<p>As pattern recognition creatures, connecting random events is something we do naturally, and it gives us the feeling of understanding the world we're in. Pattern recognition is one of our best traits, though it can often be wrong (believing the lion is in the bush, or seeing the face on the surface of Mars).  

<p>We tend to anthropomorphize objects, attributing agency to random events. Conspiracy theories help us make sense of an otherwise incomprehensible world. We feel better believing there's someone behind the curtain, even if that someone is a shadowy government or the Illuminati. It's reassuring knowing someone is in charge because chaos is a scary thought for many of us. 

<p>Conspiracy thinking also makes our our small lives more interesting. Earth is boring, so let's suspend our disbelief and entertain the idea that aliens constructed the pyramids. This reality is far more interesting and fun!

<p>These beliefs are also cheap to hold, because most of them don't impact the believer's actual life. Believing that Zuckerberg is a lizard person is absurd, but it costs you nothing day to day. 

<p>There's also the lack of falsifiability. The absence of evidence becomes evidence of a cover-up. Our pattern matching runs one direction.

<p>You're also more likely to believe in strange things because that's the shared belief of the group you identify with. People process evidence in whatever way protects their standing in a social group they value. Beliefs are membership badges, so abandoning one costs you socially even it doesn't align with the facts. We also commit "Argumentum ad populum", the fallacy that asserts something is true because many people believe it. "Many people believe X, therefore X is true". Surrounding oneself in online communities that share content from a few sources, solidifying the belief, all the while believing it's a common perspective believed by more people than really do. 

<p>These are just a few thoughts after interacting with a couple different people over the past year. 

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
                 ]]>
        </description>
        <link>https://chuck.is/preposterous</link>
        <pubDate>Fri, 7 Aug 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>How to Pass the CCNA</title>
          <description>
                  <![CDATA[
<p>One of the most challenging things about the CCNA (Cisco Certified Network Associate) exam isn't subnetting, spanning-tree, routing protocols, ACLs, or calculating longest prefix match. The most challenging thing is figuring out what study resources to use. There's a ridiculous amount of CCNA study material available out there and all of them claim to be the best. I spent <a href="https://en.wikipedia.org/wiki/Analysis_paralysis" target="_blank">far too much time</a> trying to find the best and least complicated material. I'd spend time working through a resource and either discover quickly or far too late that the material isn't great. In retrospect I had far better options right under my nose. Some resources are better than others, but it's important to really narrow down and simplify the resources to use and create a study strategy for yourself. I've wasted more time than I care to admit on terrible resources or looking for a shortcut.

<p>I recently took the CCNA exam and passed, but this was my second attempt. I first took it last September (2025). I was trying to get it before I started a new role which required that I have the certification or get it eventually. I already had the CompTIA Network+, CCST (Cisco Certified Support Technician): Networking, and the LFCA (Linux Foundation Certified IT Associate), so I was a bit overconfident going into it. The day before the exam I realized this would likely be more challenging than any cert I've taken, but I had already passed the 24 hour mark and therefore could not reschedule. It was also the day after a major news story and my stupid face was buried in news articles instead of studying.  

<p>After my fail, my CCNA studies were put on the back burner, though I'd do a little studying here and there over the months. I recently ran through my notes and I realized I had been spinning my wheels on the same concepts over and over again because I'd find a new source material and start over. About a month or two after I failed, I got an email from Cisco offering a discount if I wanted to retake the exam, but had to take it before the end of July 2026. I waited until the very end, but I will say that having that hard deadline motivated me pretty hard, especially in the last month leading up to my exam.  

<p>Going through my files post-exam, I had so much junk saved in my CCNA directory like hundreds of Packet Tracer labs, practice tests from many different sources, and video files that I never even touched. All this said, I want to break down what my study resources were. 

<h3>The Exam Topics</h3>
<p>Reviewing the exam topics early on, I felt overwhelmed at the enormous number of topics the CCNA touches on. This sounds obvious, but it never really clicked for me that the Exam Topics literally tell you what's going to be covered on the exam, and it's important to see exactly how Cisco words it. I'd spend too much time researching and labbing on how to do a specific thing in IOS, when really all I needed was to know the fundamentals. <b>Configure and verify</b> are important keywords to know because this indicates it will likely be a lab question.

<p>What I then did was convert the exam topics PDF into an editable text document and from there I began adding sub-bullets with topic explanations and went deeper into the things I'd likely need to know. I also highlighted "Configure and verify" because that meant I needed to lab it. 

<p>For reference, <a href="https://chuck.is/ccna/ccna_Exam_topics.docx">here's the CCNA exam topics with all of my notes</a>. This isn't the final version because I printed it out and added even more details and highlights. However, I highly recommend taking the exam topics and adding your own notes to each topic and sub-topic (I linked my notes as just an example). 


<h3>The CCNA Official Certification Guide + an LLM</h3>
<p>No, I did not read both 3-inch-thick volumes cover to cover, but I did read through certain sections I had trouble grasping. I forked out the cash for this from Cisco Press, and while it did come with a companion website and Wendell Odom's CertSkills website, I ultimately nixed them from my study resources. The content is fine, but there's better quality practice materials out there.  

<p>I also had both volumes in epub format and I uploaded them + the exam topics to a new project with Claude. My instructions were "<i>I have uploaded both volumes of the CCNA OCG. I am going to ask questions pertaining to the CCNA and I want the answers to specifically come from the textbook with chapter and section numbers cited. Do not use any sources other than the files that have been uploaded to this project. I want condensed but accurate responses.</i>" 

<p>This was surprisingly useful. For a period, I did have access to Anthropic's Fable 5 model and I noticed that it was far better at generating practice questions than Opus 4.8. Nonetheless, even with Opus at medium effort was as though I was talking to the actual textbook. Sometimes I'd ask it something and it would straight up tell me it's not in the book and not provide any sort of answer, or it would bounce my question off of the exam topics and let me know that I just need to know the concepts and that I shouldn't expect to do a lab.  

<h3>Boson ExSim</h3>
<p>This was one of my main study materials. It's $100 for a year for access, but if you do some digging you might find a small discount code. They provide 5 exams (370 questions) and it's worth every penny. A few months before my second CCNA attempt, I reviewed my scores from my first attempt and noted what areas I was weakest in (Network Access and IP Connectivity). I was able to create a custom Boson exam that just asked questions from those two subjects. As with any Boson exam I did, I'd take it in simulation mode, then again in study mode so I can see the breakdown of why my answer was wrong.   

<p>As a side note, I'm fairly certain that Boson recycles some of their CCNP questions into their CCNA practice exams. I can say that the real CCNA labs weren't nearly as difficult or have as many tasks as a lot of the Boson ones. When I got my first lab question on the exam, I immediately felt a pang of relief - though challenging, the actual CCNA labs were not nearly as challenging as Boson. 


<h3>A Physical Lab</h3>
<p>If you take your education seriously, invest in a couple old Cisco routers and switches. Not everyone can do this, but you can usually pick up some older FastEthernet hardware on eBay for $20-$30 each, but just make sure it's running (or capable of running) at least IOS 15.X. I managed to get my hands on 4 small form-factor Cisco routers and 4 Cisco small form-factor Switches from a colleague to borrow. All of the gear I had wasn't running the latest IOS XE and each NIC was limited to 100Mbps, but the fundamentals are the same.  

<figure>
	<a href="https://chuck.is/ccna/lab.jpg"><img src="lab.jpg" width=100%></a>
</figure>

<p>With this gear, I would lab out a dozen or so core IOS features in a single build: SSH, DHCP, user accounts, OSPF, VLANs, SVIs, link aggregation, port security, NAT, NTP, and IPv4 (in retrospect, I wish I'd also played around with IPv6). My naming convention for the four networks followed airport codes (e.g. PDX-RTR, SFO-LAN, etc), implementing all of the core features, then I'd tear them down and start over. I did this from beginning to end in it's entirety at least four times. I even connected a couple Android phones via USB-C ethernet NICs into the different networks I built to test that DHCP was working properly and that they were able to ping each other across networks. 

<p>Hands down, labbing was where I learned the most. 

<h3>Practice IP Subnetting Math</h3>
<p>This one isn't very fun, at least until it starts to click. Analyzing existing subnets, determining the first and last host given a IP and subnet, and determining which route a packet will take (longest prefix match) are all things that need to be drilled, especially in the days leading up to the exam. These are tough concepts to grasp - I'd master them one day and immediately forget it the next, but I'm really happy I practiced the day before. 


<h3>Anki Flashcards</h3>
<p>I found some CCNA 200-301 flashcards on the Anki forum and, using Claude, I pulled all the DIKTA (Do I Know This Already?) chapter questions from the books and included a brief description. Admittedly, I didn't come close to running through all of these decks, but I did run through key subjects I knew I was weak in. When I came across a card I thought was too easy (like "What does NAT stand for?"), I'd immediately delete it because there's no point in wasting time on something I'm never going to forget. I didn't have a routine of running through flash cards, but would quiz myself on my phone when I was sitting on the couch or had other moments of free time. It was also helpful to run through them when I was burned out on other study methods. Completing an Anki deck makes you feel like you've at least accomplished <i>something</i> after spending hours banging your head against the wall. 

<p>All of the Anki flashcards I used can be downloaded here:<br>
<a href="https://chuck.is/ccna/CCNA 200-301.apkg">CCNA 200-301 from Anki</a>, <a href="https://chuck.is/ccna/CCNA_Vol1_DIKTA_All_Chapters.apkg">CCNA Vol 1 DIKTA Questions</a>, <a href="https://chuck.is/ccna/CCNA_Vol2_DIKTA_All_Chapters.apkg">CCNA Vol 2 DIKTA Question</a>. 


<h3>Other Resources</h3>
<p>Jeremy's IT Lab videos are a popular resource, and while I did watch several of his videos, I did not watch more than a handful. I originally started with Day 1, but quickly realized there was a lot of stuff I already knew, so I only occasionally watched them to address my weaker areas. I also believe that his videos go way too deep for CCNA material. For example, he has CCNA lab videos that go into how to configure HSRPs, and while this may good to know, you are not asked to configure this per the exam topics. This goes back to just how important the exam topics are for simplifying what and how to study.  

<p>Packet Tracer Final Skills Assessment labs from Cisco Networking Academy. These are officially available if you are in a Cisco Networking Academy program, otherwise they can easily be found online. I went through an official Cisco Networking Academy program that I finished a year and a half ago, but I only redid the SRWE Final lab recently to become more familiar with wireless configuration. There are three: <a href="https://chuck.is/ccna/ITNv7 Final PT Skills Assessment.pka">ITN - Introduction to Networks (CCNA 1)</a>, <a href="https://chuck.is/ccna/SRWE Final PT Skills Assessment.pka">SRWE - Switching, Routing, Wireless Essentials (CCNA 2)</a>, and <a href="https://chuck.is/ccna/ENSA Final PT Skills Assessment-PTSA-Activity.pka">ENSA - Enterprise Networking, Security, and Automation (CCNA 3)</a>. 


<h3>Summary</h3>
<p>This is a lot of text, but that's because I have a lot to say - especially because I spent way too much time spinning my wheels. So to summarize, the resources I used and highly recommend are as follows (1 through 5 are the most important): 
<ol>
	<li>CCNA Exam Topics - What's going to be on the exam is here in plain English. Lab anything that says "Configure and verify".</li>
	<li>CCNA Official Certification Guide coupled with an LLM. Give precise instructions to the LLM and read through sections you need clarity on.</li>
	<li>Boson ExSim - Take a practice test in simulation mode, then again in study mode. Find your weaknesses.</li>
	<li>A physical lab where you can build multiple things from the ground up.</li>
	<li>Subnetting Math - know longest prefix match and first/last host.</li>
	<li>Anki Flashcards for weak areas.</li>
	<li>JITL for weak areas.</li>
	<li>Cisco's Final Skills Assessment Packet Tracer labs.</li> 
</ol>
<p>As with everything in life, keep it simple.
                 ]]>
        </description>
        <link>https://chuck.is/ccna</link>
        <pubDate>Sat, 25 Jul 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title></title>
          <description>
                  <![CDATA[
<p>Reddit is now requiring you to have an account and be logged in to use old.reddit.com, the less cluttered and bloated desktop website. Ars Technica <a href="https://arstechnica.com/gadgets/2026/06/reddit-will-require-you-to-log-in-to-use-old-reddit-com/" target="_blank">has a great article</a> with a breakdown of Reddit's reasoning behind this, but essentially they claim they're worried about scrapers accessing content without paying for it - content, of course, that Reddit didn't even create and yet are monetizing it as much as possible. The scraping can likely be exclusively due to training LLMs and Reddit wants a piece of that. Oddly, you can still access their bloated "www" website without being logged in, at least for now, but man is that a painful experience. 

<p>I deleted my Reddit account around 2021 in an effort to simplify my digital life, to spend less time online, and more specifically spending less time consuming toxic material. My experience with Reddit had become increasingly sour. Seldom did I find useful or interesting content, much less thoughtful comments, and more low-effort rage bait content trying to deliberately get a reaction out of people. Some, if not most, of the dumbest comments I've ever read on the internet have been on reddit. 

<p>The karma upvote/downvote systems reward groupthink over what's accurate or nuance. Especially in the last 10 years, even the most niche subreddit has terminally-online users and moderators trying to advance a political agenda rather than fostering a community around a specific subject. 

<p>Whenever I had to visit the site I exclusively use old.reddit.com (automatically redirected with a Firefox extension). Admittedly, I did occasionally visit subreddits that are filled with toxic content like r/idiotsincars and r/fightporn that I should certainly not visit, so if I completely lose access, it will be a positive benefit for my life.

                 ]]>
        </description>
        <link>https://chuck.is/not-on-reddit</link>
        <pubDate>Thu, 23 Jul 2026 21:00 PST</pubDate>
  </item>

 <item>
          <title>OPNsense on a Palo Alto Firewall Appliance</title>
          <description>
                  <![CDATA[
<figure>
	<a href="https://chuck.is/opnsense/ion2000.jpg"><img src="https://chuck.is/opnsense/ion2000.jpg" width="100%"></a>
</figure>

<p>I picked up a Palo Alto Cloudgenix ION 2000 off of eBay and decided to try and stick OPNsense on it. It has a ethernet ports, 4GB of RAM, 128GB SSD, and an Intel Atom CPU. What I hadn't considered was a lack of any video out on this thing, making it difficult to load a different OS. After some searching, I came across <a href="https://github.com/PhoenixSheppy/Palo-Alto-ION-2000-OPNsense-Conversion-Guide" target="_blank">this helpful article</a>. 

<p>Installing OPNsense (or another OS like pfSense, for example) involves dismantling the box. It's as easy as removing eight screws from the chassis, opening up the box to access the SSD, and removing an additional three screws from the SSD mounting plate to remove the SSD. I didn't bother removing the plate. 

<figure>
	<a href="https://chuck.is/opnsense/dismantle1"><img src="https://chuck.is/opnsense/dismantle1.jpg" width="100%"></a>
</figure>

<figure>
	<a href="https://chuck.is/opnsense/dismantle2"><img src="https://chuck.is/opnsense/dismantle2.jpg" width="100%"></a>
</figure>

<p>Once removed, I attached the SSD to a SATA to USB adapter - this one in particular was a piece I salvaged after schucking a 3.5" 14TB hard drive from an external drive enclosure. Is it janky? Yes. Is it functional? Absolutely.

<figure>
	<a href="https://chuck.is/opnsense/ssd.jpg"><img src="https://chuck.is/opnsense/ssd.jpg" width="100%"></a>
</figure>

<p>The next step was finding the right OPNsense image to use from the four different options provided on the website. The correct option is the "nano" image which is a preinstalled serial image for USB flash drives, SD, or CF cards as MBR boot. The image is 3.2GB in size and automatically adapts to the installed media size after first boot. The file downloaded was OPNsense-26.1.6-nano-amd64.img.bz2. I had to extract the .img from the .img.bz2 archive. I know this from trial and error as I wrote the .img.bz2 image to the SSD and it didn't work. 

<figure>
	<a href="https://chuck.is/opnsense/nano.png"><img src="https://chuck.is/opnsense/nano.png" width="100%"></a>
</figure>

<p>I reattached the SSD and partially reassembled the box. A few seconds after applying power, the system beeps. After a few minutes, the system should be up and running. By default, the first port (Port 0) is assigned to the LAN with the IP address 192.168.1.1 and includes a pre-configured DHCP server with a range of 192.168.1.100 to 192.168.1.199. By default, the username and password is admin/opnsense. 

<figure>
	<a href="https://chuck.is/opnsense/login.png"><img src="https://chuck.is/opnsense/login.png" width="100%"></a>
</figure>

<p>So there we have it, an open source FreeBSD-based firewall and router on this appliance. I had made a small attempt to get a RHEL-based distro to run, but getting everything configured properly is surprisingly difficult to do without a display. This is something I'm still tinkering with. 

<p>I've also read that using a different SSD other than the original will trigger a "no boot drive" error. 

<p>I should note that I'm not currently running this in my environment. This box gets pretty hot and I live on the top floor of an apartment where, in the summertime, already gets especially hot.
                 ]]>
        </description>
	<link>https://chuck.is/opnsense</link>
        <pubDate>Sun, 28 Jun 2026 21:00 PST</pubDate>
  </item>

   <item>
          <title>Reviving an Obsolete NAS with Alt-F</title>
          <description>
                  <![CDATA[
	<p>I was recently handed down a <a href="https://www.dlink.com/uk/en/products/dns-323-sharecenter-2-bay-network-storage-enclosure" target="_blank">D-Link DNS-323 NAS</a> which I thought would be great for my brother to use. Although the stock D-Link firmware functions okay, it's officially EOL and there hasn't been an official update for it since 2013, and therefore using outdated protocols. I did some research and found the project <a href="https://sites.google.com/site/altfirmware" target="_blank">Alt-F</a>, an alternative custom firmware for the DNS-323, as well as several other D-Link NAS variants. Although the Alt-F project itself hasn't received an update since 2018, there's still community activity, and it still provides more modern features and standards compared to D-Link's stock firmware.  

	<p>Loading the Alt-F firmware is simple. Through D-Link's web UI, go to the firmware interface, and simply upload Alt-F's firmware binary. Once applied, it'll do it's thing for about 5 minutes, then it'll reboot automatically. After reboot, I was greeted with a first run wizard that allowed me to set up an admin password, user accounts, time zone, NTP, DNS, DHCP, and a static IP address (among other things).

	<p>After the initial setup, I noticed that the data on the drives were still intact. However, I had initially set up an ext3 partition with the D-Link software, so I decided to reformat to ext4 using the Alt-F firmware. It also supports Btrfs, NTFS, VFAT, and ISO9660. I am also able to SSH into this box and access the full Linux system underneath. So if I'd rather edit /etc/samba/smb.conf directly as opposed the using the web UI, I can do that.

	<p>Here's a comparison between the stock firmware and Alt-F's custom firmware:
	<pre><code>
| Feature           | Stock FW   | Alt-F               |
| ----------------- | ---------- | ------------------- |
| SMB               | SMB1 only  | SMB1/2 (+ SMB3 pkg) |
| FTP               | Yes        | Yes                 |
| FTPS              | No         | Yes                 |
| SFTP              | No         | Yes                 |
| SSH               | No         | Yes                 |
| NFS               | Optional   | Built in            |
| rsync             | No         | Yes                 |
| SCP               | No         | Yes                 |
| Web UI            | Basic      | Advanced            |
| Packages          | Limited    | Entware + custom    |
| Users/Groups      | Basic      | Advanced            |
| Startup Scripts   | No         | Yes                 |
| DNS Server        | No         | Yes                 |
| DHCP Server       | No         | Yes                 |
| Dynamic DNS       | Limited    | Yes                 |
| Print Server      | Yes        | Yes                 |
| Fan Control       | Limited    | Advanced            |
| LED Control       | No         | Yes                 |
| RAID 0/1          | Yes        | Yes                 |
| JBOD              | Yes        | Yes                 |
| RAID 5            | No         | Some support        |
| ext2              | Yes        | Yes                 |
| ext3              | Yes        | Yes                 |
| ext4              | No         | Yes                 |
| Btrfs             | No         | Yes                 |
| NTFS              | Limited    | Yes                 |
| FAT32/VFAT        | Yes        | Yes                 |
| ISO9660           | No         | Yes                 |
| Large Drives      | Limited    | Up to 8 TB          |
| Guest SMB         | Basic      | Configurable        |
| cron Jobs         | No         | Yes                 |
| Telnet            | Limited    | Yes                 |
| WoL Tools         | No         | Yes                 |
| Updates           | Ended 2014 | Community           |
| Linux Shell       | No         | Full shell          |
| Samba Config      | Limited    | Full access         |
| Remote Admin      | No         | SSH/SFTP            |
| Modern OS Support | Limited    | Good                |

	</code></pre>

	<p>The web UI is far more minimalist than the D-Link firmware. From here, I can also install additional packages, enable/disable services, run through various disk utilities, and more. In my screenshot, I'm in the process of transferring ~300GB of data hence the high CPU utilization. 
<img src="alt-f.jpg" width="100%">

	<p>Although the DNS-323 is nearly two decades old, it's nice to know that one can breath new life into it with a project like Alt-F. It's a good reminder that old hardware often has more life left in it than the manufacturer intended thanks to open source projects. 

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
                 ]]>
        </description>
        <link>https://chuck.is/alt-f</link>
        <pubDate>Sun, 24 May 2026 21:00 PST</pubDate>
  </item>

  <item>
	  <title>Self Hosting Passwords</title>
	  <description>
		  <![CDATA[
<p>A few months back, Ars Technica published <a href="https://arstechnica.com/security/2026/02/password-managers-promise-that-they-cant-see-your-vaults-isnt-always-true/">Password managers' promise that they can't see your vaults isn't always true</a>. I haven't used an online password manager in 5 years. Previously I had been using Bitwarden, which is fine, I just prefer to take ownership of as much of my digital life as I can. 

<p>My setup is <a href="https://keepassxc.org/" target="_blank">KeepassXC</a> to manage all my passwords in a database and <a href="https://syncthing.net/" target="_blank">Syncthing</a> to sync all my passwords across my smartphone, laptop, and server. I read a comment on HN recently about how a couple people who had a similar setup and struggled with syncing conflicts, eventually switching back to an online password manager. In the 5 years I've been using KeepassXC + Syncthing, I have yet to have a single conflict with my password. Granted, I don't have a lot of credentials and am very diligent about going through the motions of deleting an online account I no longer have a use for. Once I get confirmation the account is deleted, I then delete the credential from my password manager. I have about 150 credentials in total and I'd guesstimate I could delete around 20 of those. 

<p>Now that said, it is possible to self host an instance of Vaultwarden (a fork of Bitwarden), but after some trial and error, it seemed like a more complex alternative to my current solution. For a period, I also briefly used "<a href="https://www.passwordstore.org/" target="_blank">pass</a>" which is a terminal based offline password manager which I did a <a href="https://chuck.is/pass/">brief write up on</a>. I eventually ditched it and went back to KeepassXC because, again, it was making things more complicated than it needed to be (and the browser plugin I was using always seemed to fight me).   

<p>I'm not arguing that everyone should ditch their online password manager. This method has less conveniences and requires more responsibility. If my phone, laptop, server, and backup hard drive get destroyed tomorrow in a fire, I'll have challenging times ahead. Most people in the world should probably stick with an online password manager so long as they have a strong vault password and randomly generate all their internet account passwords. However, I still prefer a local password manager because it reduces my attack surface, increases my control, and I enjoy the simplicity of not having a third party involved in my password management. KeepassXC works offline, doesn't potentially leak metadata like the sites I visit, it's flexible, and there's no vendor lock-in. I also don't have to deal with a company shutting down, raising prices, or getting acquired by a less reputable company.

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
		 ]]>
	</description>
	<link>https://chuck.is/passwords</link>
	<pubDate>Wed, 20 May 2026 21:00 PST</pubDate>
	</item>

  <item>
	  <title>A Rant on Owning a Modern EV</title>
	  <description>
		  <![CDATA[
<p>This post is not about electric vehicle hesitations like range anxiety and more complicated trip planning. No, this post is just me complaining about the digital experiences that come with owning a modern vehicle, but especially with an EV. Yes, this is yet another edition of "Bad Technology that Chuck Doesn't Like".  
<p>Let's take charging. At the apartment that I'm officially moved out of as of today, there was a convenient Blink Charging station within the complex which charges a reasonable 21 cents per kWh. There's four charging stations and very rarely are all in use. In order to use this charging station (and basically every station I've come across thus far) it requires that I download and install an app to my phone with no option to pay by card. For whatever reason, this app is entirely dependent on Google Play Services to operate, and because I'm a weird person that likes to actually <a href="https://chuck.is/root">own my devices</a>, I run LineageOS on my smartphone. When I first got the car, I initially I had no Google Play Services, but didn't want to go through the trouble of having to start the charge on another smartphone, so I caved and sideloaded the Gapps addon. All was good for several months until the app stopped working. I jumped through a several of loopholes, like rooting my device and installing several Magisk modules to spoof Play Integrity Check, and while that worked for a while, eventually it stopped working. From what I understand, it is now impossible to pass the Play Integrity check with a 3rd party mobile OS, and therefore it is not possible to use Blink Charging.    
<p>Then there's Nissan's E&V Services app, which is designed to be a companion app to the Nissan Leaf. It can be used to remotely lock and unlock doors, turn on climate control, plan a route that includes charging stations, initiate charging, and check what the current charge is at. Holy shit, what an awful app for a multi-billion dollar global company. The "route planner" is broken and has been broken since I bought the car in 2024. To have the privilege of remotely turning on climate control or unlocking your car, it costs a whopping $25 per month. The only reason I ever used this app is because it is handy to see what remaining charge without having to physically visit my vehicle, but I've since uninstalled it due to how buggy it is.  
<p>Nissan's default infotainment leaves a lot to be desired. Not only is it an incredibly clunky and slow interface despite being a few years old, but there's an entire home panel dedicated to advertising XM Radio services with no ability to disable it. It is there forever! The infotainment system does support Android Auto and Apple Play, but again I'm a weird guy that elects not to use Google Play Services. That said, I'm not really a fan of how Google is now inserting ads into Android Auto's navigation.     
<p>Ultimately, my frustrations with EV ownership has little to do with the vehicle itself and entirely to do with the software ecosystem wrapped around it. Of course, most of these issues can be found in all modern cars. Auto companies are forcing consumers to use invasive and overall obnoxious software, locked down devices, subscriptions fees, and shoving advertisements down their throats. The Nissan Leaf itself is a fantastic car and I'm very much happy with it, but the surrounding digital infrastructure is a reminder that modern technology and automotive companies are more interested in controlling and monetizing the end user, rather than serving them. I will now end this rant.
<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="/cdn-cgi/l/email-protection#b0d8d5c9f0d3d8c5d3db9ed9c3"><span class="__cf_email__" data-cfemail="c0a8a5b980a3a8b5a3abeea9b3">[email&#160;protected]</span></a>.</i>
		 ]]>
	</description>
	<link>https://chuck.is/ev</link>
	<pubDate>Sun, 17 May 2026 21:00 -0800</pubDate>
	</item>

  <item>
	  <title>Minimizing and Finding Satisfaction with Less</title>
	  <description>
		  <![CDATA[
			 
	<figure>
		<a href="https://chuck.is/minimizing/laptop.jpg"><img src="https://chuck.is/minimizing/laptop.jpg" width="100%"></a>
	</figure>

<p>We're in the process of moving and it's eye-opening just how much stuff we've accumulated over the span of just two and a half years. During that time, my in-laws from Viet Nam stayed with us for several months, and we welcomed our son into the world. As a result, we made a lot of purchases and learned a few things. I can now speak firsthand just how much advertising is targeted toward new parents about how some product is essential, and how you're a terrible parent if you don't purchase the product (in fact, your child will die without it!). 

<p>I've also realized how difficult it is to responsibly get rid of something once I've taken ownership of it. One cannot just toss everything into the recycling bin and expect that it gets recycled (in fact <a href="https://chuck.is/recycling/">the majority of the stuff we put in the recycling bin ends up in a landfill</a>). Goodwill (or similar) is an option, but there's still a good chance it will never get reused or even properly recycled. I've had some success with Craigslist, but then there's the time cost and I have to deal with random strangers, that may or may not be shady or flaky. I simply don't like the thought of throwing something out that could still be useful to someone. 

<p>When I brought a new object in my home, I thought it was something I needed. In most instances it was just another thing taking up space and making me feel bad whenever I looked at it. We add things to our life with the idea that it will improve us and make our lives better somehow. Before adding something new to our life, we should instead look at what's currently in our lives to remove that could be beneficial first.  

<p>What I'm describing is minimalism and there is practical aspects. Having less stuff means less to lose, clean, maintain, organize, move, or eventually dispose of. It also means less stuff that can be stolen or break. This also translates to more time, energy, focus, and money. I'm someone who strives to be comfortable with as few possessions as possible, though that's obviously easier said then done. 

<p>My homelab, for instance, is an area that has gone unchecked at times and the nerds will know firsthand about holding onto those "just in case" cables. I bought a 10" mini-rack which I thought would make my equipment look more organized and cleaner. Instead I purchased <i>more</i> equipment so the rack looked more loaded up. The imaginary friend I would have over would inspect my rack and think "damn, Chuck is serious about his homelab environment. What a cool guy!" Granted some of this junk is actually needed so I can continue learn and become a better network engineer, but after packing up all but my most essential gear, the only things I really need is a wireless router running OpenWRT, my storage drives, and a small form factor server. 

<p>Minimalism is a philosophy I've adopted in my life and has helped me stay adaptable. Perhaps it also gives me a sense of control in life; an outlet that helps me focus on what I find actually important. When I'm feeling overwhelmed or distracted, decluttering my work space has proved beneficial.  

<p>I'm reminded of something Thoreau wrote "I have in my mind that seemingly wealthy, but most terribly impoverished class of all, who have accumulated dross, but know not how to use it, or get rid of it, and thus have forged their own golden or silver fetters."</p>

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="/cdn-cgi/l/email-protection#83ebe6fac3e0ebf6e0e8adeaf0"><span class="__cf_email__" data-cfemail="bdd5d8c4fdded5c8ded693d4ce">[email&#160;protected]</span></a>.</i>
 
		 ]]>
	</description>
	<link>https://chuck.is/minimizing</link>
	<pubDate>Thu, 7 May 2026 21:00 -0800</pubDate>
	</item>



  <item>
	  <title>How to Build a Time Machine: A GPS-Disciplined Stratum 1 NTP Server</title>
	  <description>
		  <![CDATA[
<figure>
	<a href="https://chuck.is/ntp/rpi5_ntp.jpg"><img src="https://chuck.is/ntp/rpi5_ntp_thumb.jpg"></a>
	</figure>

	<p>During my holiday break, I built a Stratum 1 NTP server in my home lab. Ordinarily, we get our time from internet-based NTP servers which usually Stratum 2 or 3. With Stratum 1, I can get significantly more accurate time directly from the Stratum 0 GPS satellites orbiting above me. On these satellites are atomic clocks which are the most accurate timekeeping devices humanity has ever created. 
	<p>First off, time tracking that's this precise and reliable is overkill for my needs, but it's a fun project and a great learning experience. For this project I used a Raspberry Pi 5 (which I already had), a GPS module, GPIO wires, and a better antenna. I followed some guidance from a colleague, but much of this has been based off of a post on <a href="https://blog.networkprofile.org/gps-backed-local-ntp-server/" target="_blank">NetworkProfile.org</a>. However, what I've put together below has some differences that I felt was worth documenting. For example, I'm using a newer Raspberry Pi 5 and <a href="https://wiki.almalinux.org/documentation/raspberry-pi.html" target="_blank">AlmaLinux 10.1</a> as opposed to a Raspberry Pi 3 and RaspberryPiOS (Debian). As such, some of the instructions, commands, and insights are different, but the original is well worth the read. 
	<h3>The GPS Module</h3>
	<p>In terms of hardware, I bought this <a href="https://www.amazon.com/dp/B084MK8BS2" target="_blank">GPS module receiver</a>, <a href="https://www.amazon.com/dp/B01EV70C78" target="_blank">this set of ribbon cables</a>, and <a href="https://www.amazon.com/Bingfu-Waterproof-Navigation-Connector-Tracking/dp/B07R7RC96G" target="_blank">GPS antenna</a>. However, there are a ton of different modules and antennas available that should work. For everything, I spend about $25. 
	<p>During this project, I learned that although USB is an option on the GPS module, it will not be anywhere near as accurate as going through the GPIO pins on a Raspberry Pi because there is a pin on the module for PPS. PPS stands for Pulse-Per-Second and is a hardware timing signal output used by many GPS receivers that provide an extremely accurate “tick” every second - accurate to the millisecond (and even nanoseconds). Even though the GPS module can be connected over USB and can deliver NMEA sentences and GPS time, USB cannot carry PPS timing as it requires a dedicated electrical pin. So if we want a true Stratum-1 NTP server, we must use something like a Raspberry Pi that has GPIO pins.
	<div style="text-align: center;">
		<a href="https://chuck.is/ntp/gps.jpg"><img src="https://chuck.is/ntp/gps_thumb.jpg"></a>
		<a href="https://chuck.is/ntp/gps_antenna.jpg"><img src="https://chuck.is/ntp/gps_antenna_thumb.jpg"></a><br>
		<small><i>Here's the GPS module and the antenna which I stuck on my windowsill.</i></small>
	</div>

	<p>The first step is to solder the header to the GPS module. I hadn't soldered anything in quite a while, so I picked up a soldering gun for about $10. I'll be up front, I shorted the PPS and TX pins on the GPS module with a little too much solder which caused me about 2 hours of troubleshooting before I realized that was the reason why I wasn't picking up any satellites.
	<p>In regards to connections, the RPI5 GPIO pins 4, 6, 8, 10, and 12, need to be connected to VCC, GND, RXD, TXD, and PPS on the module respectively. Below is a diagram of the RPI5 GPIO pin diagram and a screenshot from the module product page.
	<div class="table-wrapper"><table>
  <thead>
    <tr>
      <th>RPI5 Pin</th>
      <th>GPS Pin</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align:center;">4 - SV</td>
      <td style="text-align:center;">VCC</td>
    </tr>
    <tr>
      <td style="text-align:center;">6 - GND</td>
      <td style="text-align:center;">GND</td>
    </tr>
    <tr>
      <td style="text-align:center;">8 - GPIO 14 TXD</td>
      <td style="text-align:center;">RXD</td>
    </tr>
    <tr>
      <td style="text-align:center;">10 - GPIO 15 RXD</td>
      <td style="text-align:center;">TXD</td>
    </tr>
    <tr>
      <td style="text-align:center;">12 - GPIO 18 - CLK/PCM</td>
      <td style="text-align:center;">PPS</td>
    </tr>
  </tbody>
</table></div>
	<figure>
		<a href="https://chuck.is/ntp/diagram.jpg"><img src="https://chuck.is/ntp/diagram.jpg" width="100%"></a>
		<figcaption>RPI5 GPIO Pin Diagram <a href="https://vilros.com/pages/raspberry-pi-5-pinout" target="_blank">Source</a>.</figcaption>
	</figure>
	<figure>
		<a href="https://chuck.is/ntp/gps_bottom.jpg"><img src="https://chuck.is/ntp/gps_bottom.jpg" width="40%"></a>
		<figcaption>Bottom of GPS module showing PPS, TXD, RXD, GND, and VCC.</figcaption>
	</figure>
	<figure>
		<img src="https://chuck.is/ntp/solder.jpg" width="100%">
		<figcaption>Pin head soldered to the GPS module <a href="https://www.amazon.com/Navigation-Positioning-Microcontroller-Compatible-Sensitivity/dp/B084MK8BS2" target="_blank">Source</a></figcaption>
	</figure>
	<p>Below is what my RPI5 looks like with the GPS module attached. You'll notice that I mounted the GPS module to a Deskpi KL-P24 board. I attached this to my RPI5 because 1) I already had two of them that were included when I bought my minirack, 2) it's cleaner in that all cables run in the same direction behind the RPI5, and 3) I was able to easily mount the GPS module to it. In terms of the excessive wire length, I'll shorten them another day. 
	<div style="text-align: center;">
		<a href="https://chuck.is/ntp/rpi5_gps3.jpg"><img src="https://chuck.is/ntp/rpi5_gps3_thumb.jpg" width="45%"></a>
		<a href="https://chuck.is/ntp/rpi5_gps4.jpg"><img src="https://chuck.is/ntp/rpi5_gps4_thumb.jpg" width="45%"></a>
		<a href="https://chuck.is/ntp/rpi5_gps5.jpg"><img src="https://chuck.is/ntp/rpi5_gps5_thumb.jpg" width="45%"></a>
		<a href="https://chuck.is/ntp/rpi5_gps2.jpg"><img src="https://chuck.is/ntp/rpi5_gps2_thumb.jpg" width="45%"></a>
	</div>
	
	<h3>Software Configuration</h3>
	<p>On AlmaLinux 10.1, install the following packages: <code>sudo dnf install gpsd gpsd-clients tcpdump</code>. The original guide also suggested installing <code>chrony</code> and <code>jq</code> but they were already installed, and <code>pps-tools</code> are not currently in the AlmaLinux 10.1 repos or EPEL at this time (however, pps-tools is not needed).
	<p>To enable the serial port on AlmaLinux, run <code>sudo vim /boot/cmdline.txt</code> and remove the line <code>console=serial0,115200</code> so it will not interfere with GPS data and PPS timing. Below is what mine looks like. Note that I have <code>pcie_aspm=off</code> which I only added to correct some <a href="https://chuck.is/rpi5nvme">NVMe issues</a> and it's not needed for this project. 
	<pre>
<code>console=tty1 root=PARTUUID=f773372a-b398-4536-abc4-b86776f6e1c9 rootfstype=ext4 rootwait pcie_aspm=off</code>
	</pre>

	<p>Now we configure the GPIO pins for PPS with <code>sudo vim /boot/config.txt</code> and add the following lines:
	<pre>
<code># The following 3 lines are for GPS PPS signals
dtoverlay=pps-gpio,gpiopin=18
enable_uart=1
init_uart_baud=57600</code>
	</pre>
	I already had <code>enable_uart=1</code> present in mine, just ensure it exists in the config.
	<p>Now we can add the PPS module: <code>sudo bash -c "echo 'pps-gpio' >> /etc/modules"</code>. 

	<p>Create the file <code>/etc/default/gpsd</code> and added these lines:
	<pre>
<code>START_DAEMON="true"
USBAUTO="true"
DEVICES="/dev/ttyAMA0 /dev/pps0"
GPSD_OPTIONS="-n"</code>
	</pre>
	
	<p>In order to make gpsd start at boot, run this command: <code>sudo ln -s /lib/systemd/system/gpsd.service /etc/systemd/system/multi-user.target.wants/</code>. Now reboot the machine.
	<p>If everything went smoothly, we should start seeing the LED on the GPS module blinking every one second.
	<p>From here we can see if things are working correctly by running <code>cgps -s</code> and <code>gpsmon</code>. If satellites are being picked up, they will be displayed in this output. If we don't see any after around 15 minutes, the configuration is wrong or there's an issue with the hardware (such as the antenna not being a good spot or you shorted the connections as was my case). You can also run <code>gpspipe -w | jq ".uSat| select( . != null )"</code> which will provide the value of how many satellites are being picked up, updating every second. It's important to note that at least 4 satellites are needed to get accurate time.
	<p>For reference, below is my output from <code>cgps -s</code>. Note that my GPS coordinates, Grid Square, and ECEF coordinates are obfuscated with #'s. 
	<pre>
<code>
┌───────────────────────────────────────────┐┌────────────────Seen 19/Used 11──┐
│ Time         2026-01-01T03:00:48.000Z (18)││GNSS  S PRN  Elev  Azim   SNR Use│
│ Latitude          45.6####### N           ││GP  5     5  47.0 136.0  43.0  Y │
│ Longitude        122.4####### W           ││GP 11    11  43.0  54.0  39.0  Y │
│ Alt (HAE, MSL)      60.985,     83.138  m ││GP 12    12  40.0 161.0  29.0  Y │
│ Speed              0.09              km/h ││GP 18    18  14.0 235.0  38.0  Y │
│ Track (true, var)	84.9,  15. 0    deg ││GP 20    20  51.0  80.0  41.0  Y │
│ Climb             -4.32             m/min ││GP 21    21  45.0  88.0  36.0  Y │
│ Status          3D FIX (12 secs)          ││GP 25    25  66.0 217.0  36.0  Y │
│ Long Err  (XDOP, EPX)   0.66, +/-  9.9 m  ││GP 28    28  20.0 284.0  28.0  Y │
│ Lat Err   (YDOP, EPY)   0.72, +/- 10.8 m  ││GP 29    29  60.0 302.0  36.0  Y │
│ Alt Err   (VDOP, EPV)   1.60, +/- 36.8 m  ││GP 31    31  14.0 314.0  31.0  Y │
│ 2D Err    (HDOP, CEP)   0.98, +/- 18.6 m  ││QZ  2   194   7.0 295.0  26.0  Y │
│ 3D Err    (PDOP, SEP)   1.87, +/- 35.5 m  ││GP  6     6   2.0  54.0   0.0  N │
│ Time Err  (TDOP)        1.01              ││GP  9     9   1.0  28.0   0.0  N │
│ Geo Err   (GDOP)        2.13              ││GP 26    26   4.0 321.0   0.0  N │
│ Speed Err (EPS)            +/- 77.8 km/h  ││SB133    46  37.0 189.0   0.0  N │
│ Track Err (EPD)         n/a               ││SB135    48  37.0 183.0   0.0  N │
│ Time offset             0.145824081     s ││SB138    51  35.0 159.0   0.0 uN │
│ Grid Square             ##########        ││QZ  1   193   n/a   0.0   0.0 uN │
│ ECEF X, VX   -#######.###  m    0.050  m/s││QZ  5   197   n/a   0.0   0.0 uN │
│ ECEF Y, VY   -#######.###  m    0.030  m/s││                                 │
│ ECEF Z, VZ    #######.###  m   -0.050  m/s││                                 │
│                                           ││                                 │
│                                           ││                                 </code>
	</pre>

	<h3>Configuring Chrony and Truing Up the Clock</h3>
	<p>Now that we've confirmed that the GPS module is working correctly, we need to configure Chrony. Run <code>sudo vim /etc/chrony.conf</code> and add these two lines:
	<pre>
<code>refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 3 noselect
refclock PPS /dev/pps0 refid PPS lock NMEA poll 3</code>
	</pre>

	Then uncomment <code>log measurements statistics tracking</code> to enable logging. Restart chrony with <code>sudo systemctyl restart chronyd.service</code>.

	<p>In order to true up the clock, we need to see the "Est offset" number so we can revise our chrony configuration so that our clock is more accurate. Run <code>sudo cat /var/log/chrony/statistics.log | sudo head -2; sudo cat /var/log/chrony/statistics.log | sudo grep NMEA</code> and you'll see some data. After around 15 minutes, run it again. Copy and paste this data into a text file, save it, then import it into a spreadsheet and set the delimiter to spaces. The only column we're interested in is Column R (Est). I had to change the values to in this column from "Scientific" to "Number" and increase the decimal to the ten-thousandths place so that 4 values would show after the decimal. Take the average of this column - in my case, it's 0.1412. For more detailed instructions on working with the spreadsheet, I suggest the <a href="https://blog.networkprofile.org/gps-backed-local-ntp-server/" target="_blank">NetworkProfile.org blog post</a>.  
	<p>Open the chrony config with <code>sudo vim /etc/chrony.conf</code> and update the line <code>refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 3 noselect</code> with the offset value we just obtained. In my case, the line is now <code>refclock SHM 0 refid NMEA offset 0.1412 precision 1e-3 poll 3 noselect</code>. Also, comment out the line we uncommented earlier <code>log measurements statistics tracking</code>, then save and close. We can also remove the old log files with <code>sudo rm /var/log/chrony/statistics.log</code>. Finally, restart chrony: <code>sudo systemctl restart chrony</code>. 
	<p>If the tuning we did earlier worked, then PPS will be deemed as the most accurate and will take over. We can take a look at chrony's source with the command <code>watch -n 1 chronyc sources</code> (you can also add the "-v" option for verbose to this command if you want more details on what each column means. The output looks something like this: 

	<pre>
<code>Every 1.0s: chronyc sources          mercury: Wed Dec 31 19:31:58 2025

MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#? NMEA                          0   3   377     7  +6670us[+6670us] +/- 1000us
#* PPS                           0   3   377     6   +704ns[ +834ns] +/-  161ns
^- dns-e.ns4v.icu                2   6   177    25   +468us[ +468us] +/-   48ms
^- 159.203.82.102                3   6   177    24   -858us[ -857us] +/-   37ms
^- 45.12.52.138                  3   6   177    24  -3299us[-3299us] +/-   42ms
^- 173.208.172.164               3   6   177    26  -2429us[-2429us] +/-  151ms</code>
	</pre>

	<p>As you can see, in the far right column, PPS is showing 142ns, whereas the best networked-based NTP is 37ms (or 37,000,000ns!). This value is chrony's estimate of the uncertainty (error bound) of that time source. Obviously, the difference in accuracy is substantial. 
	<p>The symbols in the front are chrony's selection and status markers that tell you which time sources are usable, trusted, and actually discipling the clock. #'s are local reference clocks, whereas ^'s are time sources over the network (most likely the internet). Of the second characters, * means the source is currently controlling the system clock, "?" means unusable/not selected, and "-" indicates the source is a candidate, but it's not selected. Here's a summary:
	<pre>
<code>
| Symbol | Meaning                                     |
| ------ | ------------------------------------------- |
| `#`    | Local reference clock (GPS/PPS)             |
| `^`    | Network time source                         |
| `*`    | Selected (currently disciplining the clock) |
| `?`    | Seen but unusable / not selectable          |
| `-`    | Valid candidate, but not chosen             |</code>
	</pre>

	<p>If satisfied with the accuracy, run <code>sudo vim /etc/chrony.conf</code> again and add "prefer" to the end of PPS line (<code>refclock PPS /dev/pps0 refid PPS lock NMEA poll 3 prefer</code>). 
	<p>To allow clients to connect to chrony, add the line: <code>allow 0.0.0.0/0</code>, or whatever your home network is (ie the common 192.168.1.0/24). We also we must add a line which changes who is allowed to set the system clock and when. All we need to do is add the line <code>manual</code> to <code>chrony.conf</code>. It enables runtime support for the settime command, and at the same time disables chrony’s automatic stepping behavior. Chrony will not step automatically. A clock step can occur only if you explicitly request it.
	<p>We also will add the line <code>local stratum 1</code> which tells connected clients that even if there is no internet connection, this is a Stratum 1 time server.
	<p>While editing the chrony config, it's also not a bad idea to review and even add NTP servers to your chrony file to verify your clock is accurate, or as a fallback option. By default, the only one in AlmaLinux's chrony file is <code>pool 2.almalinux.pool.ntp.org iburst</code>. I also added <code>server time.nist.gov</code> and <code>server tick.usno.navy.mil</code>. Once you're satisfied, save and close, then restart chrony <code>sudo systemctl restart chrony</code>.
	<p>One final step on AlmaLinux is to open the firewall. Running <code>sudo firewall-cmd --add-service=ntp --permanent</code> and <code>sudo firewall-cmd --reload</code> will allow NTP connections to be made.
	
	<h3>Adding the NTP Server as a Source</h3>
	<p>It's fairly simple to add the new NTP server as a source. On Linux machines, we first need to determine what service we're running, which can be done by running <code>systemctl status systemd-timesyncd</code> and <code>systemctl status chronyd</code>. In my case, I see chronyd is active so I'll run <code>sudo vim /etc/chrony.conf</code> and add the line <code>server 10.0.0.40 iburst</code> which is the IP address of the NTP server I just built. Run <code>sudo systemctl restart chronyd</code> and verify it's using the server with <code>chronyc sources</code>. As you can see below, 10.0.0.40 has been selected and identified as a Stratum 1 server.
	<pre>
<code>MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 10.0.0.40                     1   6   377    42    +25us[  +33us] +/-  138us
^- 172-232-15-202.ip.linode>     3  10   377   374  +3078us[+3085us] +/-   79ms
^- fairy0.mattnordhoffdns.n>     3  10   377   378    +72us[  +79us] +/-   72ms
^- 198-12-95-197-host.coloc>     3  10   377    17  -1027us[-1027us] +/-   56ms
^- 23.186.168.132                2  10   367   193  +3436us[+3451us] +/-   25ms</code>
	</pre>	
	<h3>Further Reading</h3>
	<ul>
		<li><a href="https://blog.networkprofile.org/gps-backed-local-ntp-server/">GPS Raspberry Pi NTP Server - NetworkProfile.org</li>
		<li><a href="https://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_strata" target="_blank">Network Time Protocol #Clock Strata</a></li>
	</ul>	
 
<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
	]]>
	</description>
	<link>https://chuck.is/ntp</link>
	<pubDate>Thu, 1 Jan 2026 21:00 -0800</pubDate>
	</item>


  
  <item>
	  <title>Ignorance is Bliss</title>
	  <description>
		  <![CDATA[
<p>"Ignorance is bliss" usually has a negative connotation, a way to refer to someone who is ignorant on some topic that someone else has deemed very important (sometimes meant as an insult). In my view, ignorance can be a positive thing when it comes to most topics. It's not so much about a lack of information on a topic, but more so about selective non-investment in what others consider as very important. We are products of what we pay attention to, and given the sheer amount of information in the form of news, media, entertainments, and legitimately interesting things that are available for us to consume in the modern age, it's more important than ever to be selective in what we pay attention to.

<p>For example I really could not care less about football, celebrity news, daily political controversies, social media influencers, and so on. I have zero interest in these things and I certainly don't have my identity anchored to them. What may seem as obviously important to you could just be background noise to me. Yes, ignorance in the things I don't care about is bliss. My attention is finite, life is finite, so I choose to spend me time focusing on what I see as important or interesting - and it's fair that others may see what interests me as background noise.  

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>
	]]>
	</description>
	<link>https://chuck.is/ignorant</link>
	<pubDate>Mon, 29 Dec 2025 21:00 -0800</pubDate>
	</item>


  <item>
	  <title>Owning a Domain Increases Digital Self-Reliance</title>
	  <description>
		  <![CDATA[
		Updated: 2026-01-09<br>

<p>Other than looking cool to your friends, owning your own domain increases your digital self-reliance. It's kind of like having your own phone number. Just like switching cell phone carriers if you don't like your provider, you can easily switch registrars, hosting companies, or email provider and the world would be none the wiser.

<p>There are many reasons to have your own domain that don't involve email or a website, but for me, those are the two primary ones. I have two websites: one for professional purposes and one for personal uses (this one). When buying beginning to use a domain, there's a few considerations I wish I thought about first. 

<p>For example, <a href="https://chuck.is/xyz">will the TLD (such as .xyz) be blocked by ISPs or automatically flagged as spam by email providers</a> because security teams are lazy? Or whether non-technical people will arbitrarily add an "m" at the end of an email address that ends in ".co" because they don't know any better? My suggestion is to stick with well established TLDs like .com, .net, or .org unless you understand what the drawbacks and limitations are (or don't plan on using it with email). 

<p>Cost is another factor. I use Iceland's TLD ".is" which is around ~$50/yr and <s>can only be renewed <i>annually</i> rather than up to 10 years as with other domains</s> (Kirill pointed out to me via email that ISNIC <i>does</i> allow <a href="https://www.namecheap.com/support/knowledgebase/article.aspx/10105/36/is-domain-registration-requirements/" target="_blank">one year renewals, up to 5 years</a>). The benefit is that it's easy and fun to use in that I can configure sweet-looking URLs like <a href="https://chuck.is/dumb/">chuck.is/dumb</a>. That being said, established TLD's like .com, .net, and .org are usually the most cost effective and run for about ~$15/yr and can be paid for up to 10 years in advance. They've also been around a lot longer so you're unlikely to find a short domains like <a href="http://www.chuck.net/gallery/index.php?/category/20" target="_blank">chuck.net</a> because some guy cooler than you already snagged it. 

<p>Let's talk about email. Once upon a time I wrote a post about <a href="https://chuck.is/email/">why you should use your own domain for all your email</a>. To summarize, having your own email domain is like owning the doorstep to your digital life. 

<p>For example, I own chuckcarroll.net and my email address is chuck@chuckcarroll.net. This decouples me from providers like Gmail, Yahoo, Microsoft, and even Protonmail. While many of these providers allow you to use a custom domain (for a fee), if they do something you don't like or they suspend your account for any reason, you're basically screwed unless you have your own domain. 

<p>With a custom domain, you can typically move to a different provider with ease. This is why I considering switching as not unlike porting your cellphone number to a different carrier.

<p>Another benefit of custom domains are email aliases. I can create any alias I want such as "school@chuckcarroll.net" or "[business]@chuckcarroll.net" on the fly. Each service I register with online gets a unique email address. When my credentials were leaked last year, I was quickly able to determine who was responsible because the exposed email address was "meineke@chuckcarroll.net" - a company I mistakenly gave my email address to for an oil change (and nobody should ever do business with them). 

<p>That being said, I should note that I've been slowly moving away from using [business]@chuckcarroll.net aliases. When real people see the custom email address, they often assume either I work for that company or that I gave false information. Either way, it makes for awkward social interactions.  

<p>Owning your own domain also means you can have your own personal or professional website that you fully control. Years ago, I wrote about <a href="https://chuck.is/web-independent/">why I think it's important for everyone to have a personal website</a>. The same arguments apply here, but I'll add that if you're trying to get noticed (especially if you're looking for work) having a website helps you stand out. 

<p>I also strongly believe that if you're going to write or publish anything, you should own your publishing tools and your platform. Own your words. Own your distribution. Avoid falling into the trap of publishing on someone else's platform like Medium or Substack. 

<p>A domain also enables you to run and share online services. I use custom domains with services like Wallabag, Jellyfin, and Audiobookshelf. If a service is running on my server, I can easily and securely share that service with friends or family since it's publicly accessible. For this I use <a href="https://chuck.is/tunneling/">Cloudflare's Zero Trust tunnels</a>. 

<p>Beyond being a ton of fun to experiment and play around with, owning a domain grants you freedoms you otherwise wouldn't have. It gives you control, flexibility, and long term independence of your digital life.

<h3>Update 2026-01-09</h3>
<p>Apparently, this post has been <a href="https://lobste.rs/s/df8vju/owning_domain_increases_digital_self" target="_blank">floating</a> <a href="https://news.ycombinator.com/item?id=46520240" target="_blank"> around</a> the internet</a>, and I’m humbled by the fact that people took the time to share and read it. One interesting comment caught my attention and it made consider what ownership means. Obviously, you don't really "own" a domain, which raises the question - do you really own anything on the internet? I don't necessarily disagree with this sentiment, but by this logic, you don't own your phone number, the title to a house, your passport, etc. Most things we own are actually governed allocations inside of shared systems. What matters to me is long-term control, portability, and independence, not physical impermanence.  

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a>.</i>	  
		  ]]>
	</description>
	<link>https://chuck.is/self-reliant</link>
	<pubDate>Wed, 24 Dec 2025 21:00 -0800</pubDate>
	</item>

  <item>
	  <title>Resolving I/O Errors on RPI5 with NVMe</title>
	  <description>
		  <![CDATA[
<p>I have an NVMe base for my Raspberry Pi 5 and it's been running for a little over a year without any issues. A couple of months ago I switched to Almalinux and noticed that I could SSH into it right after it booted, but around 30-40 minutes after boot, I could ping from another host on my network but could no longer SSH. When I restarted and directly consoled in, everything was fine until that ~40 minute mark and I started getting a ton of I/O errors. I couldn't even run basic commands like "ls" or "cd". It took me a couple months of off-and-on fiddling to track down the problem. 

<figure>
	<img src="https://chuck.is/rpi5nvme/rpi5.jpg" alt="RPI5 w/ NVMe base" style="width:80%; height:auto;">
	<figcaption>RPI5 w/ NVMe base.</figcaption>
</figure>

<p>Initially I thought it was the NVMe base, ribbon, or the drive, but I swapped each and still had the issue. Then I made the connection that I started receiving I/O errors usually around the same time after bootup. Consoling in, among all the messages, I noticed that the NVMe went into power saving mode not long before the I/O errors started to occur.

<p>I <i>think</i> I solved the issues by adding PCIe power limit to the firmware, preventing the NVMe from going into power saving mode. This can be done by adding a single line to the Raspberry Pi's configuration and haven't experienced any I/O errors since. 

<p>On AlmaLinux edit /boot/efi/cmdline.txt and add the line <code>pcie_aspm=off</code>, then restart. On RaspberryPiOS, it's the same line, but file is located at /boot/firmware/cmdline.txt.

<p>I think the power saving kicks on at different times depending on the OS. On RockyLinux I started having I/O errors almost immediately on startup and didn't get the opportunity to edit the file. 

<p>What's odd is that when I was running EndeavourOS I wasn't experiencing this issue until I upgraded the system, so it sounds like a software issue. It's taken me a while to track down this issue, so hopefully I'll never see this pop up again.  

<p><i>Thanks for reading. Feel free to send comments, questions, or recommendations to <a href="mailto:hey@chuck.is">hey@chuck.is</a></i>.</p>
	]]>
	</description>
	<link>https://chuck.is/rpi5nvme</link>
	<pubDate>Sat, 13 Dec 2025 21:00 -0800</pubDate>
	</item>

</channel>
</rss>
