<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sean.taylormadetech.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sean.taylormadetech.dev/" rel="alternate" type="text/html" /><updated>2026-10-01T05:41:40+00:00</updated><id>https://sean.taylormadetech.dev/feed.xml</id><title type="html">Sean’s Blog</title><subtitle>Sean&apos;s blog for all his tech ramblings.</subtitle><entry><title type="html">Weekly Brain Dump #42</title><link href="https://sean.taylormadetech.dev/2026/10/01/weekly-brain-dump-42.html" rel="alternate" type="text/html" title="Weekly Brain Dump #42" /><published>2026-10-01T00:00:00+00:00</published><updated>2026-10-01T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/10/01/weekly-brain-dump-42</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/10/01/weekly-brain-dump-42.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#my-first-live-coding">My First Live Coding</a>
      </strong>
      Streamed some coding and had a blast
    </li>
  
    <li>
      <strong>
        <a href="#block-stacker">Block Stacker</a>
      </strong>
      Continued work on my action puzzle game engine
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="my-first-live-coding">My First Live Coding</h2>

<p>Over the weekend I did my first live coding session on <a href="https://www.twitch.tv/hell_rok">my Twitch
channel</a>. You can also check out <a href="https://youtu.be/cRvnMzGevI4">the VOD on YouTube</a>.</p>

<p>It was a lot of fun and definitely something I want to do more of. It’s
definitely a lot slower than just coding on the couch but I think the community
aspect is nice.</p>

<h2 id="block-stacker">Block Stacker</h2>

<p>This is what I was working on while live coding. I had the urge to continue
working on this and have made some decent progress. The pieces are now contained
to the board and are rendered correctly by row number.</p>

<p>I think it won’t be much longer before it’s a recognisable game!</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://spinel.coop/blog/why-you-should-check-your-gems-lines-of-code/">Why you should check your gem's lines of code</a>:
  </strong>
  Something I hadn't thought of, good advice in here.

</p>

<p>
  <strong>
    <a href="https://hanakai.org/blog/2026/09/29/welcome-thoughtbot">Welcome, thoughtbot!</a>:
  </strong>
  Hanakai getting sponsored by thoughtbot

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance My First Live Coding Streamed some coding and had a blast Block Stacker Continued work on my action puzzle game engine Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #41</title><link href="https://sean.taylormadetech.dev/2026/09/24/weekly-brain-dump-41.html" rel="alternate" type="text/html" title="Weekly Brain Dump #41" /><published>2026-09-24T00:00:00+00:00</published><updated>2026-09-24T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/09/24/weekly-brain-dump-41</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/09/24/weekly-brain-dump-41.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#finished-porting-one-old-project">Finished Porting One Old Project</a>
      </strong>
      First project done!
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="finished-porting-one-old-project">Finished Porting One Old Project</h2>

<p>I finished porting one of my old projects! I’ll probably host it up somewhere
once I’ve finished porting the other project I’ve got planned.</p>

<p>Once I got the general pattern down to change the GUI elements from immediate
mode to object oriented it was smooth sailing.</p>

<p>It was a very simple project but sometimes it’s nice to have something you can
actually achieve, especially when morale has been low.</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://brennan.day/creating-a-blog-in-gemini/">Creating a Blog in Gemini://</a>:
  </strong>
  Gemini is an interesting concept but I have a hard time committing to
properly trying it.

</p>

<p>
  <strong>
    <a href="https://railsatscale.com/2026-09-16-ractor-age-rails-a-how-to-guide/">Ractor-age Rails: A How-To Guide</a>:
  </strong>
  A follow up from last week, more cool ractor tech.

</p>

<p>
  <strong>
    <a href="https://www.m2h.nl/writing/the-toolkit-behind-ten-years-of-games/">The backend that runs every game we make, ten years and counting</a>:
  </strong>
  An interesting read about building an analytics system for game backends.

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Finished Porting One Old Project First project done! Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #40</title><link href="https://sean.taylormadetech.dev/2026/09/17/weekly-brain-dump-40.html" rel="alternate" type="text/html" title="Weekly Brain Dump #40" /><published>2026-09-17T00:00:00+00:00</published><updated>2026-09-17T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/09/17/weekly-brain-dump-40</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/09/17/weekly-brain-dump-40.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#taylor-progress">Taylor Progress!</a>
      </strong>
      I have some energy again, so using it on Taylor
    </li>
  
    <li>
      <strong>
        <a href="#porting-old-projects">Porting Old Projects</a>
      </strong>
      Having some fun porting things to Taylor
    </li>
  
    <li>
      <strong>
        <a href="#catching-up-on-rss">Catching up on RSS</a>
      </strong>
      I love RSS
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="taylor-progress">Taylor Progress!</h2>

