<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nicholas Clooney</title>
    <link>https://blog.nicholas.clooney.io/</link>
    <description>Nicholas Clooney</description>
    <language>en</language>
    <atom:link href="https://blog.nicholas.clooney.io/feed.xml" rel="self" type="application/rss+xml" />
    
    <lastBuildDate>Tue, 14 Jul 2026 00:00:00 GMT</lastBuildDate>
    
    
      
      <item>
        <title>GL.iNet Slate 7, Tailscale, and Split-Routing Around the Great Firewall</title>
        <link>https://blog.nicholas.clooney.io/posts/gl-inet-slate-7-tailscale-and-china-split-routing/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/gl-inet-slate-7-tailscale-and-china-split-routing/</guid>
        <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A full technical walkthrough of the router-level setup I run in China:
a GL.iNet Slate 7 running Tailscale as the default route to a Debian
VPS exit node, with policy-based routing sending CN traffic direct
and a DNS split that keeps Chinese and foreign services both fast.
Includes the three gotchas that took the longest to unstick: LAN
forwarding and MASQUERADE on `tailscale0`, PBR-vs-Tailscale
precedence, and the GL.iNet 0x8000 mark leak.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>A refresher on SwiftUI state management, async/await, and common patterns</title>
        <link>https://blog.nicholas.clooney.io/posts/swiftui-state-async-and-patterns-refresher/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/swiftui-state-async-and-patterns-refresher/</guid>
        <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A working refresher on the SwiftUI you actually meet in real codebases in 2026: pre-iOS 17 state management, modern @Observable, async/await as the default, and the everyday patterns for networking, navigation, and error handling.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>My AI-Assisted Terminal Setup: Subspace Emacs and a Tmux Layout Shortcut</title>
        <link>https://blog.nicholas.clooney.io/posts/my-ai-assisted-terminal-setup-subspace-emacs-and-tmux-layout/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/my-ai-assisted-terminal-setup-subspace-emacs-and-tmux-layout/</guid>
        <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Two projects in one: a lightweight Emacs config I actually own (Subspace Emacs), and a tmux 70/20/10 vertical layout I can summon and reshape with a single keystroke. Built collaboratively with Claude and Codex.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Building a Lightweight Emacs Config After Spacemacs</title>
        <link>https://blog.nicholas.clooney.io/posts/lightweight-emacs-from-spacemacs/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/lightweight-emacs-from-spacemacs/</guid>
        <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Migrating from Spacemacs to a much smaller hand-rolled Emacs config: what I kept, what I removed, and how the new setup was implemented.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Bypassing the Meta Horizon Link Drive Check in CrossOver</title>
        <link>https://blog.nicholas.clooney.io/posts/meta-horizon-link-crossover-drive-check-bypass/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/meta-horizon-link-crossover-drive-check-bypass/</guid>
        <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[I patched the Meta Horizon Link installer just far enough to bypass its CrossOver drive eligibility check. It got past preflight, downloaded, asked for a restart, and then revealed the real problem: nothing usable had actually installed.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>AgentOS: The Agent Environment That Gets Smarter As You Build</title>
        <link>https://blog.nicholas.clooney.io/posts/building-ai-agent-workflows-that-accumulate-context/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/building-ai-agent-workflows-that-accumulate-context/</guid>
        <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[The bottleneck isn't the model. It's whether your repo can explain itself to a fresh agent. Here's how I'm building AgentOS, a project environment that gets smarter the more it's used.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>The Brain That Grew — Then Shrunk: What I Just Discovered</title>
        <link>https://blog.nicholas.clooney.io/posts/the-brain-that-grew-then-shrunk-what-i-just-discovered/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/the-brain-that-grew-then-shrunk-what-i-just-discovered/</guid>
        <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A look at the long rise of human brain size, the surprising shrinkage that followed, and why the brain may have started delegating part of the load to culture.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>The Confident Lie: What AI Got Wrong About @ViewBuilder</title>
        <link>https://blog.nicholas.clooney.io/posts/the-confident-lie-what-ai-got-wrong-about-viewbuilder/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/the-confident-lie-what-ai-got-wrong-about-viewbuilder/</guid>
        <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A real SwiftUI debugging note about optional views, overconfident AI advice, and why @ViewBuilder is inherited by body but not by your own computed view properties.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Why You Feel More Tired During the Day Than at Night</title>
        <link>https://blog.nicholas.clooney.io/posts/why-you-feel-more-tired-during-the-day-than-at-night/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/why-you-feel-more-tired-during-the-day-than-at-night/</guid>
        <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[The afternoon slump and evening second wind are not just willpower problems. They come from the push and pull between sleep pressure and the circadian alerting system.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Three ways to pass an @Observable object in SwiftUI</title>
        <link>https://blog.nicholas.clooney.io/posts/three-ways-to-pass-an-observable-object-in-swiftui/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/three-ways-to-pass-an-observable-object-in-swiftui/</guid>
        <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Environment injection, direct initializer passing, and @Binding all share SwiftUI state, but they carry different meanings around ownership, coupling, and interface scope.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>SwiftUI in the Wild: Memory, Concurrency, and the Gaps in the Docs</title>
        <link>https://blog.nicholas.clooney.io/posts/swiftui-in-the-wild-memory-concurrency-and-the-gaps-in-the-docs/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/swiftui-in-the-wild-memory-concurrency-and-the-gaps-in-the-docs/</guid>
        <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A collection of hard-won SwiftUI patterns for memory, async work, and Observation edge cases. Covers view model lifetime bugs, debouncing, async button actions, task ownership, reference cycles, and the tension between @Observable and actors.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>The Accelerated Speed of Creation</title>
        <link>https://blog.nicholas.clooney.io/posts/accelerated-speed-of-creation/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/accelerated-speed-of-creation/</guid>
        <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>This past week I shipped across code and writing at a pace that would have felt unrealistic before AI. The surprising part was that it did not feel frantic; it felt like less friction between thought and artifact. It truly feels like working at warp speed, 😜.</p><p>Look at this. This is what I have shipped so far in a single week and growing (<a href="/timeline/weeks/2026-W16/">full list here</a>):</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>I Built My Own Thread in Subspace Builder</title>
        <link>https://blog.nicholas.clooney.io/posts/threaded-timeline-entries/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/threaded-timeline-entries/</guid>
        <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[I wanted a thread-like place for public work notes that stayed fully mine. Threaded timeline entries let Subspace Builder capture progress in Markdown, in Git, and in whatever order the work actually happened.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>rtc-bridge — TCP tunneling from a browser, explained</title>
        <link>https://blog.nicholas.clooney.io/posts/rtc-bridge-tcp-tunneling-from-a-browser-explained/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/rtc-bridge-tcp-tunneling-from-a-browser-explained/</guid>
        <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A friend built a tool that lets a browser reach local TCP services over WebRTC, no open ports, no install, no public IP required. I went down the rabbit hole understanding how it actually works.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Getting Pulled Into the Ethereum Ecosystem (From a Digital Garden Perspective)</title>
        <link>https://blog.nicholas.clooney.io/posts/getting-pulled-into-the-ethereum-ecosystem/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/getting-pulled-into-the-ethereum-ecosystem/</guid>
        <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A 3am rabbit hole into Ethereum from the perspective of a markdown-based digital garden: ledgers, trust minimization, on-chain verification, and what a hybrid publishing model could look like.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>The Limits of AI and Where Humans Shine</title>
        <link>https://blog.nicholas.clooney.io/posts/how-clever-is-ai/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/how-clever-is-ai/</guid>
        <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I hit a bug that looked too small to be interesting: entries on my timeline page were not sorted correctly within the same day.</p><p>The page had a <code>date</code>, a <code>time</code>, and a custom Eleventy collection sort. That sounds like the whole problem space. Sort by date plus time, reverse the collection for newest first, done. Instead, April 12 was rendering in a strange order: <code>00:01</code>, <code>10:11</code>, <code>22:16</code>, <code>15:49</code>, <code>22:20</code>.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>What&#39;s Worth Keeping: On Humanness in the Age of AI</title>
        <link>https://blog.nicholas.clooney.io/posts/whats-worth-keeping-on-humanness-in-the-age-of-ai/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/whats-worth-keeping-on-humanness-in-the-age-of-ai/</guid>
        <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A reflection on what AI might erode if we let convenience replace judgment: junior skill-building, critical thinking, and the slower human process of forming a view before outsourcing it.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>A Small Digital Garden That Feels Like Home</title>
        <link>https://blog.nicholas.clooney.io/posts/a-small-digital-garden-that-feels-like-home/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/a-small-digital-garden-that-feels-like-home/</guid>
        <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A short reflection on how a few recent blog improvements, small experiments, and notes turned my site into a digital garden that feels calm, cohesive, and genuinely mine.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>From Drafts to a Digital Garden in Subspace Builder</title>
        <link>https://blog.nicholas.clooney.io/posts/v1.13-1.20-roundup/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/v1.13-1.20-roundup/</guid>
        <pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Subspace Builder grew from v1.13.0 to v1.20.0 with draft previews, theme-aware code snippets, Docker workflows, curated series pages, homepage pagination, and notes.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Cloudflare Build Notifications via Email Routing and Email Worker</title>
        <link>https://blog.nicholas.clooney.io/posts/cloudflare-build-notifications-email-worker/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/cloudflare-build-notifications-email-worker/</guid>
        <pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Send Workers / Pages build status (succeeded / failed) to a webhook using Cloudflare Email Routing and an Email Worker as the glue layer. Discord is used as the example destination, but the same pattern works for Slack, Telegram, Linear, or any other service that accepts an incoming webhook.</p><p>Here is the kind of Discord message this setup produces:</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>When DNS Was Innocent: Chasing a Parsec Failure Through TLS, VPNs, and a Phone Hotspot</title>
        <link>https://blog.nicholas.clooney.io/posts/parsec-hotspot-tls-investigation/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/parsec-hotspot-tls-investigation/</guid>
        <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A Parsec outage looked like DNS trouble at first, but the real issue was hostname-specific TLS failure on one network path. This post follows the investigation from misleading symptoms to the hotspot-based fix that exposed what was really happening.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Understanding @Observable and @State in Swift</title>
        <link>https://blog.nicholas.clooney.io/posts/understanding-observable-and-state-in-swift/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/understanding-observable-and-state-in-swift/</guid>
        <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Swift's Observation framework rethinks how model objects communicate changes to SwiftUI. This is the first post in my Swift series, walking through @Observable and @State with a concrete drag-coordination class as the running example.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Building ProjectDawn with Claude and Codex: An AI-Assisted iOS Devlog Deep Dive</title>
        <link>https://blog.nicholas.clooney.io/posts/building-projectdawn-with-claude-and-codex/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/building-projectdawn-with-claude-and-codex/</guid>
        <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I've been building a habit-logging iOS app called ProjectDawn. Not because the App Store needs another habit tracker, but because I wanted a personal project that was genuinely mine and open source, and a project that can answer this openly: what does it feel like to build a real, modular, native iOS app with AI as a primary collaborator?</p><p>This post is part personal log, part technical retrospective. It covers the tools I used, what surprised me, where the AI fell flat, and the biggest shifts in how I think about building things now.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Understanding Zig: A Modern Systems Language and Toolchain</title>
        <link>https://blog.nicholas.clooney.io/posts/understanding-zig-modern-systems-language-toolchain/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/understanding-zig-modern-systems-language-toolchain/</guid>
        <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[A practical overview of Zig, from its C-replacement goals and LLVM backend to its toolchain design, cross-compilation model, and appeal for systems and CLI software.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>When macOS browsers can’t load websites but `ping`, `ssh`, and `dig` still work</title>
        <link>https://blog.nicholas.clooney.io/posts/macos-browsers-cant-load-websites-dns-resolver-state/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/macos-browsers-cant-load-websites-dns-resolver-state/</guid>
        <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Browsers failing while `ping`, `ssh`, and `dig` still work can point to a split macOS resolver failure. In this post, I break down how a Tailscale + Pi-hole setup triggered resolver state corruption and how resetting DNS settings immediately fixed it.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>A Private Ingress Engine That’s Everywhere-Accessible but Publicly Invisible</title>
        <link>https://blog.nicholas.clooney.io/posts/a-everywhere-accessible-but-publicly-invisible-ingress-engine/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/a-everywhere-accessible-but-publicly-invisible-ingress-engine/</guid>
        <pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Most personal projects and homelab services don’t need to be public, but they do need to be reachable. I want to access my dev tools, internal dashboards, and side projects from anywhere, on any of my own devices, without opening ports, exposing IPs, or worrying about who might stumble across them on the internet.</p><p>This post walks through how I built an everywhere-accessible but publicly invisible ingress engine using Tailscale, Docker, Caddy, and DNS rewrites. The result is a private, domain-based setup that behaves like a small cloud. It has HTTPS, clean hostnames, and reverse proxying, but is only accessible to me, lives on my own machine, and never touches the public internet.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Running Eleventy + Puppeteer in Docker on macOS (Colima): The Full Journey</title>
        <link>https://blog.nicholas.clooney.io/posts/running-eleventy-puppeteer-docker-colima/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/running-eleventy-puppeteer-docker-colima/</guid>
        <pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I wanted a Docker setup for my Eleventy resume project that also generates a PDF using Puppeteer. I assumed this would be straightforward. <strong>It wasn’t.</strong></p><p>Here’s the real path, from <strong>zero</strong> to <strong>working</strong>, with the errors along the way and what each one actually meant.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Private Analytics With Umami, Docker Compose, and Ansible</title>
        <link>https://blog.nicholas.clooney.io/posts/deploying-umami-ansible-docker/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/deploying-umami-ansible-docker/</guid>
        <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I wanted first-party analytics on my blog without handing traffic data to a SaaS vendor. Umami checked every box: open source, self-hostable, and friendly to privacy. I already keep a small VPS online 24/7, so dedicating a slice of that machine to Umami felt like a perfect fit.</p><p>Analytics turned into a blind spot once I shut off the usual trackers. I needed something:</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Behind the Scenes: Pair-Writing the Umami Post With GPT</title>
        <link>https://blog.nicholas.clooney.io/posts/behind-the-scenes-gpt-umami-post/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/behind-the-scenes-gpt-umami-post/</guid>
        <pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I’ve had the Umami + Ansible post in my head for ages, but it touched three different repositories and a whole bunch of code snippets. Totally doable, but undeniably tedious — which is why it kept slipping down the backlog. You can read the finished article here: <a href="/posts/deploying-umami-ansible-docker/"><strong>Private Analytics With Umami, Docker Compose, and Ansible</strong></a>.</p><p>The idea that finally nudged it forward was simple: why not let GPT (Codex) do the heavy lifting while I steer?</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Three Minor Releases, One Major Leap for Subspace Builder</title>
        <link>https://blog.nicholas.clooney.io/posts/v1.10-1.12-roundup/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/v1.10-1.12-roundup/</guid>
        <pubDate>Wed, 29 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Catch up on the three rapid releases that reshape Subspace Builder with a tag hub, refreshed navigation, and a data-driven projects page.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>My Super Powered Tmux - One Session But Multiple &#39;Focuses&#39;</title>
        <link>https://blog.nicholas.clooney.io/posts/my-super-powered-tmux-one-session-but-multiple-focuses/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/my-super-powered-tmux-one-session-but-multiple-focuses/</guid>
        <pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I want tmux to feel like one cohesive environment that never goes away. When I am docked at my desk, I spread iTerm across multiple Mission Control desktops and keep a different project on each space, with some other tools I need for that specific project. Later, when I grab my MacBook Air or open Blink on my iPhone or iPad, I want those exact same panes, command histories, and scrollback.</p><p>Plain <code>tmux attach</code> gets close, but the shared &quot;current window&quot; breaks the illusion. When I switch to another window in my main terminal, all other tmux clients jump to the same window and interrupts whatever flow I was in. I wanted tmux to be stateful <em>and</em> multi-focus.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>&quot;Can you believe this?&quot; — The Tailscale Setup That Gave Me Absolute Freedom</title>
        <link>https://blog.nicholas.clooney.io/posts/how-tailscale-revolutionized-my-mobile-workflow/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/how-tailscale-revolutionized-my-mobile-workflow/</guid>
        <pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>If you’ve ever wanted your phone to double as a full-fledged development studio (complete with SSH, live previews, and your entire workflow at your fingertips) then this story is for you. It’s about how a small experiment with Tailscale turned into a complete rewire of how I build, code, and stay connected. From private dev environments to bathtub coding sessions (yes, really), here’s how it all came together.</p><p>Every section in this story layers on the next, building toward the “I can’t believe my phone is a full dev studio” moment at the end—so if you can, read it through. The payoff is worth it.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Setting Up Rust Securely (Without the Blind `curl | sh`)</title>
        <link>https://blog.nicholas.clooney.io/posts/setting-up-rust/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/setting-up-rust/</guid>
        <pubDate>Sun, 12 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Rust is one of the most thoughtfully designed languages of our time — but setting it up on macOS can feel oddly opaque. The standard advice is to run a one-liner like <code>curl https://sh.rustup.rs | sh</code>, which works beautifully but hides a lot of what’s happening behind the scenes. For developers who are more security-conscious or just prefer to know what’s being installed and where, this default approach can feel like a black box.</p><p>This post explores the different ways to install and manage Rust on macOS — from the convenience of Homebrew to the flexibility of rustup, and the transparency of manual or containerized setups. The goal is simple: give you control and understanding without sacrificing practicality.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Lighting Up GitHub Embeds in My Eleventy Blog</title>
        <link>https://blog.nicholas.clooney.io/posts/github-code-embeds/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/github-code-embeds/</guid>
        <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>For the longest time, sharing code from GitHub meant screenshotting or pasting raw
snippets into Markdown. Both options felt brittle—screenshots hide the text from RSS readers, while copy-pastes drift out of sync the minute the upstream file changes. I wanted the readability of Emgithub, the SEO of server-side rendering, and zero third-party JavaScript.</p><p>That mix finally landed this week: a <code>{% github %}</code> shortcode that fetches code at build time, highlights it, numbers each line, and offers a copy button. All it needs is the GitHub blob URL and an optional style flag for light or dark chrome.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>How I Accidentally Exposed My Umami Dashboard (and What I Learned)</title>
        <link>https://blog.nicholas.clooney.io/posts/accidentally-exposed-my-umami-dashboard/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/accidentally-exposed-my-umami-dashboard/</guid>
        <pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Recently, a few hours after setting up <a href="https://umami.is/">Umami</a> with Docker and Nginx on my VPS, I stumbled into a misconfiguration that left the admin dashboard exposed to the public web. Thankfully, there was no immediate danger. Since right after creating Umami's docker instance, I have updated the admin username and password immediately, and locked it down before anything bad could happen. Still, it was a stressful reminder that small mistakes in deployment can have big consequences.</p><p>Here’s the story of what happened and what I learned along the way.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Running Docker on macOS Without Docker Desktop: My Journey With Colima</title>
        <link>https://blog.nicholas.clooney.io/posts/docker-on-macOS-with-colima/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/docker-on-macOS-with-colima/</guid>
        <pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Like a lot of developers coming from Linux or a server environment, I hit some confusion when setting up Docker on my Mac. On Linux, you just install Docker and it works natively. On macOS, it’s a bit different — there’s no native Docker Engine because we don’t have a Linux kernel. That’s where tools like Docker Desktop and Colima come in.</p><p>Let me walk through what I’ve learned.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Wrestling Safari and Cloudflare: Debugging Umami Analytics</title>
        <link>https://blog.nicholas.clooney.io/posts/debugging-umami/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/debugging-umami/</guid>
        <pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I spent the better half of today getting Umami analytics to cooperate with a static blog served through Cloudflare and an Nginx proxy. The tracking script was having issue in Safari (CORS) and Firefox (nothing showed up in the Developer Tools' Network tab).</p><p>This is the story of following the trail from mysterious redirects to CORS ghosts and finally to Firefox’s stealthy <code>sendBeacon</code> API.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>A Not So Short Guide to Tailscale: Secure Networking Made Simple</title>
        <link>https://blog.nicholas.clooney.io/posts/tailscale-starter-guide/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/tailscale-starter-guide/</guid>
        <pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Over the past few weeks, I’ve spent quite a bit of time experimenting with <strong>Tailscale</strong>, and it has quickly become one of my favorite tools.</p><p>If you haven’t heard of it, <a href="https://tailscale.com/">Tailscale</a> is a secure, easy-to-use mesh VPN built on WireGuard. It lets your devices talk to each other as if they were on the same local network, no matter where in the world they are.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Debugging Tailscale on UK Mobile Networks: A Journey into NAT, DERP, and IPv6</title>
        <link>https://blog.nicholas.clooney.io/posts/networking-deep-dive/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/networking-deep-dive/</guid>
        <pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>What started as a simple question — <em>&quot;Why can’t I reach my MacBook over Tailscale from my iPhone on mobile data?&quot;</em> — turned into a deep dive into NAT types, relay servers, and the hidden power of IPv6. This post documents the technical journey, the dead ends, and the final conclusion.</p><p>So the mystery: why do VPS connections work, but Mac connections fail?</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Preview production drafts locally</title>
        <link>https://blog.nicholas.clooney.io/posts/hide-drafts-production/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/hide-drafts-production/</guid>
        <pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[`ELEVENTY_ENV` is now wired into every npm script so drafts stay private in production while remaining easy to preview.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>AI-Assisted Coding on iPhone: A Journey of Tools, Freedom, and Joy</title>
        <link>https://blog.nicholas.clooney.io/posts/ssh-from-iPhone-to-Mac/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/ssh-from-iPhone-to-Mac/</guid>
        <pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>For years, I thought of coding as something tied to my desk — Mac in front of me, full keyboard, full IDE. But recently, I found myself dreaming: <em>what if I could carry my entire creative coding studio in my pocket?</em> Not just SSH access, but a true AI-assisted environment where I could code, commit, and preview my projects anywhere.</p><p>This blog is half technical walkthrough, half personal reflection. It’s the story of how I explored Cloudflare Tunnel, discovered Tailscale, refined my workflow with tmux and iTerm, and ultimately unlocked the freedom of having a fully fledged Mac in my pocket.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Leveling Up Responsive Images with Eleventy Img</title>
        <link>https://blog.nicholas.clooney.io/posts/responsive-images-eleventy-img/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/responsive-images-eleventy-img/</guid>
        <pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Walking through the fixes that led us from stretched screenshots to a lean Eleventy Img pipeline, plus a quick primer on how responsive image markup really works.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Auto-Generated TOCs Land in Subspace Builder</title>
        <link>https://blog.nicholas.clooney.io/posts/auto-generated-toc/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/auto-generated-toc/</guid>
        <pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Adding Markdown-driven tables of contents means fewer manual edits, consistent anchors, and faster publishing all around.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>Shipping Social Cards with Satori (and GPT-5 Codex)</title>
        <link>https://blog.nicholas.clooney.io/posts/social-cards/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/social-cards/</guid>
        <pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>I’ve always loved how iMessage or WhatsApp automatically turn a shared link into a
little postcard. Until this week, that magic felt like a black box. I suspected there
had to be an open standard behind it, but I’d never hooked it up myself. Cue a pairing
session with GPT-5 Codex, and about two hours later, the 11ty Subspace Builder can mint
its own branded previews for every post.</p><p>Here is an example card for this blog post.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>11ty Subspace Builder v1.0.0</title>
        <link>https://blog.nicholas.clooney.io/posts/v1.0.0-release/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/v1.0.0-release/</guid>
        <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[Our first stable launch brings a polished Eleventy 3 starter with theme switching, accessible navigation, OG image automation, and a streamlined authoring flow.
]]></description>
        
      </item>
      
    
      
      <item>
        <title>The Joy (and Frustrations) of Building Small Sites with GPT-5 Codex</title>
        <link>https://blog.nicholas.clooney.io/posts/building-with-gpt-5-codex-my-experience/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/building-with-gpt-5-codex-my-experience/</guid>
        <pubDate>Sat, 20 Sep 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Building small websites with GPT-5 Codex turned out to be less about typing code and more about collaboration. From crude sketches to polished sites, the model took on the heavy lifting while I guided direction and design.</p><p>Along the way I discovered both the joy of fast iteration and the limits of relying on an AI partner. These projects became less about the sites themselves and more about exploring a new style of programming — conversational, creative, and sometimes flawed, but always eye-opening.</p>]]></description>
        
      </item>
      
    
      
      <item>
        <title>Building My Own Subspace Builder</title>
        <link>https://blog.nicholas.clooney.io/posts/building-my-own-subspace-builder/</link>
        <guid isPermaLink="true">https://blog.nicholas.clooney.io/posts/building-my-own-subspace-builder/</guid>
        <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
        
        
        <description><![CDATA[<p>Last month, my girlfriend mentioned she needed a sleek portfolio site, and I realized I’d been meaning to start a personal tech blog.</p><p>I wanted something lightweight—easy to spin up and even easier to tweak. So I dove in: building a small 11ty + Tachyons site from scratch, pushing every iteration live in under a minute, and watching her face light up with each update even though she’s halfway across the country.</p>]]></description>
        
      </item>
      
    
  </channel>
</rss>
