<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts tagged "software" - nolan caudill&#39;s internet house</title>
    <link>https://nolancaudill.com/tags/software/</link>
    <description>Posts tagged "software" on nolan caudill&#39;s internet house</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 26 Mar 2026 22:28:39 -0700</lastBuildDate>
    <atom:link href="https://nolancaudill.com/tags/software/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Putting Macbook into DFU mode</title>
      <link>https://nolancaudill.com/2026/03/26/putting-macbook-into-dfu-mode/</link>
      <pubDate>Thu, 26 Mar 2026 22:28:39 -0700</pubDate>
      <guid>https://nolancaudill.com/2026/03/26/putting-macbook-into-dfu-mode/</guid>
      <description>&lt;p&gt;During  the most recent upgrade, my MacBook seemed to freeze  on the update so I restarted. Big mistake.&lt;/p&gt;
&lt;p&gt;After it came back up, I got the scary exclamation mark and text that linked to an Apple support page. The page gave me two options: &amp;lsquo;revive&amp;rsquo; my Mac, or restore it.&lt;/p&gt;
&lt;p&gt;Reviving it meant connecting a USB-C cord between the dead laptop and a working one and then hitting a magic combination of keys on the dead one with the right timing to get it to boot into DFU mode so the firmware could be restored.&lt;/p&gt;
&lt;p&gt;I tried and tired but could not get it working correctly.&lt;/p&gt;
&lt;p&gt;Googling, I came across a YouTube video that mentioned &lt;a href=&#34;https://github.com/AsahiLinux/macvdmtool&#34;&gt;https://github.com/AsahiLinux/macvdmtool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I downloaded the software and ran &lt;code&gt;make&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then, with sudo, I ran the &lt;code&gt;serial&lt;/code&gt; subcommand and then the &lt;code&gt;dfu&lt;/code&gt; subcommand and instantly the other laptop went into DFU mode. At that point, the &amp;lsquo;reviving&amp;rsquo; continued as it should and I shortly had a working a laptop again. Thank you, open source author!&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Using Things for GTD</title>
      <link>https://nolancaudill.com/2026/03/05/using-things-for-gtd/</link>
      <pubDate>Thu, 05 Mar 2026 08:45:07 -0800</pubDate>
      <guid>https://nolancaudill.com/2026/03/05/using-things-for-gtd/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using &lt;a href=&#34;https://culturedcode.com/things/&#34;&gt;Things&lt;/a&gt; as my to-do app and &lt;a href=&#34;https://gettingthingsdone.com&#34;&gt;GTD&lt;/a&gt; (aka the Getting Things Done productivity system) for over 10 years. It&amp;rsquo;s helped me stay organized through multiple years of startups, house moves, vacations, two kids, complicated financial situations, and other life complexities, and I wanted to write about how I use them together.&lt;/p&gt;
