Advanced Old School Revival
Advanced Old School Revival features a complex character creator, the game’s core rules, and a game master’s guide.
WordPress Extend, or WPX, is the WordPress framework behind this site. I rebuilt it in 2026 for a new kind of collaboration: with AI agents that read the code, update it, and document what they changed.
Every subsystem and component explains itself in files future agents can find. An AGENTS.md file sets the rules, a generated index points to over 111 skill files, and each component carries a contract for its inputs, outputs, and markup. Claude Code and Codex read the same files and work in the environment.
The framework doesn’t impose any particular kind of site, even though it’s built around WordPress. This one includes a 3D game, scrolljacking animations, a filterable portfolio, a blog, and a contact system, all built from the same native blocks and components.
Also: WordPress, Gutenberg, HTML5, JavaScript, PHP, REST APIs, Sass, Vite.
WordPress Extend 2026 is a custom PHP and WordPress theme with native Gutenberg blocks and editor controls. Advanced Custom Fields supports its structured content, JavaScript handles browser behavior, and Sass supplies the styles. Vite builds the frontend assets, with REST APIs supporting the theme’s application interfaces.
Also: Software + IT.
The software and information technology industry develops applications, computing systems, and services that help people and organizations manage information and perform work. I’ve built websites for businesses specializing in enterprise software, databases, collaboration tools, and IT infrastructure.
Also: Web Development, Accessibility, Agentic Engineering, AI Image Generation, AI Workflows, Brand Identity, Copywriting & Editing, Performance Optimization, UI/UX Design, Web Design.
Branding, writing, and editing establish the site’s voice, while web and interface design shape its presentation. Development includes accessibility and performance work alongside the custom publishing tools. Codex supports the agentic engineering process, and directed AI imagery forms part of the visual workflow.
A Self-documenting System
I’ve found agents work best when they receive proper guidance before they touch code. Each registered skill opens with front matter that explains what it covers:
---
name: cta-component
description: CTA native Gutenberg block contract.
---Code language: YAML (yaml)
During development, a Vite watcher gathers that front matter into a single index with one line per skill. An agent searches the index by path instead of reading it:
$ rg -n -F "presentation/components/blocks/cta/" .agents/skills/skill-router/references/skill-index.md
66:- `cta-component` | `presentation/components/blocks/cta/.agents/skills/cta-component/SKILL.md` | CTA native Gutenberg block contract.Code language: Bash (bash)
The match names the owner and its skill. The agent reads that skill and the component’s contract, edits the files they describe, and updates the guidance when the behavior changes. A change to the CTA block reads about 51 KB this way, less than 1 percent of the theme’s 6.2 MB of source.
Each square is one of the theme’s 1,018 PHP, JavaScript, and Sass files, in path order. Teal squares are the files this task edits.
Agent Roles
Eight agent roles handle the specialized work, and each is defined once, as a TOML file in .agents/agents. Codex registers those files through its project config:
# .codex/config.toml
[agents.implementer]
config_file = "../.agents/agents/implementer.toml"
# .agents/agents/implementer.toml
name = "implementer"
sandbox_mode = "workspace-write"
model = "gpt-6.1-sol"
model_reasoning_effort = "medium"Code language: TOML, also INI (ini)
Claude Code mirrors the same roles as subagents in .claude/agents, with Claude models matched to each job:
---
name: implementer
model: sonnet
effort: medium
---Code language: YAML (yaml)
AGENTS.md governs how the roles work together. The primary session passes a ledger of settled decisions with every handoff, confirms a write route before any agent edits, and gives each file one writer at a time. Reviewers report findings without changing the work, and accessibility and security reviews run only when I ask for them.
The Back end
On the PHP side, namespaces mirror folders. One autoloader in functions.php resolves any WPX class from its path, so subsystems boot themselves and components load only when a page uses them:
spl_autoload_register(function ($class) {
$prefix = 'WPX\\';
if (strpos($class, $prefix) !== 0) {
return;
}
$relative = substr($class, strlen($prefix));
$normalized = str_replace('\\', '/', $relative);
$path = get_template_directory() . '/' .
strtolower($normalized) . '.php';
if (file_exists($path)) {
require_once $path;
return;
}
// Falls back to kebab-case filenames for multi-word class names.
});Code language: PHP (php)
Templates and blocks render components by slug. The renderer turns the slug into a class, asks it for data, and returns its markup unchanged:
// single-wpx-portfolio.php
echo wpx_component( 'interfaces/hero', [ 'post_id' => get_the_ID(), 'post_type' => 'wpx-portfolio' ] );Code language: PHP (php)
Each component keeps its code, its editor script, and its documentation in one folder:
presentation/components/blocks/cta/
├── block.json
├── colors.js
├── component.php
├── editor.js
├── motif.php
├── networks.json
├── readme.txt
├── schema.php
└── .agents/skills/cta-component/
├── SKILL.md
└── references/contract.mdThe Front end
In the browser, markup names its controller and JavaScript supplies the behavior. The CTA block renders with data-controller="cta", and the controller in cta.js works only inside that root, so the block can appear on a page any number of times:
// assets/js/components/blocks/blocks-custom/cta.js
import FadeUp from '../shared/fadeUp.js'
import { selectNetwork, networkMarkup } from '../shared/ctaMotif.js'
export default class Cta extends FadeUp {
static targets = '.block-cta-copy > *, .block-cta-action'
init() {
super.init()
const svg = this.root.querySelector('.block-cta-network')
if (!svg) return
const network = selectNetwork(this.root.dataset.ctaNetwork)
svg.innerHTML = networkMarkup(network)
svg.dataset.network = network.id
this.root.dataset.ctaNetwork = network.id
}
}Code language: JavaScript (javascript)
Vite discovers the entry points, builds the theme's JavaScript and Sass, and keeps the skill index current during development.
The Abilities Framework
WPX also describes itself to agents outside the repository. Thirteen adapters register with the WordPress Abilities API and mark themselves public for MCP clients. Most are read-only views of site content, such as the portfolio, a project's context (or in the case of this site, the City leaderboard), and one composes portfolio markup for review without saving it:
// abilities/abilities.php
wp_register_ability( 'wpx/' . $definition['name'], [
'label' => $definition['label'],
'description' => $definition['description'],
'category' => 'wpx',
'input_schema' => $definition['input'],
'output_schema' => $definition['output'],
'permission_callback' => static fn( $input ) => $permission( Support::input( $input ) ),
'execute_callback' => static fn( $input ) => $adapter::execute( Support::input( $input ) ),
'meta' => [
'public' => true,
'show_in_rest' => true,
'mcp' => [ 'public' => true ],
],
] );Code language: PHP (php)A Quick and dirty foundation
The framework leaves the shape of the site open. The same blocks and components produce a transit map that plays as you scroll on How I Work, a 3D city on the home page, consulting pages with interactive diagrams, a filterable portfolio, and a blog organized into series.
Because each part of the site documents itself, a new kind of page starts the same way every time: find the owner, read its contract, and extend it.
What Else Can We Build?
WPX is baby steps into a new paradigm of building websites. I may have started with WordPress almost two decades ago, but as I like to say: So Much More is Possible™ today.
This same approach organizes Fetch, an MCP server I built for Atlantic K9. Take a look at that project next:
A fantastic job … His work completely transformed our web presence. He’s patient, thoughtful and talented. An innovator and a tireless worker. I recommend him highly and without reservation.
Co-Founder & Director — Disquiet International
No one Can Do it All
When you hire me, you gain access to a private network of digital specialists. Each freelancer owns their own business, and I’ve personally worked with each of them over the years.