<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:posse="https://posseparty.com/2024/Feed" ><generator uri="https://bridgetownrb.com/" version="2.1.2">Bridgetown</generator><link href="https://wtoa.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://wtoa.dev/" rel="alternate" type="text/html" /><updated>2026-04-03T02:58:26+00:00</updated><id>https://wtoa.dev/feed.xml</id><title type="html">wtoa.dev</title><subtitle>Writing my thoughts here for the future</subtitle><entry><title type="html">Local CI in Rails 8.1</title><link href="https://wtoa.dev/posts/2026/01/10/rails-local-ci/" rel="alternate" type="text/html" title="Local CI in Rails 8.1" /><published>2026-01-10T00:00:00+00:00</published><updated>2026-01-10T00:00:00+00:00</updated><id>repo://posts.collection/_posts/2026-01-10-Rails-Local-CI.md</id><content type="html" xml:base="https://wtoa.dev/posts/2026/01/10/rails-local-ci/">&lt;p&gt;One of the things that was released in &lt;a href=&quot;https://rubyonrails.org/2025/10/22/rails-8-1&quot;&gt;Rails 8.1&lt;/a&gt; was it’s inclusion of the ability for us to define and run our CI locally. I’ve been trying it out and it works well. It is definitely a great fit for smaller applications, but for large existing applications I don’t think this is the right move to make, here are a few things to point out:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Parallelisation isn’t supported out of the box.&lt;/strong&gt; For smaller apps, running your test suite linearly is usually fine. But for some of the larger codebases I’ve worked on, we rely heavily on parallelisation on the CI to keep feedback loops tight. The native Rails 8.1 integration seems to be single-threaded by default.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SOC 2 compliance might be tricky to work out.&lt;/strong&gt; Compliance auditors love a paper trail. One of the hidden benefits of using a cloud provider like GitHub Actions or CircleCI is the immutable log of “who ran what, when, and with what result.” Moving CI “local” can murk up those waters. If the definition of “passing CI” becomes “it worked on my machine,” we lose that objective, third-party verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think this is a fantastic step forward for indie devs, solo founders, and early-stage startups. Being able to &lt;code class=&quot;highlighter-rouge&quot;&gt;git push&lt;/code&gt; knowing your “CI” has already passed locally saves money and time. But for the big players, the traditional CI pipeline isn’t going anywhere just yet.&lt;/p&gt;</content><author><name>William Tio</name></author><category term="posts" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Vibe Coding Part 2</title><link href="https://wtoa.dev/posts/2025/11/22/vibe-coding-part-two/" rel="alternate" type="text/html" title="Vibe Coding Part 2" /><published>2025-11-22T00:00:00+00:00</published><updated>2025-11-22T00:00:00+00:00</updated><id>repo://posts.collection/_posts/2025-11-18-vibe-coding-part-two.md</id><content type="html" xml:base="https://wtoa.dev/posts/2025/11/22/vibe-coding-part-two/">&lt;p&gt;It’s been a while since I last wrote about vibe coding, my first post about it was back in March.
 
One thought I had about it was whether or not it will lead to an increase in jobs for actual software engineers. I think this prediction is half true, it has led to a decline in job openings for graduate / junior roles but the demand for senior level engineers remain strong. I’m not sure if this is the same in other industry but that is the current landscape in the software industry.
 
When the AI wave initially hit, one thought that I had was that the software industry would likely be the most resilient but the rise of generative AI assisted coding has changed that thought.&lt;/p&gt;