&lt;h2 id=&#34;inbox&#34;&gt;Inbox&lt;/h2&gt;
&lt;p&gt;First, the Inbox. The purpose of the Inbox is simply to get something out of my head and onto my computer. Whenever I think of something that I want or need to do, I type the fewest necessary words to get an item in the Inbox. These words are short and leave just enough info that I can look at it a few hours later and still be able to know what it means.&lt;/p&gt;
&lt;p&gt;I have configured Things to have the badge number represent the number of tasks in Today and in the Inbox. I want to burn this number down to zero by the end of the day, which means nothing dangling in the Inbox and no tasks I&amp;rsquo;ve picked left incomplete.&lt;/p&gt;
&lt;p&gt;I try and go through the Inbox a few times per day. I follow the guideline that if a task takes less than 2 minutes, just do it, and for everything else, prioritize it.&lt;/p&gt;
&lt;p&gt;Most things that comes into the inbox will be a &amp;lsquo;someday&amp;rsquo; task, which conveniently shares the same meaning across Things and in GTD.&lt;/p&gt;
&lt;p&gt;If something is important, and I need to do it today and I can&amp;rsquo;t get to it immediately, I&amp;rsquo;ll give the task a more descriptive name, and move it to Today.&lt;/p&gt;
&lt;p&gt;In summary, quick notes come in, and then throughout the day, process the list: either do it quickly if I can, or prioritize it.&lt;/p&gt;
&lt;h2 id=&#34;projects&#34;&gt;Projects&lt;/h2&gt;
&lt;p&gt;In GTD, every task that has more than one step is a project. For me, that is too detailed most of the time. I&amp;rsquo;ve adopted a different angle: every project should have a next step that immediately gets me back into the flow of the project.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t bother creating a full project in Things for a &amp;ldquo;someday&amp;rdquo; task. That&amp;rsquo;s wasted effort as planning something I may never do, or at least for a while, is not a great use of time.&lt;/p&gt;
&lt;p&gt;I do have some recurring projects like planning birthdays or holidays, or completing taxes. I give them a deadline of when they should complete. Then, to keep the projects out of the sidebar until it&amp;rsquo;s time to think about them, I set an appropriate &amp;lsquo;When&amp;rsquo;. This maps to GTD&amp;rsquo;s &amp;ldquo;tickler file&amp;rdquo; concept.&lt;/p&gt;
&lt;p&gt;With this setup, I typically only have 2-5 projects visible in the left sidebar which keeps noise and clutter down. I can also click into &amp;lsquo;Anytime&amp;rsquo; and that view only shows me the next action for my active projects. So, if my Today is clear and I&amp;rsquo;m looking for something to do, I can click in there and see what I can get done.&lt;/p&gt;
&lt;h2 id=&#34;today&#34;&gt;Today&lt;/h2&gt;
&lt;p&gt;The Today view only holds the things that I must do today, or have committed to doing today.&lt;/p&gt;
&lt;p&gt;Every night, or over my morning coffee, I&amp;rsquo;ll skim through my active projects and pick out a small handful of things to do today from my &amp;lsquo;Anytime&amp;rsquo; list. If that Anytime list is empty, I&amp;rsquo;ll browse through the &amp;lsquo;Someday&amp;rsquo; list and see if there are any projects I want to start on.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to be ambitious and say I&amp;rsquo;m going to do more than is reasonable in a day, but I really try to keep this list short. If things roll over to the next day, I&amp;rsquo;ve found I trust my list less to tell me what is important. And, there is some benefit in looking at what I didn&amp;rsquo;t get done and figuring out why that is.&lt;/p&gt;
&lt;p&gt;I really try not to shame or guilt myself into doing tasks by putting them in the Today view. I tend to punt on those things and they roll over to the next day (and the next day, and the next day&amp;hellip;), which changes the list from being practical to aspirational.&lt;/p&gt;
&lt;h2 id=&#34;weekly-review&#34;&gt;Weekly review&lt;/h2&gt;
&lt;p&gt;This is the part that&amp;rsquo;s easy to skip, but I believe is the key to the whole system.&lt;/p&gt;
&lt;p&gt;In GTD, the weekly review helps me get my plans in good shape. I have time set aside on my calendar every Friday afternoon, where I do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Empty the Things Inbox list&lt;/li&gt;
&lt;li&gt;Use the &amp;lsquo;deadlines&amp;rsquo; view in Things to see if anything that is coming up soon&lt;/li&gt;
&lt;li&gt;Go through all projects and make sure each has a clear next step&lt;/li&gt;
&lt;li&gt;Look through the Someday list and see if there is anything important I want to schedule soon&lt;/li&gt;
&lt;li&gt;Look through my calendar and see if there is anything I should prepare for&lt;/li&gt;
&lt;li&gt;Then, a full braindump where I think of anything that&amp;rsquo;s been floating in my head&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the end of this, I have a solid grasp of what&amp;rsquo;s happening, what&amp;rsquo;s coming up, and get anything nagging me out of my head.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Things is a very natural fit for the GTD system, and I haven&amp;rsquo;t found there&amp;rsquo;s any places in the GTD system that I&amp;rsquo;ve had to hack or hammer into the software. As always, picking what&amp;rsquo;s important to do is the hard part, but Things + GTD makes it easy to make progress on those things, with little falling through the cracks.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>My current agentic coding approach</title>
      <link>https://nolancaudill.com/2026/02/22/my-current-agentic-coding-approach/</link>
      <pubDate>Sun, 22 Feb 2026 16:41:52 -0800</pubDate>
      <guid>https://nolancaudill.com/2026/02/22/my-current-agentic-coding-approach/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been full swing on using agents (primarily Codex with a mix of Claude) the past few weeks working on a few personal software projects, and I&amp;rsquo;ve started to get into a rhythm of an approach that is working for me, and results in relatively steady progress without many false starts, wild expansive scope, or complete do-overs.&lt;/p&gt;
