<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Geoff Corey&#39;s Blog</title>
    <link>https://blog.geoffcorey.com/</link>
    <description>Recent content on Geoff Corey&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Wed, 22 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.geoffcorey.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Missile Command coded by Qwen 3.6 with Claude CLI using the local LLM</title>
      <link>https://blog.geoffcorey.com/posts/missile-command-qwen3.6-claude/</link>
      <pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/missile-command-qwen3.6-claude/</guid>
      <description>&lt;p&gt;I wanted to try pointing Claude CLI to a local LLM and see how well it would
work. My machine is running linux EndevourOS has the following specs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Monitor     3840x2160 in 27&amp;#34;, 60 Hz [External]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Monitor     3840x2160 in 32&amp;#34;, 60 Hz [External]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CPU         12th Gen Intel(R) Core(TM) i9-12900KF @5.20 GHz 52.0°C
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GPU         AMD Radeon RX 9070 - 48.0°C [Discrete]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;G Driver    amdgpu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Vulkan      1.4.335 - radv [Mesa 26.0.5-arch1.1]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Motherboard PRIME Z690M-PLUS D4 (Rev 1.xx)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Bios        3811 (38.11)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RAM         ●●●● 23.94 GiB / 62.60 GiB (38%)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I use llama-cpp to run the model locally. During this experiment I kept
hitting the context limit. I bumped it pretty high but then again, I have
plenty of memory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrating from Ghost to Hugo using Claude</title>
      <link>https://blog.geoffcorey.com/posts/migrating-from-ghost-to-hugo-using-claude/</link>
      <pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/migrating-from-ghost-to-hugo-using-claude/</guid>
      <description>&lt;p&gt;Decided to move my blogs from Ghost to using Hugo and generate a static website
for the content. The reason for this was I don&amp;rsquo;t use all the fancy features of
Ghost. I don&amp;rsquo;t do newsletters and Ghost requires an email account if people
want to sign up for notifications. Plus I have to run a database for the content.&lt;/p&gt;
&lt;p&gt;I started with creating an new directory and fired up Claude and started with
this initial prompt.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Coding with Claude AI</title>
      <link>https://blog.geoffcorey.com/posts/coding-with-claude-ai/</link>
      <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/coding-with-claude-ai/</guid>
      <description>&lt;p&gt;So I wanted to see what AI coding can do and started claude with /plan&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Make a clone of Bejeweled game to run on Linux&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It laid out the requirements, made a to-do list and suggested Rust + bevy for the implementation. I agreed. It asked would you like me to build it and off we go.&lt;/p&gt;
