The Minnow Framework

What just happened? I started my Monday by upgrading my Claude Code account from the $20 to $100/month plan. By Tuesday, I was running it through 3 massive roadmaps. One roadmap for decoupling the Minnow Framework from WordPress while still maintaining database compatibility. Another roadmap for a plugin analyzer tool. And yet another roadmap for a plugin generation tool. On Thursday, Opus 4.6 was release,d so I started using that. By the end of the week, I had most of what I typically use in WordPress recreated and working. Fully independent and packed with a bunch of my personal wish list features.

Well, mostly working 😃.

Image

Let me take a step back. I didn’t start the week intending to create a CMS framework. Minnow is my playground for exploring crazy ideas around WordPress. If you want background context, I recommend reading these posts:

I was simply thinking that I should throw my extra, unused Claude Code usage at something impossible like Minnow. I view Minnow in the same way I would view an individual wanting to build an operating system from scratch. A crazy, ambitious project with no end. Something that could take someone their entire lifetime to see completed. Rewriting WordPress with a modern codebase would be this crazy. Or would it be?

A clean break means I can do whatever I want.

That’s precisely what I did. Here is what I ended up building:

  • admin/ – Dark mode admin built with Vue and Tailwind
  • api/ – Clean API with working application passwords
  • data/ – Clean folder for user data plugins and uploads
  • minnow – CLI capability of sending email, backups, magic login, installer, api tester, and an HTTP client
  • YAML only plugins – No PHP, JS, or CSS
  • Recreated popular plugins in Minnow like Gravity Forms, Gravity SMTP, Code Snippets and Redirection. (Not fully tested but fairly functional)
  • Custom fields and custom field groups built into framework with ability to import/export ACF field groups.
Image
Image

What! No PHP in plugins? How dare you…

Okay, hear me out. If PHP isn’t allowed in plugins, it could solve nearly every issue we have with WordPress today. It doesn’t mean there isn’t PHP. It just means all behavior and UI responsibilities are moved into the framework itself. This architecture means:

  • No more plugin conflicts
  • No more 3rd party security issues
  • No more code duplicate functionality
  • No more jQuery or JS/CSS conflicts

All of that can and should be handled by the framework itself. The framework’s job is to expose all of the building blocks, all of the behaviors, and all of the UI to those who wish to extend the framework.

So much of WordPress development is recreating the same thing that’s been recreated by everyone else. Recreating a licensing library. Recreating a mail handler. Recreating a form builder. Recreating functions for a redirection class. By not allowing PHP, it gives the framework an opportunity to grow and actually solve things that others can benefit from.

Why YAML?

I picked YAML because it felt like the right mix of human readability and yet works well for nested chains of logic. I tried doing a markdown version; however, that didn’t go very well. So the process of porting a WordPress plugin to Minnow looks roughly like this:

  • Run the WordPress plugin folder through the Minnow plugin analyzer.
tools/plugin-analyzer/bin/analyze --plugin=/path/to/plugin [--output=/path/to/output-dir]
  • That will output a good starting blueprint plugin.yaml.
  • Have Claude Code review the existing WordPress plugin to enhance the blueprint, and also fill any missing behavior or UI components needed within the framework itself.
  • Run the Minnow plugin generator.
tools/plugin-generator/bin/generate --manifest=/path/to/plugin.yaml

You can also use the CLI: minnow plugin:generate and minnow plugin:generate. The framework reads the YAML blueprint and generates the needed PHP and Vue components. I was actually shocked the first time I got it to produce something like this:

Image

Here is a look at data/plugins/minnow-snippets/plugin.yaml https://app.warp.dev/block/B2PlnYBGQ5K1huK1DppJ03. That’s it. The entire plugin is declared in that single file. To improve the AI-enhanced part of this process, I created a Claude Code skill /minnow-convert. This greatly improves the conversion process as the AI will ask for screenshots of the UI. Supplying pickings of the existing admin UI is key for AI to create a high-quality blueprint.

Image

The theory is, the more plugins I attempt to get working with Minnow, the larger and more mature the framework will become.

Other developer delights

Just a few other random goodies I packed in:

Very clean PHP: Post::find(1), Option::get('siteurl') and User::all().

Image

A CLI for sending emails minnow mail:send is slated for the future. This comes baked in with a mail queueing system minnow mail:queue:status and minnow mail:queue:process.

Image

Built-in audit logging.

Image

Comments are disabled by default.

WARNING: Do not port a site from WordPress to Minnow.

Did I mention I created this in 1 week? Absolutely do not run this on a production web server. It’s unfinished, untested, and just an experiment. That said, here is a quick run through what that actually looks like. Many things will break as Minnow doesn’t work with WordPress themes and plugins. This is more of a proof of concept that shows Minnow could be used in place of WordPress with a WordPress host. Some modifications would be required.

Image
Image

At this point, you should be able to sign in to Minnow with your existing WordPress credentials. The frontend is a very basic blog-style theme, as I haven’t created a theme system yet. However, on the backend some things are viewable like pages, posts, media, users, roles, revisions, and custom fields. There is far more that’s not working than is working. That said, this should not be possible with a week of AI coding.

Image

What now?

For Minnow, there are many holes. No theme system, no editor, no ecommerce, and so many missing building blocks. However, after a week, I can say I believe it’s truly possible to build something great here. So I plan to continue building and hacking on Minnow. Want to follow along? See here: https://github.com/minnow-framework and here https://minn.xyz.

The world is changing. I can’t help but think about how damaging these new AI tools are going to be to WordPress plugin companies and SaaS companies in general. I’m personally guilty of it. I’ve stopped using a WordPress plugin or two because the features and functionality were accidentally recreated within my own custom plugins.

I am a believer that whenever one thing becomes automated and unnecessary, it means we humans now have time to focus on something that is more impactful and meaningful. Software development, as a career, is ending. We are entering an era where the translations from thoughts and ideas to applications will be accessible to everyone. While developers are the early adopters, this will quickly become something anyone can do. So the one thing I keep telling myself: you’re not thinking big enough. There has never been a better time to pursue some truly insane and ground-breaking ideas.

Austin Ginder
Austin Ginder