&lt;h2 id=&#34;work-small&#34;&gt;Work small&lt;/h2&gt;
&lt;p&gt;I like to keep the feedback loops relatively small, which means asking for small iterations and then checking often.&lt;/p&gt;
&lt;p&gt;The guideline I&amp;rsquo;ve found that keeps the process moving along is to only ask it to build something that I could reasonably test in a few minutes.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Test&amp;rdquo; in this case is more like an acceptance test — did the software do the thing I hoped it would do? I&amp;rsquo;ve actually found the automated tests that the agents have been generating and automatically running after every change to be fairly complete so this has been the &amp;ldquo;Is this what I wanted? Does this feel right?&amp;rdquo; phase.&lt;/p&gt;
&lt;p&gt;When I first started using these tools, I&amp;rsquo;d ask for fairly large, open-ended changes and then give incredibly specific instructions for one aspect of it. This never worked. I&amp;rsquo;d get something that was akin to what I asked for but usually with lots of things I didn&amp;rsquo;t want, and few things that I did. I&amp;rsquo;d also have no idea how it fit together, tradeoffs it made, or even how to test it fully.&lt;/p&gt;
&lt;p&gt;Another benefit of working small is that I&amp;rsquo;m spending most of my time verifying and tweaking which is way less frustrating than trying to rephrase and describe a full worldview to the model so that it might guess better next time.&lt;/p&gt;
&lt;h2 id=&#34;use-plan-mode-liberally&#34;&gt;Use plan mode liberally&lt;/h2&gt;
&lt;p&gt;All the major players have some version of plan mode, where the agents are explicitly forbidden from writing code and instead come up with an output that is a readable doc.&lt;/p&gt;
&lt;p&gt;My first couple of attempts at these would be to write a full requirements doc, similar to the ones a product manager would write. But, I found that I could be much more concise and get just-as-good levels of plans.&lt;/p&gt;
&lt;p&gt;For any feature of some complexity or ambiguity, or where I wasn&amp;rsquo;t quite sure I what I wanted, I&amp;rsquo;d do this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enter plan mode&lt;/li&gt;
&lt;li&gt;Write a quick, one sentence version of what I wanted&lt;/li&gt;
&lt;li&gt;Add in some extra context of the motivation if I thought it was useful&lt;/li&gt;
&lt;li&gt;If I knew of some edge cases or error conditions that I knew were important, I would add them here&lt;/li&gt;
&lt;li&gt;If it was similar to another feature, I&amp;rsquo;d mention that to give it a head-start of what &amp;ldquo;good&amp;rdquo; would look like&lt;/li&gt;
&lt;li&gt;Then, at the end, I literally say, &amp;ldquo;Ask me lots of questions.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it would! It&amp;rsquo;d go off and read through code and docs, and quickly come back with some implementation questions, scope questions (&amp;ldquo;do you want the kit-and-kaboodle, or the quick-and-easy?&amp;rdquo;), and if at any point I wasn&amp;rsquo;t sure, I&amp;rsquo;d stop and go back and forth on a minor point until I was able to figure out and describe what should happen.&lt;/p&gt;
&lt;p&gt;Plan mode is a really nice mix of being high-level and then being presented with some tradeoffs where it matters.&lt;/p&gt;
&lt;p&gt;Side benefit: Sometimes a feature is one where I&amp;rsquo;m not sure what I wanted, but I would  know it when I saw it. Just being quizzed by the agent on tradeoffs sometimes has resulted in me seeing the kernel of the feature better, while also realizing that it was way more complexity than I wanted to add and I&amp;rsquo;d scrap the whole feature.&lt;/p&gt;
&lt;h2 id=&#34;fast-automated-tests&#34;&gt;Fast, automated tests&lt;/h2&gt;
&lt;p&gt;My current software project is a CLI tool, written in go. My original prompt included mentioning it needed to be robust and that tests should be maintained and ran before returning success. The magic is watching it make changes, run the tests, see breakage, figure out what needs to change, and then changing the code to get to green again.&lt;/p&gt;
&lt;p&gt;For the current project, I had used agents to write 100% of the code. Not a single line or character change was manual. I had a minor text change I wanted to make so I manually updated the text and sure enough broke the tests. It turned out that the minor text, in my eyes, was covered in tests coverage  3 different ways, which gave me a lot of confidence in the rest of the tests.&lt;/p&gt;
&lt;h2 id=&#34;one-thread-at-a-time&#34;&gt;One thread at a time&lt;/h2&gt;
&lt;p&gt;This one is probably controversial and may be as much of a reflection of my relative newbieness to this way of working but I really like the one thread at a time approach.&lt;/p&gt;
&lt;p&gt;I know people spend time on writing orchestration systems so they can spin up multiple changes at one time but for me, the bottleneck is what can I reason through and verify. Having multiple things in flight means reasoning about how they interact, and that turns play into work.&lt;/p&gt;
&lt;h2 id=&#34;the-architecture-matters&#34;&gt;The architecture matters&lt;/h2&gt;
&lt;p&gt;Easy to read that &amp;ldquo;architecture matters&amp;rdquo; as a no-duh, of-course-it-does statement, but I think it is more interesting than a quick read suggests.&lt;/p&gt;
&lt;p&gt;Many of the reasons that people favor certain tools or patterns are things that are, in some way, less relevant now. &amp;ldquo;This tool doesn&amp;rsquo;t have good documentation&amp;rdquo; doesn&amp;rsquo;t matter when agents can just vacuum the whole code into context. And any missing shim or API or wrapper can be quick work for a well-prompted LLM.&lt;/p&gt;
&lt;p&gt;But, there is a compounding benefit in choosing certain tools or patterns. For my current project, I picked go + bash as the weapons of choice. Go is fast to compile and has a good testing story and that makes for fast feedback loops. There is also a tremendous amount of go and bash code in the world and LLMs are pretty dang good at producing idiomatic go code.&lt;/p&gt;
&lt;p&gt;And, having seen lots of systems over the years, and knowing why some are &amp;ldquo;good&amp;rdquo; and others &amp;ldquo;less good&amp;rdquo; given certain constraints, absolutely helps when making tradeoffs or figuring out which paths to go down and which to avoid. This is probably the &amp;ldquo;taste&amp;rdquo; that people say doesn&amp;rsquo;t scale. (I am not sure what I believe here yet.)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Wrapping up, my biggest suggestion is to resist the urge to go big. Work in mind-sized chunks, use your taste and judgement each step of the way, and you&amp;rsquo;ll find the momentum builds from there. I have no doubt my approach will be wildly different as people figure out what these systems are capable of, and their limitations, but right now, this rhythm is working for me and I&amp;rsquo;m having fun.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Writing a Simulator</title>
      <link>https://nolancaudill.com/2026/02/17/writing-a-simulator/</link>
      <pubDate>Tue, 17 Feb 2026 13:46:32 -0800</pubDate>
      <guid>https://nolancaudill.com/2026/02/17/writing-a-simulator/</guid>
      <description>&lt;p&gt;To give myself a slightly-bigger project, I came up with the idea of writing an simulator game where you&amp;rsquo;re the CTO of a small startup with a goal of helping your company get to an IPO.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nolancaudill.com/images/cto-sim.png&#34; alt=&#34;screenshot of CTO simulator&#34;&gt;&lt;/p&gt;
