<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Nick Perkins</title>
		<link>https://nickperkins.au/</link>
		<description>Recent content on Nick Perkins</description>
		<generator>Hugo</generator>
		<language>en</language>
		
		
		
		
			<lastBuildDate>Sat, 20 Jun 2026 10:00:00 +1000</lastBuildDate>
		
			<atom:link href="https://nickperkins.au/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>I Stopped Using MCPs and Replaced Them with Skills and Scripts</title>
				<link>https://nickperkins.au/article/skills-over-mcps/</link>
				<pubDate>Sat, 20 Jun 2026 10:00:00 +1000</pubDate>
				<guid>https://nickperkins.au/article/skills-over-mcps/</guid>
				<description>&lt;p&gt;Everyone&amp;rsquo;s excited about MCPs. The Model Context Protocol is supposed to be the standard way AI agents talk to external services. And it is good, for what it is. But I&amp;rsquo;ve been replacing MCPs with skills and scripts in my own workflows, and honestly, I&amp;rsquo;m not going back.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem-with-mcps&#34;&gt;The problem with MCPs&lt;/h2&gt;&#xA;&lt;p&gt;When you load an MCP server, all of its tool definitions get injected into the agent&amp;rsquo;s context. Every tool name, every parameter schema, every description. The Atlassian MCP alone exposes dozens of tools across Jira and Confluence. That&amp;rsquo;s a lot of schema sitting in your context window before you&amp;rsquo;ve even asked the agent to do anything.&lt;/p&gt;</description>
			</item>
			<item>
				<title>grug make AI skill. grug happy.</title>
				<link>https://nickperkins.au/article/grug-brain-skill/</link>
				<pubDate>Mon, 06 Apr 2026 10:00:00 +1000</pubDate>
				<guid>https://nickperkins.au/article/grug-brain-skill/</guid>
				<description>&lt;p&gt;grug been thinking about complexity demon lately. complexity demon sneaky. complexity demon hide in code review. complexity demon whisper &amp;ldquo;just add one more abstraction.&amp;rdquo; grug not listen.&lt;/p&gt;&#xA;&lt;p&gt;grug make thing. thing called &lt;a href=&#34;https://github.com/nickperkins/grug-brain&#34;&gt;grug-brain&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-thing-is&#34;&gt;what thing is&lt;/h2&gt;&#xA;&lt;p&gt;grug-brain is AI skill. you give skill to AI, AI become grug. AI then fight complexity demon with you.&lt;/p&gt;&#xA;&lt;p&gt;AI will:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;look at code, say if too complex&lt;/li&gt;&#xA;&lt;li&gt;suggest simpler way&lt;/li&gt;&#xA;&lt;li&gt;explain things in grug speak&lt;/li&gt;&#xA;&lt;li&gt;not add factory pattern when simple function fine&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;grug inspired by &lt;a href=&#34;https://grugbrain.dev/&#34;&gt;grugbrain.dev&lt;/a&gt;. you should go read. very wise. grug just made it easier to load into AI assistant.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The Testing Pyramid Still Matters (Even When AI Wrote Your Tests)</title>
				<link>https://nickperkins.au/article/testing-pyramid-ai-development/</link>
				<pubDate>Sat, 07 Mar 2026 10:00:00 +1000</pubDate>
				<guid>https://nickperkins.au/article/testing-pyramid-ai-development/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve been spending a lot of time in agentic AI workflows lately. Describe a feature, the agent writes the code, the tests, and the PR. It&amp;rsquo;s genuinely impressive. And the test suites are taking fifteen minutes to run, full of integration tests that didn&amp;rsquo;t need to be integration tests.&lt;/p&gt;&#xA;&lt;p&gt;The testing pyramid didn&amp;rsquo;t become irrelevant just because AI wrote the tests.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem-with-ai-and-test-placement&#34;&gt;The problem with AI and test placement&lt;/h2&gt;&#xA;&lt;p&gt;AI agents are enthusiastic testers. Ask one to add coverage for a new feature and it&amp;rsquo;ll write tests, lots of them. The problem isn&amp;rsquo;t that they default to any particular layer. It&amp;rsquo;s that they&amp;rsquo;re trained to optimise for quality and coverage, not for the cost of achieving it. Nobody&amp;rsquo;s system prompt says &amp;ldquo;think about how long this test suite will take to run.&amp;rdquo; So they go overboard. Spinning up a database, creating records via factories, hitting an HTTP endpoint, asserting on the response. It works. The test passes. But it&amp;rsquo;s expensive.&lt;/p&gt;</description>
			</item>
			<item>
				<title>AI and the Human Factor - My Observations</title>
				<link>https://nickperkins.au/article/ai-the-human-factor/</link>
				<pubDate>Wed, 20 Aug 2025 10:00:00 +1000</pubDate>
				<guid>https://nickperkins.au/article/ai-the-human-factor/</guid>
				<description>&lt;p&gt;Over the last year, I&amp;rsquo;ve been watching how people use AI coding tools. GitHub Copilot, ChatGPT, Claude - everyone&amp;rsquo;s got access to them now. But the results? Completely different depending on who&amp;rsquo;s using them.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;ve noticed: the engineers who were already good are using AI to get even better. The ones who struggled before? They&amp;rsquo;re producing questionable code at an incredible rate now.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ai-just-amplifies-what-you-already-are&#34;&gt;AI just amplifies what you already are&lt;/h2&gt;&#xA;&lt;p&gt;AI tools can be amazing productivity boosters. I&amp;rsquo;ve seen junior developers build features in hours that used to take days. Senior people are prototyping stuff at lightning speed.&lt;/p&gt;</description>
			</item>
			<item>
				<title>GitHub Enterprise Reality Check: A DevOps Engineer&#39;s Perspective</title>
				<link>https://nickperkins.au/article/github-enterprise-reality-check/</link>
				<pubDate>Fri, 25 Jul 2025 14:30:00 +1000</pubDate>
				<guid>https://nickperkins.au/article/github-enterprise-reality-check/</guid>
				<description>&lt;p&gt;Over the past couple of years, I&amp;rsquo;ve been working extensively with GitHub Enterprise in large organisational settings. While GitHub has built an exceptional developer experience and continues to ship features at an impressive pace, the reality is that GitHub Enterprise still has significant gaps when it comes to enterprise-scale operations. Let me share what I&amp;rsquo;ve discovered about the current state of GitHub Enterprise from a platform engineering perspective.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;figure class=&#34;figure&#34;&gt;&#xA;  &lt;img class=&#34;figure__img&#34; alt=&#34;A laptop computer displaying a code editor with syntax-highlighted programming code on a dark background, showing colorful text in green, yellow, and purple. The laptop sits on a clean desk surface next to a small potted succulent plant in a decorative white pot, creating a modern, minimalist workspace aesthetic.&#34; src=&#34;https://nickperkins.au/article/github-enterprise-reality-check/james-harrison-vpOeXr5wmR4-unsplash_hu_a08ccfe7886a9dc5.jpg&#34; width=&#34;711&#34; height=&#34;400&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&#xA;  &lt;figcaption class=&#34;figure__caption&#34;&gt;Photo by &lt;a href=&#34;https://unsplash.com/@jstrippa?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&#34;&gt;James Harrison&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/black-laptop-computer-turned-on-on-table-vpOeXr5wmR4?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&#34;&gt;Unsplash&lt;/a&gt;&#xA;      &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;the-repository-centric-challenge&#34;&gt;The Repository-Centric Challenge&lt;/h2&gt;&#xA;&lt;p&gt;GitHub&amp;rsquo;s architecture is fundamentally repository-focused, which works brilliantly for individual projects and small teams. However, this design becomes a significant limitation when you&amp;rsquo;re managing hundreds or thousands of repositories across an enterprise. Features that should operate at an organisational level often require manual configuration per repository, or worse, custom tooling to manage at scale.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Building Interactive MCP Tools with Elicitations: A Practical Guide</title>
				<link>https://nickperkins.au/code/mcp-elicitations-interactive-tools/</link>
				<pubDate>Fri, 11 Jul 2025 22:00:00 +1000</pubDate>
				<guid>https://nickperkins.au/code/mcp-elicitations-interactive-tools/</guid>
				<description>&lt;p&gt;The Model Context Protocol (MCP) is revolutionising how we build AI tools, but a powerful new features recently added to the protocol will be a game changer: elicitations. These enable your MCP tools to have interactive conversations with users, gathering input dynamically rather than requiring all parameters upfront. Let me show you how to build engaging, interactive MCP tools using a practical ice cream topping recommender as our example.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-are-mcp-elicitations&#34;&gt;What Are MCP Elicitations?&lt;/h2&gt;&#xA;&lt;p&gt;Elicitations in MCP allow tools to prompt users for additional information when needed. Instead of failing when required parameters are missing, your tool can ask the user to provide them through a structured interface. This creates a more natural, conversational experience with AI assistants.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How I Built Interactive AI-Powered Training with GitHub Copilot</title>
				<link>https://nickperkins.au/article/interactive-ai-copilot-training/</link>
				<pubDate>Fri, 27 Jun 2025 00:00:00 +0000</pubDate>
				<guid>https://nickperkins.au/article/interactive-ai-copilot-training/</guid>
				<description>&lt;p&gt;One of my current projects is a migration from Azure DevOps to GitHub Actions. I saw a challenge: how to effectively train DevOps teams on new tools in an engaging, practical way? Traditional docs and tutorials often miss the mark. So, I experimented: using GitHub Copilot&amp;rsquo;s Agent Mode to build an interactive, AI-powered training platform. The result was a self-paced, conversational learning experience, guiding users through complex migration scenarios like having an AI tutor.&lt;/p&gt;</description>
			</item>
			<item>
				<title>About Nick</title>
				<link>https://nickperkins.au/page/about/</link>
				<pubDate>Fri, 17 Jan 2025 20:08:42 +1000</pubDate>
				<guid>https://nickperkins.au/page/about/</guid>
				<description>&lt;p&gt;My name is Nick Perkins, and this is my personal blog. This is where I come to jot down my thoughts on things that interest me, like cloud computing, infrastructure as code, Kubernetes, platform engineering, motorsport&amp;hellip; I guess nothing much is off limits.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Search</title>
				<link>https://nickperkins.au/page/search/</link>
				<pubDate>Fri, 17 Jan 2025 20:08:42 +1000</pubDate>
				<guid>https://nickperkins.au/page/search/</guid>
				<description></description>
			</item>
			<item>
				<title>Failure MUST be an option for innovation</title>
				<link>https://nickperkins.au/article/failure-must-be-an-option/</link>
				<pubDate>Fri, 17 Jan 2025 17:48:50 +1000</pubDate>
				<guid>https://nickperkins.au/article/failure-must-be-an-option/</guid>
				<description>&lt;p&gt;This week I hosted a brown bag session at work where I explored the idea that failure isn’t something to be avoided at all costs but must be a safe option for software engineering teams. The concept of failure often carries a negative connotation. However, embracing failure as an option can foster an environment of learning, innovation, and psychological safety. Let’s explore this by looking at the benefits this shift in mindset can bring, and the elements required to create a culture where failure is seen as a stepping stone to success.&lt;/p&gt;</description>
			</item>
			<item>
				<title>ORAS for Configuration Management</title>
				<link>https://nickperkins.au/code/oras-for-configuration-management/</link>
				<pubDate>Sat, 29 Jun 2024 18:00:00 +1000</pubDate>
				<guid>https://nickperkins.au/code/oras-for-configuration-management/</guid>
				<description>&lt;p&gt;A challenge for any engineering team is handling configuration management in a secure and efficient way. Recently, I&amp;rsquo;ve explored using ORAS (OCI Registry As Storage), a tool which enhances OCI (Ope Container Initiative) registries by enabling them to store various artifacts, not just container images.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-oras&#34;&gt;What is ORAS?&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://oras.land&#34;&gt;ORAS&lt;/a&gt; is an open source project which builds tools and libraries to enable using OCI registries to store any type of artifact, not just container images. The ability to leverage container registries in this way comes from how container images are constructed.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Silver Linings</title>
				<link>https://nickperkins.au/quote/silver-linings/</link>
				<pubDate>Fri, 21 Jun 2024 21:41:12 +1000</pubDate>
				<guid>https://nickperkins.au/quote/silver-linings/</guid>
				<description>&lt;p&gt;No matter how you&amp;rsquo;re feeling today, even the darkest clouds have silver linings.&lt;/p&gt;&#xA;&lt;p&gt;If you are struggling, reach out. You&amp;rsquo;re not a burden, I promise.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Managing a Motorsport Club - My Initial Thoughts</title>
				<link>https://nickperkins.au/article/managing-a-motorsport-club/</link>
				<pubDate>Mon, 05 Feb 2024 19:43:46 +1000</pubDate>
				<guid>https://nickperkins.au/article/managing-a-motorsport-club/</guid>
				<description>&lt;p&gt;Last year, I decided to run for a position on the management committee of the motorsport club I&amp;rsquo;m a member of. It has been eye-opening to see what goes on to run a club with around 100 members.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a few things I&amp;rsquo;ve learned over the last 9 months.&lt;/p&gt;&#xA;&lt;h2 id=&#34;its-a-thankless-task&#34;&gt;It&amp;rsquo;s a thankless task&lt;/h2&gt;&#xA;&lt;p&gt;You&amp;rsquo;re damned if you do, and you&amp;rsquo;re damned if you don&amp;rsquo;t. You won&amp;rsquo;t keep everyone happy, and you just have to try and do the best job you can do. Mistakes will be made, but if you step up and right the course, people will respect that.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Motorsport Officiating</title>
				<link>https://nickperkins.au/article/motorsport-officiating/</link>
				<pubDate>Tue, 15 Aug 2023 11:07:46 +1000</pubDate>
				<guid>https://nickperkins.au/article/motorsport-officiating/</guid>
				<description>&lt;p&gt;A part of my life that I haven&amp;rsquo;t written about before is my volunteer motorsport officiating. I&amp;rsquo;ve loved motorsport for as long as I can remember. Some of my earliest memories are watching the Bathurst 1000 or the Formula 1 Australian Grand Prix from Adelaide on television. My parents were not motorsport nuts, but I did go to the Gold Coast Indy 300 in the early 1990s. We would often drive past Surfers Paradise International Raceway and the little Go-Kart track there, but we were always going somewhere else.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A simple static blog comments system using Cloudflare Workers and D1</title>
				<link>https://nickperkins.au/code/comment-api-cloudflare-d1/</link>
				<pubDate>Wed, 12 Apr 2023 09:45:41 +1000</pubDate>
				<guid>https://nickperkins.au/code/comment-api-cloudflare-d1/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve spent the last couple of weeks off work, which has given me time to tinker with some different tech. For starters, I migrated this blog over to &lt;a href=&#34;gohugo.io&#34;&gt;Hugo&lt;/a&gt;, a static site generated written in go. I&amp;rsquo;ve never had comments on this version of my blog, but I wondered how difficult it might be to roll my own system using &lt;a href=&#34;https://workers.cloudflare.com/&#34;&gt;Cloudflare Workers&lt;/a&gt;?&lt;/p&gt;&#xA;&lt;p&gt;This seemed like a good opportunity to play with one of Cloudflare&amp;rsquo;s newest offerings, &lt;a href=&#34;https://developers.cloudflare.com/d1/&#34;&gt;D1&lt;/a&gt;. D1 is Cloudflare&amp;rsquo;s serverless relational database offering built on SQLite. It is still in alpha and isn&amp;rsquo;t ready for production use, but why not take it for a spin?&lt;/p&gt;</description>
			</item>
			<item>
				<title>Infrastructure as code with Terraform</title>
				<link>https://nickperkins.au/code/infrastructure-as-code/</link>
				<pubDate>Sun, 18 Apr 2021 12:53:08 +1000</pubDate>
				<guid>https://nickperkins.au/code/infrastructure-as-code/</guid>
				<description>&lt;p&gt;Over the last couple of months I&amp;rsquo;ve been working on a project for a containerised orchestration platform using Infrastructure as Code. This has meant I&amp;rsquo;ve spent most of my time working with &lt;a href=&#34;https://www.terraform.io/&#34;&gt;Terraform&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-terraform&#34;&gt;What is Terraform?&lt;/h2&gt;&#xA;&lt;p&gt;I could write a couple of paragraphs about what Terraform is and what it does, but I think they put it best:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Terraform is an open-source infrastructure as code software tool that provides a consistent CLI workflow to manage hundreds of cloud services. Terraform codifies cloud APIs into declarative configuration files.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Using pyodbc in AWS Lambda functions</title>
				<link>https://nickperkins.au/code/lamda-pyodbc/</link>
				<pubDate>Sun, 21 Jul 2019 12:57:05 +1000</pubDate>
				<guid>https://nickperkins.au/code/lamda-pyodbc/</guid>
				<description>&lt;p&gt;This week I was working on an AWS Lambda function that needed to read and write from a legacy Microsoft SQL database. It&amp;rsquo;s written using the &lt;a href=&#34;https://github.com/aws/chalice&#34;&gt;AWS Chalice&lt;/a&gt; framework and in local testing everything looked great. Not so much when we needed to deploy it to AWS for testing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;&#xA;&lt;p&gt;Most of the time that you include a python package for use in a lambda function, Chalice is able to package that into the deployment, and you&amp;rsquo;re good to go. However, that&amp;rsquo;s only true if the package doesn&amp;rsquo;t rely on native libraries that aren&amp;rsquo;t included in the Amazon Linux environment that lambda functions run on. Microsoft ODBC drivers are one of those things.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Archive</title>
				<link>https://nickperkins.au/archive/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://nickperkins.au/archive/</guid>
				<description></description>
			</item>
	</channel>
</rss>