<p>I actually <a href="https://github.com/HellRok/Taylor/pull/89">merged a pull request</a> that I wrote for the first time in
months. It felt really good to actually sit down with my brain and just quietly
solve a problem.</p>

<p>This problem has been bugging me for a while and I knew about it since v0.4.0
but didn’t realise it was going to cause massive issues on Windows. It turns out
ever since v0.4.0 you haven’t been able to use <code class="language-plaintext highlighter-rouge">taylor.exe</code> from your <code class="language-plaintext highlighter-rouge">$PATH</code>
for development. I dunno if anyone actually does this on Windows but if they
had, it would have broken.</p>

<p>Again, I’m just happy to have the brain power back to be able to do things. This
was a mentally tricky problem for me because there were quite a few cases and
the whole “launch a development app” is surprisingly fiddly with how it handles
paths.</p>

<h2 id="porting-old-projects">Porting Old Projects</h2>

<p>I got inspired the other night to start porting a few little games that I made
for <a href="https://www.twitch.tv/nacina">my wife</a> from C++ and Godot over to Taylor. I mostly want to do
this to keep them easy to maintain and host for her but partly as a fun little
experiment to see how hard it is to port.</p>

<p>The C++ game should be really trivial, it’s already using Raylib (although
v3.0.0) and it’s written in my usual style of <code class="language-plaintext highlighter-rouge">scenes</code>. This is the one I
started the other night and hopefully will have it done in a couple of short
sessions.</p>

<p>The Godot tool I built will probably be a little trickier but that’s part of the
fun. It makes use of audio and camera movements so this will be interesting.</p>

<p>Of course I have kept this from my wife to keep it a surprise. I think she
could use a random act of kindness to help pick her mood up a little.</p>

<h2 id="catching-up-on-rss">Catching up on RSS</h2>

<p>As you can probably see from the amount of Interesting Links I have posted, I’ve
been catching up on my RSS reader. It’s been hard to have the motivation to sit
down and properly take in technical articles so I’ve left them aside for when I
had the energy.</p>

<p>Just quietly, how good is RSS? I tried a few times in my life to get into RSS
but it only stuck a couple years ago when I figured I didn’t need a web based
one and could just use <a href="https://play.google.com/store/apps/details?id=com.nononsenseapps.feeder.play">Feeder</a>. It gives me that “scrolling through Mastodon”
vibe that makes it easy to pick up and use.</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://daverupert.com/2026/08/microlighter/">microlighter</a>:
  </strong>
  A new syntax highlighter for web, focusing on being lightweight and using modern CSS.

</p>

<p>
  <strong>
    <a href="https://ko-fi.com/Post/Math-for-PICO-8-developers-A5E626UZD2">Math for PICO-8 devs</a>:
  </strong>
  Just because it focuses on PICO-8 doesn't mean it isn't universally useful.

</p>

<p>
  <strong>
    <a href="https://shkspr.mobi/blog/2026/09/activitypub-is-it-worth-defending-against-replay-attacks-and-message-signature-time-skew/">ActivityPub - Is it worth defending against replay attacks and message/signature time skew?</a>:
  </strong>
  An interesting look at how each service handles replay attacks and whether
you should even care.

</p>

<p>
  <strong>
    <a href="https://ploum.net/2026-09-02-i_dont_have_a_smartphone.html">I Don’t Have a Smartphone…</a>:
  </strong>
  A great take on how smartphones are still useful but shouldn't be shoved
down our throats.

</p>

<p>
  <strong>
    <a href="https://shkspr.mobi/blog/2026/08/activitybot-is-the-recipient-of-an-nlnet-grant/">ActivityBot is the recipient of an NLnet grant!</a>:
  </strong>
  Two Terence posts in one list! Absolutely great to see projects like this
get funding. I'm still SO tempted to write an activity pub compatible
thing sometime.

</p>

<p>
  <strong>
    <a href="https://island94.org/2026/09/converting-a-ruby-block-interface-to-start-stop-methods-with-a-fiber">Converting a Ruby block interface to start/stop methods with a Fiber</a>:
  </strong>
  Some very cool tricks with Ruby, this is very worth your time to look at
and understand.

</p>

<p>
  <strong>
    <a href="https://noteflakes.com/articles/2026-09-05-beyond-orms">Beyond ORMs</a>:
  </strong>
  I've been feeling the pain of ORMs in a large Rails monolith recently and
have started thinking this pattern would be much better for maintenance
and performance. Perhaps this'll push me to look into Hanami again?

</p>

<p>
  <strong>
    <a href="https://zylinski.se/posts/named-return-values-without-oopsies/">Named Return Values Without Oopsies</a>:
  </strong>
  Odin is an interesting language that I should give some time.

</p>