&lt;p&gt;I just started it around dinnertime last night, writing up a few paragraphs with how things like projects, budgets, hiring, incidents, and so on work. I let Claude and Codex rip on a planning (&amp;ldquo;here&amp;rsquo;s some words. now ask me questions.&amp;rdquo;) and implementation loop. After every loop, I&amp;rsquo;d play around with it, think of a thing that&amp;rsquo;d make it better, and repeat.&lt;/p&gt;
&lt;p&gt;This post isn&amp;rsquo;t about writing software with agents (though I am amazed and am learning a lot about what they are good at and not so capable of) but a more general thing I&amp;rsquo;m learning when you&amp;rsquo;re writing a simulator.&lt;/p&gt;
&lt;p&gt;Writing this simulator is as much encoding how I think the job of engineering manager works than anything else. If someone said, &amp;ldquo;How would you do the mechanics of the job?,&amp;rdquo; this would be an interactive answer to that question which is neat in a meta way.&lt;/p&gt;
&lt;p&gt;When thinking through the elements of the game and how they work and interact, I started to use (my many) years of seeing these things up close to model how I think they should behave.&lt;/p&gt;
&lt;p&gt;The first part of writing the simulator was mostly coming up with the nouns, the physical objects: projects, engineers, budgets, incidents and then, what sort of attributes they&amp;rsquo;d have. Projects have a timeline, whether or not they are started or not, which team they are assigned to and other things that seemed relevant to the flow of the game.&lt;/p&gt;
&lt;p&gt;But, thinking harder, I started to think of things that &amp;ldquo;real&amp;rdquo; projects have. They have a distribution curve of when they&amp;rsquo;ll actually finish. The individuals that start on a project might not be the same set throughout. And, when you assign a project to an already busy team, each of project takes a little longer (though you as the CTO/manager might not know that until too late).&lt;/p&gt;
&lt;p&gt;I realized that writing a simulator about something you know well, you quickly see where the simulator isn&amp;rsquo;t correct and you add that in. And, before long, I realized I haven&amp;rsquo;t written a generic &amp;ldquo;you&amp;rsquo;re the CTO&amp;rdquo; game but instead an interactive way to explore how I specifically see the job. I believe someone else given this prompt would pick different things to emphasize, objects interacting differently, and likely even different success criteria.&lt;/p&gt;
&lt;p&gt;(Also, I don&amp;rsquo;t think the game is &amp;ldquo;fun&amp;rdquo; yet but I&amp;rsquo;m not sure a simulation of a fairly bureaucratic job would be fun? If it does up being fun, or at least interesting in my eyes, I&amp;rsquo;ll likely open source it but I&amp;rsquo;m not there yet.)&lt;/p&gt;
&lt;p&gt;The other part of this exercise that is interesting is that the game does have some emergent properties. For example, new engineers have some amount of ramp before they are fully productive. New engineers on a project might take longer or make more mistakes (which is natural!). Newer engineers add some risk to projects and missed projects hurt the CTO&amp;rsquo;s standing and lowers the morale of the team. Each of these consequences follow naturally based on some simple rules, but when interacting together, every game is slightly different and somewhat surprising.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Blink: A more secure OpenClaw</title>
      <link>https://nolancaudill.com/2026/02/13/blink-a-more-secure-openclaw/</link>
      <pubDate>Fri, 13 Feb 2026 09:56:59 -0800</pubDate>
      <guid>https://nolancaudill.com/2026/02/13/blink-a-more-secure-openclaw/</guid>
      <description>&lt;p&gt;I have been intrigued by &lt;a href=&#34;https://openclaw.ai&#34;&gt;OpenClaw&lt;/a&gt; &amp;ndash; a system that uses LLM agents to act locally on your behalf, doing things like sorting email, filling out webforms, cleaning up files, etc  &amp;ndash; but the security seemed like a complete afterthought. I was happy for folks using that, but it was something I would not run for myself.&lt;/p&gt;
