<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Ryan McKinnon — Writing</title><description>What broke, what I built, and what I am still learning.</description><link>https://ryanmckinnon.com/</link><item><title>jot. Is My First Real Mac App</title><link>https://ryanmckinnon.com/blog/jot-first-mac-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/jot-first-mac-app/</guid><description>A global hotkey, a blank note, and it&apos;s out of your way — jot. is a scratch-notes app I built in a single Swift file, and my first real native Mac app. It dresses like my terminal, joins the family of little apps we run, and I use it more than anything else I&apos;ve built.</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate></item><item><title>I Deleted Ten Months of Metrics Nobody Looked At</title><link>https://ryanmckinnon.com/blog/grafana-teardown/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/grafana-teardown/</guid><description>Grafana dashboards last edited in October. Admin last logged in in October. The database grew for ten months anyway, on the smallest disk in the fleet. Teardown as maintenance.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Home Assistant Had 1,751 Devices, Sensors, and Controls. I Thought It Had 800.</title><link>https://ryanmckinnon.com/blog/smart-home-1751-entities/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/smart-home-1751-entities/</guid><description>I thought my smart home had 800 devices. An audit found 1,751 — and 29 of my 42 scripts had never run once. The fix wasn&apos;t more automation. It was less.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Meet Bubbles: The AI Assistant I Text Like a Friend</title><link>https://ryanmckinnon.com/blog/bubbles-family-ai/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/bubbles-family-ai/</guid><description>Bubbles runs on Hermes, lives on a Mac Mini, and has an iMessage number through Photon. The useful part isn&apos;t the chat—it&apos;s the skills that connect it to the tools I already use.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Let an AI Search 20 Years of Family Photos. It Can&apos;t Delete a Single One.</title><link>https://ryanmckinnon.com/blog/photos-agent-guardrails/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/photos-agent-guardrails/</guid><description>I gave our family AI access to twenty years of photos. The interesting engineering wasn&apos;t what I let it do — it was everything I refused to let it do, and keeping the captioning local so the photos never leave the house.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Built a Fantasy Football Draft Kit in One Sitting</title><link>https://ryanmckinnon.com/blog/fantasy-draft-kit-one-sitting/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/fantasy-draft-kit-one-sitting/</guid><description>Jacks&apos; fantasy league runs on a spreadsheet whose rankings are last year&apos;s points wearing this year&apos;s clothes, with zero rookies in it. So we built a draft kit: four research agents, an offline draft board, and a shot at an unfair advantage.</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How I Made Nine Family Apps Look Like One Product</title><link>https://ryanmckinnon.com/blog/dot-design-system/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/dot-design-system/</guid><description>Nine small self-hosted apps built in four different frameworks that all look like one product. One tokens file, one framework-agnostic switcher, and an icon template specified down to the baseline formula — plus the PWA caches that will happily serve last month&apos;s app.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate></item><item><title>The Nine Self-Hosted Apps I Built for My Family</title><link>https://ryanmckinnon.com/blog/family-apps-fleet/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/family-apps-fleet/</guid><description>Tasks, groceries, lists, workouts, movies, trips — all self-hosted, all sharing one design system and one icon template. The interesting parts are the cheap AI that writes its answers back to a cache, and the day a grader couldn&apos;t pick my new icons out of a lineup.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Killed My Home Control App and Fixed the Dashboard I Already Had</title><link>https://ryanmckinnon.com/blog/home-app-killed/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/home-app-killed/</guid><description>I built a house-control PWA with optimistic UI, reconnect resilience, auto-rollback deploys, 148 tests and a 52KB bundle. Then an audit asked whether it should replace Home Assistant outright, and the honest answer killed the project.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A Time-Zone Bug Made My Florida-Day App Crash on Launch</title><link>https://ryanmckinnon.com/blog/southbound-timezone-crash/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/southbound-timezone-crash/</guid><description>Southbound counts days spent in Florida. After a user flew to Illinois and back, duplicate calendar dates created across time zones made the iOS app crash before its first screen could open.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A 10-Year Login Token That Logged Me Out Weekly</title><link>https://ryanmckinnon.com/blog/ten-year-token-weekly-logout/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/ten-year-token-weekly-logout/</guid><description>My self-hosted task app issues login tokens that last ten years. It logged me out weekly anyway. The token was fine the whole time; the app kept panicking and shredding it.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A Container Update Took Four Public Services Offline for Three Days</title><link>https://ryanmckinnon.com/blog/cloudflare-tunnel-down-three-days/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/cloudflare-tunnel-down-three-days/</guid><description>A container update killed my Cloudflare tunnel by pointing it at a Docker network that no longer existed. Nothing logged, nothing alerted. Four public services, dark for three days.</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate></item><item><title>The Family Trip Planner That Starts With the Idea, Not the Booking</title><link>https://ryanmckinnon.com/blog/trips-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/trips-app/</guid><description>Every travel tool assumes you already know where you&apos;re going. Ours starts at &apos;someday, Tokyo&apos; and tracks it through to a day-by-day plan — plus the bug where marking a trip booked got un-booked forty-five seconds later.</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Moved My Apps&apos; Recommendations Out of Code and Into Markdown</title><link>https://ryanmckinnon.com/blog/taste-layer-markdown-profiles/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/taste-layer-markdown-profiles/</guid><description>Taste used to live in my source code, so changing what I like meant editing TypeScript and redeploying. Now it lives in a note in Obsidian, and every app that cares reads it at runtime. The publishing mechanism is 24 lines.</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Built One Morning Email From 14 Parts of My Life</title><link>https://ryanmckinnon.com/blog/morning-brief-worker/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/morning-brief-worker/</guid><description>Fourteen data sources, two LLM calls, one email, zero machines I have to keep awake. Every fact is rendered in TypeScript and only the voice is generated — plus the cron bug that sent a Friday email on Thursday for weeks.</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate></item><item><title>The App That Picks What We&apos;re Watching Tonight</title><link>https://ryanmckinnon.com/blog/watch-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/watch-app/</guid><description>My want-to-watch list was sharded across three services, none of which knew what I already owned. So the movie picker kept recommending films sitting on my own server. Building the state layer was easy; making it stop suggesting the same movie every night was not.</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Found Seven Pieces of a Golf Stats App I&apos;d Already Built</title><link>https://ryanmckinnon.com/blog/golf-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/golf-app/</guid><description>Golf throws off enormous data that lives in three places which don&apos;t talk to each other. A sweep of my own machines found I&apos;d already built the app in seven disconnected pieces — including a stats file hiding inside another app that explicitly bans golf.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Built a Home for Lists That Aren&apos;t Tasks or Groceries</title><link>https://ryanmckinnon.com/blog/list-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/list-app/</guid><description>A list of things you might want is not a list of things you must do, and cramming both into a task manager ruins both. So I built a third app — and then discovered the hard part isn&apos;t the app, it&apos;s deciding which of my six apps a sentence belongs to.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Twilio Rejected My SMS Registration Four Times</title><link>https://ryanmckinnon.com/blog/twilio-rejected-sms-four-times/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/twilio-rejected-sms-four-times/</guid><description>I tried to get my family AI legally approved to send text messages. Twilio&apos;s compliance robot rejected the same field four times, twice after I pasted in its own suggested wording. The robot won.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Alexa Couldn&apos;t See Twenty Lights</title><link>https://ryanmckinnon.com/blog/alexa-twenty-invisible-lights/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/alexa-twenty-invisible-lights/</guid><description>Every light at the lake place was invisible to voice control, and the setting that should have exposed them had been dead the whole time. Fixed that — then rebuilt the entire voice surface so two grandparents can run the house without ever opening an app.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate></item><item><title>I Audited My Website and Found a 105 MB Homepage and Nine Dead Links</title><link>https://ryanmckinnon.com/blog/auditing-my-own-site/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/auditing-my-own-site/</guid><description>I audit systems for a living-adjacent hobby, so I pointed the process at my own site. 105 MB homepage, zero analytics ever collected, nine dead blog links. The cobbler&apos;s kids, fully barefoot.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A Background AI Loop Was Burning $5.75 a Day</title><link>https://ryanmckinnon.com/blog/ai-dreaming-cost-incident/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/ai-dreaming-cost-incident/</guid><description>The API console showed a key burning $175/month — a key that shouldn&apos;t have been in use at all. It traced back to a background &apos;dream&apos; loop I&apos;d accidentally installed, whose built-in budget guard was under-counting its own spending by 7x.</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Giving Bubbles Access to Everything</title><link>https://ryanmckinnon.com/blog/gbrain-personal-knowledge-brain/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/gbrain-personal-knowledge-brain/</guid><description>The family AI now reads everything I know: the kids&apos; summer schedules, project decisions, business questions, years of notes. A searchable brain over my whole vault made it possible — plus two fixes that made it dependable. I love this thing.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate></item><item><title>My Workout App Started Inventing Workouts Nobody Did</title><link>https://ryanmckinnon.com/blog/fit-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/fit-app/</guid><description>A daily generated workout, a REC mode that holds your screen awake, and a rating you give after the session instead of before. Then the program drifted from reality and the app kept confidently prescribing workouts nobody was doing.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How Tailscale Connects My Servers Across Two Countries and Three Time Zones</title><link>https://ryanmckinnon.com/blog/tailscale-load-bearing/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/tailscale-load-bearing/</guid><description>My stuff lives in two countries, three time zones, one closet, and a cloud droplet. Tailscale is the reason it behaves like one house — and the one piece of the stack I&apos;d have to replace before anything else could work.</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate></item><item><title>A Debug Command Ran for 16 Days and Took My Family AI Offline</title><link>https://ryanmckinnon.com/blog/bubbles-port-exhaustion/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/bubbles-port-exhaustion/</guid><description>The family AI went silent and everything pointed at an API outage. The actual cause: a debug command I&apos;d forgotten about, hung for 16 days, eating all 16,384 network ports.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Replacing Todoist With a Task System My AI Agents Can Use</title><link>https://ryanmckinnon.com/blog/todo-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/todo-app/</guid><description>Capture was never the friction in a task app; filing is. So I self-hosted one that files for me, then discovered the more interesting use: my machine agents file tickets in it too, claim them race-safely, and hand work back.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate></item><item><title>My Laptop Dropped WiFi Every Five Minutes</title><link>https://ryanmckinnon.com/blog/laptop-wifi-drops/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/laptop-wifi-drops/</guid><description>My laptop dropped off the network every five minutes at the lake place. 38 hard disconnects in 5 hours, and the ISP, the router, and the laptop all checked out clean. The culprit was where the desk was.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Teaching My AI to See the Screenshots I Text It</title><link>https://ryanmckinnon.com/blog/imessage-screenshots/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/imessage-screenshots/</guid><description>I texted my AI a screenshot and it swore no image arrived. The iMessage adapter was compiled bytecode with no source — it had never handled inbound images at all. So I taught it to, without ever seeing its code.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The Family Shopping List I Built on an API Amazon Killed</title><link>https://ryanmckinnon.com/blog/shop-app/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/shop-app/</guid><description>Voice is where groceries actually get added — hands wet, standing at the fridge. But every good list app is a phone app. So I bridged the Echo to a list of my own, and then the purchase history turned out to be the real product.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate></item><item><title>My Somfy Blinds Needed a Seven-Tap Secret Handshake</title><link>https://ryanmckinnon.com/blog/somfy-seven-taps/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/somfy-seven-taps/</guid><description>Somfy&apos;s official cloud integration refused to see 18 motorized shades because of an account merger on their end. The way in was an undocumented local API, unlocked by tapping the hub&apos;s PIN screen seven times. The workaround ended up better than the front door.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Four Canadian Air Conditioners Wouldn&apos;t Connect Until I Set Their Region to America</title><link>https://ryanmckinnon.com/blog/lg-thinq-wrong-country/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/lg-thinq-wrong-country/</guid><description>Four Canadian LG air conditioners, installed in Canada, serving Canadians, refused to connect until I told the setup flow they were American. The hardware doesn&apos;t matter. The account region does.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Retiring the Bell Router at the Cottage</title><link>https://ryanmckinnon.com/blog/bell-router-retirement/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/bell-router-retirement/</guid><description>The new place in cottage country somehow has 2.5-gigabit symmetric fibre — and a Bell router with no bridge mode. That meant double NAT, which meant Tailscale falling back to relay servers. The fix was a fiber modem the size of a stick of gum.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate></item><item><title>2.3 Gigabit Fiber, 90 Megabit WiFi</title><link>https://ryanmckinnon.com/blog/ninety-megabit-wifi/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/ninety-megabit-wifi/</guid><description>The lake house had a verified 2.3 gigabit fiber line and every WiFi device topped out at 90 megabits. The internet was innocent. It came down to one keystone jack, and the answer to &apos;why does the internet suck&apos; was a punch-down tool.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate></item><item><title>My AI&apos;s Memory Corrupted Twice in 24 Hours</title><link>https://ryanmckinnon.com/blog/ai-memory-corrupted-twice/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/ai-memory-corrupted-twice/</guid><description>My AI&apos;s knowledge base survived its rebuild for 28 hours. Then macOS sent a kill signal mid-checkpoint and corrupted the whole database — for the second time in 24 hours. A forensic timeline, two zombie processes, and an honest ending.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate></item><item><title>The Router That Crashed Every Tuesday</title><link>https://ryanmckinnon.com/blog/router-tuesday-appointment/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/router-tuesday-appointment/</guid><description>The router at my salon suite location crashed weekly, and the fix everyone assumed was wrong. Behind it all: a missing $2 battery that made the router believe it was 1980. Fifteen days, three visits, four bad hypotheses, one $199 box.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate></item><item><title>A macOS Update Broke Touch ID in the Terminal and Left No Note</title><link>https://ryanmckinnon.com/blog/touchid-sudo-broken/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/touchid-sudo-broken/</guid><description>Touch ID for sudo died overnight, with no message anywhere: a macOS security patch had wiped one config file and divorced my keyboard from the Secure Enclave. Thirty-four minutes of file timestamps and Bluetooth forensics to get my thumb back.</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate></item><item><title>How I Turned 463 AI Coding Transcripts Into a Searchable Work Journal</title><link>https://ryanmckinnon.com/blog/worklog-pipeline/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/worklog-pipeline/</guid><description>463 session transcripts were sitting on my disk as unsearchable JSONL. Now every session that matters gets redacted, graded, summarized by a cheap model, and filed in my notes automatically — 315 notes so far, for about three dollars a month.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate></item><item><title>I Turned My Obsidian Notes Into a Private Website</title><link>https://ryanmckinnon.com/blog/obsidian-vault-website/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/obsidian-vault-website/</guid><description>I keep everything in a pile of plain-text notes. Reading them was boring, so I built a little machine that turns the whole pile into a designed, searchable website — one that rebuilds itself every few minutes and never asks me to change how I write.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate></item><item><title>The Workout App I Built in a Day</title><link>https://ryanmckinnon.com/blog/workout-app-in-a-day/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/workout-app-in-a-day/</guid><description>Coming back from a shoulder thing, I needed workouts that respected the recovery plan. Every fitness app wanted a subscription and my data. So fit. got built in a day: self-hosted on Randy, AI-generated dailies, one-click logging.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate></item><item><title>1,158 Guesses at a Router Password Nobody Saved</title><link>https://ryanmckinnon.com/blog/brute-force-my-own-router/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/brute-force-my-own-router/</guid><description>I inherited an encrypted backup of a router&apos;s config with no password to open it. So I tried to guess. Eleven hundred and fifty-eight guesses later, I did the smarter thing: I stopped.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate></item><item><title>My AI Assistant Started Texting People on Its Own</title><link>https://ryanmckinnon.com/blog/ai-texting-on-its-own/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/ai-texting-on-its-own/</guid><description>At 7:48 one morning, Bubbles blew up my phone with texts nobody asked for. The investigation took six and a half hours, ended one entire agent runtime, and produced a rule I still live by: the assistant doesn&apos;t get to text me.</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate></item><item><title>My Vector Search Couldn&apos;t Find a File It Had Already Indexed</title><link>https://ryanmckinnon.com/blog/hybrid-rag-fts5-rrf/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/hybrid-rag-fts5-rrf/</guid><description>The file was indexed. I verified it. And a two-word query still couldn&apos;t surface it. A better embedding model wouldn&apos;t have helped — what worked was a second retriever with different failure modes, fused by rank instead of by score.</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate></item><item><title>How I Gave My Private Home Apps Real URLs and HTTPS</title><link>https://ryanmckinnon.com/blog/private-apps-routing-tls/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/private-apps-routing-tls/</guid><description>A dozen self-hosted apps, each remembered as a port number. Three pieces closed it out: a wildcard domain resolving to a private address, genuine wildcard certificates issued to a server no certificate authority can visit, and a deploy that reconciles itself.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate></item><item><title>My 5 Gig Fiber Worked Until I Plugged It Into My Router</title><link>https://ryanmckinnon.com/blog/fiber-install-day/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/fiber-install-day/</guid><description>The AT&amp;T gateway passed its speed test, but my own router could not get online. The fiber provider had authorized one network-port address while the cable was plugged into another.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>A Power Outage Took 840 Smart-Home Entities Offline With No Alarm</title><link>https://ryanmckinnon.com/blog/daemon-that-comes-back/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/daemon-that-comes-back/</guid><description>A power outage took 840 smart-home entities offline with no error anyone saw. The cause was two services wanting one port and an appliance OS that re-enables its own daemon on every boot — so the fix isn&apos;t a config change, it&apos;s a boot-time reconciler.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate></item><item><title>I Moved My Family AI. The Schedules Didn&apos;t Come With It.</title><link>https://ryanmckinnon.com/blog/agent-runtime-migration/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/agent-runtime-migration/</guid><description>Swapping the agent runtime took an afternoon. Re-pointing everything bolted onto the old one took the rest of the day — including scheduled jobs that expired every seven days behind a nightly restart nobody was watching.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate></item><item><title>My Analytics Said 196 Requests. Only Three Were People.</title><link>https://ryanmckinnon.com/blog/analytics-briefing-n8n/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/analytics-briefing-n8n/</guid><description>Traffic from ten domains I never checked became one plain-language morning email. It showed me that 196 server requests represented only three actual visitors — then ran stale code for two days without an error.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate></item><item><title>I Used My WiFi Network to Tell When My Family Is Home</title><link>https://ryanmckinnon.com/blog/wifi-presence-detection/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/wifi-presence-detection/</guid><description>Home-and-away automations were firing for people who weren&apos;t there. What worked was a second, independent presence signal built from something I already owned — the WiFi controller — plus an aggregation rule with one sharp edge worth understanding before you use it.</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Why the Server in My Closet Is Named Randy</title><link>https://ryanmckinnon.com/blog/why-my-nas-is-named-randy/</link><guid isPermaLink="true">https://ryanmckinnon.com/blog/why-my-nas-is-named-randy/</guid><description>Most people name their NAS nas-01. Mine is Randy, from Trailer Park Boys, because the rule is simple: the character&apos;s job on the show is the server&apos;s job in the house.</description><pubDate>Sat, 08 Nov 2025 00:00:00 GMT</pubDate></item></channel></rss>