<p>
  <strong>
    <a href="https://railsatscale.com/2026-09-01-zjit-gc-fastpath/">ZJIT 🤝 GC: Inlining GC Fastpath in ZJIT</a>:
  </strong>
  My brain hasn't been alive enough to really go through this, but it seems
very interesting.

</p>

<p>
  <strong>
    <a href="https://railsatscale.com/2026-08-11-ractors-on-rails/">Bringing Rails into the Ractor-age</a>:
  </strong>
  I'm always excited when I see people pushing ractors!

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Taylor Progress! I have some energy again, so using it on Taylor Porting Old Projects Having some fun porting things to Taylor Catching up on RSS I love RSS Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #39</title><link href="https://sean.taylormadetech.dev/2026/09/10/weekly-brain-dump-39.html" rel="alternate" type="text/html" title="Weekly Brain Dump #39" /><published>2026-09-10T00:00:00+00:00</published><updated>2026-09-10T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/09/10/weekly-brain-dump-39</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/09/10/weekly-brain-dump-39.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#begrudgingly-agentic">Begrudgingly Agentic</a>
      </strong>
      I've been pushed to adopt agentic development
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="begrudgingly-agentic">Begrudgingly Agentic</h2>

<p>I had a weird coincidence happen that I’m kind of happy it did happen because if
it hadn’t I think my brain would have flipped and been a jerk.</p>

<p>I was dabbling with local LLMs trying out agentic programming because I have
heard so much about it and so many people claim it’s amazing. I felt I <em>must</em>
have been missing out on something. I did have some fun with it, “I’ve” built a
little personal assistant that uses a local LLM, it’s kind of alright but
definitely not a smooth experience.</p>

<p>The big coincidence though was about a week after I started this experiment I
got the news at work that I need to pick up Claude code and start using it “to
be more efficient”.</p>

<p>I think if it hadn’t been my choice to start playing with this style of
development my brain would have absolutely chucked a fit. There’s a chance I
would have just quit my job then and there.</p>

<p>Honestly, I get the appeal. Claude can absolutely smash out code and then it’s
just reviewing it. It really does remind me of when I was a team lead to a bunch
of enthusiastic juniors.</p>

<p>I can see how it’s addictive, when I started it was so magic. I just type “make
me feature X” and maybe an hour later it’d have it done for me, even if the code
was dog shit. I found myself poking my laptop until late in the night and when I
was away from home I was checking in over SSH on my phone. I’ve had to put a
hard limit on myself for when I stop touching my computer.</p>

<p>I think I’m getting the hang of Claude for work. It requires me being able
to explain what I want clearly, checking in regularly to confirm it’s not
looping or going down a rabbit hole, and thoroughly reviewing the code.</p>

<p>I think my best tip, would be to install <a href="https://github.com/dandavison/delta">git-delta</a> for reviewing code from the
terminal easily. This has helped me out quite a bit.</p>

<p>I still don’t love this “new world” of coding. I’m going to keep crafting code
by hand outside of work as I find it a lot of fun. I’m pretty tempted to take a
day off a month to do my own things and stream it. I need to even out the
feeling of betraying my ethics using these genuinely evil tools daily.</p>

<p>This has been more of a ramble than expected. If you read this, I’m sorry. It’s
a mess but I had to get it off my chest. It’s been a big part of my poor mental
health this past 2~ weeks.</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://socialwebfoundation.org/2026/09/04/static-activitypub-publishing/">Static ActivityPub Publishing</a>:
  </strong>
  Very cool, I want to learn more about ActivityPub.

</p>

<p>
  <strong>
    <a href="https://jellyfin.org/posts/jellyfin-release-12.0/">Jellyfin 12.0</a>:
  </strong>
  I love Jellyfin and I'm glad to see it hit a major milestone!

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Begrudgingly Agentic I've been pushed to adopt agentic development Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #38</title><link href="https://sean.taylormadetech.dev/2026/09/03/weekly-brain-dump-38.html" rel="alternate" type="text/html" title="Weekly Brain Dump #38" /><published>2026-09-03T00:00:00+00:00</published><updated>2026-09-03T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/09/03/weekly-brain-dump-38</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/09/03/weekly-brain-dump-38.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#agentic-development">Agentic Development</a>
      </strong>
      Sadly I must try this now
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="agentic-development">Agentic Development</h2>

<p>Work has had a large LLM push recently and I’ve been encouraged to try out this
tooling. Weirdly enough I must have had a gut feeling this was coming because I
had started dabbling with using <a href="https://opencode.ai/">OpenCode</a> withe <a href="https://huggingface.co/unsloth/gemma-4-26B-A4B-it-GGUF">Gemma 4 24B A4B</a>.</p>

<p>The local LLM and OpenCode setup was pretty nice, I like OpenCode as an
interface and after twiddling with my process I was managing to get some decent
outputs. I did find I had to stay ahead of it and understand the codebase to
help it navigate bugs and prevent churning tokens.</p>

