# coles.codes > Technical notes from Matt Coles in Melbourne, Australia on Python tools and AI agents, open-source LLMs, homelab, and cloud architecture with AWS CDK. The morning coffee, my first priority! Hey, I'm Matt - a Principal Engineer at AWS, living in Melbourne, Australia 🇦🇺. I build things and write up the bits worth keeping. Lately, that's mostly: Building tools in Python - mostly Pydantic, PydanticAI, FastAPI and AWS Strands. I like typed code, and agents do a lot of the boring work. Playing with open-source LLMs - Qwen, GLM and friends running locally on a Framework Desktop and a DGX Spark. Lately I've been testing OCR and vision models for fun. Running a homelab - Raspberry Pis, an old Synology NAS, Dell OptiPlex Micros and the bigger AI boxes, all joined by Tailscale and running lots of containers under Docker Swarm and Portainer. Living in the terminal - Claude Code and Opus daily, Ghostty on the Mac with herdr inside it, and endless tinkering with my Linux and Claude Code configs. Making apps - Into Flutter lately, after plenty of Swift and React Native. Backends usually built with CDK on AWS. Talking about it - 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. At work I ship software and worry about how it'll behave under real load. My backends usually start as FastAPI modular monoliths, with services split out only when something genuinely needs to scale on its own. ## Pages - [About](https://coles.codes/about/): Matt Coles - Principal Engineer at AWS in Melbourne, Australia 🇦🇺. Python tooling and AI agents, local LLMs, a Docker Swarm homelab, conference talks, and coffee. - [Friends](https://coles.codes/friends/): Blogs and people Matt Coles rates - hands-on writing on AWS, Python, and AI-assisted coding. - [Projects](https://coles.codes/projects/): Things Matt Coles has built or is tinkering with: an AI code reviewer, a Tailscale homelab, and local vision models. ## Posts - [herdr vs cmux, after two months on each](https://coles.codes/posts/herdr-vs-cmux/) - 2026-08-02: Two agent multiplexers compared after two months with each: where the agents run, how plugins work, remote use, and what cmux does better. - [Reviewing code you didn't write](https://coles.codes/posts/reviewing-code-you-didnt-write/) - 2026-07-22: Reviewing code is a separate skill from writing it. How to find the issue that matters, especially when an AI produced the change. - [Where I run my coding agents, and why it depends on the box](https://coles.codes/posts/where-the-agents-run/) - 2026-07-19: How I limit coding-agent blast radius: disposable Dell micros for unattended work, with permissions kept on around valuable credentials. - [Designing MCP tools for agents](https://coles.codes/posts/designing-mcp-tools-for-agents/) - 2026-07-17: MCP tools advertise contracts to the model. Keep related filters typed and shape safe data in code; load large catalogs progressively. - [Why local models get stuck repeating JSON](https://coles.codes/posts/grammar-constrained-repetition-trap/) - 2026-07-14: A faster GPU turned 'too slow' into 'broken': why grammar-constrained JSON extraction sends local vision models into repetition loops, and what helps. - [Pydantic AI structured outputs and evals on Bedrock](https://coles.codes/posts/pydantic-evals/) - 2026-07-13: How I stage model trust on Bedrock: structured outputs to lock the shape, Pydantic Evals for content, and a calibrated LLM judge for the open text. - [Building and securing MCP servers with FastMCP](https://coles.codes/posts/securing-mcp-servers-fastmcp/) - 2026-07-10: Build a FastMCP 3 server for company data. Add group-based access and an audit trail, then test the complete example offline. - [Skills or MCP servers: when you need a server](https://coles.codes/posts/skills-or-mcp-servers/) - 2026-07-08: Skills can drive any CLI, but your laptop's credentials aren't an access model. Once data is shared and access has to be governed, you need an MCP server. - [Anchoring specs to code with ast-grep](https://coles.codes/posts/anchoring-specs-to-code-with-ast-grep/) - 2026-07-06: I use ast-grep rules to keep living specs tied to the code they describe, even when files move and line numbers change. - [Breaking In](https://coles.codes/posts/breaking-in/) - 2026-06-18: The entry-level market narrowed and AI writes most of the code now. A principal engineer on whether it's still worth starting in software in 2026. - [The shapeshifting engineer](https://coles.codes/posts/the-shapeshifting-engineer/) - 2026-06-17: AI writes most of the code now. The engineering job is moving towards judgement, better specs, and checking what the machine produced. - [Local models in mid-2026: the engineering that closed the gap](https://coles.codes/posts/local-models-mid-2026/) - 2026-06-12: How open weights got close enough to run at home in 2026, the engineering that got them there, and why a memory crunch made the box pricier. - [Herding parallel agents on a remote box with herdr](https://coles.codes/posts/herding-agents-with-herdr/) - 2026-06-10: herdr is an agent-aware tmux replacement that shows which parallel Pi or Claude Code session needs you. My remote-box setup and install notes. - [Building lgtmaybe: a PR reviewer for any model](https://coles.codes/posts/building-lgtmaybe/) - 2026-06-07: How I built lgtmaybe, a provider-agnostic PR reviewer with keyless cloud auth, and the fiddly security and concurrency problems that were fun to solve. - [Identifiers within AWS CDK](https://coles.codes/posts/identifiers-within-cdk/) - 2021-09-30: Construct IDs and the unique logical IDs CDK generates from them, with a 2026 appendix on CDK v2 and the renaming footgun that can delete a resource. - [Reference and import existing assets into AWS CDK](https://coles.codes/posts/reference-and-import-existing-assets-into-aws-cdk/) - 2021-09-30: A 2021 walkthrough of importing existing CloudFormation and referencing live AWS resources in CDK with Python, plus a 2026 appendix on what changed in CDK v2. ## Feeds - [RSS](https://coles.codes/index.xml) - [Sitemap](https://coles.codes/sitemap.xml)