<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gary Pendergast</title>
	<atom:link href="https://pento.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://pento.net</link>
	<description>I&#039;m on the Internet</description>
	<lastBuildDate>Wed, 03 Jun 2026 02:17:17 +0000</lastBuildDate>
	<language>art-xemoji</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://pento.net/wp-content/uploads/2014/10/1ad9e5c98d81c6815a65dab5b6e1f669-54515cee_site_icon-32x32.png</url>
	<title>Gary Pendergast</title>
	<link>https://pento.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://pento.net/?pushpress=hub'/>
<cloud domain='pento.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<site xmlns="com-wordpress:feed-additions:1">6589800</site>	<item>
		<title>Your New Job Description</title>
		<link>https://pento.net/2026/06/03/your-new-job-description/</link>
					<comments>https://pento.net/2026/06/03/your-new-job-description/#respond</comments>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Wed, 03 Jun 2026 01:54:49 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[agentic development]]></category>
		<category><![CDATA[developer productivity]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[tech industry]]></category>
		<guid isPermaLink="false">https://pento.net/?p=6064</guid>

					<description><![CDATA[The tech industry is in upheaval again, but the mindset that made you a good developer before is exactly what will keep you a good developer now. Here's how to adapt, thrive, and raise the floor for your whole team.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The tech industry is going through massive upheaval. Roles are disappearing, engineers are being laid off by the thousands. Companies are discovering they no longer have a business model, and the global economy is desperately trying to both absorb the impact and understand the implications of what&#8217;s going on.</p>



<p class="wp-block-paragraph">This was the industry 25 years ago, back when I was first getting started in tech around the time of the dotcom crash.</p>



<p class="wp-block-paragraph">Less than 10 years later, it was happening again: the iPhone had launched, so we&#8217;d figured out how to make mobile sites. Then the App Store launched, so we had to figure out how to build apps, instead. The development landscape was changing faster than any one person could keep up: how could you possibly be a good developer now?</p>



<h2 class="wp-block-heading">Good Development Then</h2>



<p class="wp-block-paragraph">Even back then, writing the cleverest, or neatest, or fastest code was only a part of being a good developer. The industry was rapidly iterating on development practices and developer tooling: you didn&#8217;t write code in <code>notepad.exe</code>, you used a code editor, or perhaps even an IDE. You didn&#8217;t copy files into production, you used version control. These tools had existed in the corporate world for years, of course, but open source alternatives were making them available to anyone who wanted to be a a developer. They improved, too: adding auto-complete, templates, and integrating test environments for rapid iteration.</p>



<p class="wp-block-paragraph">The democratisation continued, too: from the rise of Stack Overflow as a source of code snippets that you could easily re-use, to package managers made it even easier to re-use code on an industrial scale, through to the proliferation of through to the proliferation of transpilers and build tools. It got to a point where it where didn&#8217;t even really matter what language you wrote your code in. As long as you had the right build tool for it, it could run anywhere.</p>



<p class="wp-block-paragraph">The history of our industry has been defined by a never-ending drive to increase the leverage of every keystroke, but it&#8217;s always been at something of a measured pace. But what happens when a giant leap occurs?</p>



<h2 class="wp-block-heading">Good Development Now</h2>



<p class="wp-block-paragraph">A couple of year couple of years ago, LLM-based development tools were little more than slightly smarter (but infinitely slower) autocomplete, and it looked like they&#8217;d stalled there. A year ago, agentic development tools came along, and it was starting to look like there might actually be something useful here, though they were far too prone to making unacceptable mistakes. More recently, the current generation of agentic tools emerged, and we find ourselves able to generate production-ready code with minimal developer intervention.</p>



<p class="wp-block-paragraph">So if we no longer need to write code, what becomes of the software developer?</p>



<p class="wp-block-paragraph">Hint: you&#8217;re still coding, just at a a different abstraction level. Your job has always been to take a problem, and solve it with software. The exact method you used to produce that software has never been prescribed, you use the right tool for the job.</p>



<p class="wp-block-paragraph">Right now, the tools are pretty messy. Concepts are changing week to week, state of the art last quarter is today&#8217;s legacy. I&#8217;m reminded of when the mobile web was first emerging, the horrible CSS hacks we&#8217;d previously reserved for Internet Explorer now had to be applied to make things work in mobile browsers, too. When we first started building mobile websites, they were entirely different code bases, but we slowly figured out how to make the same code work everywhere. The change came as a hurricane, the tooling followed later, cleaning up the mess.</p>



<h2 class="wp-block-heading">HOWTO: Be a Good Developer</h2>



<p class="wp-block-paragraph">Once again, the tech industry is in a state of upheaval. The good news is, the exact same mindset that made you a good developer previously is what will keep you being a good developer today. Some of the bad habits we picked up along the way might have to go, though.</p>



<p class="wp-block-paragraph">You can&#8217;t just look at the code in front of you any longer. Closing out your 5 tickets for the sprint won&#8217;t help you use agentic tools: it&#8217;s impossible to stick to your little corner of the machine if the tooling is suddenly able to reach everywhere. You need to learn how the entire system works: not necessarily so you can create code that spaghetti-fies its way through the system, but so you can know when it&#8217;s right to make changes elsewhere.</p>



<p class="wp-block-paragraph">Think about the tools that always made it easiest for you to create good code. From the simplest code formatter to the most comprehensive test suite: these tools gave you fast, reliable, timely, and actionable feedback that you can act upon. The exact same tooling is what will give you the best output from agentic development tools today.</p>



<p class="wp-block-paragraph">The same is true of process. Well-written, unambiguous requirements produced in a collaborative, iterative fashion creates clear guidelines for what needs to be built creates clear guidelines for what needs to be built. Useful code reviews that helped you learn more about the system you&#8217;re building inside of ensures you&#8217;ve built it the right way ensures you&#8217;ve built it the right way. Comprehensive real world testing with clear, actionable feedback checks that you&#8217;ve solved the problem.</p>



<p class="wp-block-paragraph">Creating great software was never about being the most brilliant coder, it&#8217;s always been about creating an environment where great software comes naturally: that&#8217;s as true today as it was yesterday.</p>



<h2 class="wp-block-heading">Raising the Floor</h2>



<p class="wp-block-paragraph">Information sharing has always been a key driver in pushing the software engineering practices forward. From the global Open Source movement right down to how your team works together, sharing compounds exponentially. Where one developer with a well-configured CI pipeline raises the quality of their own output, an entire team on the same pipeline raises the floor for everyone.</p>



<p class="wp-block-paragraph">Start with <a href="https://pento.net/2026/04/13/guardrails-for-agentic-development/">shared guardrails</a>. If you&#8217;ve set up a test coverage ratchet or a linter config that&#8217;s been improving your own work, propose it to the team. Champion it in a PR, explain why it caught something it would otherwise have missed, and make it part of your shared CI standard. Remember that you&#8217;re not trying to impose process, you&#8217;re aiming to help the team&#8217;s agents work to the same standard as yours. When everyone&#8217;s feedback loop is well-configured, the whole team moves faster with less rework.</p>



<p class="wp-block-paragraph">Work on shared review culture. In code reviews, start asking questions like &#8220;what guardrails did you put in place?&#8221; and &#8220;how did you verify the agent&#8217;s output?&#8221; You&#8217;re not looking for gotchas: be genuinely curious, and find the patterns that can help evolve the tooling everyone uses.</p>



<p class="wp-block-paragraph">Talk about what &#8220;done&#8221; looks like. Define acceptance criteria and type checks that everyone agrees on, so that agents across the team are working to the same standard, instead of individual interpretations of what&#8217;s good enough. Always remember that you&#8217;re not looking to create bureaucracy, you&#8217;re defining alignment: when developers and agents share a common north star, when you&#8217;re pulling in the same direction, the job becomes easier and you can move onto new and bigger opportunities.</p>



<h2 class="wp-block-heading">Choose Your Own Adventure</h2>



<p class="wp-block-paragraph">There are big changes happening in the industry right now, the practice of software engineering is evolving to encompass agentic development tools. Your choice remains, however: just as you could always choose whether you prefer to use a full IDE, a code editor, or <code>notepad.exe</code>. Now you can choose to use the frontier LLMs, you can choose self-hosted LLMs. You can use the myriad of available harnesses, you can write something that works just for you. Previous generations of software engineering practices didn&#8217;t disappear because something new came out, they adapted to work with the best bits, and kept the rest optional.</p>



<p class="wp-block-paragraph">This is a time of exciting and challenging opportunities: just as has happened before, we&#8217;re defining what the practice looks like for the coming decades. Start with something small, perhaps have a chat with your lead about what their view is, I promise they&#8217;re trying to figure out what it all means just as much as you are! Now is a good time to take care of technical debt: agents work best in a consistent environment, so cleaning up some of those old abstractions and interfaces will help increase the momentum. Keep learning: my years in this industry has taught me that nothing ever stays the same, there&#8217;s only one way to continue improving your craft.</p>



<p class="wp-block-paragraph">Feed your curiosity.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pento.net/2026/06/03/your-new-job-description/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6064</post-id>	</item>
		<item>
		<title>Guardrails for Agentic Development</title>
		<link>https://pento.net/2026/04/13/guardrails-for-agentic-development/</link>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Mon, 13 Apr 2026 06:01:47 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[agentic development]]></category>
		<category><![CDATA[developer workflow]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5839</guid>

					<description><![CDATA[Agents can write code fast, but speed without feedback loops produces mediocre results. Here's how guardrails transform agentic development from vibe coding into a workflow you'd actually trust in production.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Developers are writing less and less code. A large part of their time is now spent on keeping the agents honest, instead.</p>



<p class="wp-block-paragraph">Agentic development is on the cusp of transforming the software development world more than any evolution I&#8217;ve seen previously. I&#8217;ve watched agents produce in minutes what would have taken me days, or even weeks. The problem is, there&#8217;s still a huge gap between &#8220;the agent can write code&#8221; and &#8220;the agent writes code I&#8217;d actually ship.&#8221; That gap is where the guardrails live.</p>



<h2 class="wp-block-heading">The Problem With Vibe Coding</h2>



<p class="wp-block-paragraph">Vibe coding had a moment there, but it seems like every vibe coder is rapidly discovering the problem that every engineer saw coming: you can&#8217;t vibe code your way out of a poorly architected mess. There&#8217;s no denying that vibe coding is great to start with! You rapidly produce code, you ship huge changes several times a day, and the feature count just keeps on climbing.</p>



<p class="wp-block-paragraph">Three months later, however, you wonder where it all went wrong. You&#8217;re debugging a production issue at 2am, you discover that the agent generated a function with no error handling, no edge case coverage, and a subtle bug that only manifests under load. The code <em>looked</em> right. The problem is that nobody verified it was right, not even the agent.</p>



<p class="wp-block-paragraph">The fundamental issue isn&#8217;t that agents inherently write bad code. LLMs produce the most statistically likely code. In practice that code is&#8230; average. Not amazing, not terrible, just average. Average is fine in isolation, but it quickly becomes a problem as the system becomes more complex. Without automated feedback loops, there&#8217;s no mechanism forcing them to improve their own work. An agent left to its own devices will happily produce code that passes a superficial smell test while skipping the hard parts. How many times have you seen an agent mark something critical as &#8220;out of scope&#8221;, or &#8220;for a follow-up issue&#8221;? How many times have they just mocked something that they couldn&#8217;t quickly figure out?</p>



<h2 class="wp-block-heading">Guardrails Are Feedback Loops, Not Restrictions</h2>



<p class="wp-block-paragraph">In real life, guardrails aren&#8217;t just for safety, they give you more information about your environment. A guardrail tells you there&#8217;s probably something dangerous on the other side: you should pay attention. It&#8217;s not prescriptive about how you respond, it&#8217;s just telling you to be aware.</p>



<p class="wp-block-paragraph">You give agents guardrails for much the same reason. They don&#8217;t inherently know things about your project, so you have to give them information, preferably in a form that can evolve over time. Agents won&#8217;t pause and ask a clarifying question when something feels off. They&#8217;ll just confidently produce <em>something</em> and move on. We need to force them to stop and check their work.</p>



<h2 class="wp-block-heading">Coverage-Driven Agent Loops</h2>



<p class="wp-block-paragraph">Here&#8217;s an example from my own workflow. One useful guardrail I&#8217;ve found for agentic development is test coverage. Where historically it might&#8217;ve been a vanity metric on a dashboard, now it can be used to give a real-time feedback signal that agents can act on.</p>



<figure class="wp-block-embed is-type-rich is-provider-github wp-block-embed-github"><div class="wp-block-embed__wrapper">
		<div class="og-fallback-embed">
			<div class="og-fallback-embed__image"><img decoding="async" src="https://opengraph.githubassets.com/ff9c203a044a9edad763c74c2bf61dfc226d3b49257759316b6a853472b03b8c/pento/lcov-coverage-check" alt="GitHub - pento/lcov-coverage-check: A GitHub Action that parses LCOV coverage files, enforces ratcheting thresholds, and posts PR coverage summaries with automatic baseline management." loading="lazy" /></div>			<div class="og-fallback-embed__content">
				<p class="og-fallback-embed__provider">GitHub</p>
				<p class="og-fallback-embed__title">
					<a href="https://github.com/pento/lcov-coverage-check" target="_blank" rel="noopener noreferrer">GitHub &#8211; pento/lcov-coverage-check: A GitHub Action that parses LCOV coverage files, enforces ratcheting thresholds, and posts PR coverage summaries with automatic baseline management.</a>
				</p>
									<p class="og-fallback-embed__description">A GitHub Action that parses LCOV coverage files, enforces ratcheting thresholds, and posts PR coverage summaries with automatic baseline management. &#8211; pento/lcov-coverage-check</p>
							</div>
		</div>
		
</div></figure>



<p class="wp-block-paragraph">I recently built <a href="https://github.com/pento/lcov-coverage-check">lcov-coverage-check</a>, a GitHub Action that parses coverage files, enforces ratcheting thresholds. The idea is fairly simply: it enforces a ratchet mechanism where coverage can never go down. New files must meet a minimum threshold.</p>



<p class="wp-block-paragraph">How it works isn&#8217;t the most important factor, though. What it does with that information is what really makes the difference. It posts a summary report directly to the PR, which an agent can read and act on. It sees which files need more testing, and can immediately act upon it. </p>



<h2 class="wp-block-heading">Principles for Effective Guardrails</h2>



<p class="wp-block-paragraph">Coverage is just one example; over recent months I&#8217;ve found that there&#8217;s a clear pattern to providing useful guardrails for your agents. Here are the three principles that I&#8217;ve found to be most effective:</p>



<p class="wp-block-paragraph"><strong>Objective.</strong> Pass or fail. Agents are probabilistic machines, so their response to subjective feedback like &#8220;this could be cleaner&#8221; is always going to be unpredictable. The more specific a signal you can give them, the better the outcome.</p>



<p class="wp-block-paragraph"><strong>Ratcheting.</strong> Quality should only move in one direction. Coding agents will always skip something they decide is too hard; you need to stop that from happening.</p>



<p class="wp-block-paragraph"><strong>Composable.</strong> It&#8217;s another example of the <a href="https://en.wikipedia.org/wiki/Swiss_cheese_model">Swiss Cheese model</a>. No single guardrail catches everything, some things will naturally slip through. Instead, you have multiple layers: type checking catches structural errors, linting enforces style consistency, test coverage ensures behavioural verification, and integration tests validate end-to-end flows. Each layer is simple, but together, they form an effective barrier.</p>



<h2 class="wp-block-heading">Your New Job Description</h2>



<p class="wp-block-paragraph">Every &#8220;thought leader&#8221; with a LinkedIn account and a ChatGPT subscription is continually posting about how LLMs will replace developers. Funnily enough, they&#8217;re nearly right, but for entirely the wrong reasons. The coding part of the job is probably going away, but it&#8217;s been happening for a long time already. We didn&#8217;t stop creating machine code, we created compilers that do it for us. We didn&#8217;t stop creating JavaScript, we created transpilers that do it for us.</p>



<p class="wp-block-paragraph">This is just the next step in the evolution. Instead of writing code, you need to design the constraints and feedback systems that produce good code. It&#8217;s a move up the abstraction ladder, not off it.</p>



<p class="wp-block-paragraph">There&#8217;s more good news! Thriving in this brave new world is pretty straightforward: you don&#8217;t need to be the person who can write the cleverest prompt. Human language is inherently messy and unpredictable; computers are entirely logic-driven and predictable. To transform the former into the latter, you need useful feedback loops. </p>



<p class="wp-block-paragraph">The best agentic workflows aren&#8217;t the ones with the smartest models. They&#8217;re the ones with the best guardrails.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5839</post-id>	</item>
		<item>
		<title>Claudaborative Editing 0.4: Twice the fun!</title>
		<link>https://pento.net/2026/04/10/claudaborative-editing-0-4-twice-the-fun/</link>
					<comments>https://pento.net/2026/04/10/claudaborative-editing-0-4-twice-the-fun/#comments</comments>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Fri, 10 Apr 2026 05:40:37 +0000</pubDate>
				<category><![CDATA[Claudaborative Editing]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[Gutenberg]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5741</guid>

					<description><![CDATA[Claudaborative Editing 0.4 brings AI writing tools directly into the WordPress block editor. Proofread, review, edit, translate, plan posts with an interactive compose mode, and get pre-publish metadata suggestions, all without leaving Gutenberg.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve been taking an iterative approach to building Claudaborative Editing: build something to prove that the underlying concept works, then evolve on top of that. The first two iterations were answering a question I had: <a href="https://pento.net/2026/03/28/claudaborative-editing-0-2-now-with-500-more-collaboration/">can an LLM genuinely improve the writing process</a>? Along the way, I found a more important question: <a href="https://pento.net/2026/04/07/the-human-in-the-loop/">can it be done without contributing to the masses of generated slop we see</a>? </p>



<p class="wp-block-paragraph">Having seen the underlying idea working, I needed to answer the next question: can it be brought into the actual writing environment? Can it be useful, but keep out of the way?</p>



<p class="wp-block-paragraph">Can you talk to an LLM from within WordPress, and have it talk back? I think I&#8217;m onto something, and it&#8217;s <a href="https://core.trac.wordpress.org/ticket/60000">alot</a> of fun.</p>



<h2 class="wp-block-heading">Coming to a WordPress Near You</h2>



<p class="wp-block-paragraph">Naturally, the next step was to build a WordPress plugin that provided a straightforward interface to the LLM backend. You still install the tool to run with your local copy of Claude Code, but once it&#8217;s running, you can do everything directly from the block editor. The plugin is waiting to be approved for the WordPress.org plugin directory, but you can <a href="https://github.com/pento/claudaborative-editing/releases">download it directly from the GitHub repo now</a>.</p>



<figure class="wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="640" height="682" data-id="5779" src="https://pento.net/wp-content/uploads/2026/04/menu.png" alt="A screenshot of the Collaborative Editing Menu. It shows 5 options: Compose, Proofread, Review, Edit, and Translate." class="wp-image-5779" srcset="https://pento.net/wp-content/uploads/2026/04/menu.png 640w, https://pento.net/wp-content/uploads/2026/04/menu-282x300.png 282w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="865" data-id="5778" src="https://pento.net/wp-content/uploads/2026/04/edit-1024x865.png" alt="A screenshot of the Edit box, where a user can have the LLM make broad changes to their post." class="wp-image-5778" srcset="https://pento.net/wp-content/uploads/2026/04/edit-1024x865.png 1024w, https://pento.net/wp-content/uploads/2026/04/edit-300x253.png 300w, https://pento.net/wp-content/uploads/2026/04/edit-768x649.png 768w, https://pento.net/wp-content/uploads/2026/04/edit.png 1044w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="838" data-id="5777" src="https://pento.net/wp-content/uploads/2026/04/translate-1024x838.png" alt="A screenshot of the Translate box, where the user can have the LLM translate their post into other languages. Because this is a freeform field, they're not limited to the normal options: they can also translate into weird languages, like &quot;pirate&quot;, or &quot;emoji&quot;." class="wp-image-5777" srcset="https://pento.net/wp-content/uploads/2026/04/translate-1024x838.png 1024w, https://pento.net/wp-content/uploads/2026/04/translate-300x245.png 300w, https://pento.net/wp-content/uploads/2026/04/translate-768x628.png 768w, https://pento.net/wp-content/uploads/2026/04/translate.png 1044w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="419" height="1024" data-id="5794" src="https://pento.net/wp-content/uploads/2026/04/pre-publish-419x1024.png" alt="A screenshot of the pre-publish panel, showing the featured image, a suggested excerpt, and suggestions for new and existing tags and categories to use." class="wp-image-5794" srcset="https://pento.net/wp-content/uploads/2026/04/pre-publish-419x1024.png 419w, https://pento.net/wp-content/uploads/2026/04/pre-publish-123x300.png 123w, https://pento.net/wp-content/uploads/2026/04/pre-publish.png 560w" sizes="auto, (max-width: 419px) 100vw, 419px" /></figure>
</figure>



<p class="wp-block-paragraph">Tools are easily accessible when you need them, but otherwise stay out of your way. You choose how much input you want the LLM to have in your writing: it can fix things up for you, or you can ask it to just leave notes and you&#8217;ll decide how you want to proceed. Personally, I prefer to do the work myself, but everyone can choose their level of comfort.</p>



<p class="wp-block-paragraph">That said, one of the things I often forget to do when writing a post is to tag it properly. If I do remember, I&#8217;m never sure what to tag it with. By the time I get to publishing, I&#8217;m impatient just to get it out in the world! So, now there&#8217;s a button that&#8217;ll give suggestions right before publishing, letting you pick and choose which suggestions to use, and what to drop.</p>



<h2 class="wp-block-heading">Planning is a Conversation</h2>



<p class="wp-block-paragraph">I always start Claude Code in planning mode, and I wanted that for posts, too. That&#8217;s where I started this post, and I can absolutely see myself using this every time I need to write a post. Not to do the writing for me, but to help me organise my thoughts. I opened the Compose mode in the sidebar, I had it summarise the changes that I&#8217;ve made in the last 2 weeks, and present a few options for how to collate them. Some I kept, some I dropped.</p>



<p class="wp-block-paragraph">In a lot of ways, it&#8217;s more like a very advanced <a href="https://en.wikipedia.org/wiki/ELIZA">ELIZA</a>, though rather than just reflecting your words back, it reflects your ideas back in a more structured form.</p>



<h2 class="wp-block-heading">What&#8217;s next</h2>



<p class="wp-block-paragraph">I&#8217;ll be honest, I&#8217;m really happy with how this has turned out so far! I&#8217;d love to hear your feedback as you use it. What would you like to see here? I&#8217;ve already noted down a bunch of ideas that came up just while I was writing this post, so there are definitely more things to come!</p>



<p class="wp-block-paragraph">Go ahead and give it a shot now:</p>



<p class="wp-block-paragraph"><code>npx claudaborative-editing start</code></p>
]]></content:encoded>
					
					<wfw:commentRss>https://pento.net/2026/04/10/claudaborative-editing-0-4-twice-the-fun/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5741</post-id>	</item>
		<item>
		<title>The Human in the Loop</title>
		<link>https://pento.net/2026/04/07/the-human-in-the-loop/</link>
					<comments>https://pento.net/2026/04/07/the-human-in-the-loop/#comments</comments>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Tue, 07 Apr 2026 06:38:33 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Claudaborative Editing]]></category>
		<category><![CDATA[LLM]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5716</guid>

					<description><![CDATA[The 'human in the loop' paradigm works brilliantly for code, where creativity lives in architecture and design. But for writing meant for humans, the act of writing is the creative act, and delegating it to an LLM means delegating your creativity. Here's why I build AI writing tools that assist rather than replace.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you&#8217;ve been paying attention to LLM-based coding tools in the past few months, you&#8217;ll have seen a seismic shift in how they&#8217;re being used. Even 12 months ago, they were little more than glorified auto-complete tools: useful for quickly repeating patterns, but terrible at producing well structured, thoughtful, maintainable code. More recently, however, there seems to have been a new equilibrium reached, where an experienced engineer can guide these tools to consistently produce high quality code. Small course adjustments seem to have an outsized effect, resulting in the &#8220;Human in the Loop&#8221; paradigm that&#8217;s become so popular.</p>



<h2 class="wp-block-heading">Why It Works</h2>



<p class="wp-block-paragraph">&#8220;Code is Poetry&#8221; has been my approach to writing code for as long as I can remember. Software is a form of expression, and the way you create that expression is through code. So, to make beautiful software, you need to write beautiful code. But, what happens when you don&#8217;t need to write code to create the software?</p>



<p class="wp-block-paragraph">Suddenly, the code becomes entirely about outcomes. It needs to be correct, functional, and maintainable, but it doesn&#8217;t need to be seen as a form of expression itself. Instead, the creative decisions move further up the stack, to the architectural level. You can write beautiful software by writing thoughtful specifications, instead.</p>



<p class="wp-block-paragraph">That&#8217;s not to say that technical abilities are suddenly obsolete. You still need to know what&#8217;s possible and realistic to be able to tell the LLM what to build, and to redirect it when it goes in a different direction. You need to be able to read and comprehend the code, you just don&#8217;t need to memorise every function signature.</p>



<h2 class="wp-block-heading">The Temptation</h2>



<p class="wp-block-paragraph">So, if an LLM can write code for me, what else can it do? Marketing copy? Emails? Opinion blog posts? I could ask Claude to write 10 paragraphs on the &#8220;The Human in the Loop&#8221;, but would you have even read this far if you thought this post was LLM generated? Of course not! I can promise you that every word of this post (and every other post on my blog) was written by me.</p>



<h2 class="wp-block-heading">Respect for the Reader</h2>



<p class="wp-block-paragraph">If I want you to read this post, and seriously consider the arguments I&#8217;m making, the least I can do is write it myself. It goes beyond that, however. LLMs can write functional code, but they can&#8217;t write beautiful software. When the text <em>is</em> the creative act, there&#8217;s no way for the LLM to write the text without compromising your creativity. If you&#8217;re the Human in the Loop for a blog post, you&#8217;re not injecting your voice, your perspective, or your personality into the post: you&#8217;re rubber stamping whatever feels good enough, and that&#8217;s a very low bar to clear.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;Good enough&#8221; isn&#8217;t actually good enough. </p>
</blockquote>



<p class="wp-block-paragraph">A measure of the complexity of a written piece of text is called &#8220;perplexity&#8221;. It measures the randomness of how the text flows, and it&#8217;s probably the thing you&#8217;re noticing when you know you&#8217;re reading LLM-generated text, but you can&#8217;t quite articulate why. It&#8217;s an uncanny valley thing: it looks like writing, it reads like writing, it might even flow like writing, but the vibes are off.</p>



<p class="wp-block-paragraph">The good news is, you&#8217;re not going insane, recent research shows that <a href="https://www.researchgate.net/publication/395972099_How_Well_Do_LLMs_Imitate_Human_Writing_Style">there is a measurable difference between human written text, and LLM generated text</a>. LLM generated text is inherently less random, which makes sense when you remember that LLMs are, at their core, giant statistical models that are really good at figuring out &#8220;what&#8217;s the most likely bit of text to come next&#8221;.</p>



<figure class="wp-block-image size-large has-custom-css wp-custom-css-20396e00"><img loading="lazy" decoding="async" width="333" height="1024" src="https://pento.net/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-3.01.26-pm-333x1024.png" alt="" class="wp-image-5720" srcset="https://pento.net/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-3.01.26-pm-333x1024.png 333w, https://pento.net/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-3.01.26-pm-499x1536.png 499w, https://pento.net/wp-content/uploads/2026/04/Screenshot-2026-04-07-at-3.01.26-pm.png 640w" sizes="auto, (max-width: 333px) 100vw, 333px" /></figure>



<h2 class="wp-block-heading">The LLM as the Assistant</h2>



<p class="wp-block-paragraph">That&#8217;s not to say that LLMs are completely useless when it comes to writing, but we need to use them the right way. While they shouldn&#8217;t be generating text, they can absolutely be used to help you write. Over the last month or so, I&#8217;ve been working on <a href="https://pento.net/2026/03/28/claudaborative-editing-0-2-now-with-500-more-collaboration/">Claudaborative Editing</a>, an experiment to see exactly how much they can help with the writing process. I&#8217;ve been building it directly into the WordPress editor, allowing me to plan, write, review, and publish this post from the one place. An LLM assisted, but <em>every word of it was written by me alone</em>. My goal isn&#8217;t to replace the author, or to make it easier to fill the web with LLM-generated dreck, it&#8217;s to help me (and hopefully you, too!) improve your writing, while still keeping it fundamentally yours.</p>



<h2 class="wp-block-heading">Where Does Creativity Live?</h2>



<p class="wp-block-paragraph">When you&#8217;re evaluating these tools, &#8220;can an LLM do this?&#8221; isn&#8217;t the question you need to ask. Instead, think about where the creative part of the process lives. For software, that&#8217;s in the design decisions and the architecture, the final product is the expression of that creativity. The specifics of the implementation don&#8217;t really matter. For a blog post, or any writing for that matter, the creativity lives in the act of writing. To delegate that to an LLM is to delegate your own creativity.</p>



<p class="wp-block-paragraph">Here&#8217;s what I believe: the best uses of LLM tools are when they augment humans, rather than try to replace them. They enhance the inherent creativity of their human operator, they don&#8217;t suppress it.</p>



<p class="wp-block-paragraph">This belief guides how I use LLMs, and how I build tools that help others use LLMs, too. I&#8217;ll be pushing out a new release of Claudaborative Editing in the next few days, I hope you&#8217;ll give it a go!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pento.net/2026/04/07/the-human-in-the-loop/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5716</post-id>	</item>
		<item>
		<title>Claudaborative Editing 0.2: now with 500% more collaboration!</title>
		<link>https://pento.net/2026/03/28/claudaborative-editing-0-2-now-with-500-more-collaboration/</link>
					<comments>https://pento.net/2026/03/28/claudaborative-editing-0-2-now-with-500-more-collaboration/#comments</comments>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 06:35:32 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Claude Code]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5697</guid>

					<description><![CDATA[A week ago, I put together a quick tech demo, showing how an MCP server could be created for Claude Code that hooked directly into Gutenberg&#8217;s Collaborative Editing feature, allowing it to act as a digital collaborator on a post. The demo focused primarily on text generation, but that&#8217;s not really the benefit that I [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A week ago, I put together <a href="https://pento.net/2026/03/20/introducing-claudaborative-editing/">a quick tech demo</a>, showing how an MCP server could be created for Claude Code that hooked directly into Gutenberg&#8217;s Collaborative Editing feature, allowing it to act as a digital collaborator on a post. The demo focused primarily on text generation, but that&#8217;s not really the benefit that I see coming with this kind of tool. Anyone can generate text, then copy/paste it into the editor. The real power comes from directly hooking into the entire post creation and editing process.</p>



<h2 class="wp-block-heading">What&#8217;s New?</h2>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="607" data-id="5711" src="https://pento.net/wp-content/uploads/2026/03/review-notes-1024x607.png" alt="A screenshot of the /review tool running on this post, prior to publication." class="wp-image-5711" srcset="https://pento.net/wp-content/uploads/2026/03/review-notes-1024x607.png 1024w, https://pento.net/wp-content/uploads/2026/03/review-notes-300x178.png 300w, https://pento.net/wp-content/uploads/2026/03/review-notes-768x456.png 768w, https://pento.net/wp-content/uploads/2026/03/review-notes-1536x911.png 1536w, https://pento.net/wp-content/uploads/2026/03/review-notes-2048x1215.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="564" data-id="5714" src="https://pento.net/wp-content/uploads/2026/03/review-processing-1024x564.png" alt="A screenshot of what Claude was doing behind the scenes when it was generating the review notes." class="wp-image-5714" srcset="https://pento.net/wp-content/uploads/2026/03/review-processing-1024x564.png 1024w, https://pento.net/wp-content/uploads/2026/03/review-processing-300x165.png 300w, https://pento.net/wp-content/uploads/2026/03/review-processing-768x423.png 768w, https://pento.net/wp-content/uploads/2026/03/review-processing-1536x847.png 1536w, https://pento.net/wp-content/uploads/2026/03/review-processing.png 1916w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p class="wp-block-paragraph">Since last week&#8217;s release, I&#8217;ve added a host of editing and review tools:</p>



<ul class="wp-block-list">
<li><code>/edit {tell the LLM how you want this post adjusted}</code><br>Automatically make simple (or even not so simple!) edits on your post, giving your writing a little extra polish.</li>



<li><code>/proofread</code><br>Find and automatically fix simple spelling, grammatical, and punctuation issues.</li>



<li><code>/review</code><br>Read the post, and leave notes (using Gutenberg&#8217;s Notes feature!) about suggested improvements to your post. This doesn&#8217;t touch your post content, leaving you to make use of the suggestions as you see fit.</li>



<li><code>/respond-to-notes</code><br>If you&#8217;re happy with the notes left in the review, you can also have it automatically apply them, too!</li>
</ul>



<p class="wp-block-paragraph">On top of that, I&#8217;ve also added an experimental <code>/translate</code> tool, to automatically translate a post into a different language. LLM translation quality varies significantly, though Claude is regularly considered to be quite good. It&#8217;s worth remembering that, like any LLM, the output is only as good as its input. If you&#8217;re translating to a language that it didn&#8217;t have much training data on, it&#8217;ll do a lot worse.</p>



<h2 class="wp-block-heading">Behind The Scenes</h2>



<p class="wp-block-paragraph">The MCP server now does a much better job of making use of the REST API, too: it now handles all block types (and does a pretty good job of guessing how to use blocks provided by plugins!). It can upload media, and it can handle all the post metadata, like categories, tags, excerpt, etc.</p>



<h2 class="wp-block-heading">Getting It Running</h2>



<p class="wp-block-paragraph">Inspired by the recently released <a href="https://make.wordpress.org/meta/2026/03/20/plugin-directory-mcp-server/">WordPress.org MCP server</a>, the install process got a refresh, too. If you&#8217;re running WordPress 7.0, you won&#8217;t even need to copy/paste the application password to connect to your site: just click the connect button in your browser, and your site will send credentials back to the installer! And if you&#8217;d prefer to avoid the magic, there&#8217;s still a <code>--manual</code> option to let you set it up the old-fashioned way.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="372" data-id="5700" src="https://pento.net/wp-content/uploads/2026/03/connect-1024x372.png" alt="A screenshot of the initial installation of the claudaborative-editing MCP server, prompting the user to enter a site to connect to." class="wp-image-5700" srcset="https://pento.net/wp-content/uploads/2026/03/connect-1024x372.png 1024w, https://pento.net/wp-content/uploads/2026/03/connect-300x109.png 300w, https://pento.net/wp-content/uploads/2026/03/connect-768x279.png 768w, https://pento.net/wp-content/uploads/2026/03/connect.png 1452w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Connect</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="577" data-id="5702" src="https://pento.net/wp-content/uploads/2026/03/approve-1024x577.png" alt="The authorisation screen of the site that the MCP server is connecting to." class="wp-image-5702" srcset="https://pento.net/wp-content/uploads/2026/03/approve-1024x577.png 1024w, https://pento.net/wp-content/uploads/2026/03/approve-300x169.png 300w, https://pento.net/wp-content/uploads/2026/03/approve-768x433.png 768w, https://pento.net/wp-content/uploads/2026/03/approve-1536x866.png 1536w, https://pento.net/wp-content/uploads/2026/03/approve.png 1582w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Authorise</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="667" data-id="5701" src="https://pento.net/wp-content/uploads/2026/03/install-1024x667.png" alt="After authorisation, this screenshot shows the continu" class="wp-image-5701" srcset="https://pento.net/wp-content/uploads/2026/03/install-1024x667.png 1024w, https://pento.net/wp-content/uploads/2026/03/install-300x195.png 300w, https://pento.net/wp-content/uploads/2026/03/install-768x500.png 768w, https://pento.net/wp-content/uploads/2026/03/install.png 1388w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Install</figcaption></figure>
</figure>



<h2 class="wp-block-heading">What&#8217;s Next?</h2>



<p class="wp-block-paragraph">This release shows how easy it is for an LLM to talk to your WordPress site. What about the other way? If you&#8217;re working on a post, you don&#8217;t want to have to switch to a terminal to get spell checking done, so how can we provide this kind of functionality directly from the block editor? Let&#8217;s experiment and find out!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pento.net/2026/03/28/claudaborative-editing-0-2-now-with-500-more-collaboration/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5697</post-id>	</item>
		<item>
		<title>Embed All The Things!</title>
		<link>https://pento.net/2026/03/26/embed-all-the-things/</link>
					<comments>https://pento.net/2026/03/26/embed-all-the-things/#comments</comments>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Thu, 26 Mar 2026 03:12:58 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugins]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5677</guid>

					<description><![CDATA[Over 10 years ago, we introduced the oEmbed API to WordPress, expanding how WordPress handled embedding to cover all WordPress sites. It was an intentional decision to focus on oEmbed at the time: we wanted to focus on the embedding mechanism that would give site owners maximum control over what their embeds looked like. The [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Over 10 years ago, we <a href="https://make.wordpress.org/core/2015/09/30/feature-plugin-merge-proposal-oembed/">introduced the oEmbed API to WordPress</a>, expanding how WordPress handled embedding to cover all WordPress sites. It was an intentional decision to focus on oEmbed at the time: we wanted to focus on the embedding mechanism that would give site owners maximum control over what their embeds looked like. The code we wrote back then still runs on tens of millions of WordPress sites every day.</p>



<p class="wp-block-paragraph">There was something extra that continued to bug me, however. What about all the other sites? oEmbed provides rich embed experiences, but not every site needs that. Sometimes, you just need a card with an image and a description, which is where OpenGraph has similarly stood the test of time. It provides a straightforward method for both site owners to create simple, rich embeds, and for service providers like Slack, Discord, or even Apple Messages to safely create a rich card to place alongside links.</p>



<p class="wp-block-paragraph">WordPress has grown since then, too. The big change is Gutenberg, of course, which really brought forward the idea that the editor should be a rich content experience, that shouldn&#8217;t just be reserved for the front end. </p>



<p class="wp-block-paragraph">With that in mind, I build a plugin to handle embedding all the other sites.</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-plugin-directory wp-block-embed-plugin-directory has-custom-css wp-custom-css-6d0daac5"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="e9IUVnEliw"><a href="https://wordpress.org/plugins/opengraph-fallback-embed/">OpenGraph Fallback Embed</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="“OpenGraph Fallback Embed” — Plugin Directory" src="https://wordpress.org/plugins/opengraph-fallback-embed/embed/#?secret=mvpCR5VqLo#?secret=e9IUVnEliw" data-secret="e9IUVnEliw" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p class="wp-block-paragraph">This is a block plugin that tries to avoid you using the block it provides if at all possible! Instead, it hooks into the end of the Embed block rendering process &#8211; if the URL you pasted couldn&#8217;t be embedded all the normal ways, this plugin will try a few more fall back options: OpenGraph, Twitter Card tags, or even just a plain description in the meta tags. It&#8217;s the kind of plugin that you can install, and never have to think about again.</p>



<div class="wp-block-jetpack-tiled-gallery aligncenter is-style-rectangular"><div class=""><div class="tiled-gallery__gallery"><div class="tiled-gallery__row"><div class="tiled-gallery__col" style="flex-basis:66.77022%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png?strip=info&#038;w=600&#038;ssl=1 600w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png?strip=info&#038;w=900&#038;ssl=1 900w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png?strip=info&#038;w=1200&#038;ssl=1 1200w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png?strip=info&#038;w=1500&#038;ssl=1 1500w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png?strip=info&#038;w=1800&#038;ssl=1 1800w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png?strip=info&#038;w=2000&#038;ssl=1 2000w" alt="" data-height="2560" data-id="5684" data-link="https://pento.net/?attachment_id=5684" data-url="https://pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png" data-width="2521" src="https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-3-1008x1024.png?ssl=1" data-amp-layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:33.22978%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png?strip=info&#038;w=600&#038;ssl=1 600w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png?strip=info&#038;w=900&#038;ssl=1 900w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png?strip=info&#038;w=1200&#038;ssl=1 1200w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png?strip=info&#038;w=1500&#038;ssl=1 1500w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png?strip=info&#038;w=1800&#038;ssl=1 1800w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png?strip=info&#038;w=2000&#038;ssl=1 2000w" alt="" data-height="2560" data-id="5682" data-link="https://pento.net/?attachment_id=5682" data-url="https://pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png" data-width="2521" src="https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-1-1008x1024.png?ssl=1" data-amp-layout="responsive"/></figure><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png?strip=info&#038;w=600&#038;ssl=1 600w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png?strip=info&#038;w=900&#038;ssl=1 900w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png?strip=info&#038;w=1200&#038;ssl=1 1200w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png?strip=info&#038;w=1500&#038;ssl=1 1500w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png?strip=info&#038;w=1800&#038;ssl=1 1800w,https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png?strip=info&#038;w=2000&#038;ssl=1 2000w" alt="" data-height="2560" data-id="5683" data-link="https://pento.net/?attachment_id=5683" data-url="https://pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png" data-width="2521" src="https://i0.wp.com/pento.net/wp-content/uploads/2026/03/screenshot-2-1008x1024.png?ssl=1" data-amp-layout="responsive"/></figure></div></div></div></div></div>



<p class="wp-block-paragraph">One of the nicest things about WordPress is how pluggable it is. Even as a long time WordPress Core developer, I don&#8217;t think everything needs to land in Core, sometimes a feature can live as handy little plugin. If you like everything just magically embedding, give this plugin a try!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pento.net/2026/03/26/embed-all-the-things/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5677</post-id>	</item>
		<item>
		<title>Introducing claudaborative-editing</title>
		<link>https://pento.net/2026/03/20/introducing-claudaborative-editing/</link>
					<comments>https://pento.net/2026/03/20/introducing-claudaborative-editing/#comments</comments>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Fri, 20 Mar 2026 05:41:37 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Claude Code]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5656</guid>

					<description><![CDATA[Human editor&#8217;s note: The post below was written by Claude Code. I personally don&#8217;t use LLMs to write for me, but I figured I&#8217;d make an exception just this once. Using entirely LLM-generated content isn&#8217;t a workable approach to writing good copy, but I&#8217;m interested in seeing how we can use these tools to interact [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Human editor&#8217;s note: The post below was written by Claude Code. I personally don&#8217;t use LLMs to write for me, but I figured I&#8217;d make an exception just this once. Using entirely LLM-generated content isn&#8217;t a workable approach to writing good copy, but I&#8217;m interested in seeing how we can use these tools to interact with and improve the writing process!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">I&#8217;ve been using Claude Code for more and more of my daily work, and one thing that&#8217;s been bugging me is the gap between &#8220;Claude wrote some text&#8221; and &#8220;that text is on my blog.&#8221; There&#8217;s always a manual copy-paste step, formatting fixups, and the general friction of moving content between two worlds. So I built a bridge.</p>



<p class="wp-block-paragraph"><a href="https://github.com/pento/claudaborative-editing">claudaborative-editing</a> is an MCP server that lets Claude Code collaboratively edit WordPress posts in real time, right alongside you in the Gutenberg block editor. You open a post in your browser, Claude opens the same post from the terminal, and you both edit together — changes sync live via WordPress&#8217;s collaborative editing protocol.</p>



<p class="wp-block-paragraph">In fact, this very post is being written by Claude, using the tool. It&#8217;s claudaborative-editing all the way down.</p>



<h2 class="wp-block-heading">How it works</h2>



<p class="wp-block-paragraph">WordPress 7.0 introduced real-time collaborative editing, built on <a href="https://yjs.dev/">Yjs</a> — the same CRDT technology that powers tools like Figma and Notion. claudaborative-editing speaks this protocol natively: it maintains a Yjs document that mirrors your post, syncing changes back and forth with WordPress via HTTP polling. The CRDT handles merging, so simultaneous edits from you and Claude just work — no conflicts, no overwrites.</p>



<p class="wp-block-paragraph">Getting started takes about 30 seconds:</p>



<pre class="wp-block-code"><code>npx claudaborative-editing setup</code></pre>



<p class="wp-block-paragraph">The setup wizard validates your WordPress credentials and gives you the <code>claude mcp add</code> command to register the server. After that, Claude Code can connect to your site and start editing.</p>



<h2 class="wp-block-heading">What Claude can do</h2>



<p class="wp-block-paragraph">The server exposes a full set of block-editing tools. Claude can list and open posts, read the current block structure, insert and remove blocks, update text content and attributes, move blocks around, and save. It works at the block level — the same granularity Gutenberg uses — so edits are precise and merge-safe.</p>



<p class="wp-block-paragraph">There&#8217;s a nice touch, too: when Claude writes or updates text, the changes stream into the editor character by character, like watching someone type. It&#8217;s a small thing, but it makes the collaboration feel real.</p>



<p class="wp-block-paragraph">You can also see Claude show up in the collaborators list — it registers its presence through the same awareness protocol that shows human editors, so you know when it&#8217;s active on a post.</p>



<h2 class="wp-block-heading">What&#8217;s next</h2>



<p class="wp-block-paragraph">While writing this post, I ran into a few things I wished the tool could do — so I filed some issues to track them:</p>



<ul class="wp-block-list">
<li><a href="https://github.com/pento/claudaborative-editing/issues/1">Media upload and image insertion</a> — I can write the text for a blog post, but I can&#8217;t include screenshots or diagrams yet. Being able to upload and insert images would make for much more complete drafts.</li>



<li><a href="https://github.com/pento/claudaborative-editing/issues/2">Post metadata</a> — categories, tags, excerpts, featured images, and publication status. Right now a human still needs to handle all of that before hitting publish.</li>



<li><a href="https://github.com/pento/claudaborative-editing/issues/3">Closing a post without disconnecting</a> — currently the only way to stop editing a post is to disconnect from WordPress entirely, which means you need to reconnect if you want to open a different post.</li>
</ul>



<p class="wp-block-paragraph">The tool is open source and available on <a href="https://github.com/pento/claudaborative-editing">GitHub</a>, and you can install it right now from npm with <code>npx claudaborative-editing setup</code>. You&#8217;ll need WordPress 7.0 or later with collaborative editing enabled — flip the switch under Settings → Writing, create an application password, and you&#8217;re good to go.</p>



<p class="wp-block-paragraph">I&#8217;m looking forward to seeing what people do with it. If you try it out, I&#8217;d love to hear how it goes — file issues, send PRs, or just let me know. Happy claudaborating! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f91d.png" alt="🤝" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://pento.net/2026/03/20/introducing-claudaborative-editing/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5656</post-id>	</item>
		<item>
		<title>Introducing Tidy Weather</title>
		<link>https://pento.net/2026/03/16/introducing-tidy-weather/</link>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Mon, 16 Mar 2026 03:16:59 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tidy Weather]]></category>
		<category><![CDATA[Flutter]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5641</guid>

					<description><![CDATA[I&#8217;ve been dabbling in the Flutter world for several years, and I recently published my first Flutter-based app! It&#8217;s a clean (one could even say, &#8220;tidy&#8221;) little weather app, giving you a quick overview of everything you need to know in the day. Because it&#8217;s Australia-only, it does have a very Australia-centric view on what [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve been dabbling in the Flutter world for several years, and I recently published my first Flutter-based app! It&#8217;s a clean (one could even say, &#8220;tidy&#8221;) little weather app, giving you a quick overview of everything you need to know in the day.</p>



<p class="wp-block-paragraph">Because it&#8217;s Australia-only, it does have a very Australia-centric view on what you need to know: aside from the usual weather info, it also includes live UV measurements, official fire danger forecasts, and air quality measurements. For folks who feel strongly about the BoM&#8217;s changes to their radar, it also uses a more classic radar view!</p>



<p class="wp-block-paragraph">If you&#8217;re in Australia and looking for a new weather app, I&#8217;d love for you to download it and try it out!</p>


		<div class="og-fallback-embed">
			<div class="og-fallback-embed__image"><img decoding="async" src="https://tidyweather.com/images/tidyweather/feature-graphic.png" alt="Tidy Weather" loading="lazy" /></div>			<div class="og-fallback-embed__content">
				<p class="og-fallback-embed__provider">tidyweather.com</p>
				<p class="og-fallback-embed__title">
					<a href="https://tidyweather.com/" target="_blank" rel="noopener noreferrer">Tidy Weather</a>
				</p>
									<p class="og-fallback-embed__description">Weather, in your Pocket.</p>
							</div>
		</div>
		]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5641</post-id>	</item>
		<item>
		<title>Correcting a (personal, made-up) Travesty</title>
		<link>https://pento.net/2026/03/11/correcting-a-personal-made-up-travesty/</link>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Wed, 11 Mar 2026 00:40:48 +0000</pubDate>
				<category><![CDATA[Music]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Claude Code]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5611</guid>

					<description><![CDATA[I&#8217;ve listened to Triple J&#8217;s Hottest 100 countdown for decades. Long after I grew out of being the target demographic, I&#8217;ve enjoyed it as a small window into what&#8217;s popular just a little outside of mainstream, and I make an effort to listen to the entire countdown every year. This year I had a hashtag-proud-dad [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve listened to <a href="https://en.wikipedia.org/wiki/Triple_J_Hottest_100">Triple J&#8217;s Hottest 100</a> countdown for decades. Long after I grew out of being the target demographic, I&#8217;ve enjoyed it as a small window into what&#8217;s popular just a little outside of mainstream, and I make an effort to listen to the entire countdown every year. This year I had a hashtag-proud-dad moment when my daughter heard a song playing and told me it was one of her favourites &#8211; I&#8217;d never heard of the artist! The song was quite listen-able, there&#8217;s hope for the kids!</p>



<p class="wp-block-paragraph">There is, however, one thing that&#8217;s always bugged me about the Hottest 100: <a href="https://music.apple.com/au/room/6742852033">they put their playlists in the wrong order</a>. If you go to listen to a previous Hottest 100, you&#8217;re going to be listening from #1 to #100, instead of in countdown order, as the gods of music democracy always intended.</p>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-f56f613f wp-block-group-is-layout-flex">
<p class="wp-block-paragraph">Now, when I say it&#8217;s bugged me, I do need to clarify the level of annoyance: mild irritation on the odd occasion at most, certainly never enough to do anything about it. That is, until the current iteration of LLM-based coding agents have started to demonstrate a reasonable ability to one-shot moderately complex software. And so, I threw the problem at Claude, and it quickly popped out a basic working solution!</p>
</div>



<figure class="wp-block-image alignright size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="718" src="https://pento.net/wp-content/uploads/2026/03/Screenshot-2026-03-11-at-10.33.23-am-1024x718.png" alt="Screenshot of the Apple Music auth screen, connecting my app to my Apple Music account." class="wp-image-5627" style="width:449px;height:auto" srcset="https://pento.net/wp-content/uploads/2026/03/Screenshot-2026-03-11-at-10.33.23-am-1024x718.png 1024w, https://pento.net/wp-content/uploads/2026/03/Screenshot-2026-03-11-at-10.33.23-am-300x210.png 300w, https://pento.net/wp-content/uploads/2026/03/Screenshot-2026-03-11-at-10.33.23-am-768x538.png 768w, https://pento.net/wp-content/uploads/2026/03/Screenshot-2026-03-11-at-10.33.23-am.png 1278w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Claude&#8217;s solution certainly wasn&#8217;t perfect: it required a bit of lateral thinking to get it feature complete. Working with Apple Music, the MusicKit API doesn&#8217;t let you upload playlist cover art, but the Apple Music macOS app does. So, I got it to first collect all the cover art, then use a small AppleScript to upload the cover art to the playlist through the desktop app!</p>



<p class="wp-block-paragraph">This is where I think LLM coding tools really show their strengths, and where I think the job of Software Engineer isn&#8217;t going away any time soon. They&#8217;re a great way to write software or features that otherwise wouldn&#8217;t be a high enough priority to be built, but they still need expert input to build the right thing. From a human perspective, clearly the playlists needed cover art, but Claude wrote it off as being too hard after trying to do it just with the MusicKit API. It needed someone to a) know that the Apple Music app could upload playlist art, and b) it&#8217;s possible to write an AppleScript to automate that. By definition, LLM-based tools deal in statistically likely connections, so they&#8217;re not going to come up with a lateral solution on their own.</p>



<p class="wp-block-paragraph">If you&#8217;d like to run the tool yourself (noting that you&#8217;ll need an Apple Developer account), I&#8217;ve <a href="https://github.com/pento/tidy-hottest-100">made the repository public here</a>. If you&#8217;d just like to listen to old Hottest 100 playlists the way the gods of music intended, you should be able to see them on my profile, or search for &#8220;hottest 100 countdown&#8221; in the Apple Music app.</p>



<style data-wp-block-html="css">
* { margin: 0; padding: 0; box-sizing: border-box; }

  .am-embed {
    --am-red: #fc3c44;
    --am-pink: #fa2d55;
    --am-bg: #1a1a1e;
    --am-surface: #2a2a2e;
    --am-text: #f5f5f7;
    --am-muted: #a1a1a6;
    --am-radius: 16px;

    font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
    width: 100%;
    max-width: 420px;
  }

  .am-embed a {
    text-decoration: none;
    color: inherit;
    display: block;
  }

  .am-card {
    background: var(--am-bg);
    border-radius: var(--am-radius);
    overflow: hidden;
    position: relative;
    box-shadow: 0 4px 24px rgba(0,0,0,0.3);
  }

  /* Top gradient bar */
  .am-gradient-bar {
    height: 4px;
    background: linear-gradient(90deg, #fc3c44, #fa2d55, #d43b8a, #9b59b6, #fc3c44);
    background-size: 200% 100%;
    animation: shimmer 4s ease-in-out infinite;
  }

  @keyframes shimmer {
    0%, 100% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
  }

  .am-content {
    padding: 24px;
    display: flex;
    align-items: center;
    gap: 18px;
  }

  /* Apple Music icon */
  .am-icon {
    width: 56px;
    height: 56px;
    border-radius: 14px;
    background: linear-gradient(135deg, #fc3c44 0%, #d43b8a 50%, #9b59b6 100%);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    position: relative;
    box-shadow: 0 2px 12px rgba(252, 60, 68, 0.3);
  }

  .am-icon svg {
    width: 30px;
    height: 30px;
    fill: white;
  }

  .am-info {
    flex: 1;
    min-width: 0;
  }

  .am-label {
    font-size: 11px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--am-muted);
    margin-bottom: 4px;
  }

  .am-name {
    font-size: 18px;
    font-weight: 600;
    color: var(--am-text);
    line-height: 1.2;
    margin-bottom: 2px;
  }

  .am-handle {
    font-size: 14px;
    color: var(--am-muted);
    font-weight: 400;
  }

  /* Listen on button */
  .am-cta {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--am-red);
    color: white;
    padding: 8px 16px;
    border-radius: 980px;
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.01em;
    margin-top: 12px;
    white-space: nowrap;
  }

  .am-cta svg {
    width: 14px;
    height: 14px;
    fill: currentColor;
  }

  /* Subtle noise texture overlay */
  .am-card::after {
    content: '';
    position: absolute;
    inset: 0;
    background: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
    pointer-events: none;
    border-radius: var(--am-radius);
  }

  /* Equalizer bars animation */
  .am-eq {
    display: flex;
    align-items: flex-end;
    gap: 2px;
    height: 18px;
    flex-shrink: 0;
    margin-left: auto;
    padding-left: 12px;
  }

  .am-eq span {
    width: 3px;
    border-radius: 1.5px;
    background: var(--am-red);
    animation: eq 1.2s ease-in-out infinite;
  }

  .am-eq span:nth-child(1) { height: 30%; animation-delay: 0s; }
  .am-eq span:nth-child(2) { height: 70%; animation-delay: 0.15s; }
  .am-eq span:nth-child(3) { height: 50%; animation-delay: 0.3s; }
  .am-eq span:nth-child(4) { height: 90%; animation-delay: 0.45s; }
  .am-eq span:nth-child(5) { height: 40%; animation-delay: 0.6s; }

  @keyframes eq {
    0%, 100% { transform: scaleY(1); }
    50% { transform: scaleY(0.3); }
  }
</style>

<div class="am-embed">
  <a href="https://music.apple.com/profile/pento" target="_blank" rel="noopener noreferrer">
    <div class="am-card">
      <div class="am-gradient-bar"></div>
      <div class="am-content">
        <!-- Apple Music Icon -->
        <div class="am-icon">
          <svg viewBox="0 0 122.88 122.88" xmlns="http://www.w3.org/2000/svg">
            <path d="M47.76,86.16v-38.4c0-1.44,0.8-2.32,2.4-2.64l33.12-6.72c1.76-0.32,2.72,0.48,2.88,2.4v29.28 c0,2.4-3.6,4-10.8,4.8c-13.68,2.16-11.52,25.2,7.2,18.96c7.2-2.64,8.4-9.6,8.4-16.56V21.12c0,0,0-4.8-4.08-3.6l-40.8,8.4 c0,0-3.12,0.48-3.12,4.32v48.72c0,2.4-3.6,4-10.8,4.8c-13.68,2.16-11.52,25.2,7.2,18.96C46.56,100.08,47.76,93.12,47.76,86.16 L47.76,86.16z"></path>
          </svg>
        </div>

        <div class="am-info">
          <div class="am-label">Apple Music</div>
          <div class="am-name">Gary Pendergast</div>
          <div class="am-handle">@pento</div>
          <div class="am-cta">
            <svg viewBox="0 0 24 24"><path d="M8 5v14l11-7z"></path></svg>
            Follow on Apple Music
          </div>
        </div>

        <!-- Animated EQ bars -->
        <div class="am-eq">
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
        </div>
      </div>
    </div>
  </a>
</div>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5611</post-id>	</item>
		<item>
		<title>Keeping up with Claude</title>
		<link>https://pento.net/2026/02/06/keeping-up-with-claude/</link>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Fri, 06 Feb 2026 08:06:41 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Claude Code]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5603</guid>

					<description><![CDATA[I&#8217;ve been experimenting with Claude Code quite a bit recently, and found myself wanting to be able to view my usage at a glance. Unfortunately, Anthropic don&#8217;t yet provide this information in a format consumable by a status line helper, so I&#8217;ve hacked together a little script that&#8217;ll do it for you. I have it [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve been experimenting with Claude Code quite a bit recently, and found myself wanting to be able to view my usage at a glance. Unfortunately, Anthropic don&#8217;t yet provide this information in a format consumable by a status line helper, so I&#8217;ve hacked together a little script that&#8217;ll do it for you.</p>



<p class="wp-block-paragraph">I have it set to show me how much of my 5 hour cap I&#8217;ve used (the solid bar), how far through the 5 hour window we are (the <code>*</code> in the progress bar), as well as my 7d usage and how full the context currently is. It&#8217;ll change colours to warn you when you&#8217;re potentially going to hit your limit.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="846" height="184" src="https://pento.net/wp-content/uploads/2026/02/image-1.png" alt="Screenshot of the Claude Code CLI tool, showing my custom status line running." class="wp-image-5605" srcset="https://pento.net/wp-content/uploads/2026/02/image-1.png 846w, https://pento.net/wp-content/uploads/2026/02/image-1-300x65.png 300w, https://pento.net/wp-content/uploads/2026/02/image-1-768x167.png 768w" sizes="auto, (max-width: 846px) 100vw, 846px" /></figure>



<p class="wp-block-paragraph">Here&#8217;s <a href="https://gist.github.com/pento/d5cd21682486f83e2328cbb7861262d3">a gist with the files you need</a>: copy the scripts to your <code>~/.claude/scripts</code> directory, and add the settings to your <code>~/.claude/settings.json</code>. Run <code>~/.claude/scripts/refresh-usage.sh --force</code> to get fresh data immediately.</p>



<p class="wp-block-paragraph">Given that it&#8217;s unofficial behaviour, it may break or get you banned at any time, but I hope not. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5603</post-id>	</item>
	</channel>
</rss>