<p>I completely see how addictive this can be and have found myself keeping my
laptop in arms reach when I’d normally be relaxing just so I can check its
output and kick off the next task. I’m probably going to have to enforce a hard
limit on when I use these tools to prevent burn out.</p>

<p>Work is pushing me to use <a href="https://claude.com/product/claude-code">Claude Code</a> and I’ve been dabbling with that
this afternoon and it’s bonkers how fast it is. I can absolutely see how you
would blow your leg off with a tool like this. Keeping on top of it and making
sure it’s doing the right thing and hasn’t veered off a cliff is going to be
hard.</p>

<p>I’m absolutely going to keep coding by hand outside of work once I feel
confident enough with these tools to do my job as “efficiently” as they want.
The hand crafting of beautiful code that’s maintainable is never going to be
able to be beaten as a rewarding hobby.</p>

<p>Needless to say I’m very ethically torn on all of this. I don’t like that these
tools have been trained on unethically sourced data and funnels money that could
have gone to the people who’s work it stole into the pockets of people making a
lot of money on completely unsustainable companies.</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://sarans.so/articles/how_jekyll_works">How Jekyll Works</a>:
  </strong>
  I never realised how small Jekyll is!

</p>

<p>
  <strong>
    <a href="https://people.kernel.org/monsieuricon/creepy-crawlies">Creepy crawlies</a>:
  </strong>
  It's awful how many resources are being spent stopping AI scrapers.

</p>

<p>
  <strong>
    <a href="https://four.htmx.org/announcements/2026-08-28-htmx-4.0.0-is-released">htmx 4.0.0 has been released!</a>:
  </strong>
  I've used and like HTMX, it's good to see it finally get a major bump.

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Agentic Development Sadly I must try this now Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #37</title><link href="https://sean.taylormadetech.dev/2026/08/27/weekly-brain-dump-37.html" rel="alternate" type="text/html" title="Weekly Brain Dump #37" /><published>2026-08-27T00:00:00+00:00</published><updated>2026-08-27T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/08/27/weekly-brain-dump-37</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/08/27/weekly-brain-dump-37.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#mental-health-update">Mental Health Update</a>
      </strong>
      Things are still hard but getting better
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="mental-health-update">Mental Health Update</h2>

<p>I figured I’d post this as there has been nearly zero programming or technical
things happening in my life. At least nothing serious and worth mentioning here.
I am planning to do more Taylor work when I get time and energy again. I really
want to get v0.5.0 out the door as I think it could be a major turning point for
the engine.</p>

<p>More importantly, I am looking after my mental health and doing my best to get
through this hard time. I’m deliberately conserving my energy and taking it easy
on hobbies. I’ve mostly been playing games and watching TV to keep my well full.</p>

<p>I appreciate everyone being understanding and I’m excited to get back to doing
more technical blogs and projects again!</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://francisssssssss.gay/articles/barksumipsum.php">barksum ipsum</a>:
  </strong>
  A more fun lorem ipsum for the animal brained developer

</p>

<p>
  <strong>
    <a href="https://godotengine.org/article/fixing-high-polling-rate-mice-on-windows/">Fixing high polling rate mice on Windows in Godot</a>:
  </strong>
  Windows legacy rears it's head.

</p>

<p>
  <strong>
    <a href="https://blog.joinmastodon.org/2026/08/5.0-laying-the-foundation/">5.0: Laying the foundation</a>:
  </strong>
  Big design changes for Mastodon 5.0.

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Mental Health Update Things are still hard but getting better Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #36</title><link href="https://sean.taylormadetech.dev/2026/08/20/weekly-brain-dump-36.html" rel="alternate" type="text/html" title="Weekly Brain Dump #36" /><published>2026-08-20T00:00:00+00:00</published><updated>2026-08-20T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/08/20/weekly-brain-dump-36</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/08/20/weekly-brain-dump-36.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#building-a-twitch-bot-in-opal">Building a Twitch Bot in Opal</a>
      </strong>
      I started the widget I've been building towards for a while now
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="building-a-twitch-bot-in-opal">Building a Twitch Bot in Opal</h2>

<p>The whole point of my Ruby on the frontend journey has been to work towards
building this specific widget. I want to learn how to build Twitch chat bots so
that I can build a little task tracker for my wife.</p>

<p>So far getting a connection and being able to join a channel has been
surprisingly easy. I didn’t expect that out of something owned by Amazon. That’s
really all I’ve had the chance for this week as it’s been hectic here.</p>