&lt;p&gt;I believe that we need to tread on this ground carefully, AI assistance does provide benefit in terms of the time it takes to not have to write boilerplate code but also there is a disadvantage in that if we are using it to think less, then that will not be a future I would like to see. We need to use generative AI tools to help us deliver value without compromising what makes us valuable in the first place, our ability to solve problems.&lt;/p&gt;</content><author><name>William Tio</name></author><category term="posts" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Blogu - An experimental Hanami blogging engine</title><link href="https://wtoa.dev/posts/2025/11/04/blogu/" rel="alternate" type="text/html" title="Blogu - An experimental Hanami blogging engine" /><published>2025-11-04T18:19:00+00:00</published><updated>2025-11-04T18:19:00+00:00</updated><id>repo://posts.collection/_posts/2025-11-04-blogu.md</id><content type="html" xml:base="https://wtoa.dev/posts/2025/11/04/blogu/">&lt;p&gt;In my last post I was really excited about transitioning everything over to Hanami. After experimenting with Hanami a bit more, I slowly came to realize that the current setup I have is pretty great! So all we have out of this is this &lt;a href=&quot;https://github.com/WToa/blogu&quot;&gt;repository&lt;/a&gt; that’s out there for people to explore, it’s not much but it’s something!&lt;/p&gt;

&lt;p&gt;That being said, I really enjoyed my short time with Hanami, the patterns that they present is definitely different to what you’re used to with Rails but they are patterns that are widely adopted in Rails applications I have seen in the enterprise space (clean separation of concern, reminds me a lot of &lt;a href=&quot;https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)&quot;&gt;hexagonal architecture&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Hope to find a use for it in my future side projects!&lt;/p&gt;</content><author><name>William Tio</name></author><category term="posts" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Transactional Hanami tests</title><link href="https://wtoa.dev/notes/2025/11/04/transactional-sequel-tests/" rel="alternate" type="text/html" title="Transactional Hanami tests" /><published>2025-11-04T13:55:00+00:00</published><updated>2025-11-04T13:55:00+00:00</updated><id>repo://posts.collection/_posts/2025-11-04-transactional-sequel-tests.md</id><content type="html" xml:base="https://wtoa.dev/notes/2025/11/04/transactional-sequel-tests/">&lt;p&gt;One of the things that you will likely do is to write request related specs on Hanami, by default, commits that happen on the DB are not transactional. Ideally we want tests to always be isolated from each other.&lt;/p&gt;

&lt;p&gt;Now knowing that we use Sequel under the hood, this is what we can do in our &lt;code class=&quot;highlighter-rouge&quot;&gt;spec_helper.rb&lt;/code&gt; in order to make our tests run in a transactional scope:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;DB = Sequel.sqlite # change this according to the database you are using
RSpec.configure do |c|
  c.around(:each) do |example|
    DB.transaction(rollback: :always, auto_savepoint: true) {example.run}
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>William Tio</name></author><category term="notes" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Rewriting to Hanami</title><link href="https://wtoa.dev/posts/2025/10/31/rewrite/" rel="alternate" type="text/html" title="Rewriting to Hanami" /><published>2025-10-31T09:07:00+00:00</published><updated>2025-10-31T09:07:00+00:00</updated><id>repo://posts.collection/_posts/2025-10-31-rewrite.md</id><content type="html" xml:base="https://wtoa.dev/posts/2025/10/31/rewrite/">&lt;p&gt;So currently my site runs on Bridgetown but I’ve been really curious about Hanami, so I made the decision today to do a rewrite of this site in Hanami!&lt;/p&gt;

&lt;p&gt;You might be asking, &lt;em&gt;why rewrite a static site in Hanami?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Well, why not?&lt;/p&gt;

&lt;p&gt;I have been looking at Hanami for a while now and have been tossing around the idea of rewriting my personal site on Hanami. I’m a big fan of &lt;a href=&quot;https://guides.hanamirb.org/v2.3/app/container-and-components/&quot;&gt;Hanami’s architecture&lt;/a&gt;, there’s a very clean line of separation of concerns and I very much like how explicit it is about dependency injection. I also would like to start adding functionality above what I currently am running.&lt;/p&gt;

&lt;p&gt;And &lt;a href=&quot;https://rom-rb.org/learn/#principles-amp-design&quot;&gt;ROM&lt;/a&gt; is awesome!&lt;/p&gt;

