<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ShiftLeft AI</title>
    <link>https://www.shiftleftai.dev/</link>
    <description>Recent content on ShiftLeft AI</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>ShiftLeft AI</copyright>
    <lastBuildDate>Sun, 14 Jun 2026 08:52:06 -0400</lastBuildDate>
    <atom:link href="https://www.shiftleftai.dev/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Adventures in Go and HTMX - Part 5</title>
      <link>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-5/</link>
      <pubDate>Sun, 14 Jun 2026 08:52:06 -0400</pubDate>
      <guid>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-5/</guid>
      <description>&lt;h1 id=&#34;the-sword-and-shield&#34;&gt;The Sword and Shield&lt;/h1&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve looted the dungeon. You&amp;rsquo;ve got a backpack full of mysterious objects. And now, deep in the atrium, you spot it:&lt;/p&gt;&#xA;&lt;p&gt;A sword.&lt;/p&gt;&#xA;&lt;p&gt;Not a letter opener. Not a decorative butter knife. A sword.&lt;/p&gt;&#xA;&lt;p&gt;So you take it&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip;and then you remember something somewhat embarrassing about our game.&lt;/p&gt;&#xA;&lt;p&gt;We don&amp;rsquo;t have an Equip button yet.&lt;/p&gt;&#xA;&lt;p&gt;Right now, our game can collect loot, but can&amp;rsquo;t actually use it. Which is a bit like running a restaurant where the chef is allowed to buy ingredients but not allowed to turn on the stove.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adventures in Go and HTMX - Part 4</title>
      <link>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-4/</link>
      <pubDate>Fri, 05 Jun 2026 08:52:06 -0400</pubDate>
      <guid>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-4/</guid>
      <description>&lt;h1 id=&#34;the-backpack&#34;&gt;The Backpack&lt;/h1&gt;&#xA;&lt;p&gt;You step into the hallway, eyes adjusted to the dim light, and there it is.&lt;/p&gt;&#xA;&lt;p&gt;A brass lamp. Just sitting there. Practically begging you to become the kind of adventurer who owns a brass lamp.&lt;/p&gt;&#xA;&lt;p&gt;And then you remember that our hero has no pockets!&lt;/p&gt;&#xA;&lt;p&gt;Right now our game can move between rooms and talk back via commands, but it can&amp;rsquo;t do the most emotionally important thing in any adventure: collect mildly suspicious objects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adventures in Go and HTMX - Part 3</title>
      <link>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-3/</link>
      <pubDate>Sun, 31 May 2026 08:52:06 -0400</pubDate>
      <guid>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-3/</guid>
      <description>&lt;h1 id=&#34;forms-resets--transitions&#34;&gt;Forms, Resets, &amp;amp; Transitions&lt;/h1&gt;&#xA;&lt;p&gt;In the first two articles of this series we taught our game world how to exist (Go server + templates) and how to move (boosted navigation).&lt;/p&gt;&#xA;&lt;p&gt;But a text adventure without text commands is like a wizard without a spellbook! Sure, you can still walk around, but you can&amp;rsquo;t do anything. You can&amp;rsquo;t &amp;ldquo;look.&amp;rdquo; You can&amp;rsquo;t &amp;ldquo;wait.&amp;rdquo; You can&amp;rsquo;t ask for &amp;ldquo;help.&amp;rdquo; The world is there&amp;hellip; and you&amp;rsquo;re basically just sightseeing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adventures in Go and HTMX - Part 2</title>
      <link>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-2/</link>
      <pubDate>Fri, 22 May 2026 08:52:06 -0400</pubDate>
      <guid>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-2/</guid>
      <description>&lt;h1 id=&#34;introduction---boosting&#34;&gt;Introduction - Boosting&lt;/h1&gt;&#xA;&lt;p&gt;In Part 1 of this series we intentionally built the game using the most boring navigation primitive on the web: plain old anchor tags. When the player clicks &amp;ldquo;Go North,&amp;rdquo; the browser performs a full navigation. It tears down the current document, requests &lt;code&gt;/room/atrium&lt;/code&gt;, downloads a complete HTML page, parses it, rebuilds the DOM, re-evaluates styles, and only then shows the next room. That &amp;ldquo;hard navigation&amp;rdquo; is robust and simple and it&amp;rsquo;s also why MPAs (Multi Page Applications) can feel heavy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adventures in Go and HTMX - Part 1</title>
      <link>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-1/</link>
      <pubDate>Sat, 16 May 2026 13:58:06 -0400</pubDate>
      <guid>https://www.shiftleftai.dev/posts/adventures-in-go-htmx-1/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;If you are a Go developer, you have probably felt the gravitational pull of the JavaScript ecosystem. You want to build a web application, and suddenly you are reading about React, Next.js, Vite, TypeScript, state management libraries, client-side routers, and build pipelines that have more configuration files than your entire Go project. You just wanted to show some data on a page.&lt;/p&gt;&#xA;&lt;p&gt;There is another way.&lt;/p&gt;&#xA;&lt;p&gt;HTMX is a small JavaScript library that lets you build dynamic, interactive web applications by extending HTML with a handful of attributes. Instead of writing JavaScript to fetch data and manipulate the DOM, you add &lt;code&gt;hx-get&lt;/code&gt;, &lt;code&gt;hx-post&lt;/code&gt;, &lt;code&gt;hx-swap&lt;/code&gt;, and &lt;code&gt;hx-trigger&lt;/code&gt; to your HTML elements, and the server returns HTML fragments that HTMX swaps into the page. There is no need for a separate project, your Go server renders the HTML, and HTMX makes it interactive.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Build Your First Voice Agent</title>
      <link>https://www.shiftleftai.dev/posts/voice-agents/</link>
      <pubDate>Sat, 09 May 2026 13:58:06 -0400</pubDate>
      <guid>https://www.shiftleftai.dev/posts/voice-agents/</guid>
      <description>&lt;h1 id=&#34;voice-agents&#34;&gt;Voice Agents&lt;/h1&gt;&#xA;&lt;p&gt;Lately there has been a lot of talk about AI voice agents, and given how good models have gotten at text-to-speech and speech-to-text, that is not really a surprise. A whole ecosystem of platforms and tools has popped up to support these workflows.&lt;/p&gt;&#xA;&lt;p&gt;Recently I was watching Twilio Summit 2026, and the voice demos were genuinely fantastic. They made me curious about exactly how this technology works and what it actually takes to put one of these agents together. As much as I liked Twilio&amp;rsquo;s platform, I am the kind of person who prefers to do things the hard way, mostly because I want to understand how the pieces fit together. So I decided to build a voice agent myself and see how hard it is to construct end to end experience and what the tech stack looks like.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