<p>Here’s the basic class I threw together to get it working and joining my
channel. It still needs to do any level of message parsing and responding to
events, but its surprisingly simple!</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="nn">Twitch</span>
  <span class="k">class</span> <span class="nc">Client</span>
    <span class="nb">attr_reader</span> <span class="ss">:socket</span>
    <span class="k">def</span> <span class="nf">initialize</span>
      <span class="vi">@auth_token</span> <span class="o">=</span> <span class="s2">"$YOUR_AUTH_TOKEN"</span>
      <span class="vi">@username</span> <span class="o">=</span> <span class="s2">"hell_rok"</span>
      <span class="vi">@channel</span> <span class="o">=</span> <span class="s2">"#hell_rok"</span>
    <span class="k">end</span>

    <span class="k">def</span> <span class="nf">start</span>
      <span class="no">Browser</span><span class="o">::</span><span class="no">Socket</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s2">"wss://irc-ws.chat.twitch.tv:443"</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">socket</span><span class="o">|</span>
        <span class="vi">@socket</span> <span class="o">=</span> <span class="n">socket</span>
        <span class="n">socket</span><span class="p">.</span><span class="nf">on</span> <span class="ss">:open</span> <span class="k">do</span>
          <span class="n">login</span>
        <span class="k">end</span>

        <span class="n">socket</span><span class="p">.</span><span class="nf">on</span> <span class="ss">:message</span> <span class="k">do</span> <span class="o">|</span><span class="n">event</span><span class="o">|</span>
          <span class="n">messages</span> <span class="o">=</span> <span class="no">Message</span><span class="p">.</span><span class="nf">from_event</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
          <span class="nb">puts</span> <span class="s2">"== EVENT =="</span>
          <span class="nb">puts</span> <span class="n">messages</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:message</span><span class="p">)</span>
        <span class="k">end</span>
      <span class="k">end</span>
    <span class="k">end</span>

    <span class="k">def</span> <span class="nf">login</span>
      <span class="n">socket</span><span class="p">.</span><span class="nf">puts</span><span class="p">(</span><span class="s2">"CAP REQ :twitch.tv/tags twitch.tv/commands"</span><span class="p">);</span>
      <span class="n">socket</span><span class="p">.</span><span class="nf">puts</span><span class="p">(</span><span class="s2">"PASS oauth:</span><span class="si">#{</span><span class="vi">@auth_token</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
      <span class="n">socket</span><span class="p">.</span><span class="nf">puts</span><span class="p">(</span><span class="s2">"NICK </span><span class="si">#{</span><span class="vi">@username</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
      <span class="n">socket</span><span class="p">.</span><span class="nf">puts</span><span class="p">(</span><span class="s2">"JOIN </span><span class="si">#{</span><span class="vi">@channel</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="k">class</span> <span class="nc">Message</span>
    <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">from_event</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
      <span class="nb">puts</span> <span class="s2">"-- FROM EVENT --"</span>
      <span class="n">event</span><span class="p">.</span><span class="nf">data</span><span class="p">.</span><span class="nf">lines</span><span class="p">.</span><span class="nf">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">message</span><span class="o">|</span>
        <span class="n">new</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
      <span class="k">end</span>
    <span class="k">end</span>

    <span class="nb">attr_reader</span> <span class="ss">:message</span>
    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
      <span class="vi">@message</span> <span class="o">=</span> <span class="n">message</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://www.youtube.com/watch?v=vZkAbeMLcvc">You can create any game mechanic once you understand this</a>:
  </strong>
  A great introduction into thinking about designing using a framework.

</p>

<p>
  <strong>
    <a href="https://blog.ayom.media/ideiasdechirico/offpunk-manifesto">Offpunk Manifesto</a>:
  </strong>
  A great decsription of what Offpunk is.

</p>

<p>
  <strong>
    <a href="https://retrorgb.com/2-player-legend-of-zelda-romhack.html">2-Player Legend of Zelda Romhack</a>:
  </strong>
  Someone modded the original Legend of Zelda to be multiplayer.

</p>

<p>
  <strong>
    <a href="https://daniel.haxx.se/blog/2026/08/17/theres-a-libcurl-dll-in-my-system32/">There’s a libcurl.dll in my system32</a>:
  </strong>
  A funny little story.

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Building a Twitch Bot in Opal I started the widget I've been building towards for a while now Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #35</title><link href="https://sean.taylormadetech.dev/2026/08/13/weekly-brain-dump-35.html" rel="alternate" type="text/html" title="Weekly Brain Dump #35" /><published>2026-08-13T00:00:00+00:00</published><updated>2026-08-13T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/08/13/weekly-brain-dump-35</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/08/13/weekly-brain-dump-35.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#ruby-on-the-frontend">Ruby on the Frontend</a>
      </strong>
      My Opal experiment continues
    </li>
  
    <li>
      <strong>
        <a href="#new-handheld-console">New Handheld Console</a>
      </strong>
      I ordered myself a little treat
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="ruby-on-the-frontend">Ruby on the Frontend</h2>

<p>This experiment is still going on. Now that I’m leaning into setting up testing
I’m definitely feeling the pain of the Ruby/JavaScript barrier. Particularly
with promises or trying to delay a test check until a redraw.</p>

<p>I wrote this beautiful bit of hackery to let me wait for a check to be <code class="language-plaintext highlighter-rouge">true</code>
before executing a block of Ruby code.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">window</span><span class="p">.</span><span class="nx">wait_for</span> <span class="o">=</span> <span class="p">(</span><span class="nx">block</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="k">return</span> <span class="k">new</span> <span class="nc">Promise</span><span class="p">((</span><span class="nx">resolve</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="k">if </span><span class="p">(</span><span class="nf">block</span><span class="p">())</span> <span class="p">{</span>
      <span class="nf">resolve</span><span class="p">();</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
      <span class="nf">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="nb">window</span><span class="p">.</span><span class="nf">wait_for</span><span class="p">(</span><span class="nx">block</span><span class="p">).</span><span class="nf">then</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
          <span class="nf">resolve</span><span class="p">();</span>
        <span class="p">});</span>
      <span class="p">},</span> <span class="mi">10</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">});</span>
