<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CampbellSoft Studios — Blog</title><description>Devlogs, lessons, and release notes from the projects we ship.</description><link>https://campbellsoftstudios.com/</link><language>en-us</language><atom:link href="https://campbellsoftstudios.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>The Hardware Outlives the Cloud</title><link>https://campbellsoftstudios.com/blog/hardware-outlives-the-cloud/</link><guid isPermaLink="true">https://campbellsoftstudios.com/blog/hardware-outlives-the-cloud/</guid><description>A decade of consumer-tech shutdowns distilled into one architectural rule — and why it shapes every companion app we ship.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><category>Architecture</category><category>Self-Hosted</category><category>Philosophy</category><category>Industry</category><author>ken@campbellsoftstudios.com (CampbellSoft Studios)</author></item><item><title>Why Your SVG Renders Blank: HTML Entities Are Not XML</title><link>https://campbellsoftstudios.com/blog/why-your-svg-renders-blank-html-entities-are-not-xml/</link><guid isPermaLink="true">https://campbellsoftstudios.com/blog/why-your-svg-renders-blank-html-entities-are-not-xml/</guid><description>We shipped five hero images. Two rendered. Three were blank — and the browser didn&apos;t say a word. Here&apos;s the bug, the fix, and the four-line script we wrote to make sure it can&apos;t happen again.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>SVG</category><category>Bugs</category><category>Pre-Ship</category><author>ken@campbellsoftstudios.com (CampbellSoft Studios)</author></item><item><title>Code Review Won&apos;t Catch Your Pricing Exploits. An Adversarial Audit Will.</title><link>https://campbellsoftstudios.com/blog/adversarial-audit-money-touching-features/</link><guid isPermaLink="true">https://campbellsoftstudios.com/blog/adversarial-audit-money-touching-features/</guid><description>A pre-ship checklist for any feature that touches money — coupons, refunds, bundles, partial cancellations. Twelve questions to ask before merge, drawn from one we almost shipped.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><category>Engineering</category><category>Pricing</category><category>Process</category><category>Pre-Ship</category><author>ken@campbellsoftstudios.com (CampbellSoft Studios)</author></item><item><title>Launching viewpane.app: A Marketing Site Pulled From the App Icon</title><link>https://campbellsoftstudios.com/blog/launching-viewpane-app-marketing-site/</link><guid isPermaLink="true">https://campbellsoftstudios.com/blog/launching-viewpane-app-marketing-site/</guid><description>How we built the ViewPane marketing site, why the palette came from the app icon instead of a Figma library, and the rule we wrote down to stop ourselves from re-litigating it.</description><pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate><category>ViewPane</category><category>Design</category><category>Marketing</category><category>Astro</category><author>ken@campbellsoftstudios.com (CampbellSoft Studios)</author></item><item><title>Shipping ViewPane: Ten Cameras, One Mini-PC, Zero New Attack Surface</title><link>https://campbellsoftstudios.com/blog/shipping-viewpane-ten-cameras-zero-attack-surface/</link><guid isPermaLink="true">https://campbellsoftstudios.com/blog/shipping-viewpane-ten-cameras-zero-attack-surface/</guid><description>A real-world install — what the box looks like, why we picked an N100, and the rule we wouldn&apos;t break for convenience.</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><category>ViewPane</category><category>Self-Hosted</category><category>Security</category><category>Frigate</category><author>ken@campbellsoftstudios.com (CampbellSoft Studios)</author></item><item><title>Why Our Companion Apps Cost $9.99 a Year</title><link>https://campbellsoftstudios.com/blog/why-our-companion-apps-cost-ten-dollars-a-year/</link><guid isPermaLink="true">https://campbellsoftstudios.com/blog/why-our-companion-apps-cost-ten-dollars-a-year/</guid><description>A pricing philosophy — the app is the premium product, the free tier is a trial, and nobody gets nagged.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><category>Pricing</category><category>Product</category><category>Philosophy</category><author>ken@campbellsoftstudios.com (CampbellSoft Studios)</author></item><item><title>Rebuilding the SongStitched Order State Machine</title><link>https://campbellsoftstudios.com/blog/rebuilding-songstitched-order-state-machine/</link><guid isPermaLink="true">https://campbellsoftstudios.com/blog/rebuilding-songstitched-order-state-machine/</guid><description>We had a state called &quot;paid&quot; that meant six different things. Here&apos;s why we tore it out and what we replaced it with.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><category>SongStitched</category><category>Engineering</category><category>State Machines</category><category>Postgres</category><author>ken@campbellsoftstudios.com (CampbellSoft Studios)</author></item></channel></rss>