<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>coles.codes</title><link>https://coles.codes/</link><description>Recent content on coles.codes</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 12 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://coles.codes/index.xml" rel="self" type="application/rss+xml"/><item><title>Local models in mid-2026: the engineering that closed the gap</title><link>https://coles.codes/posts/local-models-mid-2026/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +1000</pubDate><guid>https://coles.codes/posts/local-models-mid-2026/</guid><description>&lt;p>The 2026 local-model story is quieter than the headlines suggest. Open weights did not catch up to the frontier, but they got close enough on the work most of us do day to day. Running LLM&amp;rsquo;s locally yourself isn&amp;rsquo;t just a hobby project anymore and turned into a reasonable choice if you&amp;rsquo;re after a basic model for writing and research, or running as a specialised agent.&lt;/p>
&lt;p>What I find interesting is the engineering that got us here, and the progress didn&amp;rsquo;t just mean we had to get more RAM to run bigger models. If anything it was the reverse: people figured out how to spend less compute and less memory per token without losing quality.&lt;/p></description></item><item><title>Herding parallel agents on a remote box with herdr</title><link>https://coles.codes/posts/herding-agents-with-herdr/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://coles.codes/posts/herding-agents-with-herdr/</guid><description>&lt;p>My personal coding setup is a remote Ubuntu box that I connect to via ssh. Claude Code does the work and i scope down access so i can use the &lt;code>--dangerously-skip-permissions&lt;/code> flag, with Neovim and lazygit for review and git and yazi when I need to move around the filesystem. tmux and mosh holds things all together so nothing dies when my connection drops, and it&amp;rsquo;s been good to me. The Mac in front of me is basically a thin client unless i am working on projects with a heavy focus on UI.&lt;/p></description></item><item><title>Building lgtmaybe: a PR reviewer for any model</title><link>https://coles.codes/posts/building-lgtmaybe/</link><pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate><guid>https://coles.codes/posts/building-lgtmaybe/</guid><description>&lt;p>I built a PR reviewer called &lt;a href="https://github.com/MattJColes/lgtmaybe">lgtmaybe&lt;/a>, which is the joke I wanted in the name before I&amp;rsquo;d even started writing the code. In terms of how it works, you point it at a pull request, pick a model with one flag, and it posts inline comments plus a summary. A clean PR gets a 👍 LGTM, and everything else gets a maybe.&lt;/p>
&lt;p>The thing I&amp;rsquo;m happiest with is that you can run it on OpenAI, Anthropic, OpenRouter, Bedrock, Vertex, or a local Ollama box.&lt;/p></description></item><item><title>About</title><link>https://coles.codes/about/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://coles.codes/about/</guid><description>&lt;figure class="post-figure post-figure--right">
&lt;picture>
&lt;source type="image/webp" srcset="https://coles.codes/images/coffee_hu6386227120429531088.webp 320w, https://coles.codes/images/coffee_hu5970933650659788420.webp 480w" sizes="(max-width: 600px) 80vw, 15rem">
&lt;img src="https://coles.codes/images/coffee_hu13610071653516757238.jpeg" srcset="https://coles.codes/images/coffee_hu1341684920514327581.jpeg 320w, https://coles.codes/images/coffee_hu13610071653516757238.jpeg 480w" sizes="(max-width: 600px) 80vw, 15rem" width="480" height="361" alt="The morning coffee, my first priority!" loading="lazy" decoding="async">
&lt;/picture>&lt;figcaption>The morning coffee, my first priority!&lt;/figcaption>
&lt;/figure>&lt;p>Hey, I&amp;rsquo;m Matt - a Principal Engineer at AWS, living in Melbourne, Australia 🇦🇺. I build things and write up the bits worth keeping.&lt;/p>
&lt;p>Lately, that&amp;rsquo;s mostly:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Building tools in Python&lt;/strong> - Pydantic, PydanticAI, FastAPI, AWS Strands. Big on type safety, with AI agents doing the boring parts and a fair bit of agent orchestration.&lt;/li>
&lt;li>&lt;strong>Playing with open-source LLMs&lt;/strong> - Qwen, GLM and friends, run locally on a Framework Desktop and a DGX Spark. Lately a lot of OCR and vision-model tinkering, just for the fun of it.&lt;/li>
&lt;li>&lt;strong>A homelab for my tinkering&lt;/strong> - Raspberry Pis, an old Synology NAS, and a stack of Dell OptiPlex Micros, a Framework Desktop and a DGX Spark, all stitched together with Tailscale so I can reach them from anywhere, running a lot of containers with Docker Swarm and Portainer.&lt;/li>
&lt;li>&lt;strong>Currently living in the terminal&lt;/strong> - Claude Code and Opus daily, Ghostty terminal on the Mac tied with herdr, and endlessly ricing my Linux and Claude Code configs.&lt;/li>
&lt;li>&lt;strong>Making apps&lt;/strong> - Into Flutter lately, after plenty of Swift and React Native. Backends usually built with CDK on AWS.&lt;/li>
&lt;li>&lt;strong>Talking about it&lt;/strong> - I speak at user groups and conferences like AWS re:Invent and PyCon AU, make the odd YouTube video, and used to host a stream called Devs in the Shed.&lt;/li>
&lt;/ul>
&lt;p>Day to day I ship software, trying to stay a step ahead of how it&amp;rsquo;ll hold up under load and the design patterns underneath. Backends usually start as a FastAPI modular monolith, breaking out microservices only where something genuinely needs to scale.&lt;/p></description></item><item><title>Friends</title><link>https://coles.codes/friends/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://coles.codes/friends/</guid><description>&lt;p>A few blogs and people worth your time.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://blog.kukiel.dev">Paul Kukiel&lt;/a>&lt;/strong> - a good friend of mine, and one of the best Solution Architects I know. He writes hands-on posts on AWS, Python, and AI-assisted coding.&lt;/p>
&lt;p>&lt;strong>&lt;a href="https://melchi.me">Melchi Salins&lt;/a>&lt;/strong> - a colleague who goes deep on compute and AI infrastructure. His KV cache explainer even ships with an interactive calculator.&lt;/p>
&lt;p>&lt;em>If we know each other and you&amp;rsquo;d like a link here, get in touch.&lt;/em>&lt;/p></description></item><item><title>Projects</title><link>https://coles.codes/projects/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://coles.codes/projects/</guid><description>&lt;p>A few things I&amp;rsquo;ve built or am tinkering with - more will land here as they hold up.&lt;/p>
&lt;h2 id="lgtmaybe">lgtmaybe &lt;a class="heading-anchor" href="#lgtmaybe" aria-label="Link to this section">#&lt;/a>&lt;/h2>
&lt;p>A provider-agnostic PR reviewer. Six model backends behind one &lt;code>--provider&lt;/code> flag, and no static keys in your secrets for the cloud ones - Bedrock and Vertex auth keylessly over GitHub OIDC. Ships as a PyPI CLI and a GitHub Action over one core. Python, built ports-first with AI doing most of the typing. I wrote up &lt;a href="https://coles.codes/posts/building-lgtmaybe/">how I built it&lt;/a>, and the source is &lt;a href="https://github.com/MattJColes/lgtmaybe">MattJColes/lgtmaybe&lt;/a>.&lt;/p></description></item><item><title>Identifiers within AWS CDK</title><link>https://coles.codes/posts/identifiers-within-cdk/</link><pubDate>Thu, 30 Sep 2021 00:00:00 +0000</pubDate><guid>https://coles.codes/posts/identifiers-within-cdk/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Archive post - originally published 30 September 2021&lt;/strong> on &lt;a href="https://www.devsintheshed.com">devsintheshed.com&lt;/a>. The example is CDK &lt;strong>v1&lt;/strong> in JavaScript, and I&amp;rsquo;ve transcribed the code from the original article&amp;rsquo;s screenshots (the two lines of &lt;code>require&lt;/code>s and the class declaration above the visible area are the standard &lt;code>cdk init&lt;/code> template). The concept of construct IDs and unique IDs is unchanged in v2, but the imports have moved and there&amp;rsquo;s a renaming trap worth knowing about, both covered in the &lt;a href="#appendix-2026-whats-changed-in-cdk-v2">2026 appendix&lt;/a> at the end.&lt;/p></description></item><item><title>Reference and import existing assets into AWS CDK</title><link>https://coles.codes/posts/reference-and-import-existing-assets-into-aws-cdk/</link><pubDate>Thu, 30 Sep 2021 00:00:00 +0000</pubDate><guid>https://coles.codes/posts/reference-and-import-existing-assets-into-aws-cdk/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Archive post - originally published 30 September 2021&lt;/strong> on &lt;a href="https://www.devsintheshed.com">devsintheshed.com&lt;/a>. I&amp;rsquo;ve left the article exactly as it ran back then: CDK &lt;strong>v1&lt;/strong>, &lt;code>aws_cdk.core&lt;/code>, the per-service &lt;code>aws-cdk.aws-*&lt;/code> packages, the lot. It&amp;rsquo;s a snapshot of how this worked at the time. CDK has since moved to v2 and a fair bit of the code below no longer runs as written - skip to the &lt;a href="#appendix-2026-whats-changed-in-cdk-v2">2026 appendix&lt;/a> at the end for what&amp;rsquo;s different now.&lt;/p>
&lt;/blockquote>
&lt;p>Hey everyone,&lt;/p></description></item><item><title>Subscribe</title><link>https://coles.codes/subscribe/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://coles.codes/subscribe/</guid><description>&lt;p>I write up what actually works: fine-tuning local models, building simple things on AWS that scale well, and mucking around with my homelab. Drop your email and the new ones land in your inbox - no spam, and I only send when there&amp;rsquo;s actually a post.&lt;/p>
&lt;section class="newsletter newsletter--page" aria-label="Newsletter signup">
 &lt;h2 class="newsletter__heading">$ subscribe --email&lt;/h2>&lt;p class="newsletter__lead">New posts straight to your inbox.&lt;/p>
 &lt;form class="newsletter__form" action="https://coles.codes/api/subscribe" method="post">
 &lt;label class="newsletter__label" for="nl-email-page">Email address&lt;/label>
 &lt;input class="newsletter__input" type="email" name="email" id="nl-email-page"
 placeholder="you@example.com" autocomplete="email" required>
 &lt;input class="newsletter__hp" type="text" name="website" tabindex="-1"
 autocomplete="off" aria-hidden="true">
 &lt;button class="newsletter__submit" type="submit">Subscribe&lt;/button>
 &lt;/form>
 &lt;p class="newsletter__note">Double opt-in. No spam. Unsubscribe anytime.&lt;/p>
&lt;/section></description></item></channel></rss>