<span class="p">};</span>
</code></pre></div></div>

<p>This has allowed me to write a test that waits for data to load after a promise
is resolved like such.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">QUnit</span><span class="p">.</span><span class="nf">module</span> <span class="s2">"Notes"</span> <span class="k">do</span>
  <span class="n">context</span> <span class="s2">"Index"</span> <span class="k">do</span>
    <span class="nb">test</span> <span class="s2">"has Controls shown by default"</span> <span class="k">do</span>
      <span class="n">mount</span> <span class="ss">:Notes_Index</span>

      <span class="n">assert_equal</span><span class="p">(</span>
        <span class="s2">"Controls"</span><span class="p">,</span>
        <span class="no">Fragment</span><span class="o">::</span><span class="no">Notes</span><span class="o">::</span><span class="no">Index</span><span class="p">.</span><span class="nf">panel</span><span class="p">.</span><span class="nf">tabs</span><span class="p">.</span><span class="nf">active</span><span class="p">,</span>
        <span class="s2">"starts with controls active"</span>
      <span class="p">)</span>

      <span class="n">wait_for</span> <span class="k">do</span>
        <span class="no">Fragment</span><span class="o">::</span><span class="no">Notes</span><span class="o">::</span><span class="no">Form</span><span class="p">.</span><span class="nf">active</span> <span class="o">==</span> <span class="s2">"Controls"</span>
      <span class="k">end</span><span class="p">.</span><span class="nf">then</span> <span class="k">do</span>
        <span class="n">assert_equal</span><span class="p">(</span>
          <span class="s2">"Controls"</span><span class="p">,</span>
          <span class="no">Fragment</span><span class="o">::</span><span class="no">Notes</span><span class="o">::</span><span class="no">Form</span><span class="p">.</span><span class="nf">active</span><span class="p">,</span>
          <span class="s2">"Controls are active"</span>
        <span class="p">)</span>
      <span class="k">end</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<p>My current battle is getting stubbing or mocking to work correctly. I’m not sure
I’ll get it working well and am super close to just switching to Rspec/Capybara
and skipping testing in the browser. I want to fight it out though as I feel
unit testing is pretty useful here and helps me write cleaner code.</p>

<h2 id="new-handheld-console">New Handheld Console</h2>

<p>I ordered myself an <a href="https://anbernic.com/en-au/products/rg-cubexx">Anbernic RG CubeXX</a> as a reward for getting through
this tough couple of months. I’m very excited by this as I love my RG35XX but
was disappointed at how impossible it was to port Taylor to it due to locked
down hardware. I have the original so it’s not based on the H700 chipset so it
doesn’t have WiFi or accessible GPU acceleration.</p>

<p>I am keen to try and port Taylor to it so I can build games to run on the RG
CubeXX. Something about that just gets me excited and want to develop games
again. I’m also tempted to try and get a basic desktop Linux running on it as I
think that would be quite funny.</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://phoboslab.org/log/2026/08/xibalba64-making-of">How to Make a Nintendo 64 Game in 2026</a>:
  </strong>
  I had no idea Nintendo64 homebrew had come so far.

</p>

<p>
  <strong>
    <a href="https://byroot.github.io/ruby/performance/2026/08/05/shrinking-ruby-hashes.html">Shrinking Ruby Hashes</a>:
  </strong>
  Nothing quite like a deep dive on a niche Ruby topic.

</p>