&lt;p&gt;So for all of those reasons (none of them being the &lt;em&gt;best&lt;/em&gt; way to create a static site), I’ve decided to rewrite this site to be entirely in Hanami. Additionally, I am also thinking of releasing a simple blogging engine written in Hanami as well for my own use and to share with others!&lt;/p&gt;

&lt;p&gt;I will also write about my journey along the way, and also looking to fulfill my feature list here:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Add ability to create notes / posts directly on the site&lt;/li&gt;
  &lt;li&gt;Deploy Hanami using Kamal&lt;/li&gt;
  &lt;li&gt;Tracking engagement metrics&lt;/li&gt;
&lt;/ul&gt;</content><author><name>William Tio</name></author><category term="posts" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Omarchy on Mac</title><link href="https://wtoa.dev/posts/2025/10/25/omarchy-on-mac/" rel="alternate" type="text/html" title="Omarchy on Mac" /><published>2025-10-25T16:38:00+00:00</published><updated>2025-10-25T16:38:00+00:00</updated><id>repo://posts.collection/_posts/2025-10-25-omarchy-on-mac.md</id><content type="html" xml:base="https://wtoa.dev/posts/2025/10/25/omarchy-on-mac/">&lt;p&gt;So you’ve used Omarchy but still have to do some things on a Mac.&lt;/p&gt;

&lt;p&gt;You wish if there was some way to get some of the same functionality…&lt;/p&gt;

&lt;p&gt;Well let me tell you that you can use:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://karabiner-elements.pqrs.org/&quot;&gt;Karabiner&lt;/a&gt; for keybindings
&lt;a href=&quot;https://github.com/nikitabobko/AeroSpace&quot;&gt;Aerospace&lt;/a&gt; for window management&lt;/p&gt;

&lt;p&gt;Honestly just having these two things changed my MacOS workflow bringing me a bit closer to the productivity that I had with Omarchy.&lt;/p&gt;

&lt;p&gt;Of course AeroSpace is a bit buggy in MacOS (you’ll find out as you use it) but there are certainly ways around it. Just edit the configuration file and you will be able to alleviate some of the pain.&lt;/p&gt;</content><author><name>William Tio</name></author><category term="posts" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Local Docker Registry now in Kamal 2.8!</title><link href="https://wtoa.dev/posts/2025/10/21/kamal-local-docker-registry/" rel="alternate" type="text/html" title="Local Docker Registry now in Kamal 2.8!" /><published>2025-10-21T09:04:00+00:00</published><updated>2025-10-21T09:04:00+00:00</updated><id>repo://posts.collection/_posts/2025-10-21-kamal-local-docker-registry.md</id><content type="html" xml:base="https://wtoa.dev/posts/2025/10/21/kamal-local-docker-registry/">&lt;p&gt;If you’re working in Ruby on Rails 8 and are not using Kamal, I highly suggest that you give it a look. I’ve personally been using it to deploy a number of applications and I find the entire process to be very streamlined!&lt;/p&gt;

&lt;p&gt;I’ll give a simplified overview of what Kamal does assuming you have done the setup step on a server (it’s as simple as running &lt;code class=&quot;highlighter-rouge&quot;&gt;kamal setup&lt;/code&gt;)&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It builds an image locally&lt;/li&gt;
  &lt;li&gt;It pushes that image to a registry (by default it’s Docker Hub)&lt;/li&gt;
  &lt;li&gt;You pull down the image from the registry&lt;/li&gt;
  &lt;li&gt;You run the image on the server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, one problem I had was that prior to Kamal 2.8, whenever we build the image, we had to push it to a registry, now wouldn’t it be great if we didn’t have to rely on an external provider for the registry service? There are other ways to host your own registry but in practice one would usually use existing providers like Docker Hub / Github / ECR / Artifact Registry mainly to reduce setup complexity.&lt;/p&gt;

