// hooks fire as they always have
add_filter('the_content', …);
do_action('wp_enqueue_scripts');
register_post_type('review', …);
// theme template hierarchy untouched
get_template_part('parts/hero');
// WP-CLI reads posts as usual
$ wp post list --post_type=page The WordPress plugin you don't have to apologize for.
You maintain WordPress because the client pays for WordPress — not because you enjoy shortcode soup, untyped widget props, or shipping a page-builder runtime to every visitor. Atlas is one dynamic Gutenberg block. Components are TypeScript. Pages compile to JSON manifests in your repo. The plugin renders server-side; the browser receives HTML.
Where the current dev experience hurts.
Four pains filed under "the cost of doing WordPress." Atlas moves authoring out of the database.
- 01 § authoring lives in the database
PHP shortcode soup.
Custom layouts live as nested shortcodes or serialized blocks inside post_content. Not reviewable, not portable across themes. You can't grep a database column the way you grep a repo.
- 02 § no compiler, no contract
No types on widget props.
Block attributes are untyped JSON. ACF field groups are runtime structures. A renamed field silently empties pages until someone notices in production. No compiler stands between you and a broken render.
- 03 § editor runtime in production
Page-builder JS ships to visitors.
Elementor, Divi, and friends bundle the editor runtime into the front-end. A small page drags a heavy runtime before the hero paints. Caching papers over the symptom — the payload is still there on first load.
- 04 § webpack before features
Custom blocks are their own project.
Stand up @wordpress/scripts, wire webpack, write JSX and PHP twice. Every site, fresh setup before the first line of feature code.
What Atlas gives you.
Four guarantees you do not get from any other builder shipping inside WordPress today. Each one is a property of the architecture, not a feature you can lose to a roadmap pivot.
- § TYPES
TypeScript-typed component props.
Components are TSX. Props are typed against a schema you export. The compiler catches renamed fields, missing values, and shape mismatches before a manifest ships. Your reviewer is tsc.
tsc as reviewer - § GIT
Manifests as JSON in git.
A page is a deterministic JSON file. Branch it, diff it in a pull request, tag a release, roll a single page back without touching the database. Code review covers content.
one PR per page change - § PAYLOAD
Zero JS for static page chrome.
The plugin renders manifests server-side as HTML. No editor runtime to bundle, no hydration for the page shell. Motion sections opt into hydration as islands with client:load, client:visible, or client:idle.
0 bytes JS by default - § INTEROP
Plays nicely with everything else.
Atlas registers one dynamic block. It doesn't replace the theme, override template hierarchy, or capture the editor. Yoast indexes the rendered HTML. WooCommerce shortcodes render. Your caching plugin still caches.
one block in the registry
The same content, in three views.
A component you wrote. The manifest the compiler emitted. The HTML the plugin rendered. Same content end-to-end.
type Props = {
heading: string;
items: { title: string; body: string }[];
};
export const FeatureRow = ({ heading, items }: Props) => (
<section class="feature-row">
<h2>{heading}</h2>
<ul>
{items.map(i => (
<li>
<h3>{i.title}</h3>
<p>{i.body}</p>
</li>
))}'
</ul>
</section>
); {
"type": "FeatureRow",
"props": {
"heading": "Why Atlas",
"items": [
{ "title": "Types", "body": "…" },
{ "title": "Git", "body": "…" }
]
},
"island": false
} <section class="feature-row">
<h2>Why Atlas</h2>
<ul>
<li><h3>Types</h3><p>…</p></li>
<li><h3>Git</h3><p>…</p></li>
</ul>
</section>
<!-- 0 bytes of JS --> § Same component in, same HTML out, every render. The manifest is the contract.
What you keep.
Atlas is one block. The rest of WordPress works the way it has for twenty years.
// one dynamic block, one render callback
register_block_type('atlas/page', [
'render_callback' => 'atlas_render',
]);
// that's the entire surface area - § YOUR THEME
Your theme.
Atlas doesn't override template hierarchy. The theme sets typography, header, footer, and post templates as it does today. The block renders inside it.
- § YOUR PLUGINS
Your existing plugins.
Yoast indexes the rendered HTML. WP Rocket and LiteSpeed cache it. WooCommerce shortcodes and blocks still render. Atlas adds one block to the registry — no collisions.
- § YOUR CONTRACTS
Hooks, filters, WP-CLI, REST API.
The plugin renders through the standard block pipeline. Filters like the_content fire normally. WP-CLI operates on posts as usual. The REST API returns rendered HTML for blocks.
- § YOUR NETWORK
Multisite.
One plugin install across the network. Each site points at its own manifest source. No per-site licensing, no activation count, no phone-home that throttles the network admin's day.
What the GPL plugin gets you, free.
GPL-2.0+. Not a free tier with a feature wall, not a trial. The thing you install is the thing you can fork, audit, and vendor.
- Fork it. Renderer, block registration, manifest reader — all in the plugin. If the project stalls or moves in a direction you can't follow, you keep shipping the version you have.
- Vendor it. Drop it into your repo, pin to a commit, ship with your project. No marketplace API, no remote dependency at deploy time. Reproducible from source.
- Audit it. The PHP is small and readable. No obfuscated bundles, no minified runtime to reverse-engineer. Read the rendering path end-to-end before shipping to a client.
- Run it anywhere. WordPress 6.4+, PHP 8.1+, any host. The plugin doesn't require Node on the WordPress server — compilation happens upstream; the plugin only renders.
Developer questions.
Five answers worth keeping with the page so you do not have to chase them down before you decide whether to install.
-
What Node version do I need for authoring?
A current LTS. Authoring is a standard TypeScript toolchain — if you can build an Astro or Next.js project, you can author Atlas components. The WordPress server doesn't need Node.
-
Is a build pipeline required, or can I paste manifests in?
Both. In v0.1 you can paste a JSON manifest straight into the block in the WordPress editor — fine for prototypes. The TypeScript flow is what you wire into CI for real sites.
-
Can I self-host the compiler?
Yes. The compiler is a small Node program — run it locally, in CI, or on your own box. The hosted compiler exists so you don't have to, not because it's the only path.
-
Does Atlas play with my existing CI?
It's a Node build step that emits JSON. Run it in GitHub Actions, GitLab CI, Buildkite, or a Makefile. Deployment is whatever moves static files to your install today.
-
How does this compare to headless WordPress or other builders?
Atlas keeps WordPress as the rendering surface — no decoupled front-end, no separate Node app, no theme replacement. See the Elementor alternative and headless WordPress alternative pages for head-to-head framing.
Install it. Read the source.
The GPL plugin is free forever. Pull it down, point it at a manifest, see the rendered HTML on a real site before deciding anything else.
One block. One plugin. Endless possibilities.