&lt;p&gt;This, though, looks interesting and well thought-out. I&amp;rsquo;m still not at the point where I&amp;rsquo;d set this up but this is moving things in the right direction.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://coder.com/blog/why-i-ditched-openclaw-and-built-a-more-secure-ai-agent-on-blink-mac-mini&#34;&gt;Why I Ditched OpenClaw and Built a More Secure AI Agent on Blink + Mac Mini&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The community responded with workarounds: layering on firewalls, VPN tunnels, and reverse proxies. These were patches on a system that wasn&amp;rsquo;t built with security at its core. OpenClaw was designed as a single-user local tool that organically grew into something much bigger. Security was bolted on after the fact instead of baked in from the start.&lt;/p&gt;
&lt;p&gt;I wanted everything OpenClaw offered: a personal AI agent on my own hardware, connected to my real tools, available around the clock. But I also wanted a system where the secure setup is the default, without requiring constant hardening and maintenance.&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>Fun with LLMs</title>
      <link>https://nolancaudill.com/2026/02/12/fun-with-llms/</link>
      <pubDate>Thu, 12 Feb 2026 21:41:26 -0800</pubDate>
      <guid>https://nolancaudill.com/2026/02/12/fun-with-llms/</guid>
      <description>&lt;p&gt;I had a lot of fun playing Claude and OpenRouter today, trying out new techniques, prompts and different models. I realize I&amp;rsquo;m about 6 months to 2 years behind a lot of people but this is truly the most fun I&amp;rsquo;ve had writing software in a long long time.&lt;/p&gt;
