const project = "Empa";
A custom WordPress theme system built over 1+ year at JJ-NET OY — not just a theme, but a complete block ecosystem with a React-powered admin panel, remote block and pattern libraries with dependency resolution, a full dashboard widget suite, and built-in agency tools that replace entire plugins. Now live across 10+ Finnish client sites.
const problem = {
JJ-NET OY manages 150+ WordPress client sites. The default Gutenberg editor gives every site the same cluttered block library — blocks editors do not need, cannot control, and often misuse. Each new client site needed one-off solutions, forked themes, and constant developer intervention for basic content management tasks.
There was no consistent architecture. No shared block library. No way to give clients a clean, intentional editing experience without starting from scratch every time.
const goal = {
Build one theme architecture that any client site could extend. A shared remote block library developers could contribute to and sites could pull from. A pattern system that enforces its own dependencies. An admin toolkit that replaces plugins. One system, maintained in one place, deployed everywhere.
Non-technical content editors had to be able to manage blocks, scripts, and content without developer involvement for day-to-day tasks.
Activate or deactivate any block — individually or in bulk. Filter by status (installed, not installed, active, inactive) and namespace (acf, core, empa, woocommerce). Interactive search. Covers everything from core WordPress blocks to WooCommerce to custom ACF blocks. The editor sees only what you enable.
JJ-NET custom blocks (ACF and React) stored on a remote server, fetched via API and browsable with visual previews. Download a block — it installs and activates automatically, appears in the block manager with correct namespace. Delete a block — it deactivates, then removes every instance from every page and post. No broken block warnings, ever. Modal confirmation on delete.
Remote pattern library with visual previews. Before a pattern can be installed, the system checks all block dependencies. If core blocks are inactive — activate them first. If custom blocks are missing — download and activate them first. Install button stays locked until all dependencies are satisfied. Delete pattern removes all traces from all pages and posts.
Create a new child theme by typing a name and clicking create. Generates all necessary folder structure and files following Empa conventions automatically — ensuring block downloads and pattern installs work correctly on every new site. Supports WordPress Multisite. Multiple child themes can coexist, each independently activated.
License key management per installation — status, expiration, domain binding, updates toggle. Foundation for commercial distribution — license keys will gate access to the remote block and pattern libraries, enabling JJ-NET to distribute Empa to other agencies as a licensed product.
Role-based capability control — toggle matrix with WordPress roles as columns and Empa capabilities as rows. Administrator controls exactly which roles can access FSE, block manager, site scripts, template parts, and other Empa features. Granular access without any plugin.
Personalised greeting by username, shows role, posts and pages owned, last login time, session duration, and most recent activity (last created or edited page/post). Every user sees their own context on login — not generic site stats.
Real-time block inventory — total blocks, core, custom, enabled, disabled, patterns, reusable, remote. Top 5 most used blocks shown in widget. Full report page shows every block with usage count, exact pages and posts where used (with links), and search/filter. Built for safe block removal — see where a block lives before you touch it.
One-click access to the Full Site Editor directly from the dashboard. Solves a real pain point — WordPress users are consistently confused about the difference between the page editor and FSE. This removes the friction entirely.
Posts, pages, custom post types, taxonomies, publishing activity, recently published content with author and timestamp. When something breaks on a client site, the first question is always who touched it last. This answers that in one glance.
Users broken down by role — admin, editor, author, contributor, subscriber. Registration activity, most active author with publish count, recent registrations, recent activity feed. Essential for multi-user agency sites.
Three tabs: Server (PHP version, MySQL, nginx, memory limit, disk usage with warnings), Security (HTTPS, failed logins, WP version, file permissions audit, inactive plugins, debug mode), Cleanup (post revisions, auto-saves, trash, expired transients, orphaned metadata — all with one-click clean buttons).
Images, video, audio, documents breakdown with percentages, total library size, unattached files warning with review link, recent uploads. Unattached media is a common hidden bloat issue on agency sites — this surfaces it immediately.
┌─────────────────────────────────────────────────────────────┐
│ Empa Theme System │
├─────────────────────────────┬───────────────────────────────┤
│ WordPress / PHP │ React Admin Panel │
│ │ (Empa Theme Management) │
│ ┌─────────────────────┐ │ │
│ │ FSE Theme (base) │ │ Blocks tab │
│ │ Clean-slate editor │ │ Block Library (remote API) │
│ └─────────────────────┘ │ Pattern Library + resolver │
│ │ License manager │
│ ┌─────────────────────┐ │ Child Theme creator │
│ │ Dashboard Widgets │ │ Permissions matrix │
│ │ 7 custom widgets │ │ │
│ └─────────────────────┘ └───────────────────────────────┤
│ │ Admin Toolkit │
│ ┌─────────────────────┐ │ │
│ │ Child Theme(s) │ │ Site Scripts (CPT) │
│ │ Auto-generated │ │ Template Parts editor │
│ │ Multisite ready │ │ CPT Manager │
│ └─────────────────────┘ │ Taxonomy Manager │
└─────────────────────────────┴───────────────────────────────┘
│ │
┌───────┴───────┐ ┌───────┴────────┐
│ Remote Block │ │ Remote Pattern │
│ Server (API) │ │ Server (API) │
└───────────────┘ └────────────────┘Live across 10+ Finnish client sites via JJ-NET OY — including Helsinki City, Finnish Museums Association, and Netox.
Site Scripts replaces Script inserter plugins. CPT Manager replaces Custom Post Type UI. Taxonomy Manager replaces add-on taxonomy plugins. Block Intelligence replaces block analytics plugins. All built into the theme.
License system foundation built. Empa is architected to be distributed to other agencies as a licensed product — block and pattern access gated by license key.
Code is company property and cannot be open-sourced. Happy to walk through the system in detail during an interview — a demo recording is also available.