Skip primary navigation?

WordPress Extend 2026

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.

WordPress for the Agentic Era

It’s a series of tubes, really.

WPX uses native Gutenberg blocks in a hybrid, block-based theme that supports its own build script and plug-and-play services.

A Self-documenting System

WPX is a theme that explains itself.

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.

Route, then read
Task

    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.

    0 KBread for this task
    
    
    Two example tasks. For a change to the CTA block, the agent reads AGENTS.md, finds one matching line in the generated skill index, reads the block’s skill and contract, and edits four source files: about 51 kilobytes in all, less than one percent of the theme’s 6.2 megabytes of source. A change to the portfolio query reads about 39 kilobytes. After each change, the documenter updates the guidance and the Vite watcher refreshes the index.

    Agent Roles

    A single team for different models.

    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.

    One team, two runtimes
    
    
    Ledger
    The theme defines eight agent roles once, in TOML files under .agents/agents. Codex registers them through .codex/config.toml, and Claude Code mirrors them in .claude/agents, so each runtime runs the same roles with models suited to the job. A typical task: the primary session asks the architect who owns the code, sends the implementer the settled constraints and a verified write route, has the tester review the finished patch without editing it, and has the documenter bring the skills and contracts up to date. Accessibility and security reviews run only on request.

    The Back end

    Components that render themselves.

    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.md

    The Front end

    Dynamic behavior without a front-end framework.

    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

    An interface for other agents.

    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

    WordPress patterns are present, but they don't dictate the approach.

    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?

    We're only just getting started.

    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.

    Jeff Parker

    Co-Founder & Director — Disquiet International

    No one Can Do it All

    Good thing I know the right people to call.

    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.