<p>
  <strong>
    <a href="https://thoughtbot.com/blog/modeling-state-transitions-in-postgres">Modeling State Transitions in Postgres</a>:
  </strong>
  Diving into how to efficiently keep a status in a different table.

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Ruby on the Frontend My Opal experiment continues New Handheld Console I ordered myself a little treat Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #34</title><link href="https://sean.taylormadetech.dev/2026/08/06/weekly-brain-dump-34.html" rel="alternate" type="text/html" title="Weekly Brain Dump #34" /><published>2026-08-06T00:00:00+00:00</published><updated>2026-08-06T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/08/06/weekly-brain-dump-34</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/08/06/weekly-brain-dump-34.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#replace-javascript-with-ruby">Replace JavaScript with Ruby</a>
      </strong>
      I continue my madness of using Ruby in the browser
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="replace-javascript-with-ruby">Replace JavaScript with Ruby</h2>

<p>I’ve spent the little time I’ve had spare this past week fiddling with this
project and have made surprising progress!</p>

<p>Using <a href="https://opalrb.com/">OpalRB</a>, <a href="https://mithril.js.org/">Mithril</a>, and <a href="https://bulma.io/">Bulma</a> I have built an extremely nice way to
build interactive browser applications. The payload is a little heavy off the
bat but I feel the improved developer experience is worth it for what I’m doing,
which is mostly distributing desktop applications where the penalty for larger
files is greatly reduced.</p>

<p>I’m currently making this a gem and giving a serious test by implementing a real
project using it. I’m creating more widgets for my writing streamer widget pack.
I’ve only just got it to the point where I’m seriously implementing something
but so far I’m excited. The following is the code for the <code class="language-plaintext highlighter-rouge">Counter</code>
components you see below.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Mithril</span><span class="o">::</span><span class="no">Component</span><span class="p">.</span><span class="nf">define</span><span class="p">(</span><span class="ss">:Counter</span><span class="p">)</span> <span class="k">do</span>
  <span class="n">oninit</span> <span class="k">do</span>
    <span class="n">state</span><span class="p">[</span><span class="ss">:count</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
  <span class="k">end</span>

  <span class="n">view</span> <span class="k">do</span>
    <span class="n">nav</span><span class="p">(</span><span class="ss">class: </span><span class="s2">"card"</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">header</span><span class="p">(</span><span class="ss">class: </span><span class="s2">"card-header"</span><span class="p">)</span> <span class="p">{</span>
        <span class="nb">p</span><span class="p">(</span><span class="ss">class: </span><span class="s2">"card-header-title"</span><span class="p">)</span> <span class="p">{</span>
          <span class="n">plain</span> <span class="s2">"Counter"</span>
        <span class="p">}</span>
      <span class="p">}</span>
      <span class="n">div</span><span class="p">(</span><span class="ss">class: </span><span class="s2">"card-content"</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">div</span><span class="p">(</span><span class="ss">class: </span><span class="s2">"block"</span><span class="p">)</span> <span class="p">{</span>
          <span class="n">plain</span> <span class="s2">"Current count: </span><span class="si">#{</span><span class="n">state</span><span class="p">[</span><span class="ss">:count</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
        <span class="p">}</span>
      <span class="p">}</span>

      <span class="n">div</span><span class="p">(</span><span class="ss">class: </span><span class="s2">"card-footer"</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">a</span><span class="p">(</span>
          <span class="ss">class: </span><span class="s2">"card-footer-item"</span><span class="p">,</span>
          <span class="ss">onclick: </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">e</span><span class="o">.</span><span class="no">JS</span><span class="p">.</span><span class="nf">preventDefault</span>
            <span class="n">state</span><span class="p">[</span><span class="ss">:count</span><span class="p">]</span> <span class="o">-=</span> <span class="mi">1</span>
          <span class="p">},</span>
          <span class="ss">href: </span><span class="s2">"#"</span>
        <span class="p">)</span> <span class="p">{</span> <span class="n">plain</span> <span class="s2">"-"</span> <span class="p">}</span>

        <span class="n">a</span><span class="p">(</span>
          <span class="ss">class: </span><span class="s2">"card-footer-item"</span><span class="p">,</span>
          <span class="ss">onclick: </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">e</span><span class="o">.</span><span class="no">JS</span><span class="p">.</span><span class="nf">preventDefault</span>
            <span class="n">state</span><span class="p">[</span><span class="ss">:count</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
          <span class="p">},</span>
          <span class="ss">href: </span><span class="s2">"#"</span>
        <span class="p">)</span> <span class="p">{</span> <span class="n">plain</span> <span class="s2">"Reset"</span> <span class="p">}</span>

        <span class="n">a</span><span class="p">(</span>
          <span class="ss">class: </span><span class="s2">"card-footer-item"</span><span class="p">,</span>
          <span class="ss">onclick: </span><span class="o">-&gt;</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">e</span><span class="o">.</span><span class="no">JS</span><span class="p">.</span><span class="nf">preventDefault</span>
            <span class="n">state</span><span class="p">[</span><span class="ss">:count</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
          <span class="p">},</span>
          <span class="ss">href: </span><span class="s2">"#"</span>
        <span class="p">)</span> <span class="p">{</span> <span class="n">plain</span> <span class="s2">"+"</span> <span class="p">}</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<div class="post--embed">
  <iframe style="width: 450px; height: 400px;" src="/data/weekly-brain-dump-34/index.html"></iframe>
