<rss xmlns:source="http://source.scripting.com/" version="2.0">
  <channel>
    <title>Practical Computer</title>
    <link>https://blog.practical.computer/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Wed, 06 May 2026 09:09:33 -0400</lastBuildDate>
    <item>
      <title>Thoughts on self-hosting &amp; PaaS (May 2026)</title>
      <link>https://blog.practical.computer/2026/05/06/thoughts-on-selfhosting-paas-may.html</link>
      <pubDate>Wed, 06 May 2026 09:09:33 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2026/05/06/thoughts-on-selfhosting-paas-may.html</guid>
      <description>&lt;p&gt;Right now I&amp;rsquo;m running Practical Computer&amp;rsquo;s apps on Heroku, based on the following criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crunchy Bridge is, IMO, the best Managed Postgres option out there. Their platform offerings mean I&amp;rsquo;m locked into being in AWS&amp;rsquo;s network to avoid latency hits. I learned that one the hard way with the performance hit of crossing datacenters between Hetzner + AWS when self-hosting via Dokku ( &lt;a href=&#34;https://microblog.thomascannon.me/2024/05/10/the-lowest-latency.html&#34;&gt;microblog.thomascannon.me/2024/05/1&amp;hellip;&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;As other folks have said, my time is valuable, so I want minimal babysitting of servers&lt;/li&gt;
&lt;li&gt;Heroku&amp;rsquo;s developer experience is still &lt;strong&gt;really solid&lt;/strong&gt; given those constraints&lt;/li&gt;
&lt;li&gt;Render has real &amp;ldquo;Ambulance Chaser&amp;rdquo; vibes that put me off&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, given those constraints, I&amp;rsquo;ve still done a bunch of research into what self-hosting would look like, &lt;em&gt;especially&lt;/em&gt; for the extremely tiny apps that aren&amp;rsquo;t self-sustaining. The criteria I have for self-hosting are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container-first (which disqualifies Hatchbox). You can&amp;rsquo;t beat the portability &amp;amp; isolation of container images&lt;/li&gt;
&lt;li&gt;Sustainable &amp;amp; wide community support &lt;strong&gt;outside of the Ruby/Rails ecosystem&lt;/strong&gt;. This disqualifies ONCE/Kamal, which are &amp;ldquo;Not Invented Here&amp;rdquo; projects&lt;/li&gt;
&lt;li&gt;Have strong Infrastructure As Code foundations, notably Terraform/OpenTofu support. Terraform/OpenTofu support is critical in my eyes because if I&amp;rsquo;m giving up the developer experience of a platform like Heroku, I want to make up those time savings &lt;em&gt;elsewhere&lt;/em&gt; in the administrivia of provisioning and maintenance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Right now the current candidate is Portainer (&lt;a href=&#34;https://www.portainer.io&#34;&gt;www.portainer.io&lt;/a&gt;, &lt;a href=&#34;https://registry.terraform.io/providers/portainer/portainer/latest/docs&#34;&gt;registry.terraform.io/providers&amp;hellip;&lt;/a&gt; ). And even then, it&amp;rsquo;s an annoying lift that I&amp;rsquo;m not making anytime soon.&lt;/p&gt;
&lt;p&gt;For a more managed alternative to Portainer, I&amp;rsquo;ve also been looking at Northflank, but am not biting the bullet there yet: &lt;a href=&#34;https://northflank.com&#34;&gt;northflank.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.rubyforum.org/t/paas-is-dead-long-live-paas/285/9&#34;&gt;www.rubyforum.org/t/paas-is&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>Right now I&#39;m running Practical Computer&#39;s apps on Heroku, based on the following criteria:

* Crunchy Bridge is, IMO, the best Managed Postgres option out there. Their platform offerings mean I&#39;m locked into being in AWS&#39;s network to avoid latency hits. I learned that one the hard way with the performance hit of crossing datacenters between Hetzner + AWS when self-hosting via Dokku ( [microblog.thomascannon.me/2024/05/1...](https://microblog.thomascannon.me/2024/05/10/the-lowest-latency.html) )
* As other folks have said, my time is valuable, so I want minimal babysitting of servers
* Heroku&#39;s developer experience is still **really solid** given those constraints
* Render has real &#34;Ambulance Chaser&#34; vibes that put me off

However, given those constraints, I&#39;ve still done a bunch of research into what self-hosting would look like, *especially* for the extremely tiny apps that aren&#39;t self-sustaining. The criteria I have for self-hosting are:

* Container-first (which disqualifies Hatchbox). You can&#39;t beat the portability &amp; isolation of container images
* Sustainable &amp; wide community support **outside of the Ruby/Rails ecosystem**. This disqualifies ONCE/Kamal, which are &#34;Not Invented Here&#34; projects
* Have strong Infrastructure As Code foundations, notably Terraform/OpenTofu support. Terraform/OpenTofu support is critical in my eyes because if I&#39;m giving up the developer experience of a platform like Heroku, I want to make up those time savings *elsewhere* in the administrivia of provisioning and maintenance

Right now the current candidate is Portainer ([www.portainer.io](https://www.portainer.io), [registry.terraform.io/providers...](https://registry.terraform.io/providers/portainer/portainer/latest/docs) ). And even then, it&#39;s an annoying lift that I&#39;m not making anytime soon.

For a more managed alternative to Portainer, I&#39;ve also been looking at Northflank, but am not biting the bullet there yet: [northflank.com](https://northflank.com)

[www.rubyforum.org/t/paas-is...](https://www.rubyforum.org/t/paas-is-dead-long-live-paas/285/9)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2026/03/06/heads-up-our-new-home.html</link>
      <pubDate>Fri, 06 Mar 2026 17:45:04 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2026/03/06/heads-up-our-new-home.html</guid>
      <description>&lt;p&gt;Heads up! our new home for Ruby gems is gem.coop. If you&amp;rsquo;re looking for the latest and greatest open-source work from us, there&amp;rsquo;s where to go&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://beta.gem.coop/@practical-computer&#34;&gt;beta.gem.coop/@practica&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>Heads up! our new home for Ruby gems is gem.coop. If you&#39;re looking for the latest and greatest open-source work from us, there&#39;s where to go

[beta.gem.coop/@practica...](https://beta.gem.coop/@practical-computer)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2026/02/01/pssst-littlecrm-now-lets-you.html</link>
      <pubDate>Sun, 01 Feb 2026 15:50:38 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2026/02/01/pssst-littlecrm-now-lets-you.html</guid>
      <description>&lt;p&gt;🕵️‍♂️ Pssst! LittleCRM now lets you set a codename for a deal; because it&amp;rsquo;s always much more fun to add ✨mystery✨ to the work&lt;/p&gt;
&lt;img src=&#34;https://blog.practical.computer/uploads/2026/39dae0f83f.png&#34; alt=&#34;A screenshot of LittleCRM, showing how deals can have codenames (labels), with versions of the deal cards in various states.&#34;&gt;
</description>
      <source:markdown>🕵️‍♂️ Pssst! LittleCRM now lets you set a codename for a deal; because it&#39;s always much more fun to add ✨mystery✨ to the work

&lt;img src=&#34;https://blog.practical.computer/uploads/2026/39dae0f83f.png&#34; alt=&#34;A screenshot of LittleCRM, showing how deals can have codenames (labels), with versions of the deal cards in various states.&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Announcing `caddy-dev`</title>
      <link>https://blog.practical.computer/2026/01/24/announcing-caddydev.html</link>
      <pubDate>Sat, 24 Jan 2026 13:02:21 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2026/01/24/announcing-caddydev.html</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re using &lt;code&gt;puma-dev&lt;/code&gt; (having &lt;code&gt;.test&lt;/code&gt;  domains and automatic HTTPS is super nice!) but want HTTP2+ support + all the benefits of caddy, I&amp;rsquo;ve started work on a small script/setup that provides a &lt;code&gt;puma-dev&lt;/code&gt; like experience, but using &lt;code&gt;caddy&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;And best of all, there are no intermediary steps/tools, it&amp;rsquo;s just a setup that strings together 2 out-of-the-box programs.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/practical-computer/caddy-dev&#34;&gt;https://github.com/practical-computer/caddy-dev&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>If you&#39;re using `puma-dev` (having `.test`  domains and automatic HTTPS is super nice!) but want HTTP2+ support + all the benefits of caddy, I&#39;ve started work on a small script/setup that provides a `puma-dev` like experience, but using `caddy`! 

And best of all, there are no intermediary steps/tools, it&#39;s just a setup that strings together 2 out-of-the-box programs.

https://github.com/practical-computer/caddy-dev
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2026/01/16/web-awesome-continues-to-be.html</link>
      <pubDate>Fri, 16 Jan 2026 17:51:38 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2026/01/16/web-awesome-continues-to-be.html</guid>
      <description>&lt;p&gt;Web Awesome continues to be an excellent investment. Since it&amp;rsquo;s all based on Web Standards, extending it to handle complex behavior leverages decades of experience, tooling, and approaches. Gotta love it!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/shoelace-style/webawesome/discussions/1939#discussioncomment-15521818&#34;&gt;github.com/shoelace-&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>Web Awesome continues to be an excellent investment. Since it&#39;s all based on Web Standards, extending it to handle complex behavior leverages decades of experience, tooling, and approaches. Gotta love it!

[github.com/shoelace-...](https://github.com/shoelace-style/webawesome/discussions/1939#discussioncomment-15521818)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/12/26/before-and-after-todays-polishing.html</link>
      <pubDate>Fri, 26 Dec 2025 21:39:50 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/12/26/before-and-after-todays-polishing.html</guid>
      <description>&lt;p&gt;Before and after today&amp;rsquo;s polishing round. Slowly, but surely, getting there&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;uploads/2025/screenshot-2025-12-26-at-20.37.23.png&#34; width=&#34;600&#34; height=&#34;585&#34; alt=&#34;The start of today&#39;s polishing round. The UI takes up a lot of vertical space, without much visual cohesion.&#34;&gt;&lt;img src=&#34;uploads/2025/screenshot-2025-12-26-at-20.36.52.png&#34; width=&#34;600&#34; height=&#34;585&#34; alt=&#34;After today&#39;s polishing pass. The components are grouped together, wasteful information is trimmed, and there&#39;s a better flow of information&#34;&gt;&lt;/p&gt;
</description>
      <source:markdown>Before and after today&#39;s polishing round. Slowly, but surely, getting there



&lt;img src=&#34;uploads/2025/screenshot-2025-12-26-at-20.37.23.png&#34; width=&#34;600&#34; height=&#34;585&#34; alt=&#34;The start of today&#39;s polishing round. The UI takes up a lot of vertical space, without much visual cohesion.&#34;&gt;&lt;img src=&#34;uploads/2025/screenshot-2025-12-26-at-20.36.52.png&#34; width=&#34;600&#34; height=&#34;585&#34; alt=&#34;After today&#39;s polishing pass. The components are grouped together, wasteful information is trimmed, and there&#39;s a better flow of information&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/11/29/i-knew-trimming-a-bunch.html</link>
      <pubDate>Sat, 29 Nov 2025 13:53:00 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/11/29/i-knew-trimming-a-bunch.html</guid>
      <description>&lt;p&gt;I knew trimming a bunch of dead code from Little CRM would be a lot, but not 22K+ 😬😵‍💫&lt;/p&gt;
&lt;img src=&#34;uploads/2025/09576b0c71.png&#34; alt=&#34;A Github diff summary, showing 599 changed files with 2,594 additions and 22,874 deletions&#34;&gt;
</description>
      <source:markdown>I knew trimming a bunch of dead code from Little CRM would be a lot, but not 22K+ 😬😵‍💫

&lt;img src=&#34;uploads/2025/09576b0c71.png&#34; alt=&#34;A Github diff summary, showing 599 changed files with 2,594 additions and 22,874 deletions&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/10/21/new-opensource-pr-this-time.html</link>
      <pubDate>Tue, 21 Oct 2025 18:12:48 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/10/21/new-opensource-pr-this-time.html</guid>
      <description>&lt;p&gt;New open-source PR, this time for Noticed + keyword mailers! &lt;a href=&#34;https://github.com/excid3/noticed/pull/565&#34;&gt;github.com/excid3/no&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>New open-source PR, this time for Noticed + keyword mailers! [github.com/excid3/no...](https://github.com/excid3/noticed/pull/565)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/10/14/shoutouts-to-the-datadog-team.html</link>
      <pubDate>Tue, 14 Oct 2025 07:52:58 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/10/14/shoutouts-to-the-datadog-team.html</guid>
      <description>&lt;p&gt;Shoutouts to the Datadog team for making it remarkably easy to write + submit an integration. Hopefully this will get merged in soon!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/DataDog/dd-trace-rb/pull/4977&#34;&gt;github.com/DataDog/d&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>Shoutouts to the Datadog team for making it remarkably easy to write + submit an integration. Hopefully this will get merged in soon!

[github.com/DataDog/d...](https://github.com/DataDog/dd-trace-rb/pull/4977)
</source:markdown>
    </item>
    
    <item>
      <title>Quick notes: Lies, Damn Lies, and Chrome&#39;s Lighthouse tab</title>
      <link>https://blog.practical.computer/2025/10/08/quick-notes-lies-damn-lies.html</link>
      <pubDate>Wed, 08 Oct 2025 17:44:50 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/10/08/quick-notes-lies-damn-lies.html</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a super quick post, as I&amp;rsquo;m mired in a few projects. But! The web is a living document, and I want to get these thoughts out there; I can always update this later.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent a fair bit of time over the past 3 weeks trying to chase down how to get a good Lighthouse performance score, particularly as I refine Little CRM and hone in my Web Awesome usage. Lighthouse was constantly dropping the score to the ~80s, leading me to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build a whole static site in 11ty that was just the markup + asset compilation&lt;/li&gt;
&lt;li&gt;Figure out a Caddy setup that would give me HTTP/2 with full compression locally&lt;/li&gt;
&lt;li&gt;Burn &lt;em&gt;even more&lt;/em&gt; time after that spamming the &amp;ldquo;analyze page&amp;rdquo; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ultimately, the lessons I&amp;rsquo;ve learned are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Lighthouse tab is finicky; particularly the Cumulative Layout Shift. The other stuff it checks is good, though!&lt;/li&gt;
&lt;li&gt;What Lighthouse reports for Simulated Throttling might not actually reflect real-world loading. Switch to DevTools throttling to check those results as well&lt;/li&gt;
&lt;li&gt;For layout shifting and overall loading details, check the &amp;ldquo;Performance&amp;rdquo; tab, it&amp;rsquo;s much more insightful.&lt;/li&gt;
&lt;li&gt;Make sure to throttle CPU &amp;amp; Network to get reasonable information when testing locally&lt;/li&gt;
&lt;li&gt;Building a good Web Awesome bundle (or really, any framework-layer bundle) is really important for first load performance. a Cloak can work, but for slow network connections it can make things unnecessarily worse. General rule for building the Web Awesome bundle: &lt;code&gt;page&lt;/code&gt;, &lt;code&gt;callout&lt;/code&gt;, &lt;code&gt;card&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;, &lt;code&gt;avatar&lt;/code&gt;, &lt;code&gt;divider&lt;/code&gt;, &lt;code&gt;tab-group&lt;/code&gt;. Then, pick the things you really really want to be available ASAP. But everything else (eg: tooltips) should be autoloaded&lt;/li&gt;
&lt;li&gt;Break up your applicaton bundles from your framework bundles. Combined with &lt;code&gt;preload&lt;/code&gt; directives on Font Awesome&amp;rsquo;s CDN, that improves caching and load performance thanks to HTTP/2.&lt;/li&gt;
&lt;li&gt;Most importantly: with a slow network connection, there is always going to be some rearranging until SSR gets to be stable. So, aim for getting content on the page for users ASAP. They already know they&amp;rsquo;re on a bad network&lt;/li&gt;
&lt;/ul&gt;
</description>
      <source:markdown>_This is a super quick post, as I&#39;m mired in a few projects. But! The web is a living document, and I want to get these thoughts out there; I can always update this later._

I&#39;ve spent a fair bit of time over the past 3 weeks trying to chase down how to get a good Lighthouse performance score, particularly as I refine Little CRM and hone in my Web Awesome usage. Lighthouse was constantly dropping the score to the ~80s, leading me to:

- Build a whole static site in 11ty that was just the markup + asset compilation
- Figure out a Caddy setup that would give me HTTP/2 with full compression locally
- Burn *even more* time after that spamming the &#34;analyze page&#34; button.

Ultimately, the lessons I&#39;ve learned are:

- The Lighthouse tab is finicky; particularly the Cumulative Layout Shift. The other stuff it checks is good, though!
- What Lighthouse reports for Simulated Throttling might not actually reflect real-world loading. Switch to DevTools throttling to check those results as well
- For layout shifting and overall loading details, check the &#34;Performance&#34; tab, it&#39;s much more insightful.
- Make sure to throttle CPU &amp; Network to get reasonable information when testing locally
- Building a good Web Awesome bundle (or really, any framework-layer bundle) is really important for first load performance. a Cloak can work, but for slow network connections it can make things unnecessarily worse. General rule for building the Web Awesome bundle: `page`, `callout`, `card`, `icon`, `avatar`, `divider`, `tab-group`. Then, pick the things you really really want to be available ASAP. But everything else (eg: tooltips) should be autoloaded
- Break up your applicaton bundles from your framework bundles. Combined with `preload` directives on Font Awesome&#39;s CDN, that improves caching and load performance thanks to HTTP/2.
- Most importantly: with a slow network connection, there is always going to be some rearranging until SSR gets to be stable. So, aim for getting content on the page for users ASAP. They already know they&#39;re on a bad network
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/09/05/the-work-that-marco-roth.html</link>
      <pubDate>Fri, 05 Sep 2025 17:40:19 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/09/05/the-work-that-marco-roth.html</guid>
      <description>&lt;p&gt;The work that Marco Roth is doing on the view layer for Ruby is so exciting. We’re running the newly-announced ReActionView in Little CRM; which already fixed a variety of syntax errors in our markup 😅&lt;/p&gt;
</description>
      <source:markdown>The work that Marco Roth is doing on the view layer for Ruby is so exciting. We’re running the newly-announced ReActionView in Little CRM; which already fixed a variety of syntax errors in our markup 😅
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/08/01/to-quote-kaspthbskysocial-lgtm.html</link>
      <pubDate>Fri, 01 Aug 2025 15:55:01 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/08/01/to-quote-kaspthbskysocial-lgtm.html</guid>
      <description>&lt;p&gt;To quote &lt;a href=&#34;http://kaspth.bsky.social&#34;&gt;@kaspth.bsky.social&lt;/a&gt;: &amp;ldquo;LGTM&amp;rdquo;&lt;/p&gt;
&lt;img src=&#34;uploads/2025/6aab3ae639.png&#34; alt=&#34;A pull request that has over 9,000 lines added, and over 25,000 lines deleted&#34;&gt;
</description>
      <source:markdown>To quote [@kaspth.bsky.social](http://kaspth.bsky.social): &#34;LGTM&#34;

&lt;img src=&#34;uploads/2025/6aab3ae639.png&#34; alt=&#34;A pull request that has over 9,000 lines added, and over 25,000 lines deleted&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/06/29/with-web-awesome-moving-towards.html</link>
      <pubDate>Sun, 29 Jun 2025 10:33:40 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/06/29/with-web-awesome-moving-towards.html</guid>
      <description>&lt;p&gt;With Web Awesome moving towards its release date; I’m finally starting to get a proper design for our apps. The theming is still WIP, but the components are much more cohesive&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;uploads/2025/ba120f454e.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;uploads/2025/da5a75cd03.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;uploads/2025/9bd1b842bf.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;uploads/2025/f2c08c3062.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
      <source:markdown>With Web Awesome moving towards its release date; I’m finally starting to get a proper design for our apps. The theming is still WIP, but the components are much more cohesive 

&lt;img src=&#34;uploads/2025/ba120f454e.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;uploads/2025/da5a75cd03.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;uploads/2025/9bd1b842bf.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;uploads/2025/f2c08c3062.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/06/23/if-youre-gonna-be-at.html</link>
      <pubDate>Mon, 23 Jun 2025 13:26:56 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/06/23/if-youre-gonna-be-at.html</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re gonna be at RailsConf, I&amp;rsquo;m hosting an unofficial hang before the conference kicks off! &lt;a href=&#34;https://lu.ma/railshang2025&#34;&gt;lu.ma/railshang&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>If you&#39;re gonna be at RailsConf, I&#39;m hosting an unofficial hang before the conference kicks off! [lu.ma/railshang...](https://lu.ma/railshang2025)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/06/20/a-quick-little-update-showing.html</link>
      <pubDate>Fri, 20 Jun 2025 09:58:49 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/06/20/a-quick-little-update-showing.html</guid>
      <description>&lt;p&gt;A quick little update, showing off one of the best tools I&amp;rsquo;m currently paying for: &lt;a href=&#34;https://kaleidoscope.app&#34;&gt;Kaleidoscope&lt;/a&gt;. It&amp;rsquo;s saved me &lt;em&gt;hours&lt;/em&gt; of time tackling merge conflicts, diffing results; and I&amp;rsquo;m finding new &amp;amp; exciting ways to use it. In this case: applying framework upgrades from one app into another!&lt;/p&gt;
&lt;p&gt;&lt;video src=&#34;https://blog.practical.computer/uploads/2025/kaleidoscope-upgrade.mp4&#34; poster=&#34;https://blog.practical.computer/uploads/2025/poster.png&#34; controls=&#34;controls&#34; preload=&#34;metadata&#34;&gt;&lt;/video&gt;&lt;/p&gt;
</description>
      <source:markdown>A quick little update, showing off one of the best tools I&#39;m currently paying for: [Kaleidoscope](https://kaleidoscope.app). It&#39;s saved me _hours_ of time tackling merge conflicts, diffing results; and I&#39;m finding new &amp; exciting ways to use it. In this case: applying framework upgrades from one app into another!

&lt;video src=&#34;https://blog.practical.computer/uploads/2025/kaleidoscope-upgrade.mp4&#34; poster=&#34;https://blog.practical.computer/uploads/2025/poster.png&#34; controls=&#34;controls&#34; preload=&#34;metadata&#34;&gt;&lt;/video&gt;
</source:markdown>
    </item>
    
    <item>
      <title>The Practical Framework 3.0 (alpha 1)</title>
      <link>https://blog.practical.computer/2025/06/02/the-practical-framework-alpha.html</link>
      <pubDate>Mon, 02 Jun 2025 21:18:54 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/06/02/the-practical-framework-alpha.html</guid>
      <description>&lt;p&gt;These have been a &lt;strong&gt;long&lt;/strong&gt; time in the making; and they&amp;rsquo;re barely the initial alphas, but the Practical Framework is officially open-sourced.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re 3.0 releases because they&amp;rsquo;ve gone through 2 internal revisions. Next up is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updating existing apps to use 3.0&lt;/li&gt;
&lt;li&gt;Refinements from there&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Tons&lt;/strong&gt;&lt;/em&gt; of documentation, because the framework takes a very different approach than others on the market&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’re curious:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/practical-computer/practical&#34;&gt;The Ruby repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/practical-computer/practical-views-js&#34;&gt;The JS repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
      <source:markdown>These have been a **long** time in the making; and they&#39;re barely the initial alphas, but the Practical Framework is officially open-sourced.

They&#39;re 3.0 releases because they&#39;ve gone through 2 internal revisions. Next up is:
- Updating existing apps to use 3.0
- Refinements from there
- ***Tons*** of documentation, because the framework takes a very different approach than others on the market

If you’re curious:

- [The Ruby repo](https://github.com/practical-computer/practical)
- [The JS repo](https://github.com/practical-computer/practical-views-js)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/05/20/171905.html</link>
      <pubDate>Tue, 20 May 2025 17:19:05 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/05/20/171905.html</guid>
      <description>&lt;p&gt;A great read: &lt;a href=&#34;https://animationobsessive.substack.com/p/rejecting-the-slop-economy&#34;&gt;animationobsessive.substack.com/p/rejecti&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>A great read: [animationobsessive.substack.com/p/rejecti...](https://animationobsessive.substack.com/p/rejecting-the-slop-economy)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/04/23/after-years-of-work-and.html</link>
      <pubDate>Wed, 23 Apr 2025 16:51:43 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/04/23/after-years-of-work-and.html</guid>
      <description>&lt;p&gt;After 3+ years of work and refining in private repos, I&amp;rsquo;ve finally published an open-source implementation for client-side error handling that should work for 99% of cases! &lt;a href=&#34;https://github.com/practical-computer/practical-error-handling-js&#34;&gt;github.com/practical&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>After 3+ years of work and refining in private repos, I&#39;ve finally published an open-source implementation for client-side error handling that should work for 99% of cases! [github.com/practical...](https://github.com/practical-computer/practical-error-handling-js)
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/04/18/this-is-still-one-of.html</link>
      <pubDate>Fri, 18 Apr 2025 12:44:05 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/04/18/this-is-still-one-of.html</guid>
      <description>&lt;p&gt;This is still one of the best guides &amp;amp; approaches for progressively enhanced form errors. I’ve been running a version of it for 2 years; and will be open-sourcing that library in the next few weeks&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cloudfour.com/thinks/progressively-enhanced-form-validation-part-1-html-and-css/&#34;&gt;cloudfour.com/thinks/pr&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
      <source:markdown>This is still one of the best guides &amp; approaches for progressively enhanced form errors. I’ve been running a version of it for 2 years; and will be open-sourcing that library in the next few weeks

[cloudfour.com/thinks/pr...](https://cloudfour.com/thinks/progressively-enhanced-form-validation-part-1-html-and-css/)
</source:markdown>
    </item>
    
    <item>
      <title>Overhauling an existing app&#39;s view layer without halting development</title>
      <link>https://blog.practical.computer/2025/04/08/overhauling-an-existing-apps-view.html</link>
      <pubDate>Tue, 08 Apr 2025 09:10:07 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/04/08/overhauling-an-existing-apps-view.html</guid>
      <description>&lt;p&gt;After months of research and development, a new guide about how to build maintainable view layers in Rails (and overhaul an existing UI without stopping feature development) is live.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://thomascannon.me/guides/the-rails-view-layer&#34;&gt;thomascannon.me/guides/th&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is the largest thing I&amp;rsquo;ve ever seriously published, clocking in at about 8.2K words, with an open-source snapshot to boot&lt;/p&gt;
&lt;p&gt;After a short break, I&amp;rsquo;m going to extract the framework-level code into libraries, then start the process of migrating Little CRM 💪&lt;/p&gt;
</description>
      <source:markdown>After months of research and development, a new guide about how to build maintainable view layers in Rails (and overhaul an existing UI without stopping feature development) is live.

[thomascannon.me/guides/th...](https://thomascannon.me/guides/the-rails-view-layer)

This is the largest thing I&#39;ve ever seriously published, clocking in at about 8.2K words, with an open-source snapshot to boot

After a short break, I&#39;m going to extract the framework-level code into libraries, then start the process of migrating Little CRM 💪
</source:markdown>
    </item>
    
    <item>
      <title>Rails View Layers in 2025</title>
      <link>https://blog.practical.computer/2025/03/22/rails-view-layers-in.html</link>
      <pubDate>Sat, 22 Mar 2025 10:16:44 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/03/22/rails-view-layers-in.html</guid>
      <description>&lt;p&gt;I’m currently in the middle of re-tackling the view layer for Practical Computer. Now that there are 2 apps + a framework, the complexity is high enough to actually tackle the problem comprehensively&lt;/p&gt;
&lt;p&gt;So, from my view of the Rails View Layer landscape, you have the following paths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;continue as-is, as we have for 15 years&lt;/li&gt;
&lt;li&gt;get partway there with ViewComponent, having to make concessions &amp;amp; hacks. This is a glaring flaw; table-stakes: &lt;a href=&#34;https://viewcomponent.org/known_issues.html#compatibility-with-rails-form-helpers&#34;&gt;viewcomponent.org/known_iss&amp;hellip;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;go with Phlex all-in, acting as a clean-room replacement. Basically; nothing aside from Form Builders &amp;amp; explicit helper uses, no ERB files&lt;/li&gt;
&lt;li&gt;roll something on your own, like Garett proposes in some of his musings: &lt;a href=&#34;https://garrettdimon.com/journal/posts/erb-partials-helpers-and-rails&#34;&gt;garrettdimon.com/journal/p&amp;hellip;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Am I correct here? Am I missing something?&lt;/p&gt;
</description>
      <source:markdown>I’m currently in the middle of re-tackling the view layer for Practical Computer. Now that there are 2 apps + a framework, the complexity is high enough to actually tackle the problem comprehensively

So, from my view of the Rails View Layer landscape, you have the following paths:

- continue as-is, as we have for 15 years
- get partway there with ViewComponent, having to make concessions &amp; hacks. This is a glaring flaw; table-stakes: [viewcomponent.org/known_iss...](https://viewcomponent.org/known_issues.html#compatibility-with-rails-form-helpers)
- go with Phlex all-in, acting as a clean-room replacement. Basically; nothing aside from Form Builders &amp; explicit helper uses, no ERB files
- roll something on your own, like Garett proposes in some of his musings: [garrettdimon.com/journal/p...](https://garrettdimon.com/journal/posts/erb-partials-helpers-and-rails)

Am I correct here? Am I missing something?
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/03/09/sneak-peek-of-a-new.html</link>
      <pubDate>Sun, 09 Mar 2025 11:30:54 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/03/09/sneak-peek-of-a-new.html</guid>
      <description>&lt;p&gt;Sneak peek of a new feature that’s coming soon to Little CRM&lt;/p&gt;
&lt;img src=&#34;https://microblog.thomascannon.me/uploads/2025/34eb193ee5.png&#34; width=&#34;277&#34; height=&#34;600&#34; alt=&#34;An iOS Lock Screen, with a push notification from Little CRM that says “What’s happened this week?” A dog with a bandana that says “chaotic bisexual” is in the background&#34;&gt;
</description>
      <source:markdown>Sneak peek of a new feature that’s coming soon to Little CRM

&lt;img src=&#34;https://microblog.thomascannon.me/uploads/2025/34eb193ee5.png&#34; width=&#34;277&#34; height=&#34;600&#34; alt=&#34;An iOS Lock Screen, with a push notification from Little CRM that says “What’s happened this week?” A dog with a bandana that says “chaotic bisexual” is in the background&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/03/05/having-fun-with-error-messages.html</link>
      <pubDate>Wed, 05 Mar 2025 20:57:52 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/03/05/having-fun-with-error-messages.html</guid>
      <description>&lt;p&gt;Having fun with error messages once again&lt;/p&gt;
&lt;img src=&#34;uploads/2025/6724a88e4a.png&#34; alt=&#39;A screenshot from a component preview, notably with the following error text when 4 days a week are chosen: &#34;You picked too many days a week; please pick 3 or less. We arenʼt Duolingo here; I donʼt want to nag you every day—no one wants that.&#34;&#39;&gt;
</description>
      <source:markdown>Having fun with error messages once again

&lt;img src=&#34;uploads/2025/6724a88e4a.png&#34; alt=&#39;A screenshot from a component preview, notably with the following error text when 4 days a week are chosen: &#34;You picked too many days a week; please pick 3 or less. We arenʼt Duolingo here; I donʼt want to nag you every day—no one wants that.&#34;&#39;&gt;
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.practical.computer/2025/02/20/im-starting-to-add-notifications.html</link>
      <pubDate>Thu, 20 Feb 2025 19:45:14 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/02/20/im-starting-to-add-notifications.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m starting to add notifications, reminders, followups, prompts to Little CRM. Let me know your thoughts and what you&amp;rsquo;d find valuable (and more importantly, what you&amp;rsquo;d find annoying!)&lt;/p&gt;
&lt;p&gt;Now that I&amp;rsquo;m in the phase of my hiatus where I&amp;rsquo;m figuring out the balance of app work + music, updates are back on the menu! 💪&lt;/p&gt;
</description>
      <source:markdown>I&#39;m starting to add notifications, reminders, followups, prompts to Little CRM. Let me know your thoughts and what you&#39;d find valuable (and more importantly, what you&#39;d find annoying!)

Now that I&#39;m in the phase of my hiatus where I&#39;m figuring out the balance of app work + music, updates are back on the menu! 💪
</source:markdown>
    </item>
    
    <item>
      <title>New tool: Mustachio Extism Plugin</title>
      <link>https://blog.practical.computer/2025/01/16/new-tool-mustachio-extism-plugin.html</link>
      <pubDate>Thu, 16 Jan 2025 13:31:17 -0400</pubDate>
      
      <guid>http://practical-computer.micro.blog/2025/01/16/new-tool-mustachio-extism-plugin.html</guid>
      <description>&lt;p&gt;A new mini-tool from the Practical Computer labs: an Extism plugin to process Mustachio templates: &lt;a href=&#34;https://github.com/practical-computer/mustachio-extism-plugin/releases/tag/0.0.1&#34;&gt;github.com/practical&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Overall, I&amp;rsquo;m impressed with how Extism is structured. Being able to use WASM to deal with a thorny issue (running Mustachio&amp;rsquo;s official C# library in a Ruby codebase) with a small, cross-platform binary that can be embedded into the repo itself, dramatically simplifies the problem at hand.&lt;/p&gt;
&lt;p&gt;The goal is to hand this off to Postmark directly, since this gives their entire ecosystem a huge boost in usability.&lt;/p&gt;
</description>
      <source:markdown>A new mini-tool from the Practical Computer labs: an Extism plugin to process Mustachio templates: [github.com/practical...](https://github.com/practical-computer/mustachio-extism-plugin/releases/tag/0.0.1)

Overall, I&#39;m impressed with how Extism is structured. Being able to use WASM to deal with a thorny issue (running Mustachio&#39;s official C# library in a Ruby codebase) with a small, cross-platform binary that can be embedded into the repo itself, dramatically simplifies the problem at hand.

The goal is to hand this off to Postmark directly, since this gives their entire ecosystem a huge boost in usability.
</source:markdown>
    </item>
    
  </channel>
</rss>
