const project = "Empa";
A custom WordPress theme system built solo from scratch over 1+ year at JJ-NET OY. Empa gives content editors a clean, intentional editing experience — blocks are installed on demand, patterns enforce their dependencies, and usage is tracked across pages. Now powering major Finnish client sites.
const problem = {
The default Gutenberg editor gives every site the same cluttered block library — dozens of blocks content editors do not need, cannot control, and often misuse. For an agency maintaining 150+ client sites, this creates inconsistency, content breakage, and constant maintenance overhead.
There was no clean way to give each client a curated, intentional editing experience without forking themes repeatedly or writing one-off solutions per site.
const goal = {
Build a single theme architecture that any client site could extend — with a clean editing baseline, a managed block library, dependency resolution, and multisite support. One system, maintained in one place, deployed everywhere.
The system had to be operable by non-technical content editors without developer involvement for day-to-day block management.
The editor starts with only p and h1. No default blocks, no noise. Every block is intentional — added on demand by the content editor, not dumped in by default.
A React-powered admin panel lets editors browse and install blocks from a remote library. Blocks are registered automatically on install — no manual PHP required.
Gutenberg patterns can declare block dependencies. If a required block is not installed, the pattern installation is blocked until the dependency is satisfied — automatically.
The system tracks which blocks are used across which pages. Before removing a block, editors can see exactly where it is in use — preventing silent content breakage.
Blocks can be built in React with ACF field groups, or as standard Gutenberg blocks. Both are first-class citizens in the block manager.
Empa supports WordPress Multisite out of the box. A built-in child theme creator lets new sites spin up with a consistent base while maintaining independence.
┌──────────────────────────────────────────────────────────┐
│ Empa Theme System │
├──────────────────────────┬───────────────────────────────┤
│ WordPress / PHP │ React Admin Panel │
│ │ │
│ ┌────────────────────┐ │ ┌─────────────────────────┐ │
│ │ Clean-slate theme │ │ │ Block Manager UI │ │
│ │ (p + h1 only) │ │ │ Browse · Install · Remove│ │
│ └────────────────────┘ │ └─────────────────────────┘ │
│ │ │
│ ┌────────────────────┐ │ ┌─────────────────────────┐ │
│ │ Block Registry │ │ │ Dependency Resolver │ │
│ │ Auto-register │ │ │ Pattern install guard │ │
│ └────────────────────┘ │ └─────────────────────────┘ │
│ │ │
│ ┌────────────────────┐ │ ┌─────────────────────────┐ │
│ │ Usage Tracker │ │ │ Multisite Support │ │
│ │ Per-page index │ │ │ Child theme creator │ │
│ └────────────────────┘ │ └─────────────────────────┘ │
└──────────────────────────┴───────────────────────────────┘
│ │
┌───────┴───┐ ┌───────┴──────┐
│ ACF Blocks│ │ Gutenberg │
│ (React) │ │ Native Blocks│
└────────────┘ └─────────────┘One theme architecture replaces dozens of one-off solutions. Any new client site extends Empa rather than starting from scratch.
Designed, architected, and built entirely alone over 1+ year — no team, no spec, no prior system to reference.
Sites in the JJ-NET OY ecosystem. Major Finnish clients including Helsinki City and the Finnish Museums Association.
Code is company property and cannot be open-sourced. The case study documents the architecture and technical decisions.