<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Kyle Nazario</title><link href="https://kylenazario.com"/><link rel="self" href="https://kylenazario.com/rss.xml"/><updated>2026-08-14T20:21:27.222Z</updated><id>https://kylenazario.com</id><author><name>Kyle Nazario</name><email>kylebnazario@gmail.com</email></author><subtitle>Frontend web developer, app tinkerer and TypeScript enthusiast.</subtitle><entry><title>The power of defaults</title><link href="https://kylenazario.com/blog/power-of-defaults"/><updated>2026-08-14</updated><id>https://kylenazario.com/blog/power-of-defaults</id><content type="html">&lt;p&gt;Twitch Chief Product Officer Mike Minton kicked the hornet's nest Thursday when he announced Amazon would use Twitch streams to train AI by default. &lt;a href="https://www.bbc.com/news/articles/cp30pz8d09jo"&gt;From the BBC&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On why data was collected by default, [Minton] admitted: "If it's opt-in, nobody would opt-in. That's the honest answer."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That &lt;em&gt;is&lt;/em&gt; an honest answer. People &lt;a href="https://bsky.app/profile/patrickklepek.bsky.social/post/3msvytoeb2424"&gt;did not like it&lt;/a&gt;. YouTube essayist and gaming personality Jacob Geller &lt;a href="https://bsky.app/profile/jacobgeller.com/post/3msvyhysta22q"&gt;stated bluntly&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You may be thinking, why didn't the waiter ask before putting shit in my food? Well, if we asked, no one would want to have shit in their food.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I'm not here to defend Amazon. I don't have a strong opinion on training. I &lt;em&gt;am&lt;/em&gt; here to defend it being on by default, because if Amazon wants to train, this is the only way to do it. In tech, the default setting is all that matters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Users rarely change defaults&lt;/strong&gt;. You see this trend over and over again. Give them an option, and the overwhelming majority'll never use it.&lt;/p&gt;
&lt;p&gt;One of the most striking examples was the Apple Maps debacle. When the iPhone launched in 2007, the "Maps" app was Google Maps. Google did and does make the best consumer navigation app.&lt;/p&gt;
&lt;p&gt;But, Apple got annoyed with Mountain View because they wouldn't bring turn-by-turn navigation to iOS. So when iOS 6 released, Cupertino replaced Google Maps with &lt;a href="https://en.wikipedia.org/wiki/Apple_Maps"&gt;Apple Maps&lt;/a&gt;. Google's app was demoted to the App Store.&lt;/p&gt;
&lt;p&gt;Apple Maps had a rough launch. &lt;a href="https://www.theguardian.com/technology/2012/sep/28/apple-maps-tim-cook-apology"&gt;Tim Cook apologized&lt;/a&gt; for maps that &lt;a href="https://www.theguardian.com/technology/2012/sep/20/apple-maps-ios6-station-tower"&gt;relocated London to Ontario, hid train stations and made up airports&lt;/a&gt;. Hell, even the icon showed users &lt;a href="https://osxdaily.com/2012/06/15/maps-icon-in-ios-6-has-directions-driving-off-a-bridge-humor/"&gt;driving off a bridge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In 2026, I'd say Google Maps is 2-3x better than Apple Maps. Better non-US maps, more local business listings, great traffic data. In 2012, it was 100x better.&lt;/p&gt;
&lt;p&gt;The craziest part was &lt;em&gt;most people didn't mind&lt;/em&gt;. An email revealed in Google's antitrust trial said by 2014, Google had regained &lt;a href="https://archive.ph/G6s6R"&gt;just 40% of its previous iOS users&lt;/a&gt;. That's not nothing. It &lt;a href="https://www.cnet.com/tech/tech-industry/google-maps-already-no-1-among-free-iphone-apps/"&gt;topped the App Store&lt;/a&gt; after Apple Maps' launch.&lt;/p&gt;
&lt;p&gt;But still! 60% of users couldn't be bothered to download a navigation app that was approximately 100x better than the one that came with their phone. Google Maps was free! All people had to do was open the App Store and download it. What an incredible testament to the power of defaults.&lt;/p&gt;
&lt;p&gt;No wonder Google pays Apple &lt;a href="https://stratechery.com/2024/friendly-google-and-enemy-remedies/"&gt;~$20 billion a year&lt;/a&gt; to be the default search engine on iOS. They won't make the same mistake again.&lt;/p&gt;</content><summary>People really will not change a setting.</summary></entry><entry><title>Using AI to speed up NPM and Angular upgrades</title><link href="https://kylenazario.com/blog/ai-npm-angular-upgrades"/><updated>2026-08-05</updated><id>https://kylenazario.com/blog/ai-npm-angular-upgrades</id><content type="html">&lt;p&gt;Bitovi recently helped a client, &lt;a href="https://www.moodys.com/" title="https://www.moodys.com"&gt;Moody's&lt;/a&gt;, upgrade several frontends. We were able to quickly perform this work thanks to our frontend expertise and judicious use of AI.&lt;/p&gt;
&lt;p&gt;We performed several upgrades, including updating Angular to v21 and NestJS to v11. We also updated Tailwind and Moody's internal component library. Before starting, we built &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview" title="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview"&gt;agent skills&lt;/a&gt; telling AI how to perform each upgrade. The skills included steps to complete, success criteria, and troubleshooting for common problems. When given to &lt;a href="https://www.anthropic.com/product/claude-code" title="https://www.anthropic.com/product/claude-code"&gt;Claude Code&lt;/a&gt; running &lt;a href="https://www.anthropic.com/news/claude-sonnet-4-5" title="https://www.anthropic.com/news/claude-sonnet-4-5"&gt;Sonnet 4.5&lt;/a&gt;, the agents were able to perform almost all of the upgrade process.&lt;/p&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;Moody's uses the &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends" title="https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends"&gt;backend for frontend pattern&lt;/a&gt;. Each of their frontends contains a NestJS backend that serves an Angular frontend. The backend provides caching, validation and a convenient place to gather data from other services.&lt;/p&gt;
&lt;p&gt;Moody's had made several of these combo backend-frontend apps over time. They tended to use the version of Angular and Nest that was current at time of creation (Angular 17-18 and Nest 10).&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://gist.github.com/kyle-n/c3616de709f6f8a86265e47dea70caf8" title="https://gist.github.com/kyle-n/c3616de709f6f8a86265e47dea70caf8"&gt;first skill&lt;/a&gt; we made focused on updating Angular to 19 and Nest to 11. That put the apps on the latest major version of Nest, and a modern version of Angular. Updating Angular past 19 required upgrading their internal component library first, so this skill focused on just getting the apps to 19.&lt;/p&gt;
&lt;h2&gt;Breaking down the skill&lt;/h2&gt;
&lt;p&gt;The skill begins by providing initial requirements to the agent:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This skill upgrades a repository from its current Angular version (v17+) to Angular v19 and from its current NestJS version (v9+) to NestJS v11. This is the foundational upgrade — all subsequent goals depend on it completing successfully.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Repository is on Angular v17+ and NestJS v9+&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repository builds and tests pass on the default branch before starting&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;By verifying the apps build and pass tests before any changes, the agent can verify its upgrades still pass the tests.&lt;/p&gt;
&lt;p&gt;Next, we ask the agent to familiarize itself with the repo's dependencies:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Execution Steps&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Analyze Current State&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Read &lt;code&gt;package.json&lt;/code&gt; to identify current Angular and NestJS versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read &lt;code&gt;angular.json&lt;/code&gt; or &lt;code&gt;workspace.json&lt;/code&gt; to understand the workspace configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Identify all Angular-related packages (&lt;code&gt;@angular/*&lt;/code&gt;, &lt;code&gt;@angular-devkit/*&lt;/code&gt;, &lt;code&gt;zone.js&lt;/code&gt;, &lt;code&gt;rxjs&lt;/code&gt;, &lt;code&gt;typescript&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Identify all NestJS-related packages (&lt;code&gt;@nestjs/*&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check for any version-pinned dependencies that might conflict&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log the current state for traceability&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Then, we begin the Angular upgrade:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Angular Upgrade&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;ng update @angular/core@19 @angular/cli@19&lt;/code&gt; to perform the Angular upgrade&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If &lt;code&gt;ng update&lt;/code&gt; is not available or fails, manually update all &lt;code&gt;@angular/*&lt;/code&gt; packages to v19&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update &lt;code&gt;typescript&lt;/code&gt; to the version required by Angular v19 (check Angular's peer dependencies)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update &lt;code&gt;zone.js&lt;/code&gt; to the version compatible with Angular v19&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update &lt;code&gt;rxjs&lt;/code&gt; if required by Angular v19's peer dependencies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;npm install&lt;/code&gt; to resolve the dependency tree&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Sonnet was smart enough to know for Angular 17 projects, it had to update to 18 first. It usually ran the updater, checked results and changed dependencies as necessary until &lt;code&gt;npm install&lt;/code&gt; and the tests passed.&lt;/p&gt;
&lt;p&gt;To upgrade Nest, we tell the agent which packages to update. Best of all, if we tell the agent to check the Nest migration guide, it will load that from the Nest website and reference breaking changes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Step 3: NestJS Upgrade&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Update all &lt;code&gt;@nestjs/*&lt;/code&gt; packages to v11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update NestJS peer dependencies (&lt;code&gt;reflect-metadata&lt;/code&gt;, &lt;code&gt;class-transformer&lt;/code&gt;, &lt;code&gt;class-validator&lt;/code&gt; if present)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check for breaking changes in NestJS v11 migration guide&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update any NestJS configuration files if the schema has changed&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;For step 4 and 5, we begin cleaning up common errors.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Breaking Change Resolution&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Check for deprecated APIs removed in Angular v19:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@angular/http&lt;/code&gt; → &lt;code&gt;@angular/common/http&lt;/code&gt; (if not already migrated)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Standalone components changes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Signal-based inputs/outputs changes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Router guard changes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;Check for deprecated APIs removed in NestJS v11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the TypeScript compiler (&lt;code&gt;npx tsc --noEmit&lt;/code&gt;) to identify type errors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix all compilation errors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update any Angular schematics or builders if needed&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Step 5: Configuration Updates&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Update &lt;code&gt;tsconfig.json&lt;/code&gt; if Angular v19 requires different compiler options&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update &lt;code&gt;angular.json&lt;/code&gt; build configuration if needed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update any webpack or esbuild configuration changes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update &lt;code&gt;.browserslistrc&lt;/code&gt; if present&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;And finally, we have the agent build the project and fix any additional errors:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Step 6: Validate&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;npm run build&lt;/code&gt; (or the project's build command)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;npm run test&lt;/code&gt; (or the project's test command)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;npm run lint&lt;/code&gt; if available&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm no new warnings that indicate deprecated patterns&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Results&lt;/h2&gt;
&lt;p&gt;This &lt;a href="https://gist.github.com/kyle-n/c3616de709f6f8a86265e47dea70caf8" title="https://gist.github.com/kyle-n/c3616de709f6f8a86265e47dea70caf8"&gt;skill&lt;/a&gt; successfully upgraded multiple projects on the first attempt. It simplified the update process tremendously.&lt;/p&gt;
&lt;p&gt;We also got these great results using just Claude Sonnet 4.5 - not even Opus. The agents are good enough that even a non-frontier model can perform an upgrade, run a build, check the output and fix errors as needed.&lt;/p&gt;
&lt;p&gt;For users who are willing to run Claude or Codex in zero-permissions mode, this skill doesn't even need a developer to babysit it. You can just let it run for about 10 minutes, come back and see the results. With permissions on, it requires constant attention to approve each command.&lt;/p&gt;
&lt;p&gt;I would recommend running this skill without permissions, if your security needs allow it. Manually approving each command can be tedious. Additionally, if you download the Nest upgrade guide and point the agent at it in your prompt, the agent won't even go online.&lt;/p&gt;
&lt;p&gt;The skill worked great across multiple frontend apps, but it had one major downside. AIs are non-deterministic. The same prompt might produce different results if run twice. This skill may produce slightly different results if run multiple times, or on multiple repos. It makes debugging tricky. When something goes wrong, you're not sure if the AI failed, the repo has some unique issue, or you just used it wrong.&lt;/p&gt;
&lt;p&gt;Still, it and several other skills saved us a ton of time helping Moody's upgrade their frontends. We plan to keep developing and building new skills to help clients ship better code faster.&lt;/p&gt;</content><summary>A little guidance takes a repo a long way.</summary></entry><entry><title>Sam Neill, RIP</title><link href="https://kylenazario.com/blog/sam-neill-rip"/><updated>2026-07-13</updated><id>https://kylenazario.com/blog/sam-neill-rip</id><content type="html">&lt;img src="/img/sam-neill.webp"&gt;&lt;caption&gt;Sam Neill in Hunt for the Wilderpeople.&lt;/caption&gt;&lt;p&gt;New Zealand actor Sam Neill &lt;a href="https://www.nytimes.com/2026/07/13/obituaries/sam-neill-dead.html"&gt;died today&lt;/a&gt; at 78.&lt;/p&gt;
&lt;p&gt;He was a tremendous actor with many great performances, Dr. Alan Grant in &lt;em&gt;Jurassic Park&lt;/em&gt; being the most iconic. And what a role! Grant is icy, aloof, and utterly captivated by the dinosaurs. He's all business with a heart of gold, taking two kids under his wing.&lt;/p&gt;
&lt;p&gt;As a horror fan, I also must salute Neill as an all time scream king. He gave gonzo, all-out turns for &lt;em&gt;In the Mouth of Madness&lt;/em&gt;, &lt;em&gt;Event Horizon&lt;/em&gt; and &lt;em&gt;Possession&lt;/em&gt;. He had no protectiveness over his image. He was as happy playing heroes as creeps, weirdos and freaks. Look at the way he practically &lt;a href="https://youtu.be/af0iXeQGLD4?si=W3eBDk3FFtFBQtVA&amp;t=106"&gt;purrs his lines&lt;/a&gt; in &lt;em&gt;Event Horizon&lt;/em&gt; (&lt;strong&gt;extremely NSFW&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Neill was always good, even in bad movies. There's a bit in &lt;em&gt;Memoirs of an Invisible Man&lt;/em&gt;, a forgotten Chevy Chase movie, where his character's held at gunpoint by the titular invisible man. Neill does an impressive bit of physical acting to pretend this is happening. You can see it in &lt;a href="https://youtu.be/U4qLE7gRmfI?si=8aGmd7sjLhlLgK9E&amp;t=68"&gt;the trailer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For me, though, his finest work will always be &lt;em&gt;Hunt for the Wilderpeople&lt;/em&gt;. He is luminous as a grieving widower who learns to love again and takes a goofy kid under his wing. According to &lt;a href="https://www.reddit.com/r/blankies/comments/1uv2o4r/comment/ox8sml9/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button"&gt;one Redditor&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I was lucky enough to attend a screening of Hunt for the Wilderpeople with him in attendance at the end of March. He was brought to tears speaking of what that film meant to him.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The man was a true talent. I will miss his &lt;a href="https://www.instagram.com/reel/DFYzY_pzkQQ/?hl=en"&gt;posts about sheep&lt;/a&gt;.&lt;/p&gt;</content><summary>Remembering a Kiwi icon.</summary></entry><entry><title>WWDC Wishlist fulfilled - Building Safari extensions got easier</title><link href="https://kylenazario.com/blog/wwdc-26-wishlist-safari-extensions"/><updated>2026-06-16</updated><id>https://kylenazario.com/blog/wwdc-26-wishlist-safari-extensions</id><content type="html">&lt;img src="/img/three-browsers.webp"&gt;&lt;p&gt;On March 18, 2024, &lt;a href="/blog/safari-extensions-should-be-easier"&gt;I wrote&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I really do like Safari. That's why I've spent 1,500 words complaining. I want it to get more extensions. I want it to become more popular, so the web isn't just a &lt;a href="https://dev.to/kenbellows/chromium-and-the-browser-monoculture-problem-420n"&gt;Chromium monoculture&lt;/a&gt;. I like making Safari extensions. I just wish it was easier.&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;[Supporting it] more than &lt;strong&gt;doubled&lt;/strong&gt; my workload.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was because of three problems:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Problem 1: Safari extensions must live inside a Mac or iPhone app&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;Problem 2: Safari extensions must use a completely different monetization scheme&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;Problem 3: Safari extensions have to go through the App Store&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This year at WWDC, Apple announced third-parties can &lt;a href="https://developer.apple.com/videos/play/wwdc2026/216/"&gt;make Safari extensions without a Mac or Xcode&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To get started, I'll head over to developer.apple.com and enroll in the Apple Developer Program. After enrolling, I'll go to appstoreconnect.apple.com. Since Safari web extensions need to be packaged within a containing app, I can use App Store Connect to create this app for me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On Problem 1, Apple has not bent. Safari extensions must still live inside a container app. But now you don't even have to touch Swift - Apple can build the entire container app for you in Xcode Cloud. Just upload the WebExtension bundle.&lt;/p&gt;
&lt;p&gt;On Problem 2, Apple bent. All iOS Safari extensions must be distributed through the App Store, and everything in the App Store must use Apple's in-app purchase system. But...&lt;/p&gt;
&lt;p&gt;...Apple also bent on Problem 3. Last year, Apple announced third-party developers can &lt;a href="https://developer.apple.com/documentation/safariservices/distributing-your-safari-web-extension#Distribute-your-Developer-ID-signed-and-notarized-extension-outside-the-Mac-App-Store"&gt;distribute extensions for Mac Safari outside the App Store&lt;/a&gt;. Notarized extensions can be sideloaded like any other app on macOS. Doesn't solve the issue on iOS, but you can avoid the App Store and its associated taxes on macOS.&lt;/p&gt;
&lt;p&gt;These are all good ideas that make Safari extension development easier. As a Safari user, I hope more developers take advantage.&lt;/p&gt;
&lt;h3&gt;Remaining problems&lt;/h3&gt;
&lt;p&gt;However, there are still some barriers around Safari extension development:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Although Safari implements the same &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions"&gt;WebExtensions&lt;/a&gt; API, its appearence and behavior differs from Chrome and Firefox. To properly test an extension, developers still need a Mac with Safari.&lt;/li&gt;
&lt;li&gt;Developers still have to pay $100 per year to join the Apple Developer program.&lt;/li&gt;
&lt;li&gt;Reaching users on iOS still requires running the app review gauntlet.&lt;/li&gt;
&lt;/ol&gt;</content><summary>Making it easier to get into the ecosystem.</summary></entry><entry><title>The problem with AI writing</title><link href="https://kylenazario.com/blog/quote-ai-problem-writing"/><updated>2026-06-10</updated><id>https://kylenazario.com/blog/quote-ai-problem-writing</id><content type="html">&lt;p&gt;&lt;a href="https://www.evefairbanks.com"&gt;Eve Fairbanks&lt;/a&gt;, a professional writer and editor, &lt;a href="https://www.theatlantic.com/technology/2026/05/how-to-tell-ai-writing/687345/"&gt;in the Atlantic&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The problem is that the efficiency and frictionlessness that make AI appealing to writers are the same qualities that make it feel untrustworthy to readers. And readers are right not to trust it. No matter how much we may tell ourselves that AI is just a tool like spell-check, it isn’t. When we use AI to flesh out ideas, we lose the most important part of the writing process: thinking.&lt;/p&gt;
&lt;p&gt;[...]&lt;/p&gt;
&lt;p&gt;We end up with canned perfection—writing that can’t really be argued with, because it has no underlying deliberative reasoning process, no train of thought. As I &lt;a href="https://x.com/evefairbanks/status/2049094535603437701"&gt;wrote on X recently&lt;/a&gt;, AI writing is almost impossible to edit, because even when it sounds plausible, a closer look will show that every element is equally off: The tone is bland; individual word choices are baffling; the structure lacks sense; key pieces of the argument are missing; facts are false. Working on AI text, as an editor, is like trying to operate on a body whose skin, muscles, veins, bones, and organs are all compromised. There’s nothing to leave intact, nowhere to begin.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the best diagnosis I've read of what's wrong with AI writing. It doesn't &lt;em&gt;mean&lt;/em&gt; anything. It's not the end result of planning, composing and revising the author's thoughts. It's just probabilistic text.&lt;/p&gt;
&lt;p&gt;(&lt;a href="/blog/ai-ethics-statement"&gt;This blog does not use AI for any content&lt;/a&gt;.)&lt;/p&gt;</content><summary>According to a professional writer and editor.</summary></entry><entry><title>Why most apps have ads or subscriptions</title><link href="https://kylenazario.com/blog/why-most-apps-use-ads-subscriptions"/><updated>2026-05-28</updated><id>https://kylenazario.com/blog/why-most-apps-use-ads-subscriptions</id><content type="html">&lt;p&gt;I recently saw a comment on Reddit asking why so many apps include ads or subscriptions. What happened to just buying an app, this person wondered. I wrote them a long reply and wanted to expand on it here.&lt;/p&gt;
&lt;p&gt;Apps intended for general consumers have overwhelmingly migrated to one of two business models: free with ads, or paid with a subscription. They've done this because there are no other viable business models on the App Store.&lt;/p&gt;
&lt;p&gt;(For the purposes of this post, we are only considering consumer apps. Business-to-business software is another story).&lt;/p&gt;
&lt;h3&gt;Free with ads&lt;/h3&gt;
&lt;p&gt;Most consumer apps in 2026 are free with ads because that is what the market overwhelmingly demands.&lt;/p&gt;
&lt;p&gt;Economists distinguish between people's &lt;a href="https://en.wikipedia.org/wiki/Revealed_preference"&gt;stated and revealed preferences&lt;/a&gt;. For example, people might state a preference for healthy food, but their revealed preference is they hit the McDonald's drive-thru every day.&lt;/p&gt;
&lt;p&gt;Most apps are free with ads because the revealed preference of the majority of consumers is they will &lt;em&gt;never&lt;/em&gt; pay for an app. Not a cent, at any price. There’s just an expectation, especially among non-techy people, that Apps Are Free. Google, Instagram and TikTok are all free!&lt;/p&gt;
&lt;p&gt;If you can't charge users, you have to show them ads. &lt;a href="https://variety.com/2026/tv/news/netflix-claims-ad-tier-reaches-250-million-viewers-1236746219/"&gt;Many people do not mind them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ads also provide ongoing revenue. Developers need that.&lt;/p&gt;
&lt;h3&gt;Subscriptions&lt;/h3&gt;
&lt;p&gt;Some consumers are willing to pay for software. However, charging them once for an app is poor business.&lt;/p&gt;
&lt;p&gt;Almost all apps require ongoing support and dev work. An app is never "one and done," especially on Apple platforms. Just this year, every app had to redo their UI to support &lt;a href="https://www.apple.com/newsroom/2025/06/apple-introduces-a-delightful-and-elegant-new-software-design/"&gt;Liquid Glass&lt;/a&gt; and not look totally out of place. Heck, 10 years ago, Apple switched their chips to 64-bit. Every single 32-bit app had to be updated or &lt;a href="https://developer.apple.com/news/upcoming-requirements/?id=06062022a"&gt;it would stop working&lt;/a&gt;! (&lt;a href="https://www.reddit.com/r/ios/comments/wwgwzl/anybody_lost_a_childhood_games_to_the_ios_11/"&gt;Tons of early iPhone games were lost in this transition&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ongoing work requires ongoing revenue, and that means subscriptions. People get mad about this, because subscriptions are annoying, but it is simple business. $5 or whatever one-time purchase cannot justify perpetual support.&lt;/p&gt;
&lt;h4&gt;What about lifetime purchases?&lt;/h4&gt;
&lt;p&gt;Some apps offer a lifetime purchase option, but if you squint, this is also a subscription.&lt;/p&gt;
&lt;p&gt;Every subscription app developer calculates the lifetime expected value of a user. If your app costs $20 a year and users subscribe for an average of 3 years, the average lifetime expected value of one user is $60.&lt;/p&gt;
&lt;p&gt;Most "lifetime purchase" options I've seen are priced around 3-4 years of the equivalent yearly subscription. In other words, the expected lifetime value of an average user. A "lifetime purchase" is just paying the subscription up front.&lt;/p&gt;
&lt;h4&gt;What about [X pay-once app]?&lt;/h4&gt;
&lt;p&gt;Many apps require only one-time payments (like &lt;a href="https://nazariosoftware.com"&gt;all of my apps&lt;/a&gt;). But they are overwhelmingly not what consumers want. It is a known fact among iOS and Mac developers that "subscription with a free trial" is more popular than "paid up front," and "free with ads" is exponentially more popular than &lt;em&gt;that&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My own pay-once apps are hobby projects, just something for beer money. I shoulder the ongoing cost of maintenance and App Store developer fees simply because I like making apps.&lt;/p&gt;
&lt;h4&gt;What about paid upgrades?&lt;/h4&gt;
&lt;p&gt;For years, many Mac apps were sold as one-time purchases. This was nice, because it let you use the software forever without paying a subscription. You bought Photoshop CS4 and just had it for as long as CS4 worked with macOS. If you wanted the features in CS5, you had to buy that separately.&lt;/p&gt;
&lt;p&gt;This is a good, fair business model. It provides ongoing revenue to developers when users upgrade to the new major version, while not requiring users to pay a fee every month.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://thenextweb.com/news/apples-refusal-to-allow-paid-upgrades-in-the-app-store-hurts-developers-and-users"&gt;It is impossible on the App Store&lt;/a&gt;. Apple has had nearly 20 years to support it, and has chosen not to.&lt;/p&gt;
&lt;p&gt;Some third-party developers have tried to hack it into the App Store. Tapbots, for example, &lt;a href="https://wccftech.com/tweetbot-4-released-ios-revamped-ipad-ui-quick-relpy-notifications/"&gt;released Tweetbot 4 in 2015&lt;/a&gt; as a new app, separate from Tweetbot 3. The "upgrade" was to buy the new app. This meant losing all the existing app's downloads, reviews and store position, though. Developers have overwhelmingly decided it is not feasible. (Telling that to find an example of this, I had to go back 11 years).&lt;/p&gt;
&lt;h4&gt;Some customers are better than others&lt;/h4&gt;
&lt;p&gt;Not to be rude, but some customers are not worth the trouble. Someone who expects you to do work in exchange for $5 three years ago is not worth it. Better to chase customers who &lt;em&gt;don't&lt;/em&gt; mind paying a little every month for ongoing support. Over the years, developers have realized those people are their real audience. They'll let you build a sustainable business.&lt;/p&gt;
&lt;h3&gt;Ongoing work requires ongoing revenue&lt;/h3&gt;
&lt;p&gt;I'm not saying ads and subscriptions are not tiring. They absolutely are. I'm an iOS and Mac developer and I'm tired of subscriptions! But this is the reality of the market.&lt;/p&gt;</content><summary>The realities of consumer app development in 2026.</summary></entry><entry><title>Everything should stay</title><link href="https://kylenazario.com/blog/everything-must-go-review"/><updated>2026-05-02</updated><id>https://kylenazario.com/blog/everything-must-go-review</id><content type="html">&lt;img src="/img/station-eleven.webp"&gt;&lt;caption&gt;The Station Eleven TV show (Ian Watson / HBO Max)&lt;/caption&gt;&lt;p&gt;I went to the hospital in February. Not intentionally either! I'd gone up to &lt;a href="https://www.skithebeav.com"&gt;Beaver Mountain&lt;/a&gt; on a warm Saturday to ski. During my second run, I tried a hard left turn to slow down and go onto a catwalk through some trees. I messed up the turn and accomplished neither. Instead, I hit a tree at high speed, broke my scapula and got a concussion. Or so I'm told. I don't remember it. &lt;sup&gt;&lt;a href="#fn-1" id="user-content-fnref-1" data-footnote-ref="" aria-describedby="footnote-label"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The Beaver ski patrol, who I cannot thank enough, heard the crash from the lift. They cut my jacket off me, got me down the mountain and onto the waiting helicopter. The lifelight flight took me to the emergency room in Ogden. I woke up confused Sunday morning. My spouse told me I'd had an accident and was in the hospital. Apparently I muttered, "What the fuck?" and fell asleep.&lt;/p&gt;
&lt;p&gt;The three months since have been difficult. Did nothing but sleep for two weeks, and nothing but physical therapy after that. &lt;sup&gt;&lt;a href="#fn-2" id="user-content-fnref-2" data-footnote-ref="" aria-describedby="footnote-label"&gt;2&lt;/a&gt;&lt;/sup&gt; But, I've recovered. My scapula healed and my concussion's gone. I'm even running again.&lt;/p&gt;
&lt;p&gt;I felt powerless. This accident happened because I skied too fast and messed up, but it could have been anything. People get in car crashes every day. Any of us is one fall in the bathtub from doctors asking you who's president. There are no guarantees in life.&lt;/p&gt;
&lt;p&gt;This brush with mortality colored my experience reading the 2024 book &lt;a href="https://www.goodreads.com/book/show/201730880-everything-must-go"&gt;&lt;em&gt;Everything Must Go: The Stories We Tell About the End of the World&lt;/em&gt;&lt;/a&gt; by Dorian Lynskey. Lyskey uses an impressive swathe of apocalyptic pop culture, from the Book of Revelation to Bo Burnham's &lt;a href="https://en.wikipedia.org/wiki/Bo_Burnham:_Inside"&gt;&lt;em&gt;Inside&lt;/em&gt;&lt;/a&gt;, to interrogate the human psyche.&lt;/p&gt;
&lt;p&gt;Sometimes writing about the end of the world is a way to express our fears. Much science fiction after World War II, for example, is colored by terror of nuclear war.&lt;/p&gt;
&lt;p&gt;I was struck, though, by how much apocalyptic fiction Lynskey mentions is wish fulfillment. Some people can't wait for the world to end.&lt;/p&gt;
&lt;p&gt;Take the people disgusted with modernity. The 1800s artist William Morris wrote in a letter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have no more faith than a grain of mustard seed in the future history of "civilization", which I know now is doomed to destruction, probably before very long: what a joy it is to think of! And how often it consoles me to think of barbarism once more flooding the world, and real feelings and passions, however rudimentary, taking the place of our wretched hypocrisies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An artilleryman in &lt;em&gt;The War of the Worlds&lt;/em&gt; expresses even more venomous sentiments:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"We can’t have any weak or silly," he explains. "Life is real again, and the useless and cumbersome and mischievous have to die. They ought to die. They ought to be willing to die. It’s a sort of disloyalty, after all, to live and taint the race."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Modern life, according to these people, is fake. Soft. Cushy. Apocalypse will free us.&lt;/p&gt;
&lt;p&gt;Perhaps I am still affected by the blow to my head from hitting a tree, but yearning for apocalypse is a joke. Asking the "useless and cumbersome" to die, as if those were intrinsic qualities. As if all of us are not one bad fall away from broken bones or sprains or any number of disabling injuries. Live long enough and everyone picks up a disability or two.&lt;/p&gt;
&lt;p&gt;The truth is barely anyone would make it in the apocalypse. We all rely on government, society and medicine to keep us alive and healthy.&lt;/p&gt;
&lt;p&gt;I found &lt;a href="https://en.wikipedia.org/wiki/Station_Elevenhttps://en.wikipedia.org/wiki/Station_Eleven"&gt;&lt;em&gt;Station Eleven&lt;/em&gt;&lt;/a&gt; refreshingly brutal on this point. In Emily St. John Mandel's novel — written six years before COVID — influenza has killed most humans on the planet. Survivors live a dangerous, short, dirty existence. One character in a wheelchair dies by suicide shortly after the outbreak. His decision goes unexplained, but my impression was he felt there was no hope for someone like him.&lt;/p&gt;
&lt;p&gt;You don't see these details in many post-apocalyptic stories. Personally, I'm used to end-times tales like &lt;a href="https://en.wikipedia.org/wiki/Zombieland"&gt;&lt;em&gt;Zombieland&lt;/em&gt;&lt;/a&gt;, where the apocalypse becomes an excuse to &lt;a href="https://www.youtube.com/watch?v=IHYe3m1ajPU"&gt;go on a shopping spree&lt;/a&gt;. Rarely is The After unsentimental and... gross. But it would be. We are all creatures of modern society. Who knows how many people would be dead without antibiotics alone.&lt;/p&gt;
&lt;p&gt;Do not yearn for apocalypse. There will be no one to take CT scans and make sure your scapula heals. A twisted ankle or rogue infection might really be the death of you. And if you survive long enough, you'll just become "useless and cumbersome" to some crazy artilleryman living in a tunnel.&lt;/p&gt;
&lt;section data-footnotes="" class="footnotes"&gt;&lt;h2 class="sr-only" id="footnote-label"&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id="fn-1"&gt;
&lt;p&gt;A tremendous gift. Don't need to remember the scariest 30 seconds of my life. &lt;a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn-2"&gt;
&lt;p&gt;Funnily, my physical therapist already knew the details of my accident when we met. He is on the Beaver ski patrol. &lt;a href="#user-content-fnref-2" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content><summary>What we're talking about when we talk about the end of the world.</summary></entry><entry><title>Why I am frustrated with Windows</title><link href="https://kylenazario.com/blog/windows-trust-annoyance"/><updated>2026-03-25</updated><id>https://kylenazario.com/blog/windows-trust-annoyance</id><content type="html">&lt;p&gt;I recently partitioned the hard drive of my gaming PC and installed &lt;a href="https://system76.com/pop/?srsltid=AfmBOooN-tY36rWVNpBGAzFCdqZ5nwblQ0U70wU9ygUwxh44OgkkNYk5"&gt;Pop!_OS&lt;/a&gt; alongside Windows 10. Spent the last few weeks beating &lt;em&gt;Resident Evil Requiem&lt;/em&gt;, entirely on Linux.&lt;/p&gt;
&lt;p&gt;I wouldn’t have installed Linux if not for Windows' behavior the last few years. Desktop Linux has annoyances, but the delta between it and Windows has shrunk. Hell, Windows might be more annoying.&lt;/p&gt;
&lt;p&gt;Consider the upgrade nag for Windows 11. Sometimes when I open my computer, it implores me with a full-screen message to update to 11. &lt;a href="https://support.microsoft.com/en-us/windows/windows-10-support-has-ended-on-october-14-2025-2ca8b313-1946-43d3-b55c-2b95b107f281"&gt;10's not supported anymore&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But I threw my gaming PC together out of spare parts. I don't have &lt;a href="https://support.microsoft.com/en-us/windows/enable-tpm-2-0-on-your-pc-1fd5a332-360d-4f46-a1e7-ae6b0c90645c"&gt;TPM 2.0 enabled&lt;/a&gt;. The aforelinked support page claims most motherboards can enable it. Not sure if mine can. I might be able to &lt;a href="https://learn.microsoft.com/en-us/answers/questions/2121461/install-windows-11-without-secure-boot-on-an-unsup"&gt;skip the check&lt;/a&gt;, but that process looks tedious.&lt;/p&gt;
&lt;p&gt;I dismiss the Windows 11 nag, every time, with no option to stop it from reappearing. It, in its own small way, is a perfect example of what bothers me about Windows. The 11 modal is unstoppable, yet unhelpful. It does nothing to help me get onto a supported OS. But, Microsoft put it in Windows 10 because some number of users &lt;em&gt;will&lt;/em&gt; be able to upgrade to 11. They’ll click upgrade, and that click will get recorded in a database somewhere. Come yearly reviews, the Microsoft employee who designed this annoying, disruptive modal can point to the exact number of people who upgraded because of it. It will be viewed as a success.&lt;/p&gt;
&lt;p&gt;No matter I, a mere end user, hate the modal and its intrusion into &lt;em&gt;my&lt;/em&gt; PC. It might nudge some number of people into goosing the right metric. A Microsoft employee I’ll never meet will be promoted for making my computer worse.&lt;/p&gt;
&lt;p&gt;Once you start looking for annoying designs, you see them everywhere in Windows. Windows Search &lt;a href="https://github.com/mozilla/platform-tilt/issues/14"&gt;opens results in Edge instead of the user’s default browser&lt;/a&gt;. &lt;a href="https://www.osnews.com/story/140588/microsoft-is-bringing-annoying-windows-11-start-menu-ads-to-windows-10/"&gt;Ads are in the Start menu&lt;/a&gt;. Everything saves to OneDrive by default.&lt;/p&gt;
&lt;p&gt;The Windows team &lt;a href="https://web.archive.org/web/20260202052615/https://www.theverge.com/tech/870045/microsoft-windows-11-issues-rebuilding-trust-notepad"&gt;claims&lt;/a&gt; to be listening and "improving system performance, reliability, and the overall experience of Windows." They're even &lt;a href="https://www.windowscentral.com/microsoft/windows-11/microsoft-is-putting-an-end-to-microslop-on-windows-11-commits-to-reducing-copilot-across-system-apps-and-interfaces"&gt;removing Copilot from Notepad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Such changes, while welcome, are too little and too late for me. Windows is so annoying, I'd rather put up with Linux. Pop!_OS has flaws, but it &lt;em&gt;knows its place&lt;/em&gt;. In the two months I've used it, I have seen no:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copilot buttons&lt;/li&gt;
&lt;li&gt;Ads in OS UI&lt;/li&gt;
&lt;li&gt;Nags to update&lt;/li&gt;
&lt;li&gt;OneDrive promotions&lt;/li&gt;
&lt;li&gt;Links opening in the wrong browser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I love that Linux has no aspirations. It wants to be just an OS, not a wholistic software platform intent on selling me things. It doesn't feel the need to change constantly. It understands if I want AI tools, I'll just install Claude Code. It doesn't subvert my decisions. It supports my hardware.&lt;/p&gt;
&lt;p&gt;An operating system should be stable and effective. It should get out of the way and do what I want, quickly. My beef with Windows is I stopped trusting it to do that.&lt;/p&gt;</content><summary>It's all about the delta of annoyance.</summary></entry><entry><title>Software companies will be fine</title><link href="https://kylenazario.com/blog/ai-replaces-code-no-products"/><updated>2026-02-10</updated><id>https://kylenazario.com/blog/ai-replaces-code-no-products</id><content type="html">&lt;p&gt;There's &lt;a href="https://www.wsj.com/tech/ai/ai-wont-kill-the-software-business-just-its-growth-story-05673e07?st=dY58vx&amp;reflink=desktopwebshare_permalink"&gt;angst&lt;/a&gt; that AI will limit software companies' market. The fear isn't unfounded. Claude Code and Codex make prototyping so fast, you can imagine vibe-coding replacements for every subscription.&lt;/p&gt;
&lt;p&gt;But AI tools generate &lt;em&gt;code&lt;/em&gt;, not &lt;em&gt;products&lt;/em&gt;. They cannot replace most software companies, because most companies sell products.&lt;/p&gt;
&lt;h3&gt;What is a product?&lt;/h3&gt;
&lt;p&gt;Code is code. A product is the sum of code, customer support, logistics and domain expertise. The product is the code and everything around it. It's how easy it is to buy. It's getting an answer from customer support when something breaks. It's thoughtful features designed for the business domain. It's uptime. It's regular patches and bug fixes.&lt;/p&gt;
&lt;p&gt;My first tech job was in 2019 at &lt;a href="https://servicecore.com"&gt;ServiceCore&lt;/a&gt;, a startup selling SaaS to dumpster and portable toilet companies. &lt;sup&gt;&lt;a href="#fn-1" id="user-content-fnref-1" data-footnote-ref="" aria-describedby="footnote-label"&gt;1&lt;/a&gt;&lt;/sup&gt; I worked on the UI, an Angular app, but customers didn't pay for that. They paid for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The code&lt;/li&gt;
&lt;li&gt;A team of developers, to maintain the code, add new features and fix the ones that broke over time&lt;/li&gt;
&lt;li&gt;Product owners with deep domain expertise&lt;/li&gt;
&lt;li&gt;Customer support staff, to answer questions and fix data errors&lt;/li&gt;
&lt;li&gt;Sales people, to analyze your business and help you onboard&lt;/li&gt;
&lt;li&gt;DevOps staff, to keep the servers online&lt;/li&gt;
&lt;li&gt;Countless features and bug fixes found only by real customers using the software for real use cases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last point is crucial. Actively maintained software is not designed once. It's designed every day based on customer feedback and real-world experience. It's not just code, it's an iterative product based on years of research, feedback, fine-tuning and testing.&lt;/p&gt;
&lt;p&gt;AI tools generate code quickly, but code is just one component of a product. Most customers want the whole thing.&lt;/p&gt;
&lt;h3&gt;The money advantage&lt;/h3&gt;
&lt;p&gt;Software companies also have a financial advantage over customers who'd prefer to replace them with an AI tool: larger addressable markets.&lt;/p&gt;
&lt;p&gt;Consider this formula for valuing any piece of software:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Tv: total value
v: value of the tool to 1 user
n: number of users

Tv = v * n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If a company vibecodes their own software, &lt;em&gt;n&lt;/em&gt; is bounded by the number of their employees who can use it, which is bounded by total company size. Some businesses, like FAANGs, are either sufficiently large or make sufficiently valuable internal tooling that building lots of it makes sense. Most businesses fit neither description.&lt;/p&gt;
&lt;p&gt;Software companies, however, can sell to many customers. Their &lt;em&gt;n&lt;/em&gt; is bounded by their customers and customers' size. Their total possible value tends to be far larger.&lt;/p&gt;
&lt;p&gt;Now consider this formula for estimating the value of adding one new feature to a piece of software:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Tf: total value of a new feature
c: cost to add the feature
v: value of the feature to 1 user
n: number of users

Tf = (v * n) - c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Software companies can spread the cost of improvements over a larger customer base, letting them invest more into the product.&lt;/p&gt;
&lt;p&gt;It makes no sense to hire a full-time developer for $150k a year to build internal software worth $30k. Hiring the same dev to do that for 10 customers is a no-brainer.&lt;/p&gt;
&lt;p&gt;AI hype has made some people forget the oldest and most important lesson of software: it replicates infinitely for free, so scale is everything. The more users, the more you can invest back into the product.&lt;/p&gt;
&lt;h3&gt;A slight caveat&lt;/h3&gt;
&lt;p&gt;Some apps and services are so simple, they can be replaced by AI-coded equivalents. Sometimes you just need &lt;em&gt;one thing&lt;/em&gt;, and a full product is actually overkill.&lt;/p&gt;
&lt;p&gt;I recently &lt;a href="/blog/moltbot-setup"&gt;set up OpenClaw&lt;/a&gt;, and configured it to do a simple web search for me every morning and send an alert. &lt;sup&gt;&lt;a href="#fn-2" id="user-content-fnref-2" data-footnote-ref="" aria-describedby="footnote-label"&gt;2&lt;/a&gt;&lt;/sup&gt; There are existing apps I could have used to do this, but this was simpler. No ads, no popups, no subscriptions - just the data I want, sent to my phone.&lt;/p&gt;
&lt;h3&gt;SaaS will be fine&lt;/h3&gt;
&lt;p&gt;AI will obsolete some basic software, but most commercial software products will be fine. I don't see that changing. Even if tokens cost nothing, AI couldn't do the non-code parts of the product. And even if it could, it probably doesn't make financial sense to try.&lt;/p&gt;
&lt;section data-footnotes="" class="footnotes"&gt;&lt;h2 class="sr-only" id="footnote-label"&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id="fn-1"&gt;
&lt;p&gt;We made a lot of jokes about writing "shit code." &lt;a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn-2"&gt;
&lt;p&gt;Forgive the vagueness, but given OpenClaw's security issues, I don't want to tell people how to best prompt inject me. &lt;a href="#user-content-fnref-2" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content><summary>AI generates code, not products.</summary></entry><entry><title>Notes on setting up Moltbot</title><link href="https://kylenazario.com/blog/moltbot-setup"/><updated>2026-01-29</updated><id>https://kylenazario.com/blog/moltbot-setup</id><content type="html">&lt;img src="/img/moltbot.webp"&gt;&lt;p&gt;I run a Mac mini home server for &lt;a href="/blog/why-plex-music"&gt;Plex streaming&lt;/a&gt;, so I had to try &lt;a href="https://www.molt.bot"&gt;Moltbot&lt;/a&gt; (&lt;a href="https://mashable.com/article/clawdbot-changes-name-to-moltbot"&gt;neé Clawdbot&lt;/a&gt;). &lt;a href="https://www.theregister.com/2026/01/27/clawdbot_moltbot_security_concerns/"&gt;Major security issues notwithstanding&lt;/a&gt;, it's a cool glimpse at the future of AI assistants.&lt;/p&gt;
&lt;p&gt;However, setting up Moltbot took me most my morning. The setup docs mention features that don't work and skip required steps. Which is fine! The project's maintained by unpaid volunteers who suddenly have &lt;em&gt;way&lt;/em&gt; more users than they expected. They're doing their best.&lt;/p&gt;
&lt;p&gt;I got Moltbot working via Claude Code and Telegram, with skills, using these steps.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.molt.bot/start/getting-started#1-install-the-cli-recommended"&gt;Install Moltbot&lt;/a&gt; using the setup script. &lt;code&gt;npm install -g&lt;/code&gt; does not work.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/quickstart"&gt;Install Claude Code&lt;/a&gt; on your machine and make sure it's signed in to your account.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;clawdbot onboard --install-daemon&lt;/code&gt; to begin onboarding. The docs say the command name is &lt;code&gt;moltbot&lt;/code&gt;, but the script still installs the alias &lt;code&gt;clawdbot&lt;/code&gt; to your &lt;code&gt;$PATH&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When it asks for a model, choose Anthropic.&lt;/li&gt;
&lt;li&gt;In another terminal, run &lt;code&gt;claude setup-token&lt;/code&gt; to get an authentication code.&lt;/li&gt;
&lt;li&gt;In the Moltbot onboarding, pick the first option and enter your code.&lt;/li&gt;
&lt;li&gt;Follow the onboarding steps to create a Telegram bot. I tried Discord and could not get it working.&lt;/li&gt;
&lt;li&gt;Download Telegram and try to message your bot. It should give you an auth code to validate your session with Moltbot.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Moltbot should respond to queries in Telegram now. To make it really useful, add skills to the &lt;code&gt;~/.clawdbot/skills&lt;/code&gt; directory. Tread carefully! A rogue skill can tell Moltbot to do anything. There is a command line option to add skills, but it did not work for me. Instead, I've been downloading the &lt;code&gt;.md&lt;/code&gt; file and manually adding it. This prevents a malicious update to the skill, and lets me read each skill to make sure it has no unsafe content.&lt;/p&gt;
&lt;p&gt;Moltbot is exciting! I could already remote into my server with &lt;a href="https://edovia.com/en/screens"&gt;Screens&lt;/a&gt; and &lt;a href="https://tailscale.com"&gt;Tailscale&lt;/a&gt;, but I like having a natural-language interface to my computer. I've already added the &lt;a href="https://github.com/moltbot/skills/blob/main/skills/dbhurley/plex/SKILL.md"&gt;Plex skill&lt;/a&gt;, so now I can check my server over Telegram.&lt;/p&gt;</content><summary>Boy, those onboarding docs could use some work.</summary></entry></feed>