</div>

<p>Needless to say I’m very excited by this and it has kept programming fun during
some hard times. If nothing else I think that’s incredibly valuable. I’ll
release the code at some point for the gem I’m building but that probably won’t
be for a while.</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://hisham.hm/2026/08/04/the-lua-community-needs-to-learn-to-move-on/">The Lua community needs to learn to move on</a>:
  </strong>
  It's crazy that people keep relying on such old versions and expecting
support.

</p>

<p>
  <strong>
    <a href="https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/">Defeating Nondeterminism in LLM Inference</a>:
  </strong>
  This contained lots of things I didn't know about how computers deal with
floating point numbers.

</p>

<p>
  <strong>
    <a href="https://blog.rust-lang.org/inside-rust/2026/08/05/rust-langrust-is-adopting-an-llm-policy/">rust-lang/rust is adopting an LLM policy</a>:
  </strong>
  Quite a good policy on LLMs by the rust team, it basically boils down to "Humans need to understand the code, no exceptions"

</p>

<p>
  <strong>
    <a href="https://cgicoffee.com/blog/2026/04/tcl-tk-develop-cross-platform-cli-gui-tools-tutorial-guide">Develop Cross-Platform CLI and GUI Tools With Tcl/Tk. Powerful, Event-Driven, Open-Source And Future-Proof Toolkit… From the Past?!</a>:
  </strong>
  I had no idea Tcl/Tk was so powerful and still actively maintained.

</p>

<p>
  <strong>
    <a href="https://island94.org/2026/07/running-code-when-the-ruby-on-rails-webserver-boots">Running code when the Ruby on Rails webserver boots</a>:
  </strong>
  Surprisingly trickier than you'd think.

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance Replace JavaScript with Ruby I continue my madness of using Ruby in the browser Interesting Links Cool things I found this week Comments]]></summary></entry><entry><title type="html">Weekly Brain Dump #33</title><link href="https://sean.taylormadetech.dev/2026/07/30/weekly-brain-dump-33.html" rel="alternate" type="text/html" title="Weekly Brain Dump #33" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sean.taylormadetech.dev/2026/07/30/weekly-brain-dump-33</id><content type="html" xml:base="https://sean.taylormadetech.dev/2026/07/30/weekly-brain-dump-33.html"><![CDATA[<h2>At a Glance</h2>

<ul>
  
    <li>
      <strong>
        <a href="#my-mental-health">My Mental Health</a>
      </strong>
      Things have been rough, but I'm doing alright
    </li>
  
    <li>
      <strong>
        <a href="#interesting-links">Interesting Links</a>
      </strong>
      Cool things I found this week
    </li>
  

  <li>
    <strong>
      <a href="#comments">Comments</a>
    </strong>
  </li>
</ul>

<h2 id="my-mental-health">My Mental Health</h2>

<p>Only a small blog post this week because life has been coming at me hard for a
while now. I’m going to keep things vague here for privacy reasons but I am safe
and doing my best to maintain my mental health through a very trying time.</p>

<p>I’m hoping to put out a blog post soon about Ruby in the browser as my post last
week made me do a bit more diving on the topic and I’ve made some interesting
progress, so stay tuned for that~</p>

<h2 id="interesting-links">Interesting Links</h2>

<p>
  <strong>
    <a href="https://hyperbo.la/w/winding-down-artichoke-ruby/">Winding Down Artichoke Ruby</a>:
  </strong>
  Always sad to see a project wind down, but completely understandable
reasons for it.

</p>

<p>
  <strong>
    <a href="https://jonathan-frere.com/posts/reactivity-algorithms/">Pushing and Pulling: Three Reactivity Algorithms</a>:
  </strong>
  I've always wondered how to effectively do this.

</p>

<p>
  <strong>
    <a href="https://po-ru.com/2026/07/29/it-doesnt-matter-whether-matz-is-nice">It doesn’t matter whether “Matz is nice”</a>:
  </strong>
  This is something I mull on a lot, I still don't know what the reasonable
answer is for me.

</p>

<p><a href="/interesting_links_archive/">
  Archive of interesting links
</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[At a Glance My Mental Health Things have been rough, but I'm doing alright Interesting Links Cool things I found this week Comments]]></summary></entry></feed>