&lt;p&gt;Initial commit didn&amp;rsquo;t have tests, executed but the grid for the gems was offset. I looked at the code and figure the something was a miss with the layout and asked Claude&lt;/p&gt;</description>
    </item>
    <item>
      <title>LazyVim setup for NeoTest and Native Node.js Test Runner</title>
      <link>https://blog.geoffcorey.com/posts/lazyvim-setup-for-neotest-and-native-nodejs-test-runner/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/lazyvim-setup-for-neotest-and-native-nodejs-test-runner/</guid>
      <description>&lt;p&gt;The simplest and most effective approach involves using the devastion/neotest-node plugin. Create a configuration file at &lt;code&gt;~/.config/nvim/lua/plugins/neotest-node.lua&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nvim-neotest/neotest&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  dependencies &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nvim-neotest/nvim-nio&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nvim-lua/plenary.nvim&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nvim-treesitter/nvim-treesitter&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;devastion/neotest-node&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  config &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    require(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;neotest&amp;#34;&lt;/span&gt;).setup({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      adapters &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        require(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;neotest-node&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The configuration specifies neotest as the core framework with neotest-node as the adapter for Node.js test execution. All required dependencies are declared and initialized during plugin setup.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini Coding</title>
      <link>https://blog.geoffcorey.com/posts/gemini-coding/</link>
      <pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/gemini-coding/</guid>
      <description>&lt;p&gt;Continue to play with various AI&amp;rsquo;s and how to use them in code generation. Next up is Gemini. I installed gemini-cli and setup an API key on Google along with a billing account and limit. See &lt;a href=&#34;https://aistudio.google.com&#34;&gt;https://aistudio.google.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next I decided to try something that isn&amp;rsquo;t common (to-do, note taking, etc) and build a Texas Holdem Poker API server. I wasn&amp;rsquo;t sure the best way to write prompts and have been reading some books on the matter. I decided to ask Proton&amp;rsquo;s Lumo AI with the prompt, &amp;ldquo;help me write a prompt to build the API for a texas holdem poker game&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>LazyVim setup for NeoTest and Jest</title>
      <link>https://blog.geoffcorey.com/posts/lazyvim-setup-for-neotest-and-jest/</link>
      <pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/lazyvim-setup-for-neotest-and-jest/</guid>
      <description>&lt;p&gt;The setup involves creating a plugin configuration file that leverages the neotest-jest adapter. Save the following to &lt;code&gt;.config/nvim/lua/plugins/neotest-jest.lua&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;haydenmeade/neotest-jest&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nvim-neotest/neotest&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    dependencies &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;haydenmeade/neotest-jest&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    opts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(_, opts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      table.insert(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        opts.adapters,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        require(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;neotest-jest&amp;#34;&lt;/span&gt;)({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          jestCommand &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;npm test --&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          jestConfigFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;jest.config.js&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          cwd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; vim.fn.getcwd()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;key-components&#34;&gt;Key Components&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Plugin Dependencies&lt;/strong&gt;: The configuration specifies neotest-jest as a dependency for the main neotest plugin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jest Command&lt;/strong&gt;: Configured to use &lt;code&gt;&amp;quot;npm test --&amp;quot;&lt;/code&gt; as the execution command&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Config File Reference&lt;/strong&gt;: Points to &lt;code&gt;jest.config.js&lt;/code&gt; for test configuration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Working Directory&lt;/strong&gt;: Dynamically retrieves the current vim working directory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;related-content&#34;&gt;Related Content&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.geoffcorey.com/posts/lazyvim-setup-for-neotest-and-native-nodejs-test-runner/&#34;&gt;Native Node.js test runner integration with NeoTest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.geoffcorey.com/posts/gemini-coding/&#34;&gt;Gemini AI coding experiments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.geoffcorey.com/posts/neovim-ai-coding-assistant-w-avante/&#34;&gt;NeoVim AI coding assistance using Avante&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.geoffcorey.com/posts/coding-with-claude-ai/&#34;&gt;Claude AI coding collaboration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>NeoVim AI Coding Assistant w/Avante</title>
      <link>https://blog.geoffcorey.com/posts/neovim-ai-coding-assistant-w-avante/</link>
      <pubDate>Sun, 14 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/neovim-ai-coding-assistant-w-avante/</guid>
      <description>&lt;h2 id=&#34;initial-setup--claude-integration&#34;&gt;Initial Setup &amp;amp; Claude Integration&lt;/h2&gt;
&lt;p&gt;The author explored integrated AI coding assistance within NeoVim using Avante, recognizing that vague prompts produce problematic outputs. After testing Gemini 3&amp;rsquo;s limitations with broad requirements, they configured Avante with claude-sonnet-4-20250514.&lt;/p&gt;
&lt;p&gt;When tasked with generating tests for a registration route, the assistant &amp;ldquo;created a task list of 8 things to plow through and chugged on that for 5 minutes.&amp;rdquo; Test generation cost approximately $1.04. The assistant also refactored monolithic code, separating functionality into distinct files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AMDGPU Ring Timeout / Minecraft Workaround Using Mesa Zink</title>
      <link>https://blog.geoffcorey.com/posts/amdgpu-ring-timeout-minecraft-workaround-using-mesa-zink/</link>
      <pubDate>Tue, 23 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/amdgpu-ring-timeout-minecraft-workaround-using-mesa-zink/</guid>
      <description>&lt;h2 id=&#34;main-problem--solution&#34;&gt;Main Problem &amp;amp; Solution&lt;/h2&gt;
&lt;p&gt;The author describes encountering AMDGPU ring timeout issues with Minecraft on an AMD Radeon RX 6700 system. Rather than modifying kernel parameters, the solution involves leveraging Mesa&amp;rsquo;s Zink driver—a compatibility layer translating OpenGL calls to Vulkan.&lt;/p&gt;
&lt;h2 id=&#34;hardware-configuration&#34;&gt;Hardware Configuration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU:&lt;/strong&gt; Intel Core i5-12400F&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPU:&lt;/strong&gt; AMD Radeon RX 6700 (Navi 22, RDNA-2)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OS:&lt;/strong&gt; EndeavourOS (Arch-based distribution)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desktop:&lt;/strong&gt; KDE Plasma (initially), later tested Cosmic and Hyprland&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Display:&lt;/strong&gt; Dual 4K monitors with Freesync support&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;initial-setup&#34;&gt;Initial Setup&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Required packages:&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>LazyVim &#43; neotest-mocha and overcoming &#34;No test found&#34;</title>
      <link>https://blog.geoffcorey.com/posts/lazyvim-neotest-mocha-and-overcoming-no-test-found/</link>
      <pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/lazyvim-neotest-mocha-and-overcoming-no-test-found/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The author transitioned from AstroVim to LazyVim and configured neotest-mocha for test running in NeoVim. The setup required careful attention to file discovery patterns.&lt;/p&gt;
&lt;h2 id=&#34;installation-steps&#34;&gt;Installation Steps&lt;/h2&gt;
&lt;h3 id=&#34;mason-tools-installed&#34;&gt;Mason Tools Installed&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;bash-language-server&lt;/li&gt;
&lt;li&gt;eslint_d&lt;/li&gt;
&lt;li&gt;gitui&lt;/li&gt;
&lt;li&gt;js-debug-adapter&lt;/li&gt;
&lt;li&gt;lua-language-server&lt;/li&gt;
&lt;li&gt;marksman&lt;/li&gt;
&lt;li&gt;prettierd&lt;/li&gt;
&lt;li&gt;shellcheck, shfmt&lt;/li&gt;
&lt;li&gt;sqlfluff&lt;/li&gt;
&lt;li&gt;stylua&lt;/li&gt;
&lt;li&gt;typescript-language-server&lt;/li&gt;
&lt;li&gt;vtsls&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;lazy-extras-loaded&#34;&gt;Lazy Extras Loaded&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;dap.core, dap.nlua&lt;/li&gt;
&lt;li&gt;editor.inc-rename, editor.neo-tree&lt;/li&gt;
&lt;li&gt;formatting.prettier&lt;/li&gt;
&lt;li&gt;linting.eslint&lt;/li&gt;
&lt;li&gt;lsp.none-ls&lt;/li&gt;
&lt;li&gt;test.core&lt;/li&gt;
&lt;li&gt;util.gitui, vscode&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;A plugin configuration file was created at &lt;code&gt;~/.config/nvim/lua/plugins/neotest&lt;/code&gt; with neotest-mocha adapter setup. The config includes custom command arguments handling context data for test execution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux amdgpu: ring gfx_0.0.0 timeout</title>
      <link>https://blog.geoffcorey.com/posts/linux-amdgpu-ring-gfx-timeout/</link>
      <pubDate>Thu, 04 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/linux-amdgpu-ring-gfx-timeout/</guid>
      <description>&lt;p&gt;Running Wayland and experiencing Minecraft issues with kernel 6.16.3-arch1-1. GPU timeout errors appeared in system logs indicating the graphics processor failed to complete tasks within expected timeframe.&lt;/p&gt;
&lt;h2 id=&#34;initial-problem&#34;&gt;Initial Problem&lt;/h2&gt;
&lt;p&gt;Kernel logs showed: &lt;code&gt;ring gfx_0.0.0 timeout, signaled seq=7925632, emitted seq=7925634&lt;/code&gt; with the graphics device requiring a complete reset to recover.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hardware Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AMD Radeon RX 6700 (Navi 22)&lt;/li&gt;
&lt;li&gt;12th Gen Intel Core i5-12400F&lt;/li&gt;
&lt;li&gt;64GB RAM&lt;/li&gt;
&lt;li&gt;KDE Plasma 6.4.4 on Wayland&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;troubleshooting-process&#34;&gt;Troubleshooting Process&lt;/h2&gt;
&lt;p&gt;The author identified a Mesa regression by running glmark2 benchmarks, which initially crashed the system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Best Business Books for Inspiration</title>
      <link>https://blog.geoffcorey.com/posts/best-business-books-for-inspiration/</link>
      <pubDate>Sun, 24 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/best-business-books-for-inspiration/</guid>
      <description>&lt;p&gt;I have written business plans every year for fun and executed a few. These books inspire different aspects of running a company or starting a new one.&lt;/p&gt;
&lt;h2 id=&#34;e-myth-revisited-by-gerber&#34;&gt;E-Myth: Revisited by Gerber&lt;/h2&gt;
&lt;p&gt;First epiphany business book is &lt;a href=&#34;https://ia902800.us.archive.org/21/items/TheEMythRevisitedMichaelE.Gerber/The%20E-Myth%20Revisited%20-%20Michael%20E.%20Gerber.pdf&#34;&gt;E-Myth: Revisited by Gerber&lt;/a&gt;. This book exposes the myth of &amp;ldquo;I started a business so I&amp;rsquo;m an entrepreneur!&amp;rdquo; It follows the pie maker starting a pie shop and making pies.&lt;/p&gt;
&lt;p&gt;The core insight: they are a technician making pies, not an entrepreneur. By documenting routines for pie production and hiring staff to follow them, they become a manager. Eventually, documenting management routines creates a self-running company based on repeatable processes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setup a Self-Hosted Ghost Blog with Docker and Caddy</title>
      <link>https://blog.geoffcorey.com/posts/setup-a-self-hosted-ghost-blog-with-docker-and-caddy/</link>
      <pubDate>Fri, 22 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/setup-a-self-hosted-ghost-blog-with-docker-and-caddy/</guid>
      <description>&lt;p&gt;Ghost blogging platform offers simplicity, but email configuration presents challenges. This guide demonstrates deploying Ghost via docker-compose with Caddy as a reverse proxy.&lt;/p&gt;
&lt;h2 id=&#34;core-setup&#34;&gt;Core Setup&lt;/h2&gt;
&lt;p&gt;The Ghost documentation provides foundational installation steps. Caddy can handle wildcard domain certificates through Let&amp;rsquo;s Encrypt for HTTPS security.&lt;/p&gt;
&lt;h2 id=&#34;email-configuration-options&#34;&gt;Email Configuration Options&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Transactional Emails&lt;/strong&gt; (signup/subscriptions):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mailtrap free tier maintains your domain reputation&lt;/li&gt;
&lt;li&gt;Gmail alternative available if you accept third-party domain indicators&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Newsletters&lt;/strong&gt; (bulk messages):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mailgun offers a free tier suitable for low-volume blogs&lt;/li&gt;
&lt;li&gt;Configuration requires editing &lt;code&gt;config.production.json&lt;/code&gt; with SMTP credentials&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;gmail-smtp-configuration&#34;&gt;Gmail SMTP Configuration&lt;/h2&gt;
&lt;p&gt;Generate a dedicated app password via Google Account security settings, then configure Ghost with these credentials in the mail section of your production configuration file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Caddy, Wildcard Certs and Ghost</title>
      <link>https://blog.geoffcorey.com/posts/caddy-wildcard-certs-and-ghost/</link>
      <pubDate>Fri, 23 May 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/caddy-wildcard-certs-and-ghost/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;Hosting multiple applications on subdomains requires a strategy for SSL certificates. The specific example involves deploying Ghost blogging software to &lt;code&gt;blog.geoffcorey.com&lt;/code&gt; while redirecting the root domain to this subdomain. The setup uses wildcard Let&amp;rsquo;s Encrypt certificates to avoid generating separate certificates for each subdomain.&lt;/p&gt;
&lt;h2 id=&#34;cloudflare-api-token&#34;&gt;Cloudflare API Token&lt;/h2&gt;
&lt;p&gt;DNS configuration requires Cloudflare. The &lt;a href=&#34;https://github.com/caddybuilds/caddy-cloudflare&#34;&gt;CaddyBuilds/caddy-cloudflare&lt;/a&gt; Docker image provides DNS challenge support for obtaining wildcard certificates.&lt;/p&gt;
&lt;h2 id=&#34;setup-docker-compose--caddy-configuration&#34;&gt;Setup: Docker Compose &amp;amp; Caddy Configuration&lt;/h2&gt;
&lt;h3 id=&#34;docker-composeyml&#34;&gt;docker-compose.yml&lt;/h3&gt;
&lt;p&gt;The configuration includes three services:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Snowflake: conversion of timestamp NTZ to UTC with offset</title>
      <link>https://blog.geoffcorey.com/posts/snowflake-timestamp-ntz-to-utc-with-offset/</link>
      <pubDate>Thu, 17 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/posts/snowflake-timestamp-ntz-to-utc-with-offset/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;Code attempting to transform Snowflake &lt;code&gt;timestamp_ntz&lt;/code&gt; values stored in &lt;code&gt;America/New_York&lt;/code&gt; local format into UTC time with offset notation did not account for Daylight Savings Time.&lt;/p&gt;
&lt;h2 id=&#34;solution&#34;&gt;Solution&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ALTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;SESSION&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;SET&lt;/span&gt; TIMEZONE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;America/New_York&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    TO_TIMESTAMP_NTZ(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;12/15/2023 01:02:03&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;mm/dd/yyyy hh24:mi:ss&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; mytimestamp,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mytimestamp::timestamp_tz &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; orig,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    TO_VARCHAR(mytimestamp, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;YYYY-MM-DDTHH24:MI:SS.FF3-TZHTZM&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; datetime_wrong,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    CONVERT_TIMEZONE(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;UTC&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;America/New_York&amp;#39;&lt;/span&gt;,TO_TIMESTAMP_LTZ(mytimestamp)) &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; converted_ts,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DATEDIFF(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hour&amp;#39;&lt;/span&gt;, converted_ts, mytimestamp) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; hourdiff,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    TO_VARCHAR(converted_ts) &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; hourdiff &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;:00&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; datetime;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The key involves using &lt;code&gt;CONVERT_TIMEZONE()&lt;/code&gt; with explicit source and target timezones, which properly handles DST transitions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://blog.geoffcorey.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/about/</guid>
      <description>&lt;h2 id=&#34;contact&#34;&gt;Contact&lt;/h2&gt;
&lt;p&gt;Email: &lt;code&gt;me @ geoffcorey.com&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;current-role&#34;&gt;Current Role&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;North - Senior Manager&lt;/strong&gt; (Aug 2019 - Present, Remote)
Manager for PayAnywhere API team utilizing Node.js, PostgreSQL, Snowflake, and AWS.&lt;/p&gt;
&lt;h2 id=&#34;professional-experience&#34;&gt;Professional Experience&lt;/h2&gt;
&lt;h3 id=&#34;ibm---software-developer&#34;&gt;IBM - Software Developer&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Oct 2015 - Aug 2019 | Durham, NC&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developed open-source continuous delivery services for Kubernetes&lt;/li&gt;
&lt;li&gt;Built IBM Cloud Kubernetes Service API/CLI with GoLang and Docker&lt;/li&gt;
&lt;li&gt;Created IBM Bluemix DevOps tools using Cloud Foundry and Node.js&lt;/li&gt;
&lt;li&gt;Patent filed Mar 31, 2017: &amp;ldquo;Container chaining for automated process completion&amp;rdquo; (US20180285156A1)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;udu-llc---application-architect&#34;&gt;UDU LLC - Application Architect&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Dec 2014 - Sep 2015 | Durham, NC&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Patents</title>
      <link>https://blog.geoffcorey.com/patents/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://blog.geoffcorey.com/patents/</guid>
      <description>&lt;h2 id=&#34;container-chaining-for-automated-process-completion&#34;&gt;Container Chaining for Automated Process Completion&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://patents.google.com/patent/US20180285156A1&#34;&gt;View on Google Patents&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This patent describes &amp;ldquo;a method obtains a configuration for an automated process that includes discrete tasks.&amp;rdquo; The system allows users to specify different container images for each task and define the sequence for instantiating containers to complete the process. The method automatically identifies the next container to execute and repeats this process until all tasks are finished.&lt;/p&gt;
&lt;h2 id=&#34;intra-media-demarcation&#34;&gt;Intra-Media Demarcation&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://patents.google.com/patent/US20090162024A1/en?oq=US+US20090162024+A1&#34;&gt;View on Google Patents&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
