{"id":151765,"date":"2026-04-01T17:14:51","date_gmt":"2026-04-02T00:14:51","guid":{"rendered":"https:\/\/ma.tt\/?p=151765"},"modified":"2026-04-01T18:01:54","modified_gmt":"2026-04-02T01:01:54","slug":"taxonomist","status":"publish","type":"post","link":"https:\/\/ma.tt\/2026\/04\/taxonomist\/","title":{"rendered":"Taxonomist"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I&#8217;m really excited to introduce a project I worked on with various AI agents the other night, which I think represents a new way we might build things in the future.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, the problem: My WordPress site has 5,600+ posts going back decades, and I had some categories that were old and I didn&#8217;t really use anymore, and I wasn&#8217;t happy with the structure. Every time I made a new post, it irked me a little, and I had this long-standing itch to go back and clean up all my categories, but I knew it was going to be a slog.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let me present<span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">&nbsp;<a href=\"https:\/\/github.com\/m\/taxonomist\" target=\"_blank\">Taxonomist<\/a>, a new open-source tool you can run with one copy-and-paste<\/span> command line that solves this problem. Here&#8217;s the idea:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>You run this code in your terminal, and it spins up a Claude Code instance that asks you for your URL.<\/li>\n\n\n\n<li>Then it takes that and figures out what type of site you have, which APIs are available, and starts downloading all your posts locally for analysis.<\/li>\n\n\n\n<li>Sub-agents analyze every post against your current categories and thinks about suggesting new ones.<\/li>\n\n\n\n<li>It previews all the changes.<\/li>\n\n\n\n<li>Tries a variety of ways to authenticate against your site and make all the changes.<\/li>\n\n\n\n<li>Logs everything locally, so anything is reversible later.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">THIS IS VERY ALPHA. PROBABLY BUGGY. BE CAREFUL WITH IT. PATCHES WELCOME. MAYBE MAKE A BACKUP OF YOUR SITE BEFORE YOU CHANGE IT.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It kind of just worked. I ran it live against ma.tt and it cleaned up a ton of stuff pretty much exactly how I wanted. But there&#8217;s a lot of weird stuff happening here, so I don&#8217;t know quite what this is yet.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>It&#8217;s very non-deterministic! There is some pre-written code, and probably could be more, but a lot of the code is generated on the fly by your agent. This creates interesting bugs where people testing with less powerful models had some odd behavior.<\/li>\n\n\n\n<li>I kind of want a directory of these useful AI agents on WordPress.org, but also, there&#8217;s something a little strange about trusting a remote shell script to run on your machine.<\/li>\n\n\n\n<li>I tested this with Claude, but there&#8217;s no reason Codex couldn&#8217;t use the repo in the exact same way, and I&#8217;d love to improve the quick start script to start by detecting all the agents you have, asking which you&#8217;d like to use, and also which directory you&#8217;d like to work in. I think we could kill the <code>cd taxonomist-main &amp;&amp; claude \"start\"<\/code> part of it.<\/li>\n\n\n\n<li>Because much of the code and commands are generated on the fly from prompts, it&#8217;s very resilient! I&#8217;ve seen people try it, and it ran into errors with libraries or whatever, but it just figured out how to work around them.<\/li>\n\n\n\n<li>I&#8217;d love it if, at the end of every session, there was a moment for self-reflection where the agent would take the repository and suggest upstream issues and PRs based on anything that went wrong. Then this could recursively self-improve very quickly.<\/li>\n\n\n\n<li>There are some obvious improvements to this, for example, doing this for tags. Sometimes it creates too many categories when you might only want 3-5 for your theme.<\/li>\n\n\n\n<li>One fun thing is a bunch of the work of this just uses public WordPress APIs, so you can run it against any site! I like using <a href=\"https:\/\/distributed.blog\/\">distributed.blog<\/a> as a demo. It&#8217;ll still do all the fun downloading and analysis and everything, you just won&#8217;t be able to make changes.<\/li>\n\n\n\n<li>I now have a local cache of all my WordPress posts I can do other interesting things with, and that&#8217;s cool.<\/li>\n\n\n\n<li>The logging and reverting probably still has some bugs in it.<\/li>\n\n\n\n<li>You can riff with it along the way, so for example, it suggested I get rid of my <a href=\"https:\/\/ma.tt\/category\/audrey\/\">Audrey category<\/a> because it didn&#8217;t have enough posts, and I asked it to look at all the companies on <a href=\"https:\/\/audrey.co\/\">Audrey.co website<\/a> and categorize any posts that talk about them as Audrey, which created like 50 more.<\/li>\n\n\n\n<li>I want to check the GitHub repo for any updates before it starts, and maybe periodically, because it&#8217;s iterating and improving really fast.<\/li>\n\n\n\n<li>It&#8217;s not the default but the entire thing is way more pleasant if you run it with skip-permissions. So testing I usually run the one-liner, exit, resume with skip.<\/li>\n\n\n\n<li>You can see some of my prompt history in the Github but I apologize it&#8217;s not comprehensive, I also used Gemini and Codex with this and got lots of value from them.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">So, not sure what this is, but please check it out, play with it, submit improvements or ideas, and think about what&#8217;s next. Might host a Zoom or something to brainstorm.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The final thing I say is that this was a very different process of writing software for me. Instead of staying at the computer the entire time, I found myself going away for a bit, napping and dreaming about the code, coming back with new ideas and riffing on them. Maybe I&#8217;ll return to my <a href=\"https:\/\/en.wikipedia.org\/wiki\/Polyphasic_sleep\">Uberman polyphasic sleep days<\/a>? Nap-driven development?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">BTW I have lots of thoughts and feedback for <a href=\"https:\/\/github.com\/emdash-cms\/emdash\">Emdash<\/a> but I thought this was more interesting, will try to get that out later tonight. One preview: TinyMCE is a regression; they should use <a href=\"https:\/\/github.com\/wordpress\/gutenberg\">Gutenberg<\/a>! We designed it for other CMSes and would be fun to have some common ground to jam on.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m really excited to introduce a project I worked on with various AI agents the other night, which I think represents a new way we might build things in the future. First, the problem: My WordPress site has 5,600+ posts going back decades, and I had some categories that were old and I didn&#8217;t really &hellip; <a href=\"https:\/\/ma.tt\/2026\/04\/taxonomist\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Taxonomist<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"fullscreen","default_image_id":54207,"font":"","enabled":true,"token":"eyJpbWciOiJodHRwczpcL1wvbWEudHRcL2ZpbGVzXC8yMDIxXC8wNVwvUGhvdG8tb24tMjAyMC0xMC0yOC1hdC0yLjA1LVBNLTEtMTAyNHg2ODIuanBnIiwidHh0IjoiVGF4b25vbWlzdCIsInRlbXBsYXRlIjoiZnVsbHNjcmVlbiIsImZvbnQiOiIiLCJibG9nX2lkIjoxMDQ3ODY1fQ.uXyX_b0_07TgkI00IkSQxkmvU7B7oIlaJq9qy-Xl6NoMQ"},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[2817,34],"tags":[],"class_list":["post-151765","post","type-post","status-publish","format-standard","hentry","category-ai","category-wordpress"],"parsely":{"version":"1.1.0","canonical_url":"http:\/\/ma.tt\/2026\/04\/taxonomist\/","smart_links":{"inbound":0,"outbound":0},"traffic_boost_suggestions_count":0,"meta":{"@context":"https:\/\/schema.org","@type":"NewsArticle","headline":"Taxonomist","url":"http:\/\/ma.tt\/2026\/04\/taxonomist\/","mainEntityOfPage":{"@type":"WebPage","@id":"http:\/\/ma.tt\/2026\/04\/taxonomist\/"},"thumbnailUrl":"","image":{"@type":"ImageObject","url":""},"articleSection":"AI","author":[{"@type":"Person","name":"Matt"}],"creator":["Matt"],"publisher":{"@type":"Organization","name":"Matt Mullenweg","logo":"http:\/\/ma.tt\/files\/2021\/05\/Photo-on-2020-10-28-at-2.05-PM-1.jpg"},"keywords":[],"dateCreated":"2026-04-02T00:14:51Z","datePublished":"2026-04-02T00:14:51Z","dateModified":"2026-04-02T01:01:54Z"},"rendered":"<script type=\"application\/ld+json\" class=\"wp-parsely-metadata\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"NewsArticle\",\"headline\":\"Taxonomist\",\"url\":\"http:\\\/\\\/ma.tt\\\/2026\\\/04\\\/taxonomist\\\/\",\"mainEntityOfPage\":{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/ma.tt\\\/2026\\\/04\\\/taxonomist\\\/\"},\"thumbnailUrl\":\"\",\"image\":{\"@type\":\"ImageObject\",\"url\":\"\"},\"articleSection\":\"AI\",\"author\":[{\"@type\":\"Person\",\"name\":\"Matt\"}],\"creator\":[\"Matt\"],\"publisher\":{\"@type\":\"Organization\",\"name\":\"Matt Mullenweg\",\"logo\":\"http:\\\/\\\/ma.tt\\\/files\\\/2021\\\/05\\\/Photo-on-2020-10-28-at-2.05-PM-1.jpg\"},\"keywords\":[],\"dateCreated\":\"2026-04-02T00:14:51Z\",\"datePublished\":\"2026-04-02T00:14:51Z\",\"dateModified\":\"2026-04-02T01:01:54Z\"}<\/script>","tracker_url":"https:\/\/cdn.parsely.com\/keys\/ma.tt\/p.js"},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4oB3-DtP","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":937,"url":"https:\/\/ma.tt\/2004\/05\/sing-it\/","url_meta":{"origin":151765,"position":0},"title":"Sing It From the Rafters","author":"Matt","date":"May 22, 2004","format":false,"excerpt":"WordPress 1.2 is available. I'm at a loss for words at the moment, so I'll just quote the features list...","rel":"","context":"In &quot;Music&quot;","block_context":{"text":"Music","link":"https:\/\/ma.tt\/category\/music\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1505,"url":"https:\/\/ma.tt\/2004\/09\/wordpress-tags\/","url_meta":{"origin":151765,"position":1},"title":"WordPress Tags","author":"Matt","date":"September 6, 2004","format":false,"excerpt":"Using tags intsead of categories in WordPress, includes patch.","rel":"","context":"In &quot;WordPress&quot;","block_context":{"text":"WordPress","link":"https:\/\/ma.tt\/category\/wordpress\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":983,"url":"https:\/\/ma.tt\/2004\/05\/victor-lombardi\/","url_meta":{"origin":151765,"position":2},"title":"Victor Lombardi","author":"Matt","date":"May 29, 2004","format":false,"excerpt":"Victor Lombardi now uses WordPress. Look at how the information architects go crazy with sub-categories. I love it!","rel":"","context":"In &quot;Personal&quot;","block_context":{"text":"Personal","link":"https:\/\/ma.tt\/category\/personal\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1493,"url":"https:\/\/ma.tt\/2004\/09\/blosxom-to-wordpress\/","url_meta":{"origin":151765,"position":3},"title":"Blosxom to WordPress","author":"Matt","date":"September 1, 2004","format":false,"excerpt":"HOWTO migrate from Blosxom to Wordpress. Uses the MT export format, which means things like hierarchical categories don't transfer over. Hat tip: D'Ancy Norman.","rel":"","context":"In &quot;WordPress&quot;","block_context":{"text":"WordPress","link":"https:\/\/ma.tt\/category\/wordpress\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1636,"url":"https:\/\/ma.tt\/2004\/10\/jish-is-back\/","url_meta":{"origin":151765,"position":4},"title":"Jish is Back","author":"Matt","date":"October 13, 2004","format":false,"excerpt":"Jish stopped blogging a few months ago but he is back and better than ever with Destinova, a traveller's weblog. Great usage of WordPress, sub-categories, and the link manager. Not to mention the blog itself. :)","rel":"","context":"In &quot;WordPress&quot;","block_context":{"text":"WordPress","link":"https:\/\/ma.tt\/category\/wordpress\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1810,"url":"https:\/\/ma.tt\/2004\/12\/wordpress-heat-map\/","url_meta":{"origin":151765,"position":5},"title":"WordPress Heat Map","author":"Matt","date":"December 20, 2004","format":false,"excerpt":"Matt Kingston does a weighted list or heat map plugin for categories, nice! See it in action on his archives. He should drop that in the new repository (which I would say in his comments but they're broken at the moment).","rel":"","context":"In &quot;WordPress&quot;","block_context":{"text":"WordPress","link":"https:\/\/ma.tt\/category\/wordpress\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/posts\/151765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/comments?post=151765"}],"version-history":[{"count":9,"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/posts\/151765\/revisions"}],"predecessor-version":[{"id":151784,"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/posts\/151765\/revisions\/151784"}],"wp:attachment":[{"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/media?parent=151765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/categories?post=151765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ma.tt\/wp-json\/wp\/v2\/tags?post=151765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}