&lt;p&gt;With Kamal 2.8 which included this &lt;a href=&quot;https://github.com/basecamp/kamal/pull/1355&quot;&gt;PR&lt;/a&gt;, we now are able to build the image locally, push it to a registry locally and then have the remote servers pull directly from those local registry. This removes the dependency on an external provider!&lt;/p&gt;</content><author><name>William Tio</name></author><category term="posts" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">All in on Omarchy</title><link href="https://wtoa.dev/notes/2025/08/27/all-in-on-omarchy/" rel="alternate" type="text/html" title="All in on Omarchy" /><published>2025-08-27T18:25:00+00:00</published><updated>2025-08-27T18:25:00+00:00</updated><id>repo://posts.collection/_posts/2025-08-27-all-in-on-omarchy.md</id><content type="html" xml:base="https://wtoa.dev/notes/2025/08/27/all-in-on-omarchy/">&lt;p&gt;So I’ve been trying out Omarchy for about a week now. I’ve come to really enjoy how easy it is to use. There’s a few issues I’ve run into mainly related to Bluetooth devices but the AUR wiki is a fantastic resource to come to understand what’s broken and how to fix it. I’m going to continue to use it, I’ve already replaced my daily driver with Omarchy so at this point, I’m all in.&lt;/p&gt;</content><author><name>William Tio</name></author><category term="notes" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Trying Out Omarchy</title><link href="https://wtoa.dev/posts/2025/08/15/trying-out-omarchy/" rel="alternate" type="text/html" title="Trying Out Omarchy" /><published>2025-08-15T10:00:00+00:00</published><updated>2025-08-15T10:00:00+00:00</updated><id>repo://posts.collection/_posts/2025-08-15-trying-out-omarchy.md</id><content type="html" xml:base="https://wtoa.dev/posts/2025/08/15/trying-out-omarchy/">&lt;p&gt;I’ve always enjoyed hopping between Linux distros. My journey started with Linux Mint, which was a great way to ease into the ecosystem. From there, I moved on to Ubuntu, then Fedora, and eventually ArchLinux. Lately, I’ve been running ArchLinux with hYde, a setup I’ve spent way too much time tweaking to perfection.&lt;/p&gt;

&lt;p&gt;Now, I’m giving Omarchy a spin. What caught my attention is how opinionated it is while still leaving room for customization. It’s like having a strong foundation to build on without feeling boxed in. That balance is something I really appreciate.&lt;/p&gt;

&lt;p&gt;One thing I really like is how easy it is to switch themes. They give you a lot of nice themes out of the box and allow you to even define your own theme. That said, I can already tell I’ll spend more time customizing than actually doing any real work.&lt;/p&gt;

&lt;p&gt;I’m driving Omarchy daily for the next month or so just to see how much I like it. I currently have it installed on a 2016 Dell XPS 13 model and I’m surprised by how well it’s running!&lt;/p&gt;</content><author><name>William Tio</name></author><category term="posts" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry><entry><title type="html">Migrating from Cloudflare Pages to Workers</title><link href="https://wtoa.dev/notes/2025/08/11/migrating-from-cloudflare-pages-to-workers/" rel="alternate" type="text/html" title="Migrating from Cloudflare Pages to Workers" /><published>2025-08-11T11:09:00+00:00</published><updated>2025-08-11T11:09:00+00:00</updated><id>repo://posts.collection/_posts/2025-08-11-migrating-from-cloudflare-pages-to-workers.md</id><content type="html" xml:base="https://wtoa.dev/notes/2025/08/11/migrating-from-cloudflare-pages-to-workers/">&lt;p&gt;I’ve been using Cloudflare pages for a while now and noticed that now there is a push for us to migrate to using Cloudflare workers. So I made this post to test out if the build process will work or not! I’m also keen to do a longer post later on a deep dive of my bespoke deployment process.&lt;/p&gt;</content><author><name>William Tio</name></author><category term="notes" /><posse:post format="json"><![CDATA[{"format_string":"{{title}}","append_url":true,"append_url_spacer":" ","platform_overrides":{"bsky":{"attach_link":true}}}]]></posse:post></entry></feed>