<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Mike&#39;s Shiny Objects &#8212; Blog</title>
		<link>https://mikesshinyobjects.tech/posts/</link>
		<description>Technical writing from Mike&#39;s Shiny Objects</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		<atom:link href="https://mikesshinyobjects.tech/blog/index.xml" rel="self" type="application/rss+xml" />
		<lastBuildDate>Fri, 19 Jun 2026 11:00:00 +0000</lastBuildDate>
		<item>
			<title>Fun with Home Assistant - Part 2: Auto-Switching My Fire TV&#39;s HDMI Input from a USB Switch</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-06-19-fun-with-home-assistant-part-2-hdmi-switching/</link>
			<pubDate>Fri, 19 Jun 2026 11:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-06-19-fun-with-home-assistant-part-2-hdmi-switching/</guid>
			<description>&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure and formatting. The debugging, the dead ends, and the opinions are entirely my own.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;Part 2 of 2: Fun with Home Assistant&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-06-19-fun-with-home-assistant-part-1-weather-station/&#34;&gt;Pulling My Weather Station into Home Assistant with a $40 USB Radio&lt;/a&gt; - Capturing 433MHz sensors with an RTL-SDR&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; Auto-Switching My Fire TV&amp;rsquo;s HDMI Input from a USB Switch &lt;em&gt;(you are here)&lt;/em&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Let me set expectations up front:&lt;/p&gt;</description>
		</item>
		<item>
			<title>Fun with Home Assistant - Part 1: Pulling My Weather Station into Home Assistant with a $40 USB Radio</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-06-19-fun-with-home-assistant-part-1-weather-station/</link>
			<pubDate>Fri, 19 Jun 2026 10:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-06-19-fun-with-home-assistant-part-1-weather-station/</guid>
			<description>&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure and formatting. The hardware choices, the frustration, and the opinions are entirely my own.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;Part 1 of 2: Fun with Home Assistant&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; Pulling My Weather Station into Home Assistant with a $40 USB Radio &lt;em&gt;(you are here)&lt;/em&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-06-19-fun-with-home-assistant-part-2-hdmi-switching/&#34;&gt;Auto-Switching My Fire TV&amp;rsquo;s HDMI Input from a USB Switch&lt;/a&gt; - ADB keycodes, a webhook, and udev bugs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the embarrassing truth:&lt;/p&gt;</description>
		</item>
		<item>
			<title>I Benchmarked 10 AI Models for Email Triage — A Free Local Model Won</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-04-03-email-triage-local-model-wins/</link>
			<pubDate>Fri, 03 Apr 2026 10:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-04-03-email-triage-local-model-wins/</guid>
			<description>&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure and formatting. The analysis, opinions, and surprise at the results are entirely my own.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I built an email triage system that reads incoming mail and classifies it into categories: BULK, ACTION, BILLING, MONITOR, JUNK, and PERSONAL. Each email gets a category, a confidence score, and a one-line reason. The system then labels or files the email accordingly.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;I expected an expensive cloud model to win.&lt;/strong&gt;&lt;/p&gt;</description>
		</item>
		<item>
			<title>Code Container: Isolating AI Coding Harnesses Without Losing Your Mind</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-03-20-code-container-isolating-ai-harnesses/</link>
			<pubDate>Fri, 20 Mar 2026 10:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-03-20-code-container-isolating-ai-harnesses/</guid>
			<description>&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure and formatting. The ideas, paranoia, and late-night container debugging are my own.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Let me start with a confession:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;I&amp;rsquo;ve been running AI coding agents with full, unrestricted access to my host machine.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Claude Code in YOLO mode. OpenCode. Codex. All of them, just loose on my filesystem with &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; because — let&amp;rsquo;s be honest — the permission prompts break flow. You&amp;rsquo;re in the zone, the agent is cranking through a refactor, and then it stops to ask &amp;ldquo;can I read this file?&amp;rdquo; for the fifteenth time.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Taming Git Worktrees: From Chaos to a Clean Hub Structure</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-03-06-taming-git-worktrees-from-chaos-to-hub/</link>
			<pubDate>Fri, 06 Mar 2026 10:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-03-06-taming-git-worktrees-from-chaos-to-hub/</guid>
			<description>&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure and formatting. The ideas, chaos, and embarrassing folder names are entirely my own.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;Let me start with a confession:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;I have been using git worktrees for months and my setup has looked like a disaster the whole time.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Different repos organized differently. Some had the main checkout named one thing with &lt;code&gt;-main&lt;/code&gt; and &lt;code&gt;-feature&lt;/code&gt; suffixes on sibling directories. Others had worktrees scattered to wherever my terminal happened to be open when I ran &lt;code&gt;git worktree add&lt;/code&gt;. One project had its worktrees split across two different drives because — honestly, I don&amp;rsquo;t even remember why. It seemed like a good idea at 11pm.&lt;/p&gt;</description>
		</item>
		<item>
			<title>AI-Powered Shell Commands with Shell-GPT - Part 3 of 3</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-01-05-dorothy-series-part-3-ai-powered-shell-commands-with-shell-gpt/</link>
			<pubDate>Mon, 05 Jan 2026 16:21:01 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-01-05-dorothy-series-part-3-ai-powered-shell-commands-with-shell-gpt/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 3 of 3: The Dorothy Configuration Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the final installment in a three-part series exploring how I use &lt;a href=&#34;https://github.com/bevry/dorothy&#34;&gt;Dorothy&lt;/a&gt; to manage my shell configuration across multiple shells and operating systems. In this post, I&amp;rsquo;ll show you how I integrated AI-powered command generation directly into my shell workflow.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-1-taming-dotfile-chaos-with-dorothy/&#34;&gt;Taming the Dotfile Chaos with Dorothy&lt;/a&gt; - Introduction and core concepts&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-2-secrets-management-with-1password/&#34;&gt;Secrets Management with 1Password&lt;/a&gt; - Safe environment variable handling&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-3-ai-powered-shell-commands-with-shell-gpt/&#34;&gt;AI-Powered Shell Commands with Shell-GPT&lt;/a&gt; - Natural language shell integration (this post)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure, formatting, and information gathering. The ideas, direction, and voice are my own.&lt;/em&gt;&lt;/p&gt;</description>
		</item>
		<item>
			<title>Secrets Management with 1Password - Part 2 of 3</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-01-05-dorothy-series-part-2-secrets-management-with-1password/</link>
			<pubDate>Mon, 05 Jan 2026 16:10:51 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-01-05-dorothy-series-part-2-secrets-management-with-1password/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 2 of 3: The Dorothy Configuration Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the second installment in a three-part series exploring how I use &lt;a href=&#34;https://github.com/bevry/dorothy&#34;&gt;Dorothy&lt;/a&gt; to manage my shell configuration across multiple shells and operating systems. In this post, I&amp;rsquo;ll show you how to securely manage API keys and secrets without ever committing them to your dotfiles.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-1-taming-dotfile-chaos-with-dorothy/&#34;&gt;Taming the Dotfile Chaos with Dorothy&lt;/a&gt; - Introduction and core concepts&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-2-secrets-management-with-1password/&#34;&gt;Secrets Management with 1Password&lt;/a&gt; - Safe environment variable handling (this post)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-3-ai-powered-shell-commands-with-shell-gpt/&#34;&gt;AI-Powered Shell Commands with Shell-GPT&lt;/a&gt; - Natural language shell integration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure, formatting, and information gathering. The ideas, direction, and voice are my own.&lt;/em&gt;&lt;/p&gt;</description>
		</item>
		<item>
			<title>Taming the Dotfile Chaos with Dorothy - Part 1 of 3</title>
			<link>https://mikesshinyobjects.tech/posts/2026/2026-01-05-dorothy-series-part-1-taming-dotfile-chaos-with-dorothy/</link>
			<pubDate>Mon, 05 Jan 2026 10:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2026/2026-01-05-dorothy-series-part-1-taming-dotfile-chaos-with-dorothy/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 1 of 3: The Dorothy Configuration Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the first installment in a three-part series exploring how I use &lt;a href=&#34;https://github.com/bevry/dorothy&#34;&gt;Dorothy&lt;/a&gt; to manage my shell configuration across multiple shells and operating systems. In this series, I&amp;rsquo;ll walk through my journey from dotfile chaos to a portable, maintainable system.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-1-taming-dotfile-chaos-with-dorothy/&#34;&gt;Taming the Dotfile Chaos with Dorothy&lt;/a&gt; - Introduction and core concepts (this post)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-2-secrets-management-with-1password/&#34;&gt;Secrets Management with 1Password&lt;/a&gt; - Safe environment variable handling&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2026/2026-01-05-dorothy-series-part-3-ai-powered-shell-commands-with-shell-gpt/&#34;&gt;AI-Powered Shell Commands with Shell-GPT&lt;/a&gt; - Natural language shell integration&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;em&gt;This post was written with AI assistance (Claude) for structure, formatting, and information gathering. The ideas, direction, and voice are my own.&lt;/em&gt;&lt;/p&gt;</description>
		</item>
		<item>
			<title>Context Binoculars: Understanding LLM Context Windows</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-09-13-context-binoculars/</link>
			<pubDate>Sat, 13 Sep 2025 00:00:00 -0400</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-09-13-context-binoculars/</guid>
			<description>&lt;p&gt;Remember as a kid (or in my case as an adult) when you pulled out binoculars and gazed around the room? It&amp;rsquo;s a bit disorienting for sure, but also fun. And I guess if you&amp;rsquo;ve ever wondered about what I do for fun, now you know.&lt;/p&gt;&#xA;&lt;p&gt;It struck me the other day that this was the ideal representation for how LLM context works. While my demonstration you&amp;rsquo;re going to see below is extreme, this is the reality of what we&amp;rsquo;re facing when we&amp;rsquo;re trying to get LLMs to do big projects. The context window is everything, and you&amp;rsquo;re hearing more and more about context engineering in online articles. Ensuring that the LLM has exactly the right context greatly improves the accuracy of the results that you get out the other end.&lt;/p&gt;</description>
		</item>
		<item>
			<title>The Ultimate Design Review: Example Action Items</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-09-06-2-design-review-action-items/</link>
			<pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-09-06-2-design-review-action-items/</guid>
			<description>&lt;p&gt;&lt;strong&gt;This is an example output from the automated design review system described in &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review: Orchestrating AI with Task-Based Workflows - Part 6 of 6&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This post shows how the AI transforms the comprehensive analysis into a structured, actionable backlog. The system automatically generates specific tasks with clear implementation steps, acceptance criteria, and testing requirements, turning qualitative feedback into a quantitative project plan.&lt;/p&gt;&#xA;&lt;h2 id=&#34;task-status-report-design-review-2025-09-06-action-items&#34;&gt;Task Status Report: Design Review 2025-09-06 Action Items&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;Generated on: 2025-09-07&lt;/em&gt;&lt;/p&gt;</description>
		</item>
		<item>
			<title>The Ultimate Design Review: Example Feedback</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-09-06-1-design-review-feedback/</link>
			<pubDate>Sat, 06 Sep 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-09-06-1-design-review-feedback/</guid>
			<description>&lt;p&gt;&lt;strong&gt;This is an example output from the automated design review system described in &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review: Orchestrating AI with Task-Based Workflows - Part 6 of 6&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This post shows the comprehensive analysis that the AI generates when performing a full-scale design review of a codebase. The AI systematically analyzes each layer of the application, identifies architectural strengths and issues, and provides detailed findings that form the foundation for actionable improvement tasks.&lt;/p&gt;</description>
		</item>
		<item>
			<title>MCP Servers, Ports, and Sharing - Part 1 of 6</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/</link>
			<pubDate>Wed, 20 Aug 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 1 of 6: The AI-Assisted Development Workflow Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the first installment in a six-part series exploring how AI is transforming modern development workflows. In this series, I&amp;rsquo;ll walk through my journey of using an AI-assisted development environment effectively, from basic infrastructure setup to advanced architectural enforcement and task orchestration.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/&#34;&gt;MCP Servers, Ports, and Sharing - Setting up the foundation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/&#34;&gt;ESLint Configuration Refactoring - Cleaning up tooling with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/&#34;&gt;Custom Architectural Rules - Teaching AI to enforce design patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 4:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-17-4-blog-post-task-orchestration/&#34;&gt;Task Orchestration - Managing complex refactoring workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 5:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-16-5-project-rules-for-ai/&#34;&gt;Project Rules for AI - Creating effective memory banks and guidelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 6:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review - Putting it all together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been spending a lot of time lately in the world of AI agents&amp;hellip; wait, no, that&amp;rsquo;s not it. The &lt;em&gt;Model Context Protocol&lt;/em&gt;. MCP. It&amp;rsquo;s a fancy way of saying &amp;ldquo;a way for AI models to talk to tools,&amp;rdquo; and it&amp;rsquo;s pretty powerful. But like any new toy, it comes with its own set of &amp;ldquo;some assembly required&amp;rdquo; headaches. Today, I want to talk about one of those: managing MCP servers, avoiding port conflicts, and generally keeping your digital workspace from turning into a tangled mess of wires.&lt;/p&gt;</description>
		</item>
		<item>
			<title>My ESLint Config Was a Mess. I Asked an AI to Fix It. - Part 2 of 6</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/</link>
			<pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 2 of 6: The AI-Assisted Development Workflow Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the second installment in a six-part series exploring how AI is transforming modern development workflows. In this series, I&amp;rsquo;ll walk through my journey of building an AI-assisted development environment, from basic infrastructure setup to advanced architectural enforcement and task orchestration.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/&#34;&gt;MCP Servers, Ports, and Sharing - Setting up the foundation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/&#34;&gt;ESLint Configuration Refactoring - Cleaning up tooling with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/&#34;&gt;Custom Architectural Rules - Teaching AI to enforce design patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 4:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-17-4-blog-post-task-orchestration/&#34;&gt;Task Orchestration - Managing complex refactoring workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 5:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-16-5-project-rules-for-ai/&#34;&gt;Project Rules for AI - Creating effective memory banks and guidelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 6:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review - Putting it all together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re a frontend developer, you know the love-hate relationship we have with ESLint. We love that it keeps our code clean and consistent. We hate spending hours wrestling with config files, trying to get plugins to play nicely with each other, especially in a modern TypeScript and Tailwind CSS v4 world.&lt;/p&gt;</description>
		</item>
		<item>
			<title>How I Taught My AI Pair Programmer to Be Our Team&#39;s Tailwind CSS Cop - Part 3 of 6</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/</link>
			<pubDate>Mon, 18 Aug 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 3 of 6: The AI-Assisted Development Workflow Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the third installment in a six-part series exploring how AI is transforming modern development workflows. In this series, I&amp;rsquo;ll walk through my journey of building an AI-assisted development environment, from basic infrastructure setup to advanced architectural enforcement and task orchestration.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/&#34;&gt;MCP Servers, Ports, and Sharing - Setting up the foundation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/&#34;&gt;ESLint Configuration Refactoring - Cleaning up tooling with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/&#34;&gt;Custom Architectural Rules - Teaching AI to enforce design patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 4:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-17-4-blog-post-task-orchestration/&#34;&gt;Task Orchestration - Managing complex refactoring workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 5:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-16-5-project-rules-for-ai/&#34;&gt;Project Rules for AI - Creating effective memory banks and guidelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 6:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review - Putting it all together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve all been there. You start a new project with Tailwind CSS, and everything is beautiful. The utility-first approach is fast, flexible, and keeps you right in your HTML. But as the project grows and the team expands, the CSS landscape can start to feel like the Wild West. Utility classes get sprinkled everywhere, components start to blur the lines between structure and style, and soon you&amp;rsquo;re overriding margins and fighting for specificity.&lt;/p&gt;</description>
		</item>
		<item>
			<title>From Linter Chaos to Orchestrated Tasks - Part 4 of 6</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-08-17-4-blog-post-task-orchestration/</link>
			<pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-08-17-4-blog-post-task-orchestration/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 4 of 6: The AI-Assisted Development Workflow Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the fourth installment in a six-part series exploring how AI is transforming modern development workflows. In this series, I&amp;rsquo;ll walk through my journey of building an AI-assisted development environment, from basic infrastructure setup to advanced architectural enforcement and task orchestration.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/&#34;&gt;MCP Servers, Ports, and Sharing - Setting up the foundation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/&#34;&gt;ESLint Configuration Refactoring - Cleaning up tooling with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/&#34;&gt;Custom Architectural Rules - Teaching AI to enforce design patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 4:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-17-4-blog-post-task-orchestration/&#34;&gt;Task Orchestration - Managing complex refactoring workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 5:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-16-5-project-rules-for-ai/&#34;&gt;Project Rules for AI - Creating effective memory banks and guidelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 6:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review - Putting it all together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;In my last post, I talked about how my AI pair programmer and I created a custom ESLint rule to enforce our new frontend architecture. It was a huge success. The linter, now armed with our specific rules, scanned the codebase and&amp;hellip; gave us a giant list of things to fix.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Project Rules for AI - Part 5 of 6</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-08-16-5-project-rules-for-ai/</link>
			<pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-08-16-5-project-rules-for-ai/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 5 of 6: The AI-Assisted Development Workflow Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the fifth installment in a six-part series exploring how AI is transforming modern development workflows. In this series, I&amp;rsquo;ll walk through my journey of building an AI-assisted development environment, from basic infrastructure setup to advanced architectural enforcement and task orchestration.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/&#34;&gt;MCP Servers, Ports, and Sharing - Setting up the foundation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/&#34;&gt;ESLint Configuration Refactoring - Cleaning up tooling with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/&#34;&gt;Custom Architectural Rules - Teaching AI to enforce design patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 4:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-17-4-blog-post-task-orchestration/&#34;&gt;Task Orchestration - Managing complex refactoring workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 5:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-16-5-project-rules-for-ai/&#34;&gt;Project Rules for AI - Creating effective memory banks and guidelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 6:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review - Putting it all together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;In the previous posts, we&amp;rsquo;ve taught our AI assistant &lt;em&gt;how&lt;/em&gt; to understand and enforce specific architectural rules. We&amp;rsquo;ve built a robust system for linting, testing, and managing complex tasks. But how do we ensure the AI behaves consistently and predictably over the long term? How do we give it a &amp;ldquo;personality&amp;rdquo; and a &amp;ldquo;memory&amp;rdquo; that aligns with our project&amp;rsquo;s philosophy?&lt;/p&gt;</description>
		</item>
		<item>
			<title>The Ultimate Design Review: Orchestrating AI with Task-Based Workflows - Part 6 of 6</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-08-15-6-ai-detailed-project-reviews/</link>
			<pubDate>Fri, 15 Aug 2025 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-08-15-6-ai-detailed-project-reviews/</guid>
			<description>&lt;p&gt;&lt;strong&gt;Part 6 of 6: The AI-Assisted Development Workflow Series&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the final installment in our six-part series on building an AI-assisted development workflow. We&amp;rsquo;ve set up our infrastructure, taught the AI our coding standards, and established a robust &amp;ldquo;memory bank&amp;rdquo; of project rules. Now, it&amp;rsquo;s time to put it all to the test with the ultimate challenge: a comprehensive, end-to-end design review of the entire codebase.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Series Overview:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 1:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-20-1-mcp-servers-ports-and-sharing/&#34;&gt;MCP Servers, Ports, and Sharing - Setting up the foundation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 2:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-19-2-blog-post-llm-eslint-config/&#34;&gt;ESLint Configuration Refactoring - Cleaning up tooling with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 3:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-18-3-blog-post-llm-eslint-tailwind/&#34;&gt;Custom Architectural Rules - Teaching AI to enforce design patterns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 4:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-17-4-blog-post-task-orchestration/&#34;&gt;Task Orchestration - Managing complex refactoring workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 5:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-16-5-project-rules-for-ai/&#34;&gt;Project Rules for AI - Creating effective memory banks and guidelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Part 6:&lt;/strong&gt; &lt;a href=&#34;/posts/2025/2025-08-15-6-ai-detailed-project-reviews/&#34;&gt;The Ultimate Design Review - Putting it all together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;the-challenge-from-codebase-to-action-plan&#34;&gt;The Challenge: From &amp;ldquo;Codebase&amp;rdquo; to &amp;ldquo;Action Plan&amp;rdquo;&lt;/h2&gt;&#xA;&lt;p&gt;Want to see what we&amp;rsquo;re building? I&amp;rsquo;ve created two example posts that show the actual output from this automated design review system:&lt;/p&gt;</description>
		</item>
		<item>
			<title>When AppImages Fail You: Building a Robust Extraction Tool (and Why Cursor Drove Me to It)</title>
			<link>https://mikesshinyobjects.tech/posts/2025/2025-08-10-appimage-extraction-and-cursor/</link>
			<pubDate>Sun, 10 Aug 2025 14:30:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2025/2025-08-10-appimage-extraction-and-cursor/</guid>
			<description>&lt;p&gt;Let me start this with a confession:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;I really wanted to like AppImages&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The promise is compelling: universal Linux binaries that run everywhere without installation. Just download, &lt;code&gt;chmod +x&lt;/code&gt;, and go. It&amp;rsquo;s the kind of elegant simplicity that makes you think &amp;ldquo;why didn&amp;rsquo;t we do this sooner?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Then reality hits.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-cursor-catalyst&#34;&gt;The Cursor Catalyst&lt;/h2&gt;&#xA;&lt;p&gt;This whole adventure started when I decided to try &lt;a href=&#34;https://cursor.sh/&#34;&gt;Cursor&lt;/a&gt;, the AI-powered code editor that&amp;rsquo;s my daily code editor. Unfortunately, it&amp;rsquo;s not updated frequently in AUR, so I decided to try the AppImage. When I tried to run it, I got the following error:&lt;/p&gt;</description>
		</item>
		<item>
			<title>Introducing VPEM-Visual Studio Profile Extension Manager</title>
			<link>https://mikesshinyobjects.tech/posts/2024/2024-10-05-introducing-vpem/</link>
			<pubDate>Sat, 05 Oct 2024 10:11:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2024/2024-10-05-introducing-vpem/</guid>
			<description>&lt;p&gt;VS Code Profile Extension Manager (VPEM) is a powerful command-line tool designed to help you manage your Visual Studio Code extensions across different profiles. It allows you to dump, categorize, and apply extensions with ease, streamlining your VS Code setup process.&lt;/p&gt;&#xA;&lt;h2 id=&#34;status&#34;&gt;Status&lt;/h2&gt;&#xA;&lt;p&gt;This project has been developed strictly on Linux, though it should work everywhere. If you find an issue, please report it in the &lt;a href=&#34;https://github.com/drmikecrowe/vscode-profile-extension-manager/issues&#34;&gt;GitHub issue tracker&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Executables are built using &lt;a href=&#34;https://github.com/pyinstaller/pyinstaller&#34;&gt;pyinstaller&lt;/a&gt; and are available for Linux, Windows and MacOS. Again, if any issues are found, please report them in the &lt;a href=&#34;https://github.com/drmikecrowe/vscode-profile-extension-manager/issues&#34;&gt;GitHub issue tracker&lt;/a&gt;.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Wrangling Gitlab CI/CD in Monorepos</title>
			<link>https://mikesshinyobjects.tech/posts/2024/2024-05-25-wrangling-gitlab-cicd/</link>
			<pubDate>Sat, 25 May 2024 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2024/2024-05-25-wrangling-gitlab-cicd/</guid>
			<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;small&gt;Photo by &lt;a href=&#34;https://unsplash.com/@kellysikkema?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&#34;&gt;Kelly Sikkema&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/a-person-drawing-a-diagram-on-a-piece-of-paper-lFtttcsx5Vk?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&#34;&gt;Unsplash&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;So, I recently had the opportunity to extensively dig into Gitlab’s CI/CD. We have a monorepo that I wanted to deploy automatically, and it took quite a bit of work to optimize it and work as I expected.&lt;/p&gt;&#xA;&lt;p&gt;To set the stage, here&amp;rsquo;s our core &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file (now):&lt;/p&gt;&#xA;&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;node:18-alpine3.19&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;variables&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;AWS_REGION&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;us-east-1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;AWS_DEFAULT_REGION&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;us-east-1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;FF_USE_FASTZIP&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ARTIFACT_COMPRESSION_LEVEL&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fast&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;CACHE_COMPRESSION_LEVEL&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fast&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;stages&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;prepare&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;module-caches&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;layers&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;build&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#ae81ff&#34;&gt;deploy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#******************************************************************&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;include&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.gitlab/cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.gitlab/rules-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.gitlab/build-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.gitlab/deploy-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/landing/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/landing/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/quickbooks-connector/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/reviews/reviews-api/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/reviews/reviews-api/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/reviews/reviews-ui/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/reviews/reviews-ui/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/stocks/stocks-api/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/stocks/stocks-api/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/stocks/stocks-ui/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/stocks/stocks-ui/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/tnb/tnb-api/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/tnb/tnb-api/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/tnb/tnb-ui/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;apps/tnb/tnb-ui/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;packages/pinnacle-layer/.gitlab-cache-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;local&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;packages/pinnacle-layer/.gitlab-ci.yml&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# variables:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#   CI_DEBUG_TRACE: true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#******************************************************************&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;always&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;stage&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;prepare&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;script&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#ae81ff&#34;&gt;env | sort&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here are some of the things that drove me crazy:&lt;/p&gt;</description>
		</item>
		<item>
			<title>Eleventy Blog on AWS with S3/CloudFront</title>
			<link>https://mikesshinyobjects.tech/posts/2024/2024-05-04-eleventy-blog-on-aws-with-s3cloudfront/</link>
			<pubDate>Sat, 04 May 2024 23:36:31 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2024/2024-05-04-eleventy-blog-on-aws-with-s3cloudfront/</guid>
			<description>&lt;p&gt;In starting this blog, I wanted to use AWS S3/CloudFront. I initially investigated &lt;a href=&#34;https://ion.sst.dev&#34;&gt;SST (ion specifically)&lt;/a&gt;. However, I kept running into issues with SST and NixOS, so I bailed on SST and moved directly to &lt;a href=&#34;https://www.pulumi.com&#34;&gt;Pulumi&lt;/a&gt;. Pulumi is a Terraform competitor, and I have been curious to try it out.&lt;/p&gt;&#xA;&lt;p&gt;They have a static &lt;a href=&#34;https://github.com/pulumi/examples/tree/master/aws-ts-static-website&#34;&gt;site starter&lt;/a&gt;. This is actually a decent start, but I ran into a few problems deploying my new &lt;a href=&#34;https://www.11ty.dev&#34;&gt;Eleventy Blog&lt;/a&gt;. The home page worked fine, but as you drive into sub-folders (like &lt;code&gt;/blog/&lt;/code&gt;), I started getting 403 Forbidden errors.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Dynamic Databricks Widgets</title>
			<link>https://mikesshinyobjects.tech/posts/2024/2024-05-04-dynamic-databricks-widgets/</link>
			<pubDate>Sat, 04 May 2024 16:25:19 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2024/2024-05-04-dynamic-databricks-widgets/</guid>
			<description>&lt;p&gt;Have you ever wished the Databricks widgets were a little more intelligent? When you change one, the others adjust?&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s not too hard, but it&amp;rsquo;s a bit tricky. Here&amp;rsquo;s the secret: The widgets must be replaced as they change! For example:&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s say you have a date input, and whenever it changes, you want a second widget to change. That second widget needs to be suffixed with an increasing number as the contents change. Consider:&lt;/p&gt;</description>
		</item>
		<item>
			<title>Databricks Multiple Filters using a Python Lambda statement</title>
			<link>https://mikesshinyobjects.tech/posts/2024/2024-04-28-databricks-multiple-filters-using-a-python-lambda-statement/</link>
			<pubDate>Sun, 28 Apr 2024 22:35:26 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2024/2024-04-28-databricks-multiple-filters-using-a-python-lambda-statement/</guid>
			<description>&lt;p&gt;Recently, I ran into a case where I needed to check if 11 different fields were null. Yes, I could have used Copilot (or my preferred Codeium) to generate it for me, but I knew it had to be easier. There had to be an easier way&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the scenario:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You have a list of conditions in a python list (in my case, I pasted it as separate lines and did a &lt;code&gt;conditions = &amp;quot;&amp;quot;&amp;quot;condition 1\ncondition2\n...&amp;quot;.split(&amp;quot;\n&amp;quot;)&lt;/code&gt;). Doesn&amp;rsquo;t matter how you specify your conditions, just that it&amp;rsquo;s a list somehow&lt;/li&gt;&#xA;&lt;li&gt;You have a way of associating this list with a set of Databricks columns&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what I found:&lt;/p&gt;</description>
		</item>
		<item>
			<title>How Can I Wordle Out of Housework</title>
			<link>https://mikesshinyobjects.tech/posts/2023/2023-03-06-how-can-i-wordle-out-of-housework/</link>
			<pubDate>Sun, 06 Mar 2022 00:00:00 +0000</pubDate>
			<guid>https://mikesshinyobjects.tech/posts/2023/2023-03-06-how-can-i-wordle-out-of-housework/</guid>
			<description>&lt;p&gt;Let me start this with a confession:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;I don’t (technically) play Wordle&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This is very important, as recently my wife came to me and proclaimed “I just got a “magnificent” in Wordle” (the blank look on my face definitely bumped up my heating bill for a few days). When I asked my daughter if she played it, she pointed me to &lt;a href=&#34;https://octokatherine.github.io/word-master/&#34;&gt;Word Master&lt;/a&gt; and I was hooked.&lt;/p&gt;&#xA;&lt;p&gt;Many discussions (with my daughter — my wife had no interest in our flagrant disrespect of Wordle) ensued about the best words to start. For the longest time, mine were &lt;code&gt;train&lt;/code&gt;, &lt;code&gt;speck&lt;/code&gt;, &lt;code&gt;dough&lt;/code&gt;. You see, our philosophy was to bang out 2-3 words and get the letters, then stress over guessing the word after establishing a good set of letters (hopefully in the right position). I searched online for the best 3 words, but nobody seemed to follow this technique. Everybody writing about this only was interested in the best &lt;em&gt;first&lt;/em&gt; word. So, off I went to figure it out.&lt;/p&gt;</description>
		</item>
	</channel>
</rss>
