<?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>Mon, 13 Apr 2026 06:01:47 +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>Guardrails for Agentic Development</title>
		<link>https://pento.net/2026/04/13/guardrails-for-agentic-development/</link>
					<comments>https://pento.net/2026/04/13/guardrails-for-agentic-development/#respond</comments>
		
		<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>
					
					<wfw:commentRss>https://pento.net/2026/04/13/guardrails-for-agentic-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<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/#respond</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>0</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>
					<comments>https://pento.net/2026/03/16/introducing-tidy-weather/#respond</comments>
		
		<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>
					
					<wfw:commentRss>https://pento.net/2026/03/16/introducing-tidy-weather/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<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>
		<item>
		<title>HOWTO: Fork WordPress</title>
		<link>https://pento.net/2024/10/17/howto-fork-wordpress/</link>
					<comments>https://pento.net/2024/10/17/howto-fork-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[Gary]]></dc:creator>
		<pubDate>Thu, 17 Oct 2024 01:20:23 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[HOWTO]]></category>
		<guid isPermaLink="false">https://pento.net/?p=5587</guid>

					<description><![CDATA[Congratulations on your decision to fork WordPress! You&#8217;ve taken on a mammoth task, I&#8217;m impressed with your willingness step up to the challenge of a lifetime. I&#8217;m here to give some advice on the things you might not have thought about yet, and what you&#8217;ll need to help the long term success of your fork. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Congratulations on your decision to fork WordPress! You&#8217;ve taken on a mammoth task, I&#8217;m impressed with your willingness step up to the challenge of a lifetime. I&#8217;m here to give some advice on the things you might not have thought about yet, and what you&#8217;ll need to help the long term success of your fork.</p>



<p class="wp-block-paragraph">Forking, I&#8217;m please to share, <a href="https://wordpress.org/news/2024/10/spoon/">is beautiful</a>. It continues to be an important feature of the Open Source ethos, even if it has become more involved as projects have matured. Forking is a valuable tool for Open Source communities to demonstrate that they believe a project should move in a different direction.</p>



<p class="wp-block-paragraph">Before we get into the details, however, I do have to offer a few disclaimers. This post is <strong>not</strong>:</p>



<ul class="wp-block-list">
<li>An active call for people to fork WordPress. In the spirit of Open Source, I think it&#8217;s important that we publicly talk about what this process looks like, even if it can be an uncomfortable discussion.</li>



<li>An announcement that I&#8217;m forking WordPress. I don&#8217;t have the free time for that.</li>



<li>An offer to wrangle your fork of WordPress. I am happy to discuss your plans and offer advice, though.</li>
</ul>



<p class="wp-block-paragraph">Disclaimers out of the way, let&#8217;s begin!</p>



<h2 class="wp-block-heading">Before you Announce</h2>



<p class="wp-block-paragraph">First of all, let&#8217;s talk about that big old elephant in the room: the current level of instability in the WordPress world. I wouldn&#8217;t be surprised to learn that this the major factor in motivating your fork. Unfortunately, this approach won&#8217;t get you very far, so the first thing you need to do is take any feelings you have about it, and set them aside. You need to decide what you&#8217;re in favour of, instead. What are are the positive motivational factors that will make you jump out of bed, and push this project forward for the next decade or more? What will motivate others to join you for the long haul?</p>



<figure class="wp-block-pullquote"><blockquote><p>Build a community, not an angry mob.</p></blockquote></figure>



<p class="wp-block-paragraph">Think carefully about what your fork is going to be named. I&#8217;m willing to bet that you first jumped to calling it <em>{Adjective}</em>Press, or perhaps something with &#8220;WP&#8221; in the name. That&#8217;s a great idea if you&#8217;re planning on your project being forever defined as a protest against WordPress, but you need to think beyond that. How will you define your brand to keep it relevant for decades to come?</p>



<p class="wp-block-paragraph">Oh, and make sure you can get the domains and social media handles for your name. Having to try and get them later is just expensive and frustrating.</p>



<p class="wp-block-paragraph">Talk to people. Not just your circle of friends and colleagues who agree with you, find people who can offer different perspectives, and decide how your fork is going to help them. Talk to WordPress core contributors (not just committers!), and learn their take on it. Can you present an argument that would convince long term contributors to switch to working on your fork?</p>



<p class="wp-block-paragraph">Figure out funding, at least enough to bootstrap your project. As much as I&#8217;d love to be, most of us are not post-economic. You can only get so far as a volunteer project, you&#8217;re going to need at least some people to be paid to work on it. There are big, complex problems that crop up along the way, it&#8217;s hard to solve them if everyone has to context switch between their day job, and their volunteer work.</p>



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



<p class="wp-block-paragraph">If you&#8217;ve made it this far into starting your fork, give yourself a pat on the back. You&#8217;ve made it much further than many others do. Your next challenge is deciding the process of building it. You could stick with the <a href="https://en.wikipedia.org/wiki/Benevolent_dictator_for_life">BDFL</a> approach, which certainly has benefits, particularly when first starting out. It might be hard to sell what many folks see as a key weakness in WordPress, though. Perhaps you might like to explore a democratic governance model, or some sort of hybrid approach. Everything has a set of benefits and trade-offs, you&#8217;ll need to decide what works for you.</p>



<p class="wp-block-paragraph">You&#8217;re going to have a bunch of technical dirty work to figure out. Where will the code be hosted? How will you track issues? Provide support? Discuss plans? Build community? Track data? Host themes, and plugins? What will you do about mobile apps?</p>



<p class="wp-block-paragraph">At first glance, each of these are fairly straightforward to answer, but it&#8217;s very easy to get lost in the possibilities. My advice here is simple: pick something, use it until it stops being valuable. You can always switch to something different later. Switching governance models might be hard, but switching server-side tools is relatively easy.</p>



<figure class="wp-block-pullquote"><blockquote><p>Do the dirty work, but don&#8217;t get stuck in the weeds.</p></blockquote></figure>



<p class="wp-block-paragraph">Start thinking about how you&#8217;ll build your in-person community. Meetups, conferences, hack days, helping people move to your project, there are countless opportunities here to build your community.</p>



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



<p class="wp-block-paragraph">WordPress has three substantial factors that have made it largely unassailable for many years.</p>



<p class="wp-block-paragraph">First, there&#8217;s the massive community that&#8217;s built up around WordPress over the years. Regular meetups and conferences are an integral part of building a popular Open Source project. You can&#8217;t really piggy back off the work that WordPress has done over the years here, either. The only way forward is to put in the work to build and maintain a community that you&#8217;re proud to be a part of.</p>



<p class="wp-block-paragraph">Second, there&#8217;s the vast selection of plugins and themes that are available to download for free. The quality between options vary wildly, of course, but that&#8217;s largely irrelevant. The fact that so many options exist means there really is something for everyone. You&#8217;re going to need to figure out how to either maintain long term compatibility with existing WordPress plugins and themes, or you&#8217;re going to find yourself reproducing them all.</p>



<p class="wp-block-paragraph">Finally, you&#8217;ll need to deal with inertia. The vast majority of WordPress site owners have no need or motivation to change, so you need to make it easy (ideally, your fork would be a drop-in replacement), and beneficial. What will your fork do better to solve real problems?</p>



<h2 class="wp-block-heading">Tell Your Friends!</h2>



<p class="wp-block-paragraph">It&#8217;s around about this point that you&#8217;re probably getting ready to talk about your fork publicly. Go ahead, you&#8217;ve earned it!</p>



<p class="wp-block-paragraph">Launch day is inevitably a mix of strong emotions. Elation if you get a huge positive response from the public, maybe discouragement if the public response is a bit more muted. Relief at having made it this far. Optimism about the future. Maybe even some doubt could creep in that you&#8217;re the right person to be wrangling such a huge endeavour. Whatever you end up experiencing, try not to stress about it too much. It&#8217;s a big day, but what really defines your project is what you do with it tomorrow. Next week. Next year.</p>



<p class="wp-block-paragraph">Go right back to the start, and remind yourself of the positive reasons that you&#8217;re choosing to build this project. Tell the world those positive reasons, and welcome anyone who wants to join you on the journey.</p>



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



<p class="wp-block-paragraph">Not every day is launch day, however. Most of your days will be&#8230; kinda boring, to be honest. That&#8217;s a good thing! Too much excitement will inevitably burn out you and your community. Sustainable effort, day after day, is how you build something to last.</p>



<figure class="wp-block-pullquote"><blockquote><p>It&#8217;s a marathon, not a sprint.</p></blockquote></figure>



<p class="wp-block-paragraph">Of course, there&#8217;ll be ups and downs. It&#8217;s always okay to go back to the start, and reminder yourself (and your community!) of the positive reasons that you&#8217;re all working together on this.</p>



<p class="wp-block-paragraph">Oh, and please try to remember that one day, you&#8217;re probably not going to be the right person to lead your project any more. This isn&#8217;t something to fear, or to look forward to, really: projects, communities, and individuals all grow and change. It&#8217;s probably going to be a weird time when you get to this point, but it doesn&#8217;t have to be a time of upheaval and uncertainty. If you&#8217;ve run the project well, you should hopefully have a deep pool of talented folks who can step in to continue what you began.</p>



<h2 class="wp-block-heading">Have Fun!</h2>



<p class="wp-block-paragraph">Finally, it would be remiss of me not to remind you to have fun! It&#8217;s easy to get lost in conflict at times, but it&#8217;s important to remember that&#8230; it&#8217;s just a CMS. It&#8217;s not going to be the end of the world if you take time away from the project, it&#8217;s actively beneficial for you to have a life outside of the internet. Friends, family, pets, hobbies: make time for the things that matter in your life.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pento.net/2024/10/17/howto-fork-wordpress/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5587</post-id>	</item>
	</channel>
</rss>