&lt;p&gt;Just today I&amp;rsquo;ve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diagnosed a bug with how I was added SSL to the &lt;a href=&#34;https://nolancaudill.com/2026/02/11/hosting-rss/&#34;&gt;miniflux&lt;/a&gt; installation&lt;/li&gt;
&lt;li&gt;Completely revamped my vimrc&lt;/li&gt;
&lt;li&gt;Completely revamped my zshrc&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Wrote&amp;rdquo; a basic test harness and test suite for this blog (in bash, naturally)&lt;/li&gt;
&lt;li&gt;Played with 3-4 different models&lt;/li&gt;
&lt;li&gt;And most fun of all, I sat with our 9 year old this afternoon (who is home because of the &lt;a href=&#34;https://missionlocal.org/2026/02/sf-teachers-strike-sfusd-schools-day-4-live-updates/&#34;&gt;strike&lt;/a&gt;) and wrote a complete browser-based store simulator, where you are a shopkeeper and have to do pricing and inventory management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now I&amp;rsquo;m spending the evening reading about how best to use these tools beyond barking commands at them.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Hosting an RSS reader</title>
      <link>https://nolancaudill.com/2026/02/11/hosting-rss/</link>
      <pubDate>Wed, 11 Feb 2026 21:29:14 -0800</pubDate>
      <guid>https://nolancaudill.com/2026/02/11/hosting-rss/</guid>
      <description>&lt;p&gt;In the year 2026, I decided I wanted to self-host an RSS reader. After setup, I am running &lt;a href=&#34;https://miniflux.app&#34;&gt;miniflux&lt;/a&gt; in Docker on a Synology NAS configured to expose a Google Reader API so I can use &lt;a href=&#34;https://netnewswire.com&#34;&gt;NetNewsWire&lt;/a&gt; as the client on iOS and macOS. Here&amp;rsquo;s how I got that working.&lt;/p&gt;
&lt;h2 id=&#34;motivation&#34;&gt;Motivation&lt;/h2&gt;
&lt;p&gt;My news reading method was incredibly haphazard. I flitted betweeen big news sites, apps like Apple News, various subreddits and blogs. I forgot which sites I visited. I lost track of interesting articles I came across. I was disorganized.&lt;/p&gt;
&lt;p&gt;Also, like every tech-savvy person of a particular age, I really missed Google Reader. I had dozens of RSS feeds I read daily and I missed that. I&amp;rsquo;ve tried various RSS readers over the years and none of them stuck.&lt;/p&gt;
&lt;p&gt;But, &lt;a href=&#34;https://netnewswire.blog/2026/02/11/netnewswire-turns.html&#34;&gt;on its 23rd birthday&lt;/a&gt;, I downloaded NetNewsWire and instantly loved the macOS-familiar UI.&lt;/p&gt;
&lt;p&gt;But, when exploring what RSS syncing service to use, none of the options fit what I wanted. I wouldn&amp;rsquo;t have enough feeds to justify using one of the paid services, and the iCloud option, while being the right price (read: free), is &lt;a href=&#34;https://netnewswire.com/help/iCloud.html&#34;&gt;slow&lt;/a&gt;. So, I dug into self-hosting, which NetNewsWire supports as long as the service exposes a Google Reader-compatible API.&lt;/p&gt;
&lt;p&gt;The option that floated to the top was &lt;a href=&#34;%5Bhttps://miniflux.app&#34;&gt;miniflux&lt;/a&gt;. Miniflux is, in its own words, &amp;ldquo;a minimalist and opinionated feed reader.&amp;rdquo; Perfect. It does have a very usable web UI but I planned to use it primarily via the NetNewsWire apps.&lt;/p&gt;
&lt;p&gt;I uncovered a couple of gotchas so wanted to write them here in case anyone else wants to glue these pieces together and host their own RSS reader.&lt;/p&gt;
&lt;h2 id=&#34;install-miniflux&#34;&gt;Install miniflux&lt;/h2&gt;
&lt;p&gt;First, I created a new directory on the NAS itself.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mkdir -p /[your volume here]/docker/miniflux&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Inside that directory, I created 1 file and 2 more directories.&lt;/p&gt;
&lt;p&gt;The 2 directories were: &lt;code&gt;data/postgres&lt;/code&gt; and &lt;code&gt;var/lib/postgresql/data&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The docker-compose file, titled &lt;code&gt;docker-compose.yml&lt;/code&gt; follows. Note: there are placeholder passwords and URLs in there which may be worth changing.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#39;3.8&amp;#39;

services:
  miniflux-db:
    image: postgres:15-alpine
    container_name: miniflux-db
    environment:
      - POSTGRES_USER=miniflux
      - POSTGRES_PASSWORD=changeme_strong_password
      - POSTGRES_DB=miniflux
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    restart: unless-stopped

  miniflux:
    image: miniflux/miniflux:latest
    container_name: miniflux
    ports:
      - &amp;#34;8080:8080&amp;#34;
    depends_on:
      - miniflux-db
    environment:
      - DATABASE_URL=postgres://miniflux:changeme_strong_password@miniflux-db/miniflux?sslmode=disable
      - RUN_MIGRATIONS=1
      - CREATE_ADMIN=1
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=changeme_admin_password
      - BASE_URL=http://your-nas-ip:8080
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now that you have the docker-compose file and the required directories created, run: &lt;code&gt;sudo docker-compose up -d&lt;/code&gt; to build the containers and start them.&lt;/p&gt;
&lt;p&gt;When this is complete, you should have a running miniflux reader listening on port 8080. You will now need to login to configure the service.&lt;/p&gt;
&lt;h2 id=&#34;configure-miniflux&#34;&gt;Configure miniflux&lt;/h2&gt;
&lt;p&gt;Once logged in, you will need to configure miniflux to turn on its Google Reader API, which is not on by default. Under Settings -&amp;gt; Integrations, you will see &amp;lsquo;Google Reader&amp;rsquo;. Under this section, you will need to create a new username and password (I just used the same one as the service login). Hit update and you&amp;rsquo;re done.&lt;/p&gt;
&lt;h2 id=&#34;configure-netnewswire&#34;&gt;Configure NetNewsWire&lt;/h2&gt;
&lt;p&gt;In NetNewsWire, you will want to add a new account. In the settings, under accounts, you will see &amp;lsquo;self-hosting&amp;rsquo; with FreshRSS. (NetNewsWire should probably just call this option &amp;ldquo;Google Reader API-compatible service&amp;rdquo; or something, because that&amp;rsquo;s what it is.)&lt;/p&gt;
&lt;p&gt;Select FreshRSS and then enter in the Google Reader integration username/password you just created and enter in the URL that miniflux gave you. It &lt;em&gt;should&lt;/em&gt; just be the base URL of the miniflux service with no trailing slash.&lt;/p&gt;
&lt;p&gt;If all went well, you should be in business.&lt;/p&gt;
&lt;h2 id=&#34;some-new-install-gotchas&#34;&gt;Some new install gotchas&lt;/h2&gt;
&lt;p&gt;I am not sure why but I needed to go to the &amp;lsquo;Feeds&amp;rsquo; section in miniflux and hit &amp;lsquo;refresh all feeds in the background&amp;rsquo; to get them to start polling automatically. I think this was related to the OPML import. I bet that adding a feed automatically queues up the first polling job, but an OPML import doesn&amp;rsquo;t. This fixes whatever problem that is.&lt;/p&gt;
&lt;p&gt;Also, I was moving my OPML from an existing RSS reader to this one. I wasn&amp;rsquo;t able to do it from the NetNewsWire interface but importing via the miniflux import feature worked fine.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;After following the steps above, I now have a hosted RSS reader running on my NAS and some slick native clients that stay in sync. Success.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>MeteoPace</title>
      <link>https://nolancaudill.com/2026/02/11/2026-02-11-meteopace/</link>
      <pubDate>Wed, 11 Feb 2026 13:38:45 -0800</pubDate>
      <guid>https://nolancaudill.com/2026/02/11/2026-02-11-meteopace/</guid>
      <description>&lt;p&gt;I came across &lt;a href=&#34;https://www.meteopace.com&#34;&gt;MeteoPace&lt;/a&gt; (&lt;a href=&#34;https://podcasts.apple.com/us/podcast/the-physiology-of-endurance-running-podcast/id1642720087?i=1000749193569&#34;&gt;via&lt;/a&gt;) which is something I&amp;rsquo;ve wanted for a while.&lt;/p&gt;
&lt;p&gt;When you are running, wind, heat, humidity, and elevation all can affect your ability to hold a pace. This is especially critical when you&amp;rsquo;re racing, as a few seconds difference in pace can be the difference in finishing or not. There are various rules-of-thumb and calculators people use, but those can be unwieldy and error-prone. This app looks to make this much easier.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve synced my Strava runs to this, and spot-checking some recent hilly runs seemed to match the effort I was putting in. This is going to be very useful for that summer running.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nolancaudill.com/images/meteopace.png&#34; alt=&#34;meteopace screenshot showing the impact that elevation and weather had on a recent run&#34;&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
