<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://reactpress.cc/blog</id>
    <title>ReactPress Blog</title>
    <updated>2026-08-01T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://reactpress.cc/blog"/>
    <subtitle>ReactPress Blog</subtitle>
    <icon>https://reactpress.cc/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Next.js Blog SEO Checklist (2026) — Ship Rankings with ReactPress]]></title>
        <id>https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress</id>
        <link href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress"/>
        <updated>2026-08-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A practical Next.js blog SEO checklist for 2026: SSR titles, meta, sitemap, OG, Core Web Vitals, and structured data — plus how ReactPress themes and the SEO plugin cover the defaults.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="ReactPress — The Modern Web Creation Platform." src="https://reactpress.cc/assets/images/poster-462f00e3a7be539131b5e1d3cfea7b96.png" width="4340" height="2860" class="img_hKc8"></p>
<p>A Next.js blog can rank — or disappear — based on defaults you forget on day one: client-only post pages, missing sitemap, thin meta, and bloated images. This <strong>2026 SEO checklist</strong> is written for teams shipping a <strong>Next.js blog with a real CMS</strong>, and shows how <strong>ReactPress</strong> covers the boring essentials so you can focus on content.</p>
<p><strong>Related docs:</strong> <a class="" href="https://reactpress.cc/docs/user-guide/site-settings-seo">Site settings &amp; SEO</a> · <a class="" href="https://reactpress.cc/docs/getting-started/build-nextjs-blog-in-60-seconds">Build a blog in 60 seconds</a> · <a class="" href="https://reactpress.cc/docs/developer-guide/theme-development">Theme development</a></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="1-render-html-for-crawlers-ssr--isr">1. Render HTML for crawlers (SSR / ISR)<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#1-render-html-for-crawlers-ssr--isr" class="hash-link" aria-label="Direct link to 1. Render HTML for crawlers (SSR / ISR)" title="Direct link to 1. Render HTML for crawlers (SSR / ISR)" translate="no">​</a></h2>
<p><strong>Do:</strong> Server-render post and page templates (or ISR with revalidation).<br>
<strong>Don't:</strong> Fetch the article only in <code>useEffect</code> with an empty shell.</p>
<p>ReactPress official themes use <strong>Next.js SSR/ISR</strong> for visitor routes. If you fork a theme, keep post pages on the server path.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="2-unique-title-and-meta-description-per-url">2. Unique title and meta description per URL<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#2-unique-title-and-meta-description-per-url" class="hash-link" aria-label="Direct link to 2. Unique title and meta description per URL" title="Direct link to 2. Unique title and meta description per URL" translate="no">​</a></h2>
<p>Checklist:</p>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <code>&lt;title&gt;</code> unique, ~50–60 characters, includes primary keyword naturally</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Meta description ~150–160 characters, matches search intent</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->No duplicate titles across pagination / tag archives</li>
</ul>
<p>In ReactPress Admin, enable the <strong>SEO plugin</strong> and set per-post title/description/slug. Theme SSR should emit those fields.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="3-canonical-urls">3. Canonical URLs<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#3-canonical-urls" class="hash-link" aria-label="Direct link to 3. Canonical URLs" title="Direct link to 3. Canonical URLs" translate="no">​</a></h2>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Absolute canonical on every indexable page</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Staging / preview hosts <code>noindex</code></li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Trailing-slash policy consistent</li>
</ul>
<p>Set the public site URL in production config before launch: <a class="" href="https://reactpress.cc/docs/tutorial-extras/config-intro">Configuration</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="4-sitemap-and-robotstxt">4. Sitemap and robots.txt<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#4-sitemap-and-robotstxt" class="hash-link" aria-label="Direct link to 4. Sitemap and robots.txt" title="Direct link to 4. Sitemap and robots.txt" translate="no">​</a></h2>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <code>/sitemap.xml</code> lists posts and pages (and hreflang if multilingual)</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <code>robots.txt</code> allows crawling; points to sitemap</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Submit sitemap in Google Search Console / Bing</li>
</ul>
<p>ReactPress starter themes expose sitemap/robots patterns — verify after theme enable. See <a class="" href="https://reactpress.cc/docs/user-guide/site-settings-seo">SEO settings</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="5-open-graph-and-twitter-cards">5. Open Graph and Twitter cards<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#5-open-graph-and-twitter-cards" class="hash-link" aria-label="Direct link to 5. Open Graph and Twitter cards" title="Direct link to 5. Open Graph and Twitter cards" translate="no">​</a></h2>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <code>og:title</code>, <code>og:description</code>, <code>og:url</code>, <code>og:image</code></li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Image ≥ 1200×630, compressed</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Test with platform debuggers after deploy</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="6-structured-data">6. Structured data<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#6-structured-data" class="hash-link" aria-label="Direct link to 6. Structured data" title="Direct link to 6. Structured data" translate="no">​</a></h2>
<p>Useful types for a blog/CMS:</p>
<table><thead><tr><th>Type</th><th>Where</th></tr></thead><tbody><tr><td><code>Article</code> / <code>BlogPosting</code></td><td>Post templates</td></tr><tr><td><code>Organization</code> / <code>WebSite</code></td><td>Site layout</td></tr><tr><td><code>BreadcrumbList</code></td><td>Nested docs/blog</td></tr><tr><td><code>FAQPage</code></td><td>FAQ landing pages</td></tr></tbody></table>
<p>Validate with Google’s Rich Results test. ReactPress docs site itself uses JSON-LD patterns you can mirror in themes.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="7-core-web-vitals-and-media">7. Core Web Vitals and media<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#7-core-web-vitals-and-media" class="hash-link" aria-label="Direct link to 7. Core Web Vitals and media" title="Direct link to 7. Core Web Vitals and media" translate="no">​</a></h2>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->LCP: hero/post image sized and prioritized</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->CLS: dimensions on images/embeds</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->INP: avoid heavy third-party scripts on article pages</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->WebP/AVIF where possible</li>
</ul>
<p>ReactPress <strong>image-optimizer</strong> plugin helps batch WebP — pair with sensible theme <code>next/image</code> usage.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="8-information-architecture-and-internal-links">8. Information architecture and internal links<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#8-information-architecture-and-internal-links" class="hash-link" aria-label="Direct link to 8. Information architecture and internal links" title="Direct link to 8. Information architecture and internal links" translate="no">​</a></h2>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Clear hub pages (what / compare / quickstart)</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Posts link to pillar docs; docs link back to posts</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Descriptive anchors — not “click here”</li>
</ul>
<p>Pillars worth linking from every SEO post:</p>
<ul>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/what-is-reactpress">What is ReactPress?</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">vs WordPress</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/self-hosted-cms-for-react">Self-hosted CMS</a></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="9-performance-budget-for-cms-themes">9. Performance budget for CMS themes<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#9-performance-budget-for-cms-themes" class="hash-link" aria-label="Direct link to 9. Performance budget for CMS themes" title="Direct link to 9. Performance budget for CMS themes" translate="no">​</a></h2>
<table><thead><tr><th>Budget</th><th>Target</th></tr></thead><tbody><tr><td>Lighthouse Performance (mobile)</td><td>≥ 90 on article template</td></tr><tr><td>JS on critical path</td><td>Prefer RSC/SSR; defer analytics</td></tr><tr><td>Fonts</td><td><code>font-display: swap</code>; subset</td></tr></tbody></table>
<p>Theme guidance: <a class="" href="https://reactpress.cc/docs/user-guide/appearance-themes">Appearance &amp; themes</a> · <a class="" href="https://reactpress.cc/docs/developer-guide/theme-development">Theme development</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="10-launch-verification">10. Launch verification<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#10-launch-verification" class="hash-link" aria-label="Direct link to 10. Launch verification" title="Direct link to 10. Launch verification" translate="no">​</a></h2>
<ol>
<li class=""><code>curl -I</code> production URLs — 200, correct cache headers</li>
<li class="">View-source — titles/meta present <strong>without</strong> running JS</li>
<li class="">Search Console coverage — fix excluded-by-robots surprises</li>
<li class="">Compare staging vs prod canonical hosts</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="reactpress-defaults-that-help-seo">ReactPress defaults that help SEO<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#reactpress-defaults-that-help-seo" class="hash-link" aria-label="Direct link to ReactPress defaults that help SEO" title="Direct link to ReactPress defaults that help SEO" translate="no">​</a></h2>
<table><thead><tr><th>Concern</th><th>ReactPress approach</th></tr></thead><tbody><tr><td>SSR blog</td><td>Next.js official themes</td></tr><tr><td>Editor meta</td><td>SEO plugin in Admin</td></tr><tr><td>API for custom frontends</td><td>Headless REST</td></tr><tr><td>Fast local proof</td><td><code>reactpress init</code> ~60s</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-blog &amp;&amp; cd my-blog</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<p>More: <a class="" href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide">Self-hosted Next.js CMS guide</a> · <a class="" href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026">WordPress alternatives for React</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="faq">FAQ<a href="https://reactpress.cc/blog/nextjs-blog-seo-checklist-reactpress#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ" translate="no">​</a></h2>
<p><strong>Does Next.js App Router change this checklist?</strong><br>
<!-- -->No — crawlers still need meaningful HTML and metadata APIs (<code>generateMetadata</code>, etc.).</p>
<p><strong>Is a Headless CMS enough for SEO?</strong><br>
<!-- -->Only if <strong>your</strong> Next app implements the checklist. The CMS alone does not rank.</p>
<p><strong>Where do I configure ReactPress SEO?</strong><br>
<a class="" href="https://reactpress.cc/docs/user-guide/site-settings-seo">Site settings &amp; SEO</a>.</p>
<blockquote>
<p><a href="https://reactpress.cc/zh/blog/nextjs-blog-seo-checklist-reactpress" target="_blank" rel="noopener noreferrer" class="">中文版</a></p>
</blockquote>]]></content>
        <author>
            <name>reactpress</name>
            <uri>https://github.com/fecommunity/reactpress</uri>
        </author>
        <category label="Article" term="Article"/>
        <category label="ReactPress" term="ReactPress"/>
        <category label="nextjs" term="nextjs"/>
        <category label="React CMS" term="React CMS"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Best WordPress Alternatives for React Developers in 2026]]></title>
        <id>https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026</id>
        <link href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026"/>
        <updated>2026-07-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Looking for a WordPress alternative built for React? Compare ReactPress, Headless CMS, Next.js + MDX, and headless WordPress — and pick the stack that matches your team.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="ReactPress — The Modern Web Creation Platform." src="https://reactpress.cc/assets/images/poster-462f00e3a7be539131b5e1d3cfea7b96.png" width="4340" height="2860" class="img_hKc8"></p>
<p>WordPress still runs a huge share of the web. For <strong>React developers</strong>, though, the pain is familiar: PHP themes, plugin weight, and a frontend stack that does not match the rest of the product.</p>
<p>This guide lists the <strong>practical WordPress alternatives for React teams in 2026</strong> — what each option actually gives you, and when <strong>ReactPress</strong> is the better default.</p>
<p><strong>Related:</strong> <a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">ReactPress vs WordPress</a> · <a class="" href="https://reactpress.cc/docs/getting-started/what-is-reactpress">What is ReactPress?</a> · <a class="" href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4">Long-form: Why React still doesn't have its WordPress</a></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="what-react-teams-usually-want-from-a-wp-alternative">What React teams usually want from a WP alternative<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#what-react-teams-usually-want-from-a-wp-alternative" class="hash-link" aria-label="Direct link to What React teams usually want from a WP alternative" title="Direct link to What React teams usually want from a WP alternative" translate="no">​</a></h2>
<ol>
<li class=""><strong>Familiar publishing</strong> — posts, pages, media, roles</li>
<li class=""><strong>Modern delivery</strong> — React / Next.js SSR, not PHP templates</li>
<li class=""><strong>Headless option</strong> — API for apps without abandoning Admin</li>
<li class=""><strong>Self-host or clear license</strong> — MIT/open core without surprise lock-in</li>
<li class=""><strong>Time-to-live</strong> — hours, not a quarter</li>
</ol>
<p>Few tools hit all five. Here is how the common choices score.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="1-reactpress--publishing-platform-for-react">1. ReactPress — publishing platform for React<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#1-reactpress--publishing-platform-for-react" class="hash-link" aria-label="Direct link to 1. ReactPress — publishing platform for React" title="Direct link to 1. ReactPress — publishing platform for React" translate="no">​</a></h2>
<p><strong>Best for:</strong> teams that want WordPress-like workflow with a React stack.</p>
<table><thead><tr><th>You get</th><th>Notes</th></tr></thead><tbody><tr><td>Admin + API + Next.js theme</td><td>One CLI: <code>reactpress init</code></td></tr><tr><td>Plugins + desktop client</td><td>4.0 Extend line</td></tr><tr><td>Headless REST</td><td>On by default</td></tr><tr><td>License</td><td>MIT</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-site &amp;&amp; cd my-site</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<p>Try the walkthrough: <a class="" href="https://reactpress.cc/docs/getting-started/build-nextjs-blog-in-60-seconds">Next.js blog in 60 seconds</a>.</p>
<p><strong>Trade-off:</strong> plugin marketplace is young vs WordPress. You win if you can ship JavaScript extensions.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="2-headless-cms-strapi-payload-sanity-contentful">2. Headless CMS (Strapi, Payload, Sanity, Contentful)<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#2-headless-cms-strapi-payload-sanity-contentful" class="hash-link" aria-label="Direct link to 2. Headless CMS (Strapi, Payload, Sanity, Contentful)" title="Direct link to 2. Headless CMS (Strapi, Payload, Sanity, Contentful)" translate="no">​</a></h2>
<p><strong>Best for:</strong> multi-channel content APIs when the Next.js site is a separate product.</p>
<p><strong>Trade-off:</strong> you still build the visitor site, SEO pipeline, and often previews. See <a class="" href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms">ReactPress vs Strapi vs Payload</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="3-nextjs--mdx--contentlayer--velite">3. Next.js + MDX / Contentlayer / Velite<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#3-nextjs--mdx--contentlayer--velite" class="hash-link" aria-label="Direct link to 3. Next.js + MDX / Contentlayer / Velite" title="Direct link to 3. Next.js + MDX / Contentlayer / Velite" translate="no">​</a></h2>
<p><strong>Best for:</strong> docs and blogs where <strong>git is the CMS</strong> and every author is a developer.</p>
<p><strong>Trade-off:</strong> non-technical editors struggle; no media library/comments unless you add services.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="4-headless-wordpress--nextjs-frontend">4. Headless WordPress + Next.js frontend<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#4-headless-wordpress--nextjs-frontend" class="hash-link" aria-label="Direct link to 4. Headless WordPress + Next.js frontend" title="Direct link to 4. Headless WordPress + Next.js frontend" translate="no">​</a></h2>
<p><strong>Best for:</strong> keeping Gutenberg/editorial plugins while rebuilding the public site in React.</p>
<p><strong>Trade-off:</strong> you operate <strong>two</strong> complex systems (WP + Next) and the sync/preview story stays non-trivial.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="5-ghost-hashnode-beehiiv-etc">5. Ghost, Hashnode, Beehiiv, etc.<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#5-ghost-hashnode-beehiiv-etc" class="hash-link" aria-label="Direct link to 5. Ghost, Hashnode, Beehiiv, etc." title="Direct link to 5. Ghost, Hashnode, Beehiiv, etc." translate="no">​</a></h2>
<p><strong>Best for:</strong> newsletters and pure blogging with hosted convenience.</p>
<p><strong>Trade-off:</strong> less ideal as a general React CMS for docs + marketing + custom apps; hosting/data control varies.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="comparison-snapshot">Comparison snapshot<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#comparison-snapshot" class="hash-link" aria-label="Direct link to Comparison snapshot" title="Direct link to Comparison snapshot" translate="no">​</a></h2>
<table><thead><tr><th>Option</th><th>Editor UX</th><th>React/Next delivery</th><th>Self-host</th><th>Assembly cost</th></tr></thead><tbody><tr><td><strong>ReactPress</strong></td><td>Admin Markdown-first</td><td>Official Next themes</td><td>Yes</td><td>Low</td></tr><tr><td><strong>Strapi / Payload</strong></td><td>Strong Admin</td><td>You build</td><td>Yes (self-host editions)</td><td>High</td></tr><tr><td><strong>MDX in git</strong></td><td>PRs / IDE</td><td>Excellent</td><td>Yes</td><td>Medium</td></tr><tr><td><strong>WP + Next</strong></td><td>Gutenberg</td><td>Custom Next</td><td>Yes</td><td>High</td></tr><tr><td><strong>Hosted blog SaaS</strong></td><td>Polished</td><td>Limited</td><td>Often no</td><td>Low</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="when-to-stay-on-wordpress">When to stay on WordPress<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#when-to-stay-on-wordpress" class="hash-link" aria-label="Direct link to When to stay on WordPress" title="Direct link to When to stay on WordPress" translate="no">​</a></h2>
<ul>
<li class="">Editors depend on WooCommerce, page builders, or niche WP plugins</li>
<li class="">Migration cost of themes/plugins exceeds the pain of PHP</li>
<li class="">You want turnkey managed WP hosting</li>
</ul>
<p>Otherwise, if the rest of your company is React, keeping PHP only for the marketing site is usually technical debt.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="migration-sketch-wordpress--reactpress">Migration sketch (WordPress → ReactPress)<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#migration-sketch-wordpress--reactpress" class="hash-link" aria-label="Direct link to Migration sketch (WordPress → ReactPress)" title="Direct link to Migration sketch (WordPress → ReactPress)" translate="no">​</a></h2>
<ol>
<li class="">Export posts (XML/API) and map to ReactPress articles via scripts or Headless API</li>
<li class="">Rebuild the theme in Next.js (or start from <a href="https://github.com/fecommunity/reactpress-theme-starter" target="_blank" rel="noopener noreferrer" class="">theme-starter</a>)</li>
<li class="">Redirect old permalinks → new routes</li>
<li class="">Re-verify sitemap, canonical, and Core Web Vitals</li>
</ol>
<p>FAQ: <a class="" href="https://reactpress.cc/docs/reference/faq">Can I migrate from WordPress?</a></p>
<div class="theme-admonition theme-admonition-tip admonition_ZbkS alert alert--success"><div class="admonitionHeading_kwlI"><span class="admonitionIcon_Bp5B"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Name disambiguation</div><div class="admonitionContent_wVdS"><p><strong>ReactPress</strong> (fecommunity) is a NestJS + Next.js publishing platform. It is <strong>not</strong> the WordPress plugin that embeds React apps into existing WP sites.</p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="bottom-line">Bottom line<a href="https://reactpress.cc/blog/wordpress-alternatives-for-react-developers-2026#bottom-line" class="hash-link" aria-label="Direct link to Bottom line" title="Direct link to Bottom line" translate="no">​</a></h2>
<p>For <strong>React developers</strong> in 2026, the best WordPress alternative depends on whether you need a <strong>content API</strong> or a <strong>publishing platform</strong>.</p>
<ul>
<li class="">API only → Strapi / Payload</li>
<li class="">Git-only docs → MDX</li>
<li class="">Publish like WordPress, ship with Next.js → <strong>ReactPress</strong></li>
</ul>
<p>Start here: <a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">ReactPress vs WordPress (2026)</a>.</p>
<blockquote>
<p><a href="https://reactpress.cc/zh/blog/wordpress-alternatives-for-react-developers-2026" target="_blank" rel="noopener noreferrer" class="">中文版</a></p>
</blockquote>]]></content>
        <author>
            <name>reactpress</name>
            <uri>https://github.com/fecommunity/reactpress</uri>
        </author>
        <category label="Article" term="Article"/>
        <category label="ReactPress" term="ReactPress"/>
        <category label="WordPress alternative" term="WordPress alternative"/>
        <category label="React CMS" term="React CMS"/>
        <category label="nextjs" term="nextjs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Practical Guide to a Self-Hosted Next.js Blog CMS (2026)]]></title>
        <id>https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide</id>
        <link href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide"/>
        <updated>2026-07-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How to self-host a Next.js blog with a real CMS in 2026 — SQLite or MySQL, SSR SEO, Admin editing, and data ownership. Why ReactPress beats DIY Strapi + starter stacks.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="ReactPress ��— The Modern Web Creation Platform." src="https://reactpress.cc/assets/images/poster-462f00e3a7be539131b5e1d3cfea7b96.png" width="4340" height="2860" class="img_hKc8"></p>
<p>“We want a <strong>self-hosted Next.js blog</strong>” sounds simple. In practice it splits into three projects: a CMS, an Admin, and a theme — plus backups, SEO, and auth. This guide shows a <strong>practical 2026 path</strong> that keeps data on your infrastructure and still feels like a product, not a weekend mash-up.</p>
<p><strong>TL;DR:</strong> Use a publishing platform that already wires Admin + API + Next.js theme. With <strong>ReactPress</strong>, <code>reactpress init</code> gets you a local stack in about <strong>60 seconds</strong>, defaulting to <strong>SQLite</strong> (no Docker required).</p>
<p><strong>Related docs:</strong> <a class="" href="https://reactpress.cc/docs/getting-started/self-hosted-cms-for-react">Self-hosted CMS for React</a> · <a class="" href="https://reactpress.cc/docs/getting-started/build-nextjs-blog-in-60-seconds">60-second Next.js blog</a> · <a class="" href="https://reactpress.cc/docs/tutorial-basics/deploy-your-site">Production deploy</a></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="what-self-hosted-nextjs-cms-should-include">What “self-hosted Next.js CMS” should include<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#what-self-hosted-nextjs-cms-should-include" class="hash-link" aria-label="Direct link to What “self-hosted Next.js CMS” should include" title="Direct link to What “self-hosted Next.js CMS” should include" translate="no">​</a></h2>
<table><thead><tr><th>Layer</th><th>Why it matters</th></tr></thead><tbody><tr><td><strong>Next.js visitor site</strong></td><td>SSR/ISR for SEO and Core Web Vitals</td></tr><tr><td><strong>Admin</strong></td><td>Non-git publishing for editors</td></tr><tr><td><strong>API / DB</strong></td><td>Durable content you control</td></tr><tr><td><strong>Media</strong></td><td>Uploads on your disk or object storage</td></tr><tr><td><strong>SEO plumbing</strong></td><td>Titles, canonical, sitemap, OG</td></tr><tr><td><strong>Ops</strong></td><td>Backups, doctor/logs, reverse proxy</td></tr></tbody></table>
<p>Skip any layer and you are back to assembling Strapi + <code>create-next-app</code> + custom upload routes.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="option-a--diy-flexible-slow">Option A — DIY (flexible, slow)<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#option-a--diy-flexible-slow" class="hash-link" aria-label="Direct link to Option A — DIY (flexible, slow)" title="Direct link to Option A — DIY (flexible, slow)" translate="no">​</a></h2>
<p>Typical stack:</p>
<ol>
<li class="">Strapi / Payload / direct MDX in git</li>
<li class="">Custom Next.js App Router site</li>
<li class="">Preview mode, webhook rebuilds, image pipeline</li>
<li class="">Your own auth and roles</li>
</ol>
<p><strong>Pros:</strong> maximum control. <strong>Cons:</strong> weeks before the first editor can publish safely; you own every CVE and upgrade.</p>
<p>DIY is right for platform teams. It is expensive for a company blog.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="option-b--reactpress-productized-self-host">Option B — ReactPress (productized self-host)<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#option-b--reactpress-productized-self-host" class="hash-link" aria-label="Direct link to Option B — ReactPress (productized self-host)" title="Direct link to Option B — ReactPress (productized self-host)" translate="no">​</a></h2>
<p>ReactPress is an open-source <strong>publishing system for React developers</strong>:</p>
<ul>
<li class="">NestJS API (Headless REST on by default)</li>
<li class="">Vite Admin (posts, pages, media, comments, themes, plugins)</li>
<li class="">Next.js themes with SSR SEO</li>
<li class="">Hook plugins (SEO, summary, image optimizer, …)</li>
<li class="">Optional Electron desktop for offline writing</li>
</ul>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-blog &amp;&amp; cd my-blog</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<table><thead><tr><th>Surface</th><th>URL</th></tr></thead><tbody><tr><td>Blog</td><td><a href="http://localhost:3001/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001</a></td></tr><tr><td>Admin</td><td><a href="http://localhost:3001/admin/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001/admin/</a></td></tr><tr><td>API</td><td><a href="http://localhost:3002/api" target="_blank" rel="noopener noreferrer" class="">http://localhost:3002/api</a></td></tr></tbody></table>
<p>Default credentials: change <code>admin</code> / <code>admin</code> immediately.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="database-choices-for-self-hosting">Database choices for self-hosting<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#database-choices-for-self-hosting" class="hash-link" aria-label="Direct link to Database choices for self-hosting" title="Direct link to Database choices for self-hosting" translate="no">​</a></h2>
<table><thead><tr><th>Stage</th><th>Recommendation</th></tr></thead><tbody><tr><td>Laptop / small site</td><td><strong>SQLite</strong> (default) — zero ops</td></tr><tr><td>Growth / shared DB</td><td><strong>MySQL</strong></td></tr><tr><td>Containers</td><td><a class="" href="https://reactpress.cc/docs/tutorial-extras/docker-deployment">Docker guide</a></td></tr></tbody></table>
<p>Always back up <strong>database + <code>uploads/</code></strong>. Config notes: <a class="" href="https://reactpress.cc/docs/tutorial-extras/config-intro">Configuration</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="seo-checklist-for-a-self-hosted-nextjs-blog">SEO checklist for a self-hosted Next.js blog<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#seo-checklist-for-a-self-hosted-nextjs-blog" class="hash-link" aria-label="Direct link to SEO checklist for a self-hosted Next.js blog" title="Direct link to SEO checklist for a self-hosted Next.js blog" translate="no">​</a></h2>
<ol>
<li class="">Enable the <strong>SEO plugin</strong> and fill per-post meta</li>
<li class="">Confirm theme <code>/sitemap.xml</code> and <code>robots.txt</code></li>
<li class="">Set public site URL in production config</li>
<li class="">Use SSR/ISR — avoid client-only post pages</li>
<li class="">Compress images (built-in image-optimizer plugin helps)</li>
</ol>
<p>Details: <a class="" href="https://reactpress.cc/docs/user-guide/site-settings-seo">Site settings &amp; SEO</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="production-outline">Production outline<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#production-outline" class="hash-link" aria-label="Direct link to Production outline" title="Direct link to Production outline" translate="no">​</a></h2>
<ol>
<li class="">VPS or Node host with reverse proxy (Caddy/Nginx)</li>
<li class="">Process manager or Docker for API + theme</li>
<li class="">TLS, secure Admin exposure, rotated secrets</li>
<li class="">Scheduled backups of DB + uploads</li>
<li class=""><code>reactpress doctor</code> after deploy</li>
</ol>
<p>Full guide: <a class="" href="https://reactpress.cc/docs/tutorial-basics/deploy-your-site">Production deployment</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="self-hosted-vs-saas">Self-hosted vs SaaS<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#self-hosted-vs-saas" class="hash-link" aria-label="Direct link to Self-hosted vs SaaS" title="Direct link to Self-hosted vs SaaS" translate="no">​</a></h2>
<table><thead><tr><th></th><th>Self-hosted ReactPress</th><th>SaaS Headless</th></tr></thead><tbody><tr><td>Data residency</td><td>Your disk / your DB</td><td>Vendor cloud</td></tr><tr><td>Cost model</td><td>Infra only (MIT software)</td><td>Seats + API + bandwidth</td></tr><tr><td>Visitor site</td><td>Included Next theme</td><td>Usually separate</td></tr><tr><td>Offline writing</td><td>Desktop client</td><td>Rare</td></tr></tbody></table>
<p>Choose SaaS for zero ops. Choose self-host when <strong>ownership and React stack unity</strong> matter.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="faq">FAQ<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ" translate="no">​</a></h2>
<p><strong>Do I need Kubernetes?</strong><br>
<!-- -->No. Many blogs run on a single VM.</p>
<p><strong>Can I keep my own Next.js app?</strong><br>
<!-- -->Yes — Headless API + API keys. See <a class="" href="https://reactpress.cc/docs/developer-guide/headless-api">Headless API</a>.</p>
<p><strong>Is 4.0 production-ready?</strong><br>
<!-- -->Yes — 4.0.0 is stable. Stage first when upgrading from 3.x. <a class="" href="https://reactpress.cc/docs/reference/faq">FAQ</a> · <a class="" href="https://reactpress.cc/docs/tutorial-extras/migration-3-to-4">Migration 3→4</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="start-here">Start here<a href="https://reactpress.cc/blog/self-hosted-nextjs-cms-blog-guide#start-here" class="hash-link" aria-label="Direct link to Start here" title="Direct link to Start here" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-blog &amp;&amp; cd my-blog</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<p>Then read <a class="" href="https://reactpress.cc/docs/getting-started/what-is-reactpress">What is ReactPress?</a> and <a class="" href="https://reactpress.cc/docs/getting-started/self-hosted-cms-for-react">Self-hosted CMS for React</a>.</p>
<blockquote>
<p><a href="https://reactpress.cc/zh/blog/self-hosted-nextjs-cms-blog-guide" target="_blank" rel="noopener noreferrer" class="">中文版</a></p>
</blockquote>]]></content>
        <author>
            <name>reactpress</name>
            <uri>https://github.com/fecommunity/reactpress</uri>
        </author>
        <category label="Article" term="Article"/>
        <category label="ReactPress" term="ReactPress"/>
        <category label="React CMS" term="React CMS"/>
        <category label="self-hosted" term="self-hosted"/>
        <category label="nextjs" term="nextjs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[ReactPress vs Strapi vs Payload — When You Need More Than a Headless CMS]]></title>
        <id>https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms</id>
        <link href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms"/>
        <updated>2026-07-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Comparing ReactPress with Strapi and Payload for React teams. Learn when a Headless API is enough — and when you need a full publishing platform with Admin, Next.js themes, and SEO.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="ReactPress — The Modern Web Creation Platform." src="https://reactpress.cc/assets/images/poster-462f00e3a7be539131b5e1d3cfea7b96.png" width="4340" height="2860" class="img_hKc8"></p>
<p>If your team builds on <strong>React / Next.js</strong>, the shortlist for content infrastructure usually looks like this: <strong>Strapi</strong>, <strong>Payload</strong>, maybe Contentful or Sanity — and then someone asks, <em>“Where do we put the actual blog?”</em></p>
<p>That question exposes a category gap. <strong>Headless CMS</strong> tools excel at content APIs and admin schemas. They do <strong>not</strong> ship a visitor-facing Next.js site, WordPress-style publishing workflow, theme catalog, and SEO pipeline as one product.</p>
<p><strong>ReactPress</strong> sits on the other side of that gap: a <strong>publishing system for React developers</strong> — Admin + NestJS API + Next.js themes + plugins + desktop — with Headless REST included by default.</p>
<p>This article compares <strong>ReactPress vs Strapi vs Payload</strong> so you can choose the right shape of system — not just the trendiest API.</p>
<p><strong>Related docs:</strong> <a class="" href="https://reactpress.cc/docs/getting-started/what-is-reactpress">What is ReactPress?</a> · <a class="" href="https://reactpress.cc/docs/developer-guide/headless-api">Headless API</a> · <a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">vs WordPress</a></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="quick-comparison">Quick comparison<a href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms#quick-comparison" class="hash-link" aria-label="Direct link to Quick comparison" title="Direct link to Quick comparison" translate="no">​</a></h2>
<table><thead><tr><th></th><th>ReactPress</th><th>Strapi</th><th>Payload</th></tr></thead><tbody><tr><td><strong>Primary deliverable</strong></td><td>Full publishing platform</td><td>Headless CMS / API</td><td>Headless CMS (Next-native Admin)</td></tr><tr><td><strong>Visitor site</strong></td><td>Official Next.js themes</td><td>You build it</td><td>You build it (or compose)</td></tr><tr><td><strong>Admin</strong></td><td>Posts, media, themes, plugins</td><td>Content-type builder</td><td>Collections + admin UI</td></tr><tr><td><strong>Default stack</strong></td><td>NestJS + Vite Admin + Next theme</td><td>Node + Admin panel</td><td>Next.js Admin + your app</td></tr><tr><td><strong>SEO out of the box</strong></td><td>Theme SSR + SEO plugin</td><td>Depends on your frontend</td><td>Depends on your frontend</td></tr><tr><td><strong>Time to public blog</strong></td><td>~60 seconds with CLI</td><td>Days–weeks of app work</td><td>Days–weeks of app work</td></tr><tr><td><strong>Best when</strong></td><td>You want to publish, not assemble</td><td>You only need an API</td><td>You want TS-first Headless in Next</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="what-headless-cms-does-well">What Headless CMS does well<a href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms#what-headless-cms-does-well" class="hash-link" aria-label="Direct link to What Headless CMS does well" title="Direct link to What Headless CMS does well" translate="no">​</a></h2>
<p>Strapi and Payload (and peers) are excellent when:</p>
<ul>
<li class="">Multiple channels (web, mobile, kiosk) share one content API</li>
<li class="">Your design system / Next app is already the product</li>
<li class="">Editors only need structured fields — not a theme marketplace</li>
<li class="">You accept owning SSR, sitemap, OG tags, previews, and deploy wiring</li>
</ul>
<p>If that is your reality, a Headless CMS is often the right call. ReactPress is not trying to replace every Strapi deployment.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="where-headless-leaves-a-hole">Where Headless leaves a hole<a href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms#where-headless-leaves-a-hole" class="hash-link" aria-label="Direct link to Where Headless leaves a hole" title="Direct link to Where Headless leaves a hole" translate="no">​</a></h2>
<p>Marketing and engineering blogs still need:</p>
<ol>
<li class="">A <strong>public site</strong> that ranks (SSR/ISR, Core Web Vitals)</li>
<li class="">An <strong>editor UX</strong> close to “write → publish → see it live”</li>
<li class=""><strong>Media, comments, SEO meta</strong>, and often a desktop/offline path</li>
<li class="">A theme you can swap without rewriting the CMS</li>
</ol>
<p>With Strapi/Payload you assemble those layers. Many teams underestimate that assembly — and ship late with three repos and no sitemap.</p>
<p>ReactPress ships the layers as one CLI:</p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-site &amp;&amp; cd my-site</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<ul>
<li class="">Visitor (Next.js): <a href="http://localhost:3001/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001</a></li>
<li class="">Admin: <a href="http://localhost:3001/admin/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001/admin/</a></li>
<li class="">API: <a href="http://localhost:3002/api/health" target="_blank" rel="noopener noreferrer" class="">http://localhost:3002/api/health</a></li>
</ul>
<p>Walkthrough: <a class="" href="https://reactpress.cc/docs/getting-started/build-nextjs-blog-in-60-seconds">Build a Next.js blog in 60 seconds</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="reactpress-headless-included-not-headless-only">ReactPress: Headless included, not Headless-only<a href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms#reactpress-headless-included-not-headless-only" class="hash-link" aria-label="Direct link to ReactPress: Headless included, not Headless-only" title="Direct link to ReactPress: Headless included, not Headless-only" translate="no">​</a></h2>
<p>ReactPress <strong>is</strong> Headless-capable:</p>
<ul>
<li class="">REST endpoints for articles, pages, categories, and more</li>
<li class="">API keys and webhooks</li>
<li class=""><code>@fecommunity/reactpress-toolkit</code> for typed clients</li>
</ul>
<p>But the product promise is broader: <strong>Admin manages content · Theme manages presentation · Plugin manages logic · API manages data</strong>.</p>
<p>Use the official theme to launch. Fork <a href="https://github.com/fecommunity/reactpress-theme-starter" target="_blank" rel="noopener noreferrer" class="">reactpress-theme-starter</a> when you need a custom frontend — without throwing away Admin.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="decision-guide">Decision guide<a href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms#decision-guide" class="hash-link" aria-label="Direct link to Decision guide" title="Direct link to Decision guide" translate="no">​</a></h2>
<p><strong>Choose Strapi or Payload if</strong> you already have (or will build) the visitor app, and the CMS should stay a pure content backend.</p>
<p><strong>Choose ReactPress if</strong> you need a <strong>self-hosted React publishing stack</strong> — blog/docs/marketing site — with SSR SEO and optional Headless, without reinventing Admin + theme + SEO.</p>
<p><strong>Still on WordPress?</strong> See <a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">ReactPress vs WordPress (2026)</a> and the long-form essay <a class="" href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4">Why React still doesn't have its WordPress</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="faq">FAQ<a href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms#faq" class="hash-link" aria-label="Direct link to FAQ" title="Direct link to FAQ" translate="no">​</a></h2>
<p><strong>Is ReactPress a Strapi competitor?</strong><br>
<!-- -->Partially. Overlap is the content API. ReactPress competes more with “WordPress + modern frontend” than with API-only CMS.</p>
<p><strong>Can I use ReactPress as API-only?</strong><br>
<!-- -->Yes. Point any React app at the Headless API. You can ignore the default theme.</p>
<p><strong>Is Payload “more Next.js” than ReactPress?</strong><br>
<!-- -->Payload’s Admin is Next-native; ReactPress’s <strong>visitor</strong> themes are Next.js, while Admin is a Vite SPA. Different split — both React-friendly.</p>
<p><strong>License?</strong><br>
<!-- -->ReactPress is MIT. Always verify Strapi/Payload editions and hosting terms for your case.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="next-steps">Next steps<a href="https://reactpress.cc/blog/reactpress-vs-strapi-payload-headless-cms#next-steps" class="hash-link" aria-label="Direct link to Next steps" title="Direct link to Next steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/what-is-reactpress">What is ReactPress?</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/self-hosted-cms-for-react">Self-hosted CMS for React</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/headless-api">Headless API guide</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/theme-development">Theme development</a></li>
</ul>
<blockquote>
<p><a href="https://reactpress.cc/zh/blog/reactpress-vs-strapi-payload-headless-cms" target="_blank" rel="noopener noreferrer" class="">中文版</a></p>
</blockquote>]]></content>
        <author>
            <name>reactpress</name>
            <uri>https://github.com/fecommunity/reactpress</uri>
        </author>
        <category label="Article" term="Article"/>
        <category label="ReactPress" term="ReactPress"/>
        <category label="React CMS" term="React CMS"/>
        <category label="headless-cms" term="headless-cms"/>
        <category label="nextjs" term="nextjs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Why React Still Doesn't Have Its WordPress — And Why We Built ReactPress 4.0]]></title>
        <id>https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4</id>
        <link href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4"/>
        <updated>2026-07-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[React has dominated front-end development for a decade, yet still lacks a default publishing platform. This long-form guide explains the industry gap, why WordPress succeeded, what Headless CMS misses, and how ReactPress 4.0 delivers a complete open-source React CMS — Admin, API, Next.js themes, plugins, and a desktop client in one CLI.]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="ReactPress — The Modern Web Creation Platform." src="https://reactpress.cc/assets/images/poster-462f00e3a7be539131b5e1d3cfea7b96.png" width="4340" height="2860" class="img_hKc8"></p>
<p>If you are a front-end engineer, you have probably lived this loop:</p>
<ol>
<li class="">The team decides the marketing site or blog should run on <strong>React / Next.js</strong>.</li>
<li class="">You evaluate Strapi, Payload, Contentful, Sanity, Ghost, Tina — each is good at something, yet <strong>none ships a complete publishing platform you can install, write in, and publish from on day one</strong>.</li>
<li class="">You fork a Next.js blog starter, wire up a Headless backend, then build media handling, comment moderation, SEO metadata, preview mode, and deployment scripts yourself.</li>
<li class="">Three months later the blog is still not live — but you are maintaining five repositories.</li>
</ol>
<p>Meanwhile, <strong>WordPress</strong> still powers more than 40% of the web. PHP is mocked as legacy. Gutenberg is criticized. And yet WordPress remains the default choice for solo bloggers, content teams, agencies, and SMBs worldwide.</p>
<p><strong>React has ruled the front end for ten years. Why does it still not have its own WordPress?</strong></p>
<p>That is not a skills problem. It is a <strong>product category</strong> problem. For three years our community kept asking the same question: <em>"Can we manage content like WordPress, but deliver it with Next.js?"</em> Existing answers either ship only an API, weld Admin and theme into one unmaintainable app, or require Docker + MySQL + six npm packages before you can write a single paragraph.</p>
<p>We built <strong>ReactPress 4.0</strong> to close that gap — an <strong>open-source React publishing platform</strong>, not another Headless backend you must assemble yourself.</p>
<p>This article is a long-form field guide. It explains:</p>
<ul>
<li class="">What the industry is missing, and why the "impossible triangle" of editing, frontend freedom, and out-of-the-box completeness keeps breaking teams.</li>
<li class="">Why WordPress won for twenty years — and which lessons transfer to React, and which do not.</li>
<li class="">Why the React ecosystem has excellent parts but no default <strong>whole machine</strong>.</li>
<li class="">How ReactPress 4.0 works: one CLI, one Admin, swappable Next.js themes, Hook-based plugins, an Electron desktop client, and a Headless REST API that is on by default.</li>
</ul>
<p><strong>SEO focus:</strong> React CMS · Next.js CMS · WordPress alternative · React publishing platform · Open source CMS</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="table-of-contents">Table of contents<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#table-of-contents" class="hash-link" aria-label="Direct link to Table of contents" title="Direct link to Table of contents" translate="no">​</a></h2>
<ol>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#executive-summary" class="">Executive summary</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#1-the-industry-problem" class="">The industry problem</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#2-why-wordpress-succeeded" class="">Why WordPress succeeded</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#3-the-react-ecosystem-gap" class="">The React ecosystem gap</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#4-reactpress-philosophy" class="">ReactPress philosophy</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#5-system-architecture" class="">System architecture</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#6-see-it-in-action" class="">See it in action</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#7-admin-the-writing-surface" class="">Admin: the writing surface</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#8-theme-system" class="">Theme system</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#9-plugin-system" class="">Plugin system</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#10-desktop-client" class="">Desktop client</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#11-headless-api" class="">Headless API</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#12-seo-and-performance" class="">SEO and performance</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#13-security-model" class="">Security model</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#14-deployment-patterns" class="">Deployment patterns</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#15-migration-paths" class="">Migration paths</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#16-who-should-use-reactpress" class="">Who should use ReactPress</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#17-roadmap" class="">Roadmap</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#18-faq" class="">FAQ</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#19-getting-started" class="">Getting started</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#20-conclusion" class="">Conclusion</a></li>
<li class=""><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-a-extended-comparison-matrices" class="">Appendices A–AF</a> — comparisons, module deep dives, runbooks, extended FAQ</li>
</ol>
<blockquote>
<p><strong>About this guide:</strong> ~100,000 characters · ~12,500 English words · default language <strong>English</strong> · last updated 2026-07-12 · <a href="https://reactpress.cc/zh/blog/why-react-still-doesnt-have-wordpress-reactpress-4" target="_blank" rel="noopener noreferrer" class="">中文版</a></p>
</blockquote>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="executive-summary">Executive summary<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#executive-summary" class="hash-link" aria-label="Direct link to Executive summary" title="Direct link to Executive summary" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Question</th><th style="text-align:left">Short answer</th></tr></thead><tbody><tr><td style="text-align:left"><strong>What is ReactPress?</strong></td><td style="text-align:left">A self-hosted <strong>React publishing platform</strong>: NestJS API + Vite Admin + Next.js theme + Hook plugins + CLI + Electron desktop.</td></tr><tr><td style="text-align:left"><strong>Is it a Headless CMS?</strong></td><td style="text-align:left">It includes Headless REST, but delivers far more — visitor site, Admin, and extensions out of the box.</td></tr><tr><td style="text-align:left"><strong>WordPress alternative?</strong></td><td style="text-align:left">Yes, for teams that want WordPress-style workflows with a modern React / Next.js stack.</td></tr><tr><td style="text-align:left"><strong>How fast to start?</strong></td><td style="text-align:left"><code>npm i -g @fecommunity/reactpress</code> → <code>reactpress init</code> → live stack in ~60 seconds.</td></tr><tr><td style="text-align:left"><strong>License</strong></td><td style="text-align:left">MIT — fork, self-host, commercial use allowed.</td></tr><tr><td style="text-align:left"><strong>Current release</strong></td><td style="text-align:left">4.0 (codename <strong>Extend</strong>) — plugins, desktop, npm theme catalog.</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-site &amp;&amp; cd my-site</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<table><thead><tr><th style="text-align:left">Surface</th><th style="text-align:left">URL</th></tr></thead><tbody><tr><td style="text-align:left">Public site</td><td style="text-align:left"><a href="http://localhost:3001/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001</a></td></tr><tr><td style="text-align:left">Admin</td><td style="text-align:left"><a href="http://localhost:3001/admin/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001/admin/</a></td></tr><tr><td style="text-align:left">API</td><td style="text-align:left"><a href="http://localhost:3002/api/health" target="_blank" rel="noopener noreferrer" class="">http://localhost:3002/api/health</a></td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="1-the-industry-problem">1. The industry problem<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#1-the-industry-problem" class="hash-link" aria-label="Direct link to 1. The industry problem" title="Direct link to 1. The industry problem" translate="no">​</a></h2>
<p>Modern content infrastructure forces a bad trade-off. Teams must pick two of three: <strong>great editing</strong>, <strong>frontend freedom</strong>, and <strong>a complete system you can run tomorrow</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="11-the-impossible-triangle">1.1 The impossible triangle<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#11-the-impossible-triangle" class="hash-link" aria-label="Direct link to 1.1 The impossible triangle" title="Direct link to 1.1 The impossible triangle" translate="no">​</a></h3>
<p>Over the last decade, content tooling split into three paths. Each solves real problems — and each leaves a hole.</p>
<h4 class="anchor anchorTargetStickyNavbar_aIG4" id="path-a-wordpress-style-monolithic-cms">Path A: WordPress-style monolithic CMS<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#path-a-wordpress-style-monolithic-cms" class="hash-link" aria-label="Direct link to Path A: WordPress-style monolithic CMS" title="Direct link to Path A: WordPress-style monolithic CMS" translate="no">​</a></h4>
<p>WordPress binds <strong>content management, theme rendering, and plugin extension</strong> inside one PHP runtime. For non-technical users it is extraordinary: install a theme, add plugins, launch ecommerce, memberships, forms, and SEO without writing code.</p>
<p>The costs are equally well known:</p>
<ul>
<li class=""><strong>Theme and plugin quality varies wildly</strong> — one bad plugin can tank performance or security.</li>
<li class=""><strong>The front end is locked to the PHP theme system</strong> — React teams cannot reuse component libraries or design systems without a Headless detour.</li>
<li class=""><strong>Headless mode is bolted on</strong>, not the default mental model; REST works, but often needs extra plugins and glue.</li>
<li class=""><strong>Core Web Vitals</strong> frequently depend on caching layers (Redis, CDN, page-cache plugins) instead of SSR/ISR as a first-class design choice.</li>
</ul>
<p>WordPress optimizes for <strong>"let people who cannot code publish"</strong> — not <strong>"let people who code in React publish with the same ease."</strong></p>
<h4 class="anchor anchorTargetStickyNavbar_aIG4" id="path-b-static-site-generators">Path B: Static site generators<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#path-b-static-site-generators" class="hash-link" aria-label="Direct link to Path B: Static site generators" title="Direct link to Path B: Static site generators" translate="no">​</a></h4>
<p>Hugo, Jekyll, early Gatsby, Astro — they maximize <strong>build-time HTML</strong> and deliver excellent Lighthouse scores at low hosting cost.</p>
<p>SSG hides a strict assumption: <strong>content change = developer edits Markdown + CI rebuild</strong>. Non-technical editors cannot ship articles independently. Drafts, scheduled posts, media libraries, comment moderation, and multi-author permissions — routine in WordPress — are absent or Git-shaped in pure SSG flows.</p>
<p>Next.js App Router and ISR help, but three questions remain unanswered in most setups:</p>
<ul>
<li class="">Where do posts <strong>live</strong>?</li>
<li class="">Who can <strong>write in a browser</strong> without touching the repo?</li>
<li class="">Where do <strong>uploaded images</strong> go?</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_aIG4" id="path-c-headless-cms">Path C: Headless CMS<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#path-c-headless-cms" class="hash-link" aria-label="Direct link to Path C: Headless CMS" title="Direct link to Path C: Headless CMS" translate="no">​</a></h4>
<p>Strapi, Payload, Directus, Sanity, Contentful — they excel at <strong>content APIs</strong>: customizable schemas, multi-channel delivery, permissions.</p>
<p>What they typically do <strong>not</strong> ship is the <strong>visitor-facing website</strong> and the <strong>daily writing UI</strong> your authors expect as a finished product.</p>
<p>A typical Headless rollout:</p>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">Pick Headless CMS → define schema → tolerate or customize Admin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">→ build Next.js front end → wire API → implement SEO / sitemap / OG</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">→ configure media storage → build or buy comments → write deploy scripts</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">→ train editors on a new back office</span><br></div></code></pre></div></div>
<p>That is viable for mature platform teams. It is <strong>heavy</strong> for "we need a React-stack blog this week."</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="12-the-contradiction-summarized">1.2 The contradiction, summarized<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#12-the-contradiction-summarized" class="hash-link" aria-label="Direct link to 1.2 The contradiction, summarized" title="Direct link to 1.2 The contradiction, summarized" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Path</th><th style="text-align:center">Editing</th><th style="text-align:center">Frontend freedom</th><th style="text-align:center">Out of the box</th><th style="text-align:center">Modern performance</th></tr></thead><tbody><tr><td style="text-align:left">WordPress</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">△</td></tr><tr><td style="text-align:left">SSG / bare Next.js</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">△</td><td style="text-align:center">✅</td></tr><tr><td style="text-align:left">Headless CMS</td><td style="text-align:center">△</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">Depends on front end</td></tr><tr><td style="text-align:left"><strong>Target: React publishing platform</strong></td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td></tr></tbody></table>
<p>React won on <strong>frontend freedom</strong> and <strong>performance</strong>. It never shipped the <strong>complete publishing platform</strong> category WordPress owns.</p>
<p><strong>That is why ReactPress exists.</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="13-a-front-end-leads-real-week">1.3 A front-end lead's real week<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#13-a-front-end-leads-real-week" class="hash-link" aria-label="Direct link to 1.3 A front-end lead's real week" title="Direct link to 1.3 A front-end lead's real week" translate="no">​</a></h3>
<p>Consider a story we hear almost weekly:</p>
<p><strong>Monday:</strong> Product wants a blog with SEO; marketing must publish without developers. You open the tech spec and list Strapi, Payload, Ghost, and Headless WordPress.</p>
<p><strong>Tuesday:</strong> You pick Strapi. Docker, PostgreSQL, Content Types. The Admin works, but marketing complains that uploading an image requires four fields when they only want Markdown articles.</p>
<p><strong>Wednesday:</strong> You start the Next.js front end — routing, layout, dark mode, syntax highlighting. Work that belongs in a <strong>theme</strong> is being rebuilt inside a product app.</p>
<p><strong>Thursday:</strong> SEO — sitemap, Open Graph, JSON-LD, canonical URLs — three more PRs. Comments? Disqus or build your own; Strapi does not care.</p>
<p><strong>Friday:</strong> Deploy API on a VPS, front end on Vercel, media on OSS, four CI pipelines. Marketing asks: "Where do I preview drafts?" You pause: "We still need preview mode…"</p>
<p><strong>Next Monday:</strong> Product asks for status. You say "the backend is done." They ask: "When can we publish?"</p>
<p>The failure is not any single tool. <strong>Nobody delivered the full loop of publishing</strong> — install, write, preview, ship, extend.</p>
<p>ReactPress ends that loop. Not with a better API alone, but with a <strong>machine that is already assembled</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="14-why-one-more-headless-cms-is-not-enough">1.4 Why "one more Headless CMS" is not enough<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#14-why-one-more-headless-cms-is-not-enough" class="hash-link" aria-label="Direct link to 1.4 Why &quot;one more Headless CMS&quot; is not enough" title="Direct link to 1.4 Why &quot;one more Headless CMS&quot; is not enough" translate="no">​</a></h3>
<p>Every new TypeScript Headless CMS launch gets praise for schema design. We celebrate those projects — they push <strong>content modeling</strong> forward.</p>
<p>For "ship our team blog this week," however, <strong>a prettier Content Type editor does not reduce the number of Next.js pages you must write</strong>.</p>
<p>The industry does not lack Headless CMS options. It lacks:</p>
<ol>
<li class="">A <strong>production-grade visitor site by default</strong> — not a demo repo.</li>
<li class="">A <strong>writing Admin authors open daily</strong> — not Swagger's neighbor.</li>
<li class=""><strong>Extension points</strong> — install plugins, not fork core.</li>
<li class=""><strong>Operations entry points</strong> — <code>doctor</code>, not a forty-page deploy guide.</li>
</ol>
<p>When all four are true, the category name should be <strong>Publishing Platform</strong>, not Headless CMS. ReactPress chooses the former.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="15-total-cost-of-ownership-assembly-vs-platform">1.5 Total cost of ownership: assembly vs platform<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#15-total-cost-of-ownership-assembly-vs-platform" class="hash-link" aria-label="Direct link to 1.5 Total cost of ownership: assembly vs platform" title="Direct link to 1.5 Total cost of ownership: assembly vs platform" translate="no">​</a></h3>
<p>Hidden costs dominate Headless assembly projects:</p>
<table><thead><tr><th style="text-align:left">Cost center</th><th style="text-align:left">Headless assembly (typical)</th><th style="text-align:left">ReactPress (default)</th></tr></thead><tbody><tr><td style="text-align:left">Initial engineering</td><td style="text-align:left">2–8 weeks</td><td style="text-align:left">~60 seconds to running stack</td></tr><tr><td style="text-align:left">Ongoing repos</td><td style="text-align:left">3–5 (API, web, infra, theme, scripts)</td><td style="text-align:left">1 site directory + optional theme fork</td></tr><tr><td style="text-align:left">Editor onboarding</td><td style="text-align:left">Custom docs for bespoke Admin</td><td style="text-align:left">WordPress-familiar <code>/admin/</code></td></tr><tr><td style="text-align:left">SEO baseline</td><td style="text-align:left">Build sitemap, OG, JSON-LD yourself</td><td style="text-align:left">Theme starter + SEO plugin</td></tr><tr><td style="text-align:left">Offline writing</td><td style="text-align:left">Not standard</td><td style="text-align:left">Electron desktop + SQLite</td></tr><tr><td style="text-align:left">Diagnostics</td><td style="text-align:left">Log diving across services</td><td style="text-align:left"><code>reactpress doctor</code></td></tr></tbody></table>
<p>Platforms win when <strong>time-to-first-article</strong> matters more than infinite schema flexibility on day one.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="2-why-wordpress-succeeded">2. Why WordPress succeeded<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#2-why-wordpress-succeeded" class="hash-link" aria-label="Direct link to 2. Why WordPress succeeded" title="Direct link to 2. Why WordPress succeeded" translate="no">​</a></h2>
<p>Before asking for "React's WordPress," understand what WordPress actually won — beyond PHP and early hosting deals.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="21-one-front-door-zero-decision-fatigue">2.1 One front door, zero decision fatigue<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#21-one-front-door-zero-decision-fatigue" class="hash-link" aria-label="Direct link to 2.1 One front door, zero decision fatigue" title="Direct link to 2.1 One front door, zero decision fatigue" translate="no">​</a></h3>
<p>WordPress users rarely choose among backend frameworks, front-end stacks, and deployment patterns. Download, database credentials, <code>/wp-admin/</code> — <strong>one path</strong>.</p>
<p>That "zero decisions" feels limiting to engineers. For most site owners, <strong>fewer choices is the product</strong>.</p>
<p>ReactPress 4.0 adopts the lesson: <code>npm i -g @fecommunity/reactpress</code> → <code>reactpress init</code> → API + Admin + theme in ~60 seconds. No Docker by default. No hand-written <code>.env</code>. No three terminal tabs.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="22-core--theme--plugin-boundaries">2.2 Core / Theme / Plugin boundaries<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#22-core--theme--plugin-boundaries" class="hash-link" aria-label="Direct link to 2.2 Core / Theme / Plugin boundaries" title="Direct link to 2.2 Core / Theme / Plugin boundaries" translate="no">​</a></h3>
<p>Early WordPress established a durable split:</p>
<table><thead><tr><th style="text-align:left">Layer</th><th style="text-align:left">Responsibility</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Core</strong></td><td style="text-align:left">Data model, admin framework, user roles</td></tr><tr><td style="text-align:left"><strong>Theme</strong></td><td style="text-align:left">What visitors see</td></tr><tr><td style="text-align:left"><strong>Plugin</strong></td><td style="text-align:left">Cross-cutting logic — SEO, forms, security, ecommerce</td></tr></tbody></table>
<p>That separation enabled <strong>"change skin without changing bones"</strong> and <strong>"add capability without forking theme."</strong> A theme market and a plugin market followed.</p>
<p>React projects often lack an <strong>official, community-recognized boundary</strong>. Next.js apps merge CMS concerns, marketing UI, and product code. Changing "theme" means rewriting the repo.</p>
<p>ReactPress maps the model explicitly:</p>
<table><thead><tr><th style="text-align:left">WordPress</th><th style="text-align:left">ReactPress</th><th style="text-align:left">Role</th></tr></thead><tbody><tr><td style="text-align:left">wp-admin</td><td style="text-align:left">Admin (<code>/admin/</code>)</td><td style="text-align:left">Content, media, settings</td></tr><tr><td style="text-align:left">Theme</td><td style="text-align:left"><code>themes/*</code> (Next.js)</td><td style="text-align:left">Visitor SSR/ISR site</td></tr><tr><td style="text-align:left">Plugin</td><td style="text-align:left"><code>plugins/*</code> (Hooks)</td><td style="text-align:left">Server-side extension</td></tr><tr><td style="text-align:left">REST API</td><td style="text-align:left"><code>/api/*</code></td><td style="text-align:left">Headless access, on by default</td></tr><tr><td style="text-align:left">—</td><td style="text-align:left">Desktop (Electron)</td><td style="text-align:left">Local-first writing</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="23-plugins-as-longevity">2.3 Plugins as longevity<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#23-plugins-as-longevity" class="hash-link" aria-label="Direct link to 2.3 Plugins as longevity" title="Direct link to 2.3 Plugins as longevity" translate="no">​</a></h3>
<p>WordPress hosts <strong>60,000+ plugins</strong>. Search, install, activate — that loop built a civilization of extensions without waiting for core releases.</p>
<p>React "plugins" are usually private npm packages or forks — <strong>high skill floor, not hot-swappable, no marketplace gravity</strong>.</p>
<p>ReactPress 4.0 ships <strong>Hook + <code>plugin.json</code></strong>, Admin slots, and built-in SEO / summary / image-optimizer plugins so <strong>"extend without touching core"</strong> is platform-native.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="24-hosting-democratization">2.4 Hosting democratization<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#24-hosting-democratization" class="hash-link" aria-label="Direct link to 2.4 Hosting democratization" title="Direct link to 2.4 Hosting democratization" translate="no">​</a></h3>
<p>WordPress succeeded with one-click installers on shared hosts. Users should not need to understand Nginx or PM2 on day one.</p>
<p>ReactPress defaults to <strong>embedded SQLite</strong>, documents VPS/Docker paths for growth, and ships <strong><code>reactpress doctor</code></strong> — lowering "will it run on my machine?"</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="25-what-we-learn--and-what-we-refuse-to-copy">2.5 What we learn — and what we refuse to copy<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#25-what-we-learn--and-what-we-refuse-to-copy" class="hash-link" aria-label="Direct link to 2.5 What we learn — and what we refuse to copy" title="Direct link to 2.5 What we learn — and what we refuse to copy" translate="no">​</a></h3>
<p><strong>We learn:</strong> single entry point, theme/plugin boundaries, author-first workflows, data portability.</p>
<p><strong>We refuse:</strong> welding visitor rendering and Admin into one PHP theme; plugin quantity over architectural debt; requiring Docker/MySQL for a first article.</p>
<p><strong>Same editing workflow. Modern Next.js delivery.</strong> That is the accurate relationship to WordPress — and what <strong>WordPress alternative</strong> should mean in 2026: not PHP cosplay, but <strong>rebuilding the publishing platform category on React</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="26-gutenberg-writing-ui-as-product-not-afterthought">2.6 Gutenberg: writing UI as product, not afterthought<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#26-gutenberg-writing-ui-as-product-not-afterthought" class="hash-link" aria-label="Direct link to 2.6 Gutenberg: writing UI as product, not afterthought" title="Direct link to 2.6 Gutenberg: writing UI as product, not afterthought" translate="no">​</a></h3>
<p>WordPress 5.0's block editor was controversial, but one decision was right: <strong>treat the writing surface as core product</strong>, not a database form with labels.</p>
<p>ReactPress Admin uses Markdown — our primary audience is technical teams and developer blogs — yet the principle holds: drag-and-drop media, categories, tags, schedules, comment moderation, and plugin settings live in Admin.</p>
<p>We deliberately avoid stuffing React presentation components into Admin as "blocks." That would leak theme logic into core. <strong>Presentation components belong in themes.</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="27-data-ownership-and-open-source">2.7 Data ownership and open source<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#27-data-ownership-and-open-source" class="hash-link" aria-label="Direct link to 2.7 Data ownership and open source" title="Direct link to 2.7 Data ownership and open source" translate="no">​</a></h3>
<p>WordPress's GPL heritage and MySQL-on-disk model made <strong>migration and self-hosting</strong> credible.</p>
<p>ReactPress is <strong>MIT</strong>. SQLite lives at <code>.reactpress/reactpress.db</code>. Backup can be <code>tar czf backup.tar.gz .reactpress uploads</code>. For teams searching <strong>open source CMS</strong>, that means auditable source, no mandatory cloud, and fork-friendly customization.</p>
<p>When content is an asset, <strong>the platform must be portable too</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="28-the-wordpress-economy--lessons-for-reactpress">2.8 The WordPress economy — lessons for ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#28-the-wordpress-economy--lessons-for-reactpress" class="hash-link" aria-label="Direct link to 2.8 The WordPress economy — lessons for ReactPress" title="Direct link to 2.8 The WordPress economy — lessons for ReactPress" translate="no">​</a></h3>
<p>WordPress created parallel economies:</p>
<ul>
<li class=""><strong>Hosting</strong> (managed WordPress)</li>
<li class=""><strong>Themes</strong> (marketplace + custom agencies)</li>
<li class=""><strong>Plugins</strong> (free + premium)</li>
<li class=""><strong>Agencies</strong> (implementation + care plans)</li>
</ul>
<p>ReactPress 4.0's roadmap — npm theme catalog, plugin catalog, marketplace — targets the same <strong>extension economies</strong>, but with <strong>npm + TypeScript + Next.js</strong> as the distribution layer instead of zip uploads to <code>wp-content/</code>.</p>
<p>The goal is not to clone ThemeForest on day one. The goal is to make <strong>theme and plugin authors have a standard addressable runtime</strong> so ecosystem gravity can accumulate.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="3-the-react-ecosystem-gap">3. The React ecosystem gap<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#3-the-react-ecosystem-gap" class="hash-link" aria-label="Direct link to 3. The React ecosystem gap" title="Direct link to 3. The React ecosystem gap" translate="no">​</a></h2>
<p>"React CMS" is not an empty keyword. Many projects exist. Few occupy the <strong>Publishing Platform</strong> quadrant — editor-friendly <strong>and</strong> developer-friendly <strong>and</strong> complete out of the box.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="31-positioning-map">3.1 Positioning map<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#31-positioning-map" class="hash-link" aria-label="Direct link to 3.1 Positioning map" title="Direct link to 3.1 Positioning map" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">                    Editor-friendly</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                          ↑</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            WordPress     |     ReactPress (target)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                          |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Headless ───────────┼─────────── Full-stack frameworks</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      (Strapi, etc.)      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                          |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            Markdown+Git  |     Next.js blog templates</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                          ↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    Developer-friendly</span><br></div></code></pre></div></div>
<ul>
<li class=""><strong>Next.js blog templates:</strong> beautiful front ends, no CMS.</li>
<li class=""><strong>Headless CMS:</strong> strong APIs; you build Admin UX and visitor site.</li>
<li class=""><strong>Notion / docs → static:</strong> great drafting, weak custom domain + SEO control.</li>
<li class=""><strong>Git-based CMS (Tina, Decap):</strong> developer-native; higher friction for non-technical editors.</li>
<li class=""><strong>SaaS publishing (Ghost, Medium):</strong> complete loops, varying self-host and theme freedom.</li>
</ul>
<p><strong>The gap is upper-right:</strong> both editors and engineers happy, unified on React / Next.js.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="32-why-nextjs-did-not-ship-a-cms">3.2 Why Next.js did not ship a CMS<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#32-why-nextjs-did-not-ship-a-cms" class="hash-link" aria-label="Direct link to 3.2 Why Next.js did not ship a CMS" title="Direct link to 3.2 Why Next.js did not ship a CMS" translate="no">​</a></h3>
<p>Next.js is a <strong>rendering and routing framework</strong>, not a content platform. Contentlayer, MDX, Draft Mode — excellent for <strong>developer-driven</strong> sites, not <strong>daily editorial operations</strong>.</p>
<p>Expecting Next.js to bundle WordPress-style Admin is like expecting React to bundle a database. Framework teams correctly stay in lane.</p>
<p>So <strong>Next.js CMS</strong> became an <strong>integration problem</strong>: every team wires Headless + custom Admin + SEO + deploy. The community has brilliant <strong>parts</strong>, not a standard <strong>whole</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="33-search-intent-behind-the-keywords">3.3 Search intent behind the keywords<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#33-search-intent-behind-the-keywords" class="hash-link" aria-label="Direct link to 3.3 Search intent behind the keywords" title="Direct link to 3.3 Search intent behind the keywords" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Keyword</th><th style="text-align:left">Surface need</th><th style="text-align:left">Deep need</th></tr></thead><tbody><tr><td style="text-align:left">React CMS</td><td style="text-align:left">React admin</td><td style="text-align:left">No PHP; unified stack</td></tr><tr><td style="text-align:left">Next.js CMS</td><td style="text-align:left">Next integration</td><td style="text-align:left">SSR SEO + customizable front end</td></tr><tr><td style="text-align:left">WordPress alternative</td><td style="text-align:left">Leave WordPress</td><td style="text-align:left">Keep workflow, lose PHP baggage</td></tr><tr><td style="text-align:left">Open source CMS</td><td style="text-align:left">Self-host</td><td style="text-align:left">Data sovereignty, auditability</td></tr><tr><td style="text-align:left">React publishing platform</td><td style="text-align:left">End-to-end</td><td style="text-align:left"><strong>One command, not five repos</strong></td></tr></tbody></table>
<p>ReactPress answers the last row: <strong>Build. Manage. Extend.</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="34-our-own-iteration-history">3.4 Our own iteration history<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#34-our-own-iteration-history" class="hash-link" aria-label="Direct link to 3.4 Our own iteration history" title="Direct link to 3.4 Our own iteration history" translate="no">​</a></h3>
<p>ReactPress evolved inside the FECommunity ecosystem:</p>
<table><thead><tr><th style="text-align:left">Era</th><th style="text-align:left">Codename</th><th style="text-align:left">Lesson</th></tr></thead><tbody><tr><td style="text-align:left">2.x</td><td style="text-align:left">—</td><td style="text-align:left">Proved demand; packages too fragmented</td></tr><tr><td style="text-align:left">3.0</td><td style="text-align:left"><strong>Platform</strong></td><td style="text-align:left">One CLI, ~60s stack; Docker MySQL default felt heavy</td></tr><tr><td style="text-align:left">3.1+</td><td style="text-align:left">Toolkit</td><td style="text-align:left">Unified API contract; Next 14 / React 18</td></tr><tr><td style="text-align:left">4.0</td><td style="text-align:left"><strong>Extend</strong></td><td style="text-align:left">Plugins, desktop, npm themes; SQLite default; bundled CLI runtime</td></tr></tbody></table>
<p>Each release responded to Issues — not roadmap bingo. 4.0's bundled runtime, SQLite, npm themes, Hook plugins, and Electron desktop each map to repeated user stories.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="35-landscape-comparison-default-deliverables">3.5 Landscape comparison (default deliverables)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#35-landscape-comparison-default-deliverables" class="hash-link" aria-label="Direct link to 3.5 Landscape comparison (default deliverables)" title="Direct link to 3.5 Landscape comparison (default deliverables)" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Solution</th><th style="text-align:left">Ships by default</th><th style="text-align:left">Visitor site</th><th style="text-align:left">Typical friction</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Strapi</strong></td><td style="text-align:left">API + Admin</td><td style="text-align:left">No</td><td style="text-align:left">Build Next.js front end</td></tr><tr><td style="text-align:left"><strong>Payload</strong></td><td style="text-align:left">API + Admin (React)</td><td style="text-align:left">No</td><td style="text-align:left">Same</td></tr><tr><td style="text-align:left"><strong>Sanity</strong></td><td style="text-align:left">API + Studio</td><td style="text-align:left">No</td><td style="text-align:left">SaaS pricing, vendor path</td></tr><tr><td style="text-align:left"><strong>Contentful</strong></td><td style="text-align:left">API + web app</td><td style="text-align:left">No</td><td style="text-align:left">Enterprise Headless</td></tr><tr><td style="text-align:left"><strong>Ghost</strong></td><td style="text-align:left">API + Admin + theme</td><td style="text-align:left">Handlebars theme</td><td style="text-align:left">Not React stack</td></tr><tr><td style="text-align:left"><strong>TinaCMS</strong></td><td style="text-align:left">Git / API hybrid</td><td style="text-align:left">Varies</td><td style="text-align:left">Git conflicts, dev-centric</td></tr><tr><td style="text-align:left"><strong>Next.js blog example</strong></td><td style="text-align:left">Sample code</td><td style="text-align:left">Yes</td><td style="text-align:left">No CMS; Markdown in repo</td></tr><tr><td style="text-align:left"><strong>Headless WordPress</strong></td><td style="text-align:left">REST API</td><td style="text-align:left">You build</td><td style="text-align:left">Plugin/config sprawl</td></tr><tr><td style="text-align:left"><strong>ReactPress</strong></td><td style="text-align:left">API + Admin + theme + plugins + CLI + desktop</td><td style="text-align:left">Next.js SSR</td><td style="text-align:left">Young plugin market</td></tr></tbody></table>
<p>Google <strong>"Next.js CMS"</strong> and you mostly find tutorials on <strong>connecting</strong> Next.js to Headless — not <strong>installing a full CMS in one command</strong>. That tutorial-shaped gap is the product gap.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="36-signals-from-the-community">3.6 Signals from the community<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#36-signals-from-the-community" class="hash-link" aria-label="Direct link to 3.6 Signals from the community" title="Direct link to 3.6 Signals from the community" translate="no">​</a></h3>
<p>Recurring sentences in discussions and Issues:</p>
<ul>
<li class=""><em>"We already use Next.js — we don't want PHP WordPress for the blog."</em></li>
<li class=""><em>"Strapi works but I lost two weekends on the front end."</em></li>
<li class=""><em>"Is there a self-hosted open source option that isn't another assembly kit?"</em></li>
</ul>
<p>These are engineering pain, not marketing copy. ReactPress 4.0 is built as a response.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="37-the-missing-default-stack-moment">3.7 The missing "default stack" moment<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#37-the-missing-default-stack-moment" class="hash-link" aria-label="Direct link to 3.7 The missing &quot;default stack&quot; moment" title="Direct link to 3.7 The missing &quot;default stack&quot; moment" translate="no">​</a></h3>
<p>React has a default bundler story (Vite / webpack era), a default framework story (Next.js for full stack), a default UI story (component libraries) — but <strong>no default publish story</strong>.</p>
<p>When a junior developer asks "how do I launch my blog?" the answers fork:</p>
<ul>
<li class="">WordPress (PHP)</li>
<li class="">Medium / Substack (platform lock-in)</li>
<li class="">"Fork this Next.js template and use Notion as CMS"</li>
<li class="">"Spin up Strapi"</li>
</ul>
<p>There is no answer equivalent to <code>create-react-app</code> or <code>next new</code> for <strong>publishing</strong>. ReactPress aims to be that answer: <code>reactpress init</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="38-framework-churn-vs-platform-stability">3.8 Framework churn vs platform stability<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#38-framework-churn-vs-platform-stability" class="hash-link" aria-label="Direct link to 3.8 Framework churn vs platform stability" title="Direct link to 3.8 Framework churn vs platform stability" translate="no">​</a></h3>
<p>React teams rewrite front ends every few years — Pages Router to App Router, CSS-in-JS to Tailwind, REST to tRPC. <strong>Content outlives framework fashion.</strong></p>
<p>A publishing platform must separate <strong>durable content</strong> (articles, media, URLs) from <strong>replaceable presentation</strong> (themes). WordPress survived because themes churn while posts remain. ReactPress copies that separation with Next.js themes + stable REST — not by freezing your entire app in one Next repo.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="4-reactpress-philosophy">4. ReactPress philosophy<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#4-reactpress-philosophy" class="hash-link" aria-label="Direct link to 4. ReactPress philosophy" title="Direct link to 4. ReactPress philosophy" translate="no">​</a></h2>
<blockquote>
<p><strong>ReactPress is not only a Headless CMS. It is an open-source publishing platform for the React era.</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="41-one-sentence-definition">4.1 One-sentence definition<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#41-one-sentence-definition" class="hash-link" aria-label="Direct link to 4.1 One-sentence definition" title="Direct link to 4.1 One-sentence definition" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">Admin owns content · Theme owns presentation · Plugin owns logic</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">· API owns data · Toolkit owns the contract</span><br></div></code></pre></div></div>
<ul>
<li class=""><strong>Content belongs to the system</strong> — posts, pages, media, taxonomy, comments, settings.</li>
<li class=""><strong>Presentation belongs to themes</strong> — swappable Next.js apps.</li>
<li class=""><strong>Logic belongs to plugins</strong> — SEO, summaries, image pipelines via Hooks.</li>
<li class=""><strong>Data exposes through API</strong> — REST, Swagger, API keys.</li>
<li class=""><strong>Toolkit unifies clients</strong> — one typed HTTP layer for Admin, theme, plugin UI.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="42-vs-headless-cms">4.2 vs Headless CMS<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#42-vs-headless-cms" class="hash-link" aria-label="Direct link to 4.2 vs Headless CMS" title="Direct link to 4.2 vs Headless CMS" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Dimension</th><th style="text-align:left">Headless CMS</th><th style="text-align:left">ReactPress</th></tr></thead><tbody><tr><td style="text-align:left">Deliverable</td><td style="text-align:left">API (+ Admin)</td><td style="text-align:left">API + Admin + theme + plugins + CLI + desktop</td></tr><tr><td style="text-align:left">Visitor site</td><td style="text-align:left">Your problem</td><td style="text-align:left">Official Next.js theme; swappable</td></tr><tr><td style="text-align:left">Onboarding</td><td style="text-align:left">Deploy backend → build front end</td><td style="text-align:left"><code>reactpress init</code> ~60s</td></tr><tr><td style="text-align:left">Extension</td><td style="text-align:left">Webhooks, custom fields</td><td style="text-align:left">Hooks + <code>plugin.json</code> + Admin slots</td></tr><tr><td style="text-align:left">Stack</td><td style="text-align:left">Mixed</td><td style="text-align:left">React + Next.js + NestJS</td></tr></tbody></table>
<p>Need only an API and custom everything? Headless may be lighter.</p>
<p>Need <strong>WordPress workflow + React front end + one CLI</strong>? ReactPress fits — the practical <strong>WordPress alternative</strong> for JS teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="43-design-principles">4.3 Design principles<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#43-design-principles" class="hash-link" aria-label="Direct link to 4.3 Design principles" title="Direct link to 4.3 Design principles" translate="no">​</a></h3>
<p>From <a href="https://github.com/fecommunity/reactpress/blob/master/ARCHITECTURE.md" target="_blank" rel="noopener noreferrer" class="">ARCHITECTURE.md</a>:</p>
<p><strong>Maintainability → Extensibility → Tech fit → Low cost</strong></p>
<p>Hard rules:</p>
<ol>
<li class=""><strong>Admin does not serve visitor pages.</strong> Themes do not serve <code>/admin/</code>.</li>
<li class="">All front ends talk to the API <strong>only through Toolkit</strong>.</li>
<li class=""><strong>Server depends on no front-end package.</strong></li>
<li class=""><strong>Themes never touch the database.</strong></li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="44-two-audiences-two-paths">4.4 Two audiences, two paths<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#44-two-audiences-two-paths" class="hash-link" aria-label="Direct link to 4.4 Two audiences, two paths" title="Direct link to 4.4 Two audiences, two paths" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Audience</th><th style="text-align:left">Goal</th><th style="text-align:left">Entry</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Site owners</strong></td><td style="text-align:left">Launch blog, team publishing</td><td style="text-align:left"><code>npm i -g @fecommunity/reactpress</code> → <code>init</code></td></tr><tr><td style="text-align:left"><strong>Contributors</strong></td><td style="text-align:left">Core, themes, plugins</td><td style="text-align:left">Clone monorepo → <code>pnpm dev</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="45-thirty-second-start">4.5 Thirty-second start<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#45-thirty-second-start" class="hash-link" aria-label="Direct link to 4.5 Thirty-second start" title="Direct link to 4.5 Thirty-second start" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-site &amp;&amp; cd my-site</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<table><thead><tr><th style="text-align:left">Service</th><th style="text-align:left">URL</th></tr></thead><tbody><tr><td style="text-align:left">Public site</td><td style="text-align:left"><a href="http://localhost:3001/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001</a></td></tr><tr><td style="text-align:left">Admin</td><td style="text-align:left"><a href="http://localhost:3001/admin/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001/admin/</a> (<code>admin</code> / <code>admin</code>)</td></tr><tr><td style="text-align:left">API</td><td style="text-align:left"><a href="http://localhost:3002/api/health" target="_blank" rel="noopener noreferrer" class="">http://localhost:3002/api/health</a></td></tr></tbody></table>
<p>SQLite by default. No Docker. <code>reactpress doctor</code> when something fails.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="46-content-in-the-system-front-end-for-developers-in-practice">4.6 "Content in the system, front end for developers" in practice<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#46-content-in-the-system-front-end-for-developers-in-practice" class="hash-link" aria-label="Direct link to 4.6 &quot;Content in the system, front end for developers&quot; in practice" title="Direct link to 4.6 &quot;Content in the system, front end for developers&quot; in practice" translate="no">​</a></h3>
<p><strong>Anti-pattern A:</strong> Embed full theme preview in Admin with global theme CSS — couples Admin to theme; theme swap breaks back office.</p>
<p><strong>Anti-pattern B:</strong> Theme reads DB connection strings — kills Headless path and security boundaries.</p>
<p><strong>ReactPress approach:</strong> Preview on <code>:3003</code>; themes use <code>NEXT_PUBLIC_API_URL</code>; mutations go through authenticated REST.</p>
<p>Editors and theme developers work in <strong>parallel pipelines</strong> — essential for multi-disciplinary teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="47-vs-visual-site-builders">4.7 vs visual site builders<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#47-vs-visual-site-builders" class="hash-link" aria-label="Direct link to 4.7 vs visual site builders" title="Direct link to 4.7 vs visual site builders" translate="no">​</a></h3>
<p>Webflow, Framer, Wix solve publishing through <strong>visual editors + hosted lock-in</strong>. Great for landing pages; narrow for teams that need <strong>Git-reviewed theme code, CI deploy, API integrations</strong>.</p>
<p>ReactPress is not a drag-and-drop page builder. It serves teams who treat <strong>code as asset</strong> — themes in Git, plugins in monorepo, content in CMS.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="48-what-platform-means-operationally">4.8 What "platform" means operationally<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#48-what-platform-means-operationally" class="hash-link" aria-label="Direct link to 4.8 What &quot;platform&quot; means operationally" title="Direct link to 4.8 What &quot;platform&quot; means operationally" translate="no">​</a></h3>
<p>A platform provides:</p>
<ul>
<li class=""><strong>Stable contracts</strong> (REST + Toolkit types)</li>
<li class=""><strong>Lifecycle tools</strong> (<code>init</code>, <code>doctor</code>, <code>logs</code>, <code>stop</code>)</li>
<li class=""><strong>Extension registries</strong> (themes, plugins)</li>
<li class=""><strong>Opinionated defaults</strong> (SQLite, official theme, SEO plugin)</li>
<li class=""><strong>Escape hatches</strong> (Headless-only, custom theme, MySQL)</li>
</ul>
<p>A CMS backend alone provides APIs. ReactPress provides <strong>the full operational loop</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="5-system-architecture">5. System architecture<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#5-system-architecture" class="hash-link" aria-label="Direct link to 5. System architecture" title="Direct link to 5. System architecture" translate="no">​</a></h2>
<p>ReactPress 4.0 uses a <strong>monorepo + multi-process</strong> model: content management, visitor delivery, and API services are decoupled; <strong>Toolkit</strong> unifies contracts.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="51-architecture-diagram">5.1 Architecture diagram<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#51-architecture-diagram" class="hash-link" aria-label="Direct link to 5.1 Architecture diagram" title="Direct link to 5.1 Architecture diagram" translate="no">​</a></h3>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="52-authoring-to-delivery-flow">5.2 Authoring-to-delivery flow<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#52-authoring-to-delivery-flow" class="hash-link" aria-label="Direct link to 5.2 Authoring-to-delivery flow" title="Direct link to 5.2 Authoring-to-delivery flow" translate="no">​</a></h3>
<!-- -->
<p><strong>Step-by-step:</strong></p>
<ol>
<li class="">Author creates content in <strong>Admin</strong> or <strong>Desktop</strong>.</li>
<li class="">Request flows through <strong>Toolkit</strong> to <strong>NestJS API</strong>.</li>
<li class=""><strong>Plugins</strong> run on Hooks — summaries, SEO validation, image jobs.</li>
<li class="">Data persists to <strong>SQLite</strong> (default) or <strong>MySQL</strong>.</li>
<li class=""><strong>Theme</strong> fetches published content and SSR/ISR renders for visitors and crawlers.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="53-package-responsibility-matrix">5.3 Package responsibility matrix<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#53-package-responsibility-matrix" class="hash-link" aria-label="Direct link to 5.3 Package responsibility matrix" title="Direct link to 5.3 Package responsibility matrix" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Package</th><th style="text-align:left">npm</th><th style="text-align:left">Role</th><th style="text-align:left">Rendering</th><th style="text-align:left">SEO</th></tr></thead><tbody><tr><td style="text-align:left"><strong>server</strong></td><td style="text-align:left">Bundled in CLI</td><td style="text-align:left">Business logic, persistence, auth, Hooks</td><td style="text-align:left">—</td><td style="text-align:left">—</td></tr><tr><td style="text-align:left"><strong>web</strong></td><td style="text-align:left">Bundled in CLI</td><td style="text-align:left">Admin UI</td><td style="text-align:left">Vite CSR</td><td style="text-align:left">No</td></tr><tr><td style="text-align:left"><strong>themes/</strong></td><td style="text-align:left">Per theme</td><td style="text-align:left">Visitor site</td><td style="text-align:left">Next SSR/ISR</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left"><strong>toolkit</strong></td><td style="text-align:left"><code>@fecommunity/reactpress-toolkit</code></td><td style="text-align:left">API client, types</td><td style="text-align:left">—</td><td style="text-align:left">—</td></tr><tr><td style="text-align:left"><strong>plugins/</strong></td><td style="text-align:left">Per plugin</td><td style="text-align:left">Hook logic + Admin slots</td><td style="text-align:left">Mixed</td><td style="text-align:left">Plugin-driven</td></tr><tr><td style="text-align:left"><strong>desktop</strong></td><td style="text-align:left">GitHub Releases</td><td style="text-align:left">Electron + local API</td><td style="text-align:left">Loads <code>web/dist</code></td><td style="text-align:left">No</td></tr><tr><td style="text-align:left"><strong>cli</strong></td><td style="text-align:left"><code>@fecommunity/reactpress</code></td><td style="text-align:left">init, doctor, orchestration</td><td style="text-align:left">—</td><td style="text-align:left">—</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="54-technology-choices">5.4 Technology choices<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#54-technology-choices" class="hash-link" aria-label="Direct link to 5.4 Technology choices" title="Direct link to 5.4 Technology choices" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Decision</th><th style="text-align:left">Choice</th><th style="text-align:left">Rationale</th></tr></thead><tbody><tr><td style="text-align:left">API</td><td style="text-align:left">NestJS</td><td style="text-align:left">Modular TS, Hook-friendly</td></tr><tr><td style="text-align:left">Admin</td><td style="text-align:left">Vite + React SPA</td><td style="text-align:left">Interactive; no SSR needed</td></tr><tr><td style="text-align:left">Visitor site</td><td style="text-align:left">Next.js App Router</td><td style="text-align:left">SSR/ISR, SEO primitives</td></tr><tr><td style="text-align:left">Extension</td><td style="text-align:left">Hooks + manifest</td><td style="text-align:left">WordPress mental model</td></tr><tr><td style="text-align:left">Default DB</td><td style="text-align:left">SQLite</td><td style="text-align:left">Zero config</td></tr><tr><td style="text-align:left">Desktop</td><td style="text-align:left">Electron</td><td style="text-align:left">Reuse Admin SPA</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="55-runtime-ports">5.5 Runtime ports<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#55-runtime-ports" class="hash-link" aria-label="Direct link to 5.5 Runtime ports" title="Direct link to 5.5 Runtime ports" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Process</th><th style="text-align:left">Default port</th><th style="text-align:left">Notes</th></tr></thead><tbody><tr><td style="text-align:left">Theme (public)</td><td style="text-align:left">3001</td><td style="text-align:left">Includes <code>/admin/</code> proxy</td></tr><tr><td style="text-align:left">API</td><td style="text-align:left">3002</td><td style="text-align:left">REST + Swagger</td></tr><tr><td style="text-align:left">Theme preview</td><td style="text-align:left">3003</td><td style="text-align:left">Admin iframe preview</td></tr><tr><td style="text-align:left">Admin (monorepo dev)</td><td style="text-align:left">3000</td><td style="text-align:left">Standalone Vite dev server</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="56-directory-layout-after-init">5.6 Directory layout after <code>init</code><a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#56-directory-layout-after-init" class="hash-link" aria-label="Direct link to 56-directory-layout-after-init" title="Direct link to 56-directory-layout-after-init" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">my-site/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── .reactpress/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── config.json          # ports, database, URLs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── runtime/{theme-id}/  # installed theme copy</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── plugins/{plugin-id}/ # installed plugins</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── reactpress.db        # SQLite (default)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── .env                       # CLI-generated</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── uploads/                   # media</span><br></div></code></pre></div></div>
<p>Think of <code>.reactpress/</code> as WordPress <code>wp-content/</code> + database — backup with:</p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">tar czf backup.tar.gz .reactpress uploads</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="57-toolkit-single-api-client-discipline">5.7 Toolkit: single API client discipline<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#57-toolkit-single-api-client-discipline" class="hash-link" aria-label="Direct link to 5.7 Toolkit: single API client discipline" title="Direct link to 5.7 Toolkit: single API client discipline" translate="no">​</a></h3>
<p>Early 3.x allowed ad-hoc <code>fetch</code> per package → field drift between Admin and theme. 4.0 enforces <strong>Toolkit only</strong>:</p>
<ul>
<li class="">OpenAPI-aligned types and paths</li>
<li class="">Unified errors and auth headers</li>
<li class=""><code>createThemeApi</code>, <code>PluginContext</code>, Admin React hooks</li>
</ul>
<p>You lose "raw axios everywhere" freedom; you gain <strong>fewer production surprises on upgrade</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="58-headless-without-leaving-the-platform">5.8 Headless without leaving the platform<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#58-headless-without-leaving-the-platform" class="hash-link" aria-label="Direct link to 5.8 Headless without leaving the platform" title="Direct link to 5.8 Headless without leaving the platform" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">curl -H "X-API-Key: YOUR_KEY" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "http://localhost:3002/api/article/headless/list?status=publish&amp;page=1&amp;pageSize=10"</span><br></div></code></pre></div></div>
<p>Use API-only for mobile apps, secondary sites, or microservices — <strong>same content, many surfaces</strong>. That is how a <strong>React CMS</strong> should flex.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="59-monorepo-map-for-contributors">5.9 Monorepo map for contributors<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#59-monorepo-map-for-contributors" class="hash-link" aria-label="Direct link to 5.9 Monorepo map for contributors" title="Direct link to 5.9 Monorepo map for contributors" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Directory</th><th style="text-align:left">Purpose</th></tr></thead><tbody><tr><td style="text-align:left"><code>cli/</code></td><td style="text-align:left">Global CLI, process orchestration, bundled runtime</td></tr><tr><td style="text-align:left"><code>server/</code></td><td style="text-align:left">NestJS modules, entities, Hook service</td></tr><tr><td style="text-align:left"><code>web/</code></td><td style="text-align:left">Admin SPA</td></tr><tr><td style="text-align:left"><code>themes/</code></td><td style="text-align:left">Theme registry + hello-world + catalog anchors</td></tr><tr><td style="text-align:left"><code>plugins/</code></td><td style="text-align:left">Plugin registry + built-ins</td></tr><tr><td style="text-align:left"><code>toolkit/</code></td><td style="text-align:left">Shared types and HTTP clients</td></tr><tr><td style="text-align:left"><code>desktop/</code></td><td style="text-align:left">Electron main/preload, local API bootstrap</td></tr></tbody></table>
<p>End users never clone this. They install <code>@fecommunity/reactpress</code> and run <code>init</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="510-failure-modes-and-boundaries">5.10 Failure modes and boundaries<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#510-failure-modes-and-boundaries" class="hash-link" aria-label="Direct link to 5.10 Failure modes and boundaries" title="Direct link to 5.10 Failure modes and boundaries" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Failure</th><th style="text-align:left">Guardrail</th></tr></thead><tbody><tr><td style="text-align:left">Theme bypasses API</td><td style="text-align:left">Architecture review; no DB drivers in theme</td></tr><tr><td style="text-align:left">Plugin injects Next routes</td><td style="text-align:left">Forbidden — plugins are server-side</td></tr><tr><td style="text-align:left">Admin embeds business rules</td><td style="text-align:left">Belongs in plugins via Hooks</td></tr><tr><td style="text-align:left">Multiple API clients</td><td style="text-align:left">Toolkit enforcement</td></tr></tbody></table>
<p>These boundaries feel strict until you maintain the project for three years — then they feel like oxygen.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="6-see-it-in-action">6. See it in action<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#6-see-it-in-action" class="hash-link" aria-label="Direct link to 6. See it in action" title="Direct link to 6. See it in action" translate="no">​</a></h2>
<p>Platforms are judged by whether they <strong>run</strong>, not only whether they diagram well.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="61-cli-install-to-live-site-in-60-seconds">6.1 CLI: install to live site in ~60 seconds<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#61-cli-install-to-live-site-in-60-seconds" class="hash-link" aria-label="Direct link to 6.1 CLI: install to live site in ~60 seconds" title="Direct link to 6.1 CLI: install to live site in ~60 seconds" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="ReactPress CLI — from install to running site in about 60 seconds" src="https://reactpress.cc/assets/images/usage-d726dbd6e25973f3b2662771aed9e6cf.gif" width="1796" height="863" class="img_hKc8"></p>
<p>One global install. One <code>init</code>. Browser opens to visitor site and Admin. No Docker pull. No six terminals. No handwritten env files.</p>
<p>This is the WordPress "single front door" lesson — delivered as <strong>React + Next.js + NestJS</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="62-visitor-site-search-comments-knowledge-base-dark-mode">6.2 Visitor site: search, comments, knowledge base, dark mode<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#62-visitor-site-search-comments-knowledge-base-dark-mode" class="hash-link" aria-label="Direct link to 6.2 Visitor site: search, comments, knowledge base, dark mode" title="Direct link to 6.2 Visitor site: search, comments, knowledge base, dark mode" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Official theme — search, comments, knowledge base, dark mode" src="https://reactpress.cc/assets/images/demo-e38a1e116cd27e6fe14fdbfbfda16e2b.gif" width="1180" height="660" class="img_hKc8"></p>
<p>The official <a href="https://reactpress-theme-starter.vercel.app/" target="_blank" rel="noopener noreferrer" class="">reactpress-theme-starter</a> demo includes:</p>
<ul>
<li class="">Full-text search</li>
<li class="">Comment system</li>
<li class="">Knowledge base / docs navigation</li>
<li class="">Dark mode</li>
<li class="">Responsive layout</li>
<li class=""><code>sitemap.xml</code>, <code>robots.txt</code>, JSON-LD</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="63-lighthouse-performance-and-seo-as-defaults">6.3 Lighthouse: performance and SEO as defaults<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#63-lighthouse-performance-and-seo-as-defaults" class="hash-link" aria-label="Direct link to 6.3 Lighthouse: performance and SEO as defaults" title="Direct link to 6.3 Lighthouse: performance and SEO as defaults" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Lighthouse scores on the official theme demo" src="https://reactpress.cc/assets/images/lighthouse-8e583f1d8db7707ba8edb2060875e3c0.png" width="2634" height="1452" class="img_hKc8"></p>
<p>On the official theme demo, scores reach <strong>Performance 95 / SEO 100</strong> (your production numbers depend on hosting and content).</p>
<p>For <strong>Next.js CMS</strong> evaluations, this matters: you should not trade WordPress-style workflow for a slow visitor experience. The default theme exists to prove <strong>workflow + speed</strong> coexist.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="64-live-demos">6.4 Live demos<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#64-live-demos" class="hash-link" aria-label="Direct link to 6.4 Live demos" title="Direct link to 6.4 Live demos" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Demo</th><th style="text-align:left">URL</th></tr></thead><tbody><tr><td style="text-align:left">Production blog</td><td style="text-align:left"><a href="https://blog.gaoredu.com/" target="_blank" rel="noopener noreferrer" class="">blog.gaoredu.com</a></td></tr><tr><td style="text-align:left">Theme starter</td><td style="text-align:left"><a href="https://reactpress-theme-starter.vercel.app/" target="_blank" rel="noopener noreferrer" class="">reactpress-theme-starter.vercel.app</a></td></tr><tr><td style="text-align:left">Documentation</td><td style="text-align:left"><a href="https://reactpress.cc/" target="_blank" rel="noopener noreferrer" class="">reactpress.cc</a></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="65-before--after-assembly">6.5 Before / after assembly<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#65-before--after-assembly" class="hash-link" aria-label="Direct link to 6.5 Before / after assembly" title="Direct link to 6.5 Before / after assembly" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">Before (typical Headless assembly)          With ReactPress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">─────────────────────────────────          ─────────────────</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Pick CMS backend                      →    reactpress init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Build or customize Admin              →    Admin at /admin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Develop Next.js visitor site          →    http://localhost:3001</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Debug env / ports / DB                →    reactpress doctor</span><br></div></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="7-admin-the-writing-surface">7. Admin: the writing surface<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#7-admin-the-writing-surface" class="hash-link" aria-label="Direct link to 7. Admin: the writing surface" title="Direct link to 7. Admin: the writing surface" translate="no">​</a></h2>
<p>Visitors see the theme. Authors live in <strong>Admin</strong>. If Admin fails, the platform fails — regardless of API elegance.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="71-post-editor">7.1 Post editor<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#71-post-editor" class="hash-link" aria-label="Direct link to 7.1 Post editor" title="Direct link to 7.1 Post editor" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="ReactPress Admin — Markdown post editor" src="https://reactpress.cc/assets/images/post-435bb396c480d4bac00214772118482d.png" width="3584" height="2006" class="img_hKc8"></p>
<p>Admin provides:</p>
<ul>
<li class=""><strong>Markdown editor</strong> with code blocks, tables, paste-to-upload images</li>
<li class=""><strong>Draft / publish</strong> workflow</li>
<li class=""><strong>Categories and tags</strong></li>
<li class=""><strong>Pages</strong> and <strong>knowledge base</strong> content types</li>
<li class=""><strong>Revision history</strong> (server-side)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="72-media-library">7.2 Media library<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#72-media-library" class="hash-link" aria-label="Direct link to 7.2 Media library" title="Direct link to 7.2 Media library" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="ReactPress Admin — media library" src="https://reactpress.cc/assets/images/midia-5ef765e66a6a6fadbdb18ea7ae1aa00b.png" width="3584" height="2006" class="img_hKc8"></p>
<p>Centralized media under <code>uploads/</code> with optional OSS configuration (Aliyun OSS supported in server modules). Authors should not FTP files or open S3 consoles for a blog image.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="73-plugins-panel">7.3 Plugins panel<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#73-plugins-panel" class="hash-link" aria-label="Direct link to 7.3 Plugins panel" title="Direct link to 7.3 Plugins panel" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="ReactPress Admin — plugin management" src="https://reactpress.cc/assets/images/plugins-fa79e47a80061f236abab7af9e76b19e.png" width="3578" height="2000" class="img_hKc8"></p>
<p>Install, enable, and configure plugins without SSH. Built-in plugins:</p>
<table><thead><tr><th style="text-align:left">Plugin</th><th style="text-align:left">Capability</th></tr></thead><tbody><tr><td style="text-align:left"><code>seo</code></td><td style="text-align:left">Slug, keywords, meta description + editor slot</td></tr><tr><td style="text-align:left"><code>hello-world</code></td><td style="text-align:left">Auto-generate summaries on publish</td></tr><tr><td style="text-align:left"><code>image-optimizer</code></td><td style="text-align:left">Batch WebP optimization for legacy media</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="74-appearance-and-themes">7.4 Appearance and themes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#74-appearance-and-themes" class="hash-link" aria-label="Direct link to 7.4 Appearance and themes" title="Direct link to 7.4 Appearance and themes" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="ReactPress Admin — theme customization" src="https://reactpress.cc/assets/images/theme-custom-0284c814b023ce59762353463a1c7e0e.png" width="3580" height="1996" class="img_hKc8"></p>
<p><strong>Appearance → Themes</strong> — install from registry, preview on <code>:3003</code>, activate for <code>:3001</code>. Swapping themes does not migrate content; it changes presentation only.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="75-site-settings">7.5 Site settings<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#75-site-settings" class="hash-link" aria-label="Direct link to 7.5 Site settings" title="Direct link to 7.5 Site settings" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="ReactPress Admin — site settings" src="https://reactpress.cc/assets/images/settings-332b55a4300b838403f7362532659ecd.png" width="3584" height="1984" class="img_hKc8"></p>
<p>Site title, URLs, API keys, comment policies, and integration settings — the operational layer authors and admins share.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="76-comments-moderation">7.6 Comments moderation<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#76-comments-moderation" class="hash-link" aria-label="Direct link to 7.6 Comments moderation" title="Direct link to 7.6 Comments moderation" translate="no">​</a></h3>
<p>Comments flow through API with JWT for creation, server-side HTML sanitization after Markdown parsing (security hardening in 3.7+), and moderation UI in Admin. Stored XSS and spam are platform concerns, not theme afterthoughts.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="77-default-credentials-warning">7.7 Default credentials warning<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#77-default-credentials-warning" class="hash-link" aria-label="Direct link to 7.7 Default credentials warning" title="Direct link to 7.7 Default credentials warning" translate="no">​</a></h3>
<p>Local <code>admin</code> / <code>admin</code> is for trial only. Change passwords before production; <code>reactpress doctor</code> surfaces common security omissions.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="8-theme-system">8. Theme system<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#8-theme-system" class="hash-link" aria-label="Direct link to 8. Theme system" title="Direct link to 8. Theme system" translate="no">​</a></h2>
<blockquote>
<p><strong>Theme = presentation.</strong> What visitors see is a replaceable Next.js app.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="81-two-sources-three-layers">8.1 Two sources, three layers<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#81-two-sources-three-layers" class="hash-link" aria-label="Direct link to 8.1 Two sources, three layers" title="Direct link to 8.1 Two sources, three layers" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">┌─────────────────────────────────────────────────────────────┐</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  Sources                                                     │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│    local  themes/{id}/  →  .reactpress/runtime/{id}/          │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│    npm    npm package   →  .reactpress/runtime/{id}/        │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└─────────────────────────────────────────────────────────────┘</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">┌─────────────────────────────────────────────────────────────┐</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  Layers                                                      │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│    themes/              Registry                             │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│    .reactpress/runtime/ Materialized (CLI runs this)         │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│    DB + active config   Which theme is live on :3001         │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└─────────────────────────────────────────────────────────────┘</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="82-official-themes">8.2 Official themes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#82-official-themes" class="hash-link" aria-label="Direct link to 8.2 Official themes" title="Direct link to 8.2 Official themes" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Theme</th><th style="text-align:left">Source</th><th style="text-align:left">Use case</th></tr></thead><tbody><tr><td style="text-align:left">hello-world</td><td style="text-align:left">Monorepo local</td><td style="text-align:left">Learning, fork base</td></tr><tr><td style="text-align:left">reactpress-theme-starter</td><td style="text-align:left">npm catalog</td><td style="text-align:left">Production — search, KB, comments</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">reactpress theme add @fecommunity/reactpress-theme-starter@1.0.0-beta.0</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="83-mock-development-without-api">8.3 Mock development without API<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#83-mock-development-without-api" class="hash-link" aria-label="Direct link to 8.3 Mock development without API" title="Direct link to 8.3 Mock development without API" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npx create-next-app@latest my-blog \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --example "https://github.com/fecommunity/reactpress-theme-starter" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --use-pnpm</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd my-blog &amp;&amp; pnpm dev:mock</span><br></div></code></pre></div></div>
<p>Theme authors iterate UI without booting full platform — faster design cycles.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="84-data-fetching-in-themes">8.4 Data fetching in themes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#84-data-fetching-in-themes" class="hash-link" aria-label="Direct link to 8.4 Data fetching in themes" title="Direct link to 8.4 Data fetching in themes" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-typescript codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> createThemeApi </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@fecommunity/reactpress-toolkit/theme'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> api </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createThemeApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> baseURL</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">NEXT_PUBLIC_API_URL</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> data </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> api</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'publish'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> page</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Environment variables align with <code>reactpress init</code> output (<code>CLIENT_SITE_URL</code>, API URL).</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="85-app-router-conventions">8.5 App Router conventions<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#85-app-router-conventions" class="hash-link" aria-label="Direct link to 8.5 App Router conventions" title="Direct link to 8.5 App Router conventions" translate="no">​</a></h3>
<p>Official starter routes (illustrative):</p>
<table><thead><tr><th style="text-align:left">Route</th><th style="text-align:left">Purpose</th></tr></thead><tbody><tr><td style="text-align:left"><code>/</code></td><td style="text-align:left">Home</td></tr><tr><td style="text-align:left"><code>/blog/[slug]</code></td><td style="text-align:left">Article detail</td></tr><tr><td style="text-align:left"><code>/blog</code></td><td style="text-align:left">Article list</td></tr><tr><td style="text-align:left"><code>/docs/[...slug]</code></td><td style="text-align:left">Knowledge base</td></tr><tr><td style="text-align:left"><code>/search</code></td><td style="text-align:left">Search results</td></tr></tbody></table>
<p>Customize freely — contract is <strong>fetch via Toolkit</strong>, not specific folder names.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="86-seo-responsibilities-in-themes">8.6 SEO responsibilities in themes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#86-seo-responsibilities-in-themes" class="hash-link" aria-label="Direct link to 8.6 SEO responsibilities in themes" title="Direct link to 8.6 SEO responsibilities in themes" translate="no">​</a></h3>
<p>As the <strong>Next.js CMS</strong> visitor layer, themes own:</p>
<ul>
<li class="">SSR/ISR HTML completeness for crawlers</li>
<li class="">Per-route <code>&lt;title&gt;</code>, meta description, OG tags from API fields</li>
<li class=""><code>/sitemap.xml</code> and <code>robots.txt</code></li>
<li class="">JSON-LD structured data</li>
</ul>
<p>Admin + SEO plugin <strong>write</strong> metadata; theme <strong>renders</strong> it. Change SEO strategy by swapping plugins, not forking themes.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="87-deployment-patterns-for-themes">8.7 Deployment patterns for themes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#87-deployment-patterns-for-themes" class="hash-link" aria-label="Direct link to 8.7 Deployment patterns for themes" title="Direct link to 8.7 Deployment patterns for themes" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Pattern</th><th style="text-align:left">When</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Unified</strong></td><td style="text-align:left">API + theme same VPS — <code>reactpress init</code> style</td></tr><tr><td style="text-align:left"><strong>Split</strong></td><td style="text-align:left">Theme on Vercel Edge, API on VPS — classic Jamstack</td></tr><tr><td style="text-align:left"><strong>Custom</strong></td><td style="text-align:left">Mobile app or second Next site via Headless API only</td></tr></tbody></table>
<p><strong>One content graph, many surfaces</strong> — the publishing platform difference.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="88-migrating-from-wordpress-themes">8.8 Migrating from WordPress themes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#88-migrating-from-wordpress-themes" class="hash-link" aria-label="Direct link to 8.8 Migrating from WordPress themes" title="Direct link to 8.8 Migrating from WordPress themes" translate="no">​</a></h3>
<p>There is no magic PHP→JSX converter. You <strong>rewrite presentation in React</strong> — cost upfront, benefits long-term:</p>
<ul>
<li class="">Reuse design system components</li>
<li class="">Storybook and unit tests on UI</li>
<li class="">Predictable performance without unknown PHP plugins</li>
</ul>
<p>Migrate <strong>content</strong> via WordPress REST export scripts into ReactPress API. ReactPress offers <strong>new front end, familiar workflow</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="89-theme-catalog-and-version-compatibility">8.9 Theme catalog and version compatibility<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#89-theme-catalog-and-version-compatibility" class="hash-link" aria-label="Direct link to 8.9 Theme catalog and version compatibility" title="Direct link to 8.9 Theme catalog and version compatibility" translate="no">​</a></h3>
<p><code>theme.json</code> + <code>theme.manifest.schema.json</code> declare <code>requires: "&gt;=4.0.0"</code>. CLI blocks silently incompatible installs. Roadmap <strong>theme marketplace</strong> adds discovery and ratings — WordPress theme shop proved skin-swapping demand; we distribute via <strong>npm + Next.js</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="9-plugin-system">9. Plugin system<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#9-plugin-system" class="hash-link" aria-label="Direct link to 9. Plugin system" title="Direct link to 9. Plugin system" translate="no">​</a></h2>
<p>ReactPress 4.0 (codename <strong>Extend</strong>) makes <strong>Hook + <code>plugin.json</code></strong> a first-class extension model.</p>
<blockquote>
<p><strong>Theme = presentation · Plugin = logic</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="91-lifecycle">9.1 Lifecycle<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#91-lifecycle" class="hash-link" aria-label="Direct link to 9.1 Lifecycle" title="Direct link to 9.1 Lifecycle" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">Discover → Install → Enable → Configure → (optional) Uninstall</span><br></div></code></pre></div></div>
<ul>
<li class=""><strong>Admin → Plugins</strong> for GUI</li>
<li class=""><strong>CLI:</strong> <code>reactpress plugin list</code>, <code>reactpress plugin install &lt;id&gt;</code></li>
<li class=""><strong>Manifest:</strong> <code>plugin.json</code> declares hooks, Admin slots, settings schema</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="92-registry-model">9.2 Registry model<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#92-registry-model" class="hash-link" aria-label="Direct link to 9.2 Registry model" title="Direct link to 9.2 Registry model" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">plugins/               Registry (what can be installed)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">.reactpress/plugins/   Materialized installed copy + dist</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">DB globalSetting       Enabled list + per-plugin config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ↓ activate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">HookService            require(module) → register(hooks, ctx)</span><br></div></code></pre></div></div>
<p>Aligns with theme three-layer model — authors learn once.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="93-server-plugin-example">9.3 Server plugin example<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#93-server-plugin-example" class="hash-link" aria-label="Direct link to 9.3 Server plugin example" title="Direct link to 9.3 Server plugin example" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-typescript codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> PluginContext </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@fecommunity/reactpress-toolkit/plugin'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hooks</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> PluginContext</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'hooks'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ctx</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> PluginContext</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  hooks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addFilter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'article.beforePublish'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">slice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">160</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Build: <code>pnpm run build:plugins</code> in monorepo; <code>reactpress plugin install</code> for end users.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="94-hooks-vs-webhooks">9.4 Hooks vs webhooks<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#94-hooks-vs-webhooks" class="hash-link" aria-label="Direct link to 9.4 Hooks vs webhooks" title="Direct link to 9.4 Hooks vs webhooks" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Mechanism</th><th style="text-align:left">Direction</th><th style="text-align:left">Can mutate data</th><th style="text-align:left">Example</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Hook</strong></td><td style="text-align:left">In-process inbound</td><td style="text-align:left">Yes (filters)</td><td style="text-align:left">SEO validation, auto summary</td></tr><tr><td style="text-align:left"><strong>Webhook</strong></td><td style="text-align:left">Outbound HTTP</td><td style="text-align:left">No</td><td style="text-align:left">Slack notify, CI trigger</td></tr></tbody></table>
<p>Publish pipeline:</p>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">article.service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ├─ applyFilters('article.beforePublish')   ← plugins</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ├─ persist</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ├─ doAction('article.afterPublish')        ← plugins</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  └─ webhookService.dispatch('article.published')</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="95-admin-slots">9.5 Admin slots<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#95-admin-slots" class="hash-link" aria-label="Direct link to 9.5 Admin slots" title="Direct link to 9.5 Admin slots" translate="no">​</a></h3>
<p>Plugins register UI slots — <code>seo</code> adds fields beside the article editor. Authors experience <strong>meta boxes</strong>, not scattered settings pages.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="96-security">9.6 Security<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#96-security" class="hash-link" aria-label="Direct link to 9.6 Security" title="Direct link to 9.6 Security" translate="no">​</a></h3>
<ul>
<li class="">Manifest JSON Schema validation</li>
<li class="">Module path constraints</li>
<li class="">Ajv config validation</li>
</ul>
<p>Stricter than "install zip and hope" — appropriate for self-hosted <strong>open source CMS</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="97-building-your-first-plugin">9.7 Building your first plugin<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#97-building-your-first-plugin" class="hash-link" aria-label="Direct link to 9.7 Building your first plugin" title="Direct link to 9.7 Building your first plugin" translate="no">​</a></h3>
<p>Fork <code>plugins/hello-world</code> → rename id → implement <code>register()</code> → <code>pnpm build:plugins</code> → enable in Admin. <strong>An afternoon</strong> for NestJS-comfortable teams.</p>
<p>WordPress has more hooks today; ReactPress hooks are fewer but <strong>fully typed and testable</strong> — optimized for <strong>engineering teams customizing for themselves</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="98-seo-plugin-collaboration-example">9.8 SEO plugin collaboration example<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#98-seo-plugin-collaboration-example" class="hash-link" aria-label="Direct link to 9.8 SEO plugin collaboration example" title="Direct link to 9.8 SEO plugin collaboration example" translate="no">​</a></h3>
<p><code>seo</code> validates slug uniqueness on <code>article.beforePublish</code>, injects Admin fields, theme SSR reads <code>metaTitle</code>, <code>metaDescription</code>, <code>keywords</code>. <strong>Plugin writes, theme reads, core stays dumb</strong> — ideal <strong>React CMS + Next.js CMS</strong> split.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="99-honest-comparison-to-wordpress-plugins">9.9 Honest comparison to WordPress plugins<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#99-honest-comparison-to-wordpress-plugins" class="hash-link" aria-label="Direct link to 9.9 Honest comparison to WordPress plugins" title="Direct link to 9.9 Honest comparison to WordPress plugins" translate="no">​</a></h3>
<p>WordPress: 60,000+ plugins, search-and-install economy.</p>
<p>ReactPress: young catalog, strong <strong>mechanism</strong>, built-in essentials, best for <strong>teams who can code extensions</strong>.</p>
<p>If you need off-the-shelf ecommerce, membership, or form builders today, WordPress may win — see <a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">ReactPress vs WordPress</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="10-desktop-client">10. Desktop client<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#10-desktop-client" class="hash-link" aria-label="Direct link to 10. Desktop client" title="Direct link to 10. Desktop client" translate="no">​</a></h2>
<p>WordPress has no true peer for <strong>offline-first, local-database writing</strong> in the core product. ReactPress Desktop fills that gap.</p>
<p><img decoding="async" loading="lazy" alt="Desktop — offline writing, sync to production" src="https://reactpress.cc/assets/images/desktop-7e496864328500e40bfe913d01c880de.gif" width="1182" height="720" class="img_hKc8"></p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="101-architecture">10.1 Architecture<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#101-architecture" class="hash-link" aria-label="Direct link to 10.1 Architecture" title="Direct link to 10.1 Architecture" translate="no">​</a></h3>
<p><strong>Electron shell + same Admin SPA</strong> as web — one UI codebase, consistent behavior, lower maintenance than a separate native editor.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="102-modes">10.2 Modes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#102-modes" class="hash-link" aria-label="Direct link to 10.2 Modes" title="Direct link to 10.2 Modes" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Mode</th><th style="text-align:left">Scenario</th><th style="text-align:left">Behavior</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Local</strong> (default)</td><td style="text-align:left">Offline, try without Docker</td><td style="text-align:left">Embedded SQLite API at <code>127.0.0.1:3002</code></td></tr><tr><td style="text-align:left"><strong>Remote</strong></td><td style="text-align:left">Production/staging API</td><td style="text-align:left">Admin points at remote REST</td></tr></tbody></table>
<p>Switch under <strong>Settings → Desktop client</strong> or workspace panel on login.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="103-sync">10.3 Sync<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#103-sync" class="hash-link" aria-label="Direct link to 10.3 Sync" title="Direct link to 10.3 Sync" translate="no">​</a></h3>
<p>Local → remote <strong>push</strong> for articles, pages, and selected settings (requires remote admin JWT). Recommended flow: validate on staging before production push.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="104-installers">10.4 Installers<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#104-installers" class="hash-link" aria-label="Direct link to 10.4 Installers" title="Direct link to 10.4 Installers" translate="no">​</a></h3>
<p>GitHub Releases ship <strong>macOS DMG</strong>, <strong>Windows NSIS</strong>, <strong>Linux AppImage</strong> via CI matrix builds.</p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">pnpm dev:desktop      # monorepo development</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pnpm build:desktop    # installers → desktop/release/</span><br></div></code></pre></div></div>
<p>Docs: <a class="" href="https://reactpress.cc/docs/tutorial-extras/desktop-client">Desktop client guide</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="105-vs-notion-class-editors">10.5 vs Notion-class editors<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#105-vs-notion-class-editors" class="hash-link" aria-label="Direct link to 10.5 vs Notion-class editors" title="Direct link to 10.5 vs Notion-class editors" translate="no">​</a></h3>
<p>Notion, Google Docs, and wikis draft well but <strong>publish poorly</strong> to custom-domain Next.js — export steps, style loss, proprietary sync.</p>
<p>Desktop local mode means <strong>the writing UI is the production Admin</strong>, synced via standard REST — closer to <strong>Obsidian drafting + WordPress publishing</strong>, integrated and open source.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="106-security-notes">10.6 Security notes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#106-security-notes" class="hash-link" aria-label="Direct link to 10.6 Security notes" title="Direct link to 10.6 Security notes" translate="no">​</a></h3>
<p>Sync is one-way push with credentials. Test conflict behavior on staging. Treat like any CMS bulk import — <strong>rehearse before production</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="11-headless-api">11. Headless API<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#11-headless-api" class="hash-link" aria-label="Direct link to 11. Headless API" title="Direct link to 11. Headless API" translate="no">​</a></h2>
<p>ReactPress is a <strong>publishing platform first</strong> — and a <strong>Headless React CMS</strong> by default. Any client that speaks HTTP can participate.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="111-explore-with-swagger">11.1 Explore with Swagger<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#111-explore-with-swagger" class="hash-link" aria-label="Direct link to 11.1 Explore with Swagger" title="Direct link to 11.1 Explore with Swagger" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-text codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">http://localhost:3002/api</span><br></div></code></pre></div></div>
<p>Swagger UI documents routes, parameters, and response shapes — generated from NestJS decorators. Production: <code>https://your-api-domain.com/api</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="112-authentication">11.2 Authentication<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#112-authentication" class="hash-link" aria-label="Direct link to 11.2 Authentication" title="Direct link to 11.2 Authentication" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Method</th><th style="text-align:left">Use case</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Session / JWT</strong></td><td style="text-align:left">Admin SPA same-origin requests</td></tr><tr><td style="text-align:left"><strong>API Key</strong> (<code>X-API-Key</code>)</td><td style="text-align:left">Headless servers, scripts, mobile</td></tr></tbody></table>
<p>Create keys in <strong>Admin → Settings → API</strong>. Keys carry admin-level power — HTTPS only, rotate regularly, never commit to git.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="113-core-endpoints">11.3 Core endpoints<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#113-core-endpoints" class="hash-link" aria-label="Direct link to 11.3 Core endpoints" title="Direct link to 11.3 Core endpoints" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Method</th><th style="text-align:left">Path</th><th style="text-align:left">Description</th></tr></thead><tbody><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/health</code></td><td style="text-align:left">Health check</td></tr><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/article/headless/list</code></td><td style="text-align:left">Paginated published articles</td></tr><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/article/:id</code></td><td style="text-align:left">Single article</td></tr><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/page/list</code></td><td style="text-align:left">Pages</td></tr><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/category/list</code></td><td style="text-align:left">Categories</td></tr><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/tag/list</code></td><td style="text-align:left">Tags</td></tr><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/comment/list</code></td><td style="text-align:left">Comments</td></tr><tr><td style="text-align:left">GET</td><td style="text-align:left"><code>/api/setting/public</code></td><td style="text-align:left">Public site settings</td></tr><tr><td style="text-align:left">POST</td><td style="text-align:left"><code>/api/article</code></td><td style="text-align:left">Create article (auth required)</td></tr></tbody></table>
<p>Exact contracts live in Swagger — treat this table as a map, not the spec.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="114-curl-examples">11.4 curl examples<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#114-curl-examples" class="hash-link" aria-label="Direct link to 11.4 curl examples" title="Direct link to 11.4 curl examples" translate="no">​</a></h3>
<p><strong>Health:</strong></p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">curl http://localhost:3002/api/health</span><br></div></code></pre></div></div>
<p><strong>Published articles:</strong></p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">curl -H "X-API-Key: YOUR_KEY" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "http://localhost:3002/api/article/headless/list?status=publish&amp;page=1&amp;pageSize=10"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="115-toolkit-typescript-sdk">11.5 Toolkit TypeScript SDK<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#115-toolkit-typescript-sdk" class="hash-link" aria-label="Direct link to 11.5 Toolkit TypeScript SDK" title="Direct link to 11.5 Toolkit TypeScript SDK" translate="no">​</a></h3>
<div class="language-typescript codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-typescript codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> createApiClient </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@fecommunity/reactpress-toolkit'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createApiClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  baseURL</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">REACTPRESS_API_URL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  apiKey</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">REACTPRESS_API_KEY</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> articles </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">headlessList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  status</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'publish'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  page</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  pageSize</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>One SDK for Admin, themes, plugins, and external apps — <strong>types track API evolution</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="116-headless-only-deployments">11.6 Headless-only deployments<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#116-headless-only-deployments" class="hash-link" aria-label="Direct link to 11.6 Headless-only deployments" title="Direct link to 11.6 Headless-only deployments" translate="no">​</a></h3>
<p>Run API without caring about the bundled theme:</p>
<ul>
<li class="">Marketing site on a custom Next repo</li>
<li class="">Mobile app consuming articles</li>
<li class="">Multi-brand networks sharing one content backend</li>
</ul>
<p>You still benefit from ReactPress Admin for editors. You only opt out of the <strong>default visitor theme</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="117-wordpress-rest-vs-reactpress-headless">11.7 WordPress REST vs ReactPress Headless<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#117-wordpress-rest-vs-reactpress-headless" class="hash-link" aria-label="Direct link to 11.7 WordPress REST vs ReactPress Headless" title="Direct link to 11.7 WordPress REST vs ReactPress Headless" translate="no">​</a></h3>
<p>WordPress REST exists but Headless is not the default product story. Field shapes vary with plugins; performance tuning often still assumes PHP rendering.</p>
<p>ReactPress <strong>assumes</strong> Headless consumers from day one — list endpoints, API keys, Toolkit, and OpenAPI as first-class docs.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="118-webhooks-for-external-systems">11.8 Webhooks for external systems<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#118-webhooks-for-external-systems" class="hash-link" aria-label="Direct link to 11.8 Webhooks for external systems" title="Direct link to 11.8 Webhooks for external systems" translate="no">​</a></h3>
<p>Beyond in-process Hooks, server dispatches outbound webhooks (e.g. <code>article.published</code>) for Slack, CI, search indexers, or data warehouses — <strong>async integration without blocking publish latency</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="12-seo-and-performance">12. SEO and performance<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#12-seo-and-performance" class="hash-link" aria-label="Direct link to 12. SEO and performance" title="Direct link to 12. SEO and performance" translate="no">​</a></h2>
<p>Teams choose <strong>Next.js CMS</strong> stacks largely for <strong>search visibility</strong> and <strong>Core Web Vitals</strong>. ReactPress splits SEO across plugins (data) and themes (rendering).</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="121-rendering-strategy">12.1 Rendering strategy<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#121-rendering-strategy" class="hash-link" aria-label="Direct link to 12.1 Rendering strategy" title="Direct link to 12.1 Rendering strategy" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Layer</th><th style="text-align:left">Strategy</th><th style="text-align:left">SEO impact</th></tr></thead><tbody><tr><td style="text-align:left">Admin</td><td style="text-align:left">CSR (Vite)</td><td style="text-align:left">Not indexed — correct</td></tr><tr><td style="text-align:left">Theme</td><td style="text-align:left">SSR / ISR</td><td style="text-align:left">Full HTML for crawlers</td></tr><tr><td style="text-align:left">API</td><td style="text-align:left">JSON</td><td style="text-align:left">Feeds theme and Headless</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="122-built-in-seo-plugin">12.2 Built-in SEO plugin<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#122-built-in-seo-plugin" class="hash-link" aria-label="Direct link to 12.2 Built-in SEO plugin" title="Direct link to 12.2 Built-in SEO plugin" translate="no">​</a></h3>
<p>Authors set slug, focus keywords, and meta description in Admin. Theme emits:</p>
<ul>
<li class=""><code>&lt;title&gt;</code> and meta description</li>
<li class="">Open Graph and Twitter cards</li>
<li class="">Canonical URLs</li>
<li class="">JSON-LD (<code>Article</code>, <code>WebSite</code>, etc. in starter)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="123-sitemap-and-robots">12.3 Sitemap and robots<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#123-sitemap-and-robots" class="hash-link" aria-label="Direct link to 12.3 Sitemap and robots" title="Direct link to 12.3 Sitemap and robots" translate="no">​</a></h3>
<p>Official theme generates <code>/sitemap.xml</code> and <code>robots.txt</code> from API content — no manual XML editing.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="124-performance-practices-in-starter-theme">12.4 Performance practices in starter theme<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#124-performance-practices-in-starter-theme" class="hash-link" aria-label="Direct link to 12.4 Performance practices in starter theme" title="Direct link to 12.4 Performance practices in starter theme" translate="no">​</a></h3>
<ul>
<li class="">Next.js code splitting and image optimization</li>
<li class="">ISR for high-traffic lists where configured</li>
<li class="">Minimal client JS on article pages</li>
<li class="">Dark mode without hydration flash (theme-dependent)</li>
</ul>
<p>Lighthouse <strong>95 Performance / 100 SEO</strong> on demo is achievable baseline — not a guarantee for every host.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="125-reactpress-vs-wordpress-seo-plugins">12.5 ReactPress vs WordPress SEO plugins<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#125-reactpress-vs-wordpress-seo-plugins" class="hash-link" aria-label="Direct link to 12.5 ReactPress vs WordPress SEO plugins" title="Direct link to 12.5 ReactPress vs WordPress SEO plugins" translate="no">​</a></h3>
<p>WordPress often stacks Yoast or Rank Math <strong>on top of</strong> theme-dependent markup. ReactPress <strong>defaults</strong> to structured SEO fields + SSR theme — fewer moving parts for standard blogs and docs.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="126-internationalization-note">12.6 Internationalization note<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#126-internationalization-note" class="hash-link" aria-label="Direct link to 12.6 Internationalization note" title="Direct link to 12.6 Internationalization note" translate="no">​</a></h3>
<p>Docs site supports <code>en</code> and <code>zh</code> locales. Themes can implement i18n routes; content model supports multiple sites via settings and custom theme logic — i18n at theme layer keeps core simpler.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="127-measuring-before-launch">12.7 Measuring before launch<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#127-measuring-before-launch" class="hash-link" aria-label="Direct link to 12.7 Measuring before launch" title="Direct link to 12.7 Measuring before launch" translate="no">​</a></h3>
<ol>
<li class="">Run Lighthouse on staging theme URL</li>
<li class="">Validate rich results with Google Search Console</li>
<li class="">Fetch as Google / inspect rendered HTML (not only JSON API)</li>
<li class="">Confirm <code>sitemap.xml</code> lists published URLs only</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="13-security-model">13. Security model<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#13-security-model" class="hash-link" aria-label="Direct link to 13. Security model" title="Direct link to 13. Security model" translate="no">​</a></h2>
<p>Self-hosted <strong>open source CMS</strong> must be safe by default and auditable by admins.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="131-highlights-37">13.1 Highlights (3.7+)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#131-highlights-37" class="hash-link" aria-label="Direct link to 13.1 Highlights (3.7+)" title="Direct link to 13.1 Highlights (3.7+)" translate="no">​</a></h3>
<ul>
<li class=""><strong>SQL injection:</strong> whitelist filter columns in public list APIs (<a href="https://github.com/fecommunity/reactpress/security/advisories/GHSA-wmw4-mw6x-6vfm" target="_blank" rel="noopener noreferrer" class="">GHSA-wmw4-mw6x-6vfm</a>)</li>
<li class=""><strong>Stored XSS:</strong> sanitize comment HTML post-Markdown; JWT required for <code>POST /comment</code>; Helmet CSP headers</li>
<li class=""><strong>Reporting:</strong> <a href="https://github.com/fecommunity/reactpress/blob/master/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">SECURITY.md</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="132-plugin-sandboxing">13.2 Plugin sandboxing<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#132-plugin-sandboxing" class="hash-link" aria-label="Direct link to 13.2 Plugin sandboxing" title="Direct link to 13.2 Plugin sandboxing" translate="no">​</a></h3>
<p>Manifest validation, constrained <code>require</code> paths, schema-validated plugin config — reduce "malicious plugin" surface compared to unrestricted PHP includes.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="133-api-keys">13.3 API keys<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#133-api-keys" class="hash-link" aria-label="Direct link to 13.3 API keys" title="Direct link to 13.3 API keys" translate="no">​</a></h3>
<p>Equivalent to admin power. Store in secrets manager; scope CI keys read-only where possible; rotate on team churn.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="134-production-checklist">13.4 Production checklist<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#134-production-checklist" class="hash-link" aria-label="Direct link to 13.4 Production checklist" title="Direct link to 13.4 Production checklist" translate="no">​</a></h3>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Change default <code>admin</code> password</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->HTTPS everywhere</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->MySQL credentials not in git</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Rate limiting at reverse proxy</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Backup <code>.reactpress/</code> and <code>uploads/</code> on schedule</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Keep <code>@fecommunity/reactpress</code> updated for security patches</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="135-comments-attack-surface">13.5 Comments attack surface<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#135-comments-attack-surface" class="hash-link" aria-label="Direct link to 13.5 Comments attack surface" title="Direct link to 13.5 Comments attack surface" translate="no">​</a></h3>
<p>Public write endpoints are classic XSS/spam targets. Server-side sanitization + auth + CSP is platform duty — themes should not "fix" unsafe HTML alone.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="14-deployment-patterns">14. Deployment patterns<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#14-deployment-patterns" class="hash-link" aria-label="Direct link to 14. Deployment patterns" title="Direct link to 14. Deployment patterns" translate="no">​</a></h2>
<p><code>reactpress init</code> targets <strong>local and small self-hosted</strong> production. Scale up when traffic demands.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="141-sqlite--mysql">14.1 SQLite → MySQL<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#141-sqlite--mysql" class="hash-link" aria-label="Direct link to 14.1 SQLite → MySQL" title="Direct link to 14.1 SQLite → MySQL" translate="no">​</a></h3>
<p>Edit <code>.reactpress/config.json</code> <code>database.mode</code>, apply config, migrate data per <a class="" href="https://reactpress.cc/docs/tutorial-basics/deploy-your-site">deployment docs</a>. MySQL suits concurrent writers and larger catalogs.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="142-docker-compose">14.2 Docker Compose<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#142-docker-compose" class="hash-link" aria-label="Direct link to 14.2 Docker Compose" title="Direct link to 14.2 Docker Compose" translate="no">​</a></h3>
<p>Orchestrate API + theme + reverse proxy + MySQL — good for VPS teams wanting reproducible infra. See <a class="" href="https://reactpress.cc/docs/tutorial-extras/docker-deployment">Docker deployment</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="143-pm2-process-management">14.3 PM2 process management<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#143-pm2-process-management" class="hash-link" aria-label="Direct link to 14.3 PM2 process management" title="Direct link to 14.3 PM2 process management" translate="no">​</a></h3>
<p>Node processes for API and theme under PM2 on a single VPS — simple middle ground without Kubernetes.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="144-split-hosting">14.4 Split hosting<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#144-split-hosting" class="hash-link" aria-label="Direct link to 14.4 Split hosting" title="Direct link to 14.4 Split hosting" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Component</th><th style="text-align:left">Host</th><th style="text-align:left">Notes</th></tr></thead><tbody><tr><td style="text-align:left">API</td><td style="text-align:left">VPS / container</td><td style="text-align:left">SQLite or MySQL</td></tr><tr><td style="text-align:left">Theme</td><td style="text-align:left">Vercel / Netlify</td><td style="text-align:left"><code>NEXT_PUBLIC_API_URL</code> points remote</td></tr><tr><td style="text-align:left">Media</td><td style="text-align:left">Local disk or OSS</td><td style="text-align:left">Configure in server settings</td></tr></tbody></table>
<p>Classic <strong>Jamstack + Headless</strong> — still using ReactPress Admin for editors.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="145-backups">14.5 Backups<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#145-backups" class="hash-link" aria-label="Direct link to 14.5 Backups" title="Direct link to 14.5 Backups" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain"># SQLite + uploads snapshot</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tar czf backup-$(date +%F).tar.gz .reactpress uploads</span><br></div></code></pre></div></div>
<p>For MySQL, add <code>mysqldump</code> to cron. Test restores quarterly — backups are wishes until restored.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="146-cicd">14.6 CI/CD<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#146-cicd" class="hash-link" aria-label="Direct link to 14.6 CI/CD" title="Direct link to 14.6 CI/CD" translate="no">​</a></h3>
<ul>
<li class=""><strong>Theme repo:</strong> deploy on push to <code>main</code></li>
<li class=""><strong>API:</strong> deploy on tag or manual workflow</li>
<li class=""><strong>Content:</strong> lives in DB — not redeployed with theme unless static export pattern</li>
</ul>
<p>Separate <strong>content lifecycle</strong> from <strong>code lifecycle</strong> — another WordPress lesson.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="147-environment-variables">14.7 Environment variables<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#147-environment-variables" class="hash-link" aria-label="Direct link to 14.7 Environment variables" title="Direct link to 14.7 Environment variables" translate="no">​</a></h3>
<p>CLI generates <code>.env</code> from <code>.reactpress/config.json</code>. Avoid hand-editing unless you understand sync direction — <code>reactpress config --apply</code> is safer.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="15-migration-paths">15. Migration paths<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#15-migration-paths" class="hash-link" aria-label="Direct link to 15. Migration paths" title="Direct link to 15. Migration paths" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="151-new-sites">15.1 New sites<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#151-new-sites" class="hash-link" aria-label="Direct link to 15.1 New sites" title="Direct link to 15.1 New sites" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-site &amp;&amp; cd my-site</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<p>Fastest path to a <strong>React publishing platform</strong> proof of concept.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="152-reactpress-3x--40">15.2 ReactPress 3.x → 4.0<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#152-reactpress-3x--40" class="hash-link" aria-label="Direct link to 15.2 ReactPress 3.x → 4.0" title="Direct link to 15.2 ReactPress 3.x → 4.0" translate="no">​</a></h3>
<p>4.0 adds plugins, desktop, npm theme catalog — <strong>no forced breaking config migration</strong>.</p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cd your-site</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress doctor</span><br></div></code></pre></div></div>
<p>Optional: enable <code>hello-world</code> / <code>seo</code> plugins; try <code>reactpress-theme-starter</code>; install desktop client.</p>
<p>Guide: <a class="" href="https://reactpress.cc/docs/tutorial-extras/migration-3-to-4">3.x → 4.0 migration</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="153-wordpress--reactpress">15.3 WordPress → ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#153-wordpress--reactpress" class="hash-link" aria-label="Direct link to 15.3 WordPress → ReactPress" title="Direct link to 15.3 WordPress → ReactPress" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Asset</th><th style="text-align:left">Migration approach</th></tr></thead><tbody><tr><td style="text-align:left">Posts / pages</td><td style="text-align:left">WordPress REST export → script → ReactPress API</td></tr><tr><td style="text-align:left">Media</td><td style="text-align:left">Download uploads; re-upload or mirror URLs</td></tr><tr><td style="text-align:left">Categories/tags</td><td style="text-align:left">Map taxonomy via API</td></tr><tr><td style="text-align:left">Theme</td><td style="text-align:left">Rewrite in Next.js — plan engineering time</td></tr><tr><td style="text-align:left">Plugins</td><td style="text-align:left">Reimplement critical logic as ReactPress plugins</td></tr></tbody></table>
<p>Expect <strong>theme rewrite</strong> as main cost — not data model translation.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="154-strapi--other-headless--reactpress">15.4 Strapi / other Headless → ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#154-strapi--other-headless--reactpress" class="hash-link" aria-label="Direct link to 15.4 Strapi / other Headless → ReactPress" title="Direct link to 15.4 Strapi / other Headless → ReactPress" translate="no">​</a></h3>
<p>If you already shaped content in another Headless CMS, write import scripts against ReactPress POST endpoints or DB seed tools. You may adopt ReactPress Admin gradually while keeping an existing front end temporarily via parallel APIs.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="155-static-markdown-repos--reactpress">15.5 Static Markdown repos → ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#155-static-markdown-repos--reactpress" class="hash-link" aria-label="Direct link to 15.5 Static Markdown repos → ReactPress" title="Direct link to 15.5 Static Markdown repos → ReactPress" translate="no">​</a></h3>
<p>Many teams store posts in <code>content/*.md</code>. Import scripts can create articles via API, preserving slugs and dates. Editors then use Admin for new content — <strong>Git-as-CMS graduations</strong> without losing history.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="16-who-should-use-reactpress">16. Who should use ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#16-who-should-use-reactpress" class="hash-link" aria-label="Direct link to 16. Who should use ReactPress" title="Direct link to 16. Who should use ReactPress" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="161-fit-matrix">16.1 Fit matrix<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#161-fit-matrix" class="hash-link" aria-label="Direct link to 16.1 Fit matrix" title="Direct link to 16.1 Fit matrix" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Scenario</th><th style="text-align:left">Why ReactPress fits</th></tr></thead><tbody><tr><td style="text-align:left">Personal dev blog</td><td style="text-align:left">Admin + fast Next theme</td></tr><tr><td style="text-align:left">Open source docs + changelog</td><td style="text-align:left">Knowledge base + articles in one theme</td></tr><tr><td style="text-align:left">SaaS marketing site</td><td style="text-align:left">Headless API + custom Next front</td></tr><tr><td style="text-align:left">Multi-editor teams</td><td style="text-align:left">Admin for writers, theme repo for engineers</td></tr><tr><td style="text-align:left">Offline-first authors</td><td style="text-align:left">Desktop + SQLite + sync</td></tr><tr><td style="text-align:left">WordPress alternative evaluation</td><td style="text-align:left">Familiar workflow, modern stack</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="162-user-stories">16.2 User stories<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#162-user-stories" class="hash-link" aria-label="Direct link to 16.2 User stories" title="Direct link to 16.2 User stories" translate="no">​</a></h3>
<p><strong>Alice — indie developer</strong><br>
<!-- -->Uses Next.js for side projects; hates <code>git commit</code> per typo fix. <code>reactpress init</code>, publishes Sunday afternoon, Lighthouse green, VPS serves <code>:3001</code>. No Strapi, no PHP.</p>
<p><strong>Open source maintainers</strong><br>
<!-- -->Docs versioned in knowledge base API; release notes as articles; same theme, different routes. Contributors use Admin; engineers keep custom React components in theme Git.</p>
<p><strong>Marketing + front-end parallel</strong><br>
<!-- -->Marketing schedules drafts in Admin; front-end fork <code>theme-starter</code> for brand motion; plugin Hook posts to Slack on <code>article.afterPublish</code>. Nobody pastes Markdown into production code.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="163-self-assessment-checklist">16.3 Self-assessment checklist<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#163-self-assessment-checklist" class="hash-link" aria-label="Direct link to 16.3 Self-assessment checklist" title="Direct link to 16.3 Self-assessment checklist" translate="no">​</a></h3>
<p>ReactPress is likely worth a trial if <strong>≥3</strong> are true:</p>
<ul class="contains-task-list containsTaskList_LK5o">
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Primary stack is React / Next.js</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Non-developers must publish</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Self-hosted open source required</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Tired of maintaining CMS + front end + deploy separately</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Evaluated WordPress, want to avoid PHP</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Care about SSR SEO and Core Web Vitals</li>
<li class="task-list-item"><input type="checkbox" disabled=""> <!-- -->Want offline or local-first writing</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="164-when-to-choose-wordpress-instead">16.4 When to choose WordPress instead<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#164-when-to-choose-wordpress-instead" class="hash-link" aria-label="Direct link to 16.4 When to choose WordPress instead" title="Direct link to 16.4 When to choose WordPress instead" translate="no">​</a></h3>
<ul>
<li class="">Need mature plugin marketplace (ecommerce, memberships, complex forms)</li>
<li class="">Large existing WordPress theme/plugin investment</li>
<li class="">Fully non-technical team depends on off-the-shelf plugins without engineering</li>
</ul>
<p>Honest comparison: <a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">ReactPress vs WordPress</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="165-when-to-choose-pure-headless">16.5 When to choose pure Headless<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#165-when-to-choose-pure-headless" class="hash-link" aria-label="Direct link to 16.5 When to choose pure Headless" title="Direct link to 16.5 When to choose pure Headless" translate="no">​</a></h3>
<ul>
<li class="">Mobile-only product consuming content</li>
<li class="">Content model changes weekly in early product discovery</li>
<li class="">You already invested in Strapi/Payload and <strong>only</strong> need a new Next front end</li>
</ul>
<p>ReactPress shines when <strong>Admin + default theme + CLI</strong> matter — not API-only experiments.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="17-roadmap">17. Roadmap<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#17-roadmap" class="hash-link" aria-label="Direct link to 17. Roadmap" title="Direct link to 17. Roadmap" translate="no">​</a></h2>
<p>4.0 is the <strong>extensible base</strong>, not the finish line.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="171-near-term-4x">17.1 Near term (4.x)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#171-near-term-4x" class="hash-link" aria-label="Direct link to 17.1 Near term (4.x)" title="Direct link to 17.1 Near term (4.x)" translate="no">​</a></h3>
<ul>
<li class="">Plugin <strong>npm catalog</strong> and <code>reactpress plugin create</code> scaffold</li>
<li class="">Desktop <strong>auto-update</strong>, tray icon, global shortcuts</li>
<li class=""><code>reactpress theme create</code> scaffold</li>
<li class=""><strong>Theme and plugin marketplace</strong> — discovery, versions, compatibility hints</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="172-medium-term">17.2 Medium term<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#172-medium-term" class="hash-link" aria-label="Direct link to 17.2 Medium term" title="Direct link to 17.2 Medium term" translate="no">​</a></h3>
<ul>
<li class="">More official plugins (spam filtering, analytics, i18n helpers)</li>
<li class="">Managed hosting partnerships — WordPress-style one-click for ReactPress</li>
<li class="">Multi-site / multi-tenant for agencies</li>
<li class="">Deeper AI writing integrations via plugin Hooks</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="173-long-term-vision">17.3 Long-term vision<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#173-long-term-vision" class="hash-link" aria-label="Direct link to 17.3 Long-term vision" title="Direct link to 17.3 Long-term vision" translate="no">​</a></h3>
<p><strong>"React stack default for publishing"</strong> should be as easy to say as WordPress.</p>
<p>When someone asks "what do we use for the company blog?", answers should include:</p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="174-how-to-contribute">17.4 How to contribute<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#174-how-to-contribute" class="hash-link" aria-label="Direct link to 17.4 How to contribute" title="Direct link to 17.4 How to contribute" translate="no">​</a></h3>
<ul>
<li class="">Publish themes to npm catalog</li>
<li class="">Share migration scripts from WordPress or Strapi</li>
<li class="">Contribute plugins as examples</li>
<li class="">File Issues with reproduction steps</li>
</ul>
<p><strong>React's WordPress will not appear by accident</strong> — it will be built by developers tired of assembly.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="18-faq">18. FAQ<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#18-faq" class="hash-link" aria-label="Direct link to 18. FAQ" title="Direct link to 18. FAQ" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="is-reactpress-free">Is ReactPress free?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#is-reactpress-free" class="hash-link" aria-label="Direct link to Is ReactPress free?" title="Direct link to Is ReactPress free?" translate="no">​</a></h3>
<p>Yes. MIT license. Commercial use allowed. Self-host without vendor fees.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="is-40-production-ready">Is 4.0 production-ready?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#is-40-production-ready" class="hash-link" aria-label="Direct link to Is 4.0 production-ready?" title="Direct link to Is 4.0 production-ready?" translate="no">​</a></h3>
<p>Yes. 4.0.0 is the current stable release on npm (<code>@fecommunity/reactpress</code>). Core paths (<code>init</code>, Admin, API, theme, plugins) are battle-tested in community and dogfood sites like <a href="https://blog.gaoredu.com/" target="_blank" rel="noopener noreferrer" class="">blog.gaoredu.com</a>. When upgrading from 3.x, validate on staging; read <a class="" href="https://reactpress.cc/docs/tutorial-extras/migration-3-to-4">migration guide</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="do-i-need-docker">Do I need Docker?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#do-i-need-docker" class="hash-link" aria-label="Direct link to Do I need Docker?" title="Direct link to Do I need Docker?" translate="no">​</a></h3>
<p>No for default CLI flow — SQLite embedded. Docker/MySQL when you configure <code>embedded-docker</code> or external database in <code>.reactpress/config.json</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="can-i-use-my-own-front-end">Can I use my own front end?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#can-i-use-my-own-front-end" class="hash-link" aria-label="Direct link to Can I use my own front end?" title="Direct link to Can I use my own front end?" translate="no">​</a></h3>
<p>Yes. Headless REST + API Key + Toolkit SDK. Fork <a href="https://github.com/fecommunity/reactpress-theme-starter" target="_blank" rel="noopener noreferrer" class="">theme-starter</a> or build from scratch against <code>/api/article</code>, etc.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="how-is-this-different-from-wordpress">How is this different from WordPress?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#how-is-this-different-from-wordpress" class="hash-link" aria-label="Direct link to How is this different from WordPress?" title="Direct link to How is this different from WordPress?" translate="no">​</a></h3>
<p>Same <strong>admin-driven publishing workflow</strong>, but default <strong>Next.js performance</strong>, cleaner <strong>Headless path</strong>, and <strong>no PHP theme/plugin entropy</strong> for JS teams.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="wordpress-alternative-headless-cms-nextjs-blog">WordPress alternative? Headless CMS? Next.js blog?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#wordpress-alternative-headless-cms-nextjs-blog" class="hash-link" aria-label="Direct link to WordPress alternative? Headless CMS? Next.js blog?" title="Direct link to WordPress alternative? Headless CMS? Next.js blog?" translate="no">​</a></h3>
<p>All three: self-hosted WordPress-style editing, Headless REST for custom apps, official Next theme with strong Lighthouse defaults.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="how-does-reactpress-compare-to-strapi-or-payload">How does ReactPress compare to Strapi or Payload?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#how-does-reactpress-compare-to-strapi-or-payload" class="hash-link" aria-label="Direct link to How does ReactPress compare to Strapi or Payload?" title="Direct link to How does ReactPress compare to Strapi or Payload?" translate="no">​</a></h3>
<p>They primarily ship <strong>content APIs</strong>. ReactPress ships <strong>API + Admin + theme + plugins + CLI + desktop</strong> — a <strong>React publishing platform</strong>, not only a backend.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="can-i-migrate-from-wordpress">Can I migrate from WordPress?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#can-i-migrate-from-wordpress" class="hash-link" aria-label="Direct link to Can I migrate from WordPress?" title="Direct link to Can I migrate from WordPress?" translate="no">​</a></h3>
<p>Content yes (scripts/REST). Theme requires Next.js rewrite. Plan engineering for presentation layer.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="where-is-documentation">Where is documentation?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#where-is-documentation" class="hash-link" aria-label="Direct link to Where is documentation?" title="Direct link to Where is documentation?" translate="no">​</a></h3>
<p><a href="https://reactpress.cc/" target="_blank" rel="noopener noreferrer" class="">reactpress.cc</a> — installation, architecture, plugin/theme development, deployment, desktop client.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="how-do-i-report-security-issues">How do I report security issues?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#how-do-i-report-security-issues" class="hash-link" aria-label="Direct link to How do I report security issues?" title="Direct link to How do I report security issues?" translate="no">​</a></h3>
<p>Follow <a href="https://github.com/fecommunity/reactpress/blob/master/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">SECURITY.md</a>. Do not post exploitable details in public Issues first.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="what-node-version-is-required">What Node version is required?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#what-node-version-is-required" class="hash-link" aria-label="Direct link to What Node version is required?" title="Direct link to What Node version is required?" translate="no">​</a></h3>
<p>Node.js <strong>20+</strong> for current CLI releases.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="does-reactpress-support-mysql">Does ReactPress support MySQL?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#does-reactpress-support-mysql" class="hash-link" aria-label="Direct link to Does ReactPress support MySQL?" title="Direct link to Does ReactPress support MySQL?" translate="no">​</a></h3>
<p>Yes — configure in <code>.reactpress/config.json</code> for production workloads beyond SQLite.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="can-i-run-api-only">Can I run API-only?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#can-i-run-api-only" class="hash-link" aria-label="Direct link to Can I run API-only?" title="Direct link to Can I run API-only?" translate="no">​</a></h3>
<p>Yes — Headless consumers use API + Admin; visitor theme optional if you bring your own Next app.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="how-do-plugins-differ-from-themes">How do plugins differ from themes?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#how-do-plugins-differ-from-themes" class="hash-link" aria-label="Direct link to How do plugins differ from themes?" title="Direct link to How do plugins differ from themes?" translate="no">​</a></h3>
<p>Themes change <strong>visitor UI</strong>. Plugins change <strong>server logic</strong> via Hooks — SEO rules, summaries, integrations.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="is-the-desktop-app-required">Is the desktop app required?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#is-the-desktop-app-required" class="hash-link" aria-label="Direct link to Is the desktop app required?" title="Direct link to Is the desktop app required?" translate="no">​</a></h3>
<p>No. It is optional for offline/local-first authors. Web Admin is complete.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="how-do-updates-work">How do updates work?<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#how-do-updates-work" class="hash-link" aria-label="Direct link to How do updates work?" title="Direct link to How do updates work?" translate="no">​</a></h3>
<p><code>npm i -g @fecommunity/reactpress@latest</code> for CLI; <code>reactpress doctor</code> after upgrade; review changelog at <a class="" href="https://reactpress.cc/blog">/blog</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="19-getting-started">19. Getting started<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#19-getting-started" class="hash-link" aria-label="Direct link to 19. Getting started" title="Direct link to 19. Getting started" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="191-install-cli">19.1 Install CLI<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#191-install-cli" class="hash-link" aria-label="Direct link to 19.1 Install CLI" title="Direct link to 19.1 Install CLI" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div></code></pre></div></div>
<p>Install with <code>npm i -g @fecommunity/reactpress</code> (<code>@latest</code>). Prereleases use <code>@beta</code> — check <a href="https://www.npmjs.com/package/@fecommunity/reactpress" target="_blank" rel="noopener noreferrer" class="">npm</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="192-initialize-site">19.2 Initialize site<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#192-initialize-site" class="hash-link" aria-label="Direct link to 19.2 Initialize site" title="Direct link to 19.2 Initialize site" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-blog &amp;&amp; cd my-blog</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="193-verify-services">19.3 Verify services<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#193-verify-services" class="hash-link" aria-label="Direct link to 19.3 Verify services" title="Direct link to 19.3 Verify services" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Check</th><th style="text-align:left">Command / URL</th></tr></thead><tbody><tr><td style="text-align:left">Health</td><td style="text-align:left"><code>curl http://localhost:3002/api/health</code></td></tr><tr><td style="text-align:left">Admin</td><td style="text-align:left"><a href="http://localhost:3001/admin/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001/admin/</a></td></tr><tr><td style="text-align:left">Public</td><td style="text-align:left"><a href="http://localhost:3001/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001</a></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="194-first-article">19.4 First article<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#194-first-article" class="hash-link" aria-label="Direct link to 19.4 First article" title="Direct link to 19.4 First article" translate="no">​</a></h3>
<ol>
<li class="">Log in to Admin</li>
<li class="">Create article with title, Markdown body, category</li>
<li class="">Enable <strong>SEO plugin</strong> — fill meta description</li>
<li class="">Publish</li>
<li class="">View on public site — confirm SSR source in browser devtools</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="195-install-official-theme-optional">19.5 Install official theme (optional)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#195-install-official-theme-optional" class="hash-link" aria-label="Direct link to 19.5 Install official theme (optional)" title="Direct link to 19.5 Install official theme (optional)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">reactpress theme add @fecommunity/reactpress-theme-starter@1.0.0-beta.0</span><br></div></code></pre></div></div>
<p>Enable in <strong>Appearance → Themes</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="196-enable-plugins">19.6 Enable plugins<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#196-enable-plugins" class="hash-link" aria-label="Direct link to 19.6 Enable plugins" title="Direct link to 19.6 Enable plugins" translate="no">​</a></h3>
<p><strong>Plugins → Install → Enable</strong> <code>seo</code> and <code>hello-world</code>. Edit an article — observe SEO slot and auto-summary on publish.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="197-try-desktop-optional">19.7 Try desktop (optional)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#197-try-desktop-optional" class="hash-link" aria-label="Direct link to 19.7 Try desktop (optional)" title="Direct link to 19.7 Try desktop (optional)" translate="no">​</a></h3>
<p>Download from <a href="https://github.com/fecommunity/reactpress/releases" target="_blank" rel="noopener noreferrer" class="">GitHub Releases</a> or <code>pnpm build:desktop</code> from monorepo.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="198-next-steps-in-docs">19.8 Next steps in docs<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#198-next-steps-in-docs" class="hash-link" aria-label="Direct link to 19.8 Next steps in docs" title="Direct link to 19.8 Next steps in docs" translate="no">​</a></h3>
<ul>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/first-site">5-minute first site</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/core-concepts">Core concepts</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/architecture-overview">Architecture overview</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/plugin-development">Plugin development</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/theme-development">Theme development</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/headless-api">Headless API</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="199-star-and-feedback">19.9 Star and feedback<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#199-star-and-feedback" class="hash-link" aria-label="Direct link to 19.9 Star and feedback" title="Direct link to 19.9 Star and feedback" translate="no">​</a></h3>
<p>If ReactPress saves you a weekend of CMS assembly, a <a href="https://github.com/fecommunity/reactpress/stargazers" target="_blank" rel="noopener noreferrer" class="">GitHub star</a> helps the next developer searching <strong>React CMS</strong> or <strong>WordPress alternative</strong> find this path.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-a-extended-comparison-matrices">Appendix A: Extended comparison matrices<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-a-extended-comparison-matrices" class="hash-link" aria-label="Direct link to Appendix A: Extended comparison matrices" title="Direct link to Appendix A: Extended comparison matrices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="a1-reactpress-vs-wordpress-2026">A.1 ReactPress vs WordPress (2026)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#a1-reactpress-vs-wordpress-2026" class="hash-link" aria-label="Direct link to A.1 ReactPress vs WordPress (2026)" title="Direct link to A.1 ReactPress vs WordPress (2026)" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Dimension</th><th style="text-align:left">ReactPress</th><th style="text-align:left">WordPress</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Positioning</strong></td><td style="text-align:left">Full React publishing platform</td><td style="text-align:left">General-purpose PHP CMS</td></tr><tr><td style="text-align:left"><strong>Stack</strong></td><td style="text-align:left">React, Next.js, NestJS, SQLite/MySQL</td><td style="text-align:left">PHP, MySQL, PHP themes</td></tr><tr><td style="text-align:left"><strong>Time to first post</strong></td><td style="text-align:left">~60 seconds (<code>init</code>)</td><td style="text-align:left">Minutes on managed host</td></tr><tr><td style="text-align:left"><strong>Default visitor tech</strong></td><td style="text-align:left">Next.js SSR/ISR</td><td style="text-align:left">PHP templates</td></tr><tr><td style="text-align:left"><strong>Headless</strong></td><td style="text-align:left">Native REST + API keys</td><td style="text-align:left">Plugins + REST, not default</td></tr><tr><td style="text-align:left"><strong>Plugin economy</strong></td><td style="text-align:left">Young; Hook + npm catalog roadmap</td><td style="text-align:left">60,000+ plugins</td></tr><tr><td style="text-align:left"><strong>Theme economy</strong></td><td style="text-align:left">npm Next.js themes</td><td style="text-align:left">Massive PHP theme market</td></tr><tr><td style="text-align:left"><strong>Offline writing</strong></td><td style="text-align:left">Electron desktop</td><td style="text-align:left">Third-party editors</td></tr><tr><td style="text-align:left"><strong>Performance ceiling</strong></td><td style="text-align:left">High with official theme</td><td style="text-align:left">Highly variable</td></tr><tr><td style="text-align:left"><strong>Best for</strong></td><td style="text-align:left">React teams, SSR SEO, self-hosted JS stack</td><td style="text-align:left">Non-technical users, plugin-heavy sites</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="a2-reactpress-vs-headless-cms-assembly">A.2 ReactPress vs Headless CMS assembly<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#a2-reactpress-vs-headless-cms-assembly" class="hash-link" aria-label="Direct link to A.2 ReactPress vs Headless CMS assembly" title="Direct link to A.2 ReactPress vs Headless CMS assembly" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Task</th><th style="text-align:left">Strapi + Next (typical)</th><th style="text-align:left">ReactPress</th></tr></thead><tbody><tr><td style="text-align:left">Install backend</td><td style="text-align:left">Docker / cloud / VPS</td><td style="text-align:left"><code>reactpress init</code></td></tr><tr><td style="text-align:left">Admin for authors</td><td style="text-align:left">Strapi Admin (customizable)</td><td style="text-align:left">Bundled Vite Admin</td></tr><tr><td style="text-align:left">Visitor site</td><td style="text-align:left">Build from scratch</td><td style="text-align:left">Official theme included</td></tr><tr><td style="text-align:left">SEO baseline</td><td style="text-align:left">Implement in Next</td><td style="text-align:left">Plugin + theme defaults</td></tr><tr><td style="text-align:left">Comments</td><td style="text-align:left">Build or embed</td><td style="text-align:left">Platform module</td></tr><tr><td style="text-align:left">Media</td><td style="text-align:left">Configure upload provider</td><td style="text-align:left"><code>uploads/</code> + OSS option</td></tr><tr><td style="text-align:left">CLI diagnostics</td><td style="text-align:left">None unified</td><td style="text-align:left"><code>reactpress doctor</code></td></tr><tr><td style="text-align:left">Desktop offline</td><td style="text-align:left">N/A</td><td style="text-align:left">Electron client</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="a3-reactpress-vs-static-git-workflow">A.3 ReactPress vs static Git workflow<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#a3-reactpress-vs-static-git-workflow" class="hash-link" aria-label="Direct link to A.3 ReactPress vs static Git workflow" title="Direct link to A.3 ReactPress vs static Git workflow" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Dimension</th><th style="text-align:left">Markdown in Git + CI</th><th style="text-align:left">ReactPress</th></tr></thead><tbody><tr><td style="text-align:left">Non-dev publishing</td><td style="text-align:left">Poor — PR workflow</td><td style="text-align:left">Strong — Admin</td></tr><tr><td style="text-align:left">Build on every typo</td><td style="text-align:left">Often yes</td><td style="text-align:left">No — runtime CMS</td></tr><tr><td style="text-align:left">Lighthouse</td><td style="text-align:left">Excellent</td><td style="text-align:left">Excellent (theme)</td></tr><tr><td style="text-align:left">Preview drafts</td><td style="text-align:left">Branch previews</td><td style="text-align:left">Admin preview + API</td></tr><tr><td style="text-align:left">Plugin extensibility</td><td style="text-align:left">GitHub Actions scripts</td><td style="text-align:left">Hook plugins</td></tr><tr><td style="text-align:left">Data portability</td><td style="text-align:left">Files in repo</td><td style="text-align:left">DB + exports</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="a4-when-each-approach-wins">A.4 When each approach wins<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#a4-when-each-approach-wins" class="hash-link" aria-label="Direct link to A.4 When each approach wins" title="Direct link to A.4 When each approach wins" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Approach</th><th style="text-align:left">Win when</th></tr></thead><tbody><tr><td style="text-align:left"><strong>WordPress</strong></td><td style="text-align:left">Plugin marketplace is core requirement</td></tr><tr><td style="text-align:left"><strong>Headless only</strong></td><td style="text-align:left">Many channels, custom content models, API-first org</td></tr><tr><td style="text-align:left"><strong>SSG / Git</strong></td><td style="text-align:left">Developers only, infrequent publishes</td></tr><tr><td style="text-align:left"><strong>ReactPress</strong></td><td style="text-align:left">React stack + editorial workflow + self-hosted platform</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-b-reactpress-version-history">Appendix B: ReactPress version history<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-b-reactpress-version-history" class="hash-link" aria-label="Direct link to Appendix B: ReactPress version history" title="Direct link to Appendix B: ReactPress version history" translate="no">​</a></h2>
<p>Understanding 4.0 requires the iterations that shaped it.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="b1-2x--proof-of-concept">B.1 2.x — proof of concept<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#b1-2x--proof-of-concept" class="hash-link" aria-label="Direct link to B.1 2.x — proof of concept" title="Direct link to B.1 2.x — proof of concept" translate="no">​</a></h3>
<p>Early packages split across names (<code>reactpress-cli</code>, <code>reactpress-server</code>, client packages). Power users could assemble a stack; newcomers faced <strong>decision fatigue</strong> the WordPress model avoids.</p>
<p><strong>Lesson:</strong> fragmentation kills "default stack" status.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="b2-30-platform--one-cli">B.2 3.0 Platform — one CLI<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#b2-30-platform--one-cli" class="hash-link" aria-label="Direct link to B.2 3.0 Platform — one CLI" title="Direct link to B.2 3.0 Platform — one CLI" translate="no">​</a></h3>
<p>Codename <strong>Platform</strong>. Goals:</p>
<ul>
<li class=""><strong>Zero config</strong> — <code>init</code> + <code>dev</code>, embedded Docker MySQL default</li>
<li class=""><strong>Single entry</strong> — <code>@fecommunity/reactpress</code> globally</li>
<li class=""><strong>DX</strong> — interactive menu, <code>doctor</code>, <code>status</code></li>
</ul>
<p>Proved <strong>~60 second cold start</strong> after global install. Docker MySQL helped production parity but felt heavy for "try on laptop."</p>
<p><strong>Lesson:</strong> speed of first article beats production parity on day zero.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="b3-31-toolkit-modern-stack">B.3 3.1+ Toolkit modern stack<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#b3-31-toolkit-modern-stack" class="hash-link" aria-label="Direct link to B.3 3.1+ Toolkit modern stack" title="Direct link to B.3 3.1+ Toolkit modern stack" translate="no">​</a></h3>
<p>Unified <code>@fecommunity/reactpress-toolkit</code> contracts; Next.js 14 / React 18 alignment; theme development helpers. Reduced <strong>API client drift</strong> between Admin and themes.</p>
<p><strong>Lesson:</strong> platforms need a <strong>contract layer</strong> more than more features.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="b4-37-security-hardening">B.4 3.7 Security hardening<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#b4-37-security-hardening" class="hash-link" aria-label="Direct link to B.4 3.7 Security hardening" title="Direct link to B.4 3.7 Security hardening" translate="no">​</a></h3>
<p>SQL injection whitelist in public list filters; stored XSS fixes in comments; JWT for comment POST; Helmet CSP. Reported by community researchers — see changelog.</p>
<p><strong>Lesson:</strong> publishing platforms are <strong>security boundaries</strong>, not side projects.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="b5-40-extend--plugins-desktop-npm-themes">B.5 4.0 Extend — plugins, desktop, npm themes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#b5-40-extend--plugins-desktop-npm-themes" class="hash-link" aria-label="Direct link to B.5 4.0 Extend — plugins, desktop, npm themes" title="Direct link to B.5 4.0 Extend — plugins, desktop, npm themes" translate="no">​</a></h3>
<p>Codename <strong>Extend</strong>. SQLite default, bundled CLI runtime (zero extra npm deps), Hook plugins, Electron desktop, theme catalog, cross-platform desktop CI.</p>
<p><strong>Lesson:</strong> the base machine was ready; <strong>extensibility and author scenarios</strong> were next.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="b6-400-stable-promotion">B.6 4.0.0 stable promotion<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#b6-400-stable-promotion" class="hash-link" aria-label="Direct link to B.6 4.0.0 stable promotion" title="Direct link to B.6 4.0.0 stable promotion" translate="no">​</a></h3>
<p>npm <code>@latest</code> promotion, desktop installers on Releases, docs at <code>reactpress.cc</code>, README and media refresh.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-c-module-deep-dive--server">Appendix C: Module deep dive — server<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-c-module-deep-dive--server" class="hash-link" aria-label="Direct link to Appendix C: Module deep dive — server" title="Direct link to Appendix C: Module deep dive — server" translate="no">​</a></h2>
<p>The NestJS server is the <strong>trust boundary</strong> for data, auth, Hooks, and webhooks.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="c1-module-overview">C.1 Module overview<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#c1-module-overview" class="hash-link" aria-label="Direct link to C.1 Module overview" title="Direct link to C.1 Module overview" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Module area</th><th style="text-align:left">Responsibility</th></tr></thead><tbody><tr><td style="text-align:left"><code>article</code></td><td style="text-align:left">CRUD, publish workflow, revisions, Headless list</td></tr><tr><td style="text-align:left"><code>page</code></td><td style="text-align:left">Static pages</td></tr><tr><td style="text-align:left"><code>category</code> / <code>tag</code></td><td style="text-align:left">Taxonomy</td></tr><tr><td style="text-align:left"><code>comment</code></td><td style="text-align:left">Moderation, sanitization</td></tr><tr><td style="text-align:left"><code>file</code></td><td style="text-align:left">Uploads, optimization hooks</td></tr><tr><td style="text-align:left"><code>knowledge</code></td><td style="text-align:left">Knowledge base entities</td></tr><tr><td style="text-align:left"><code>extension</code></td><td style="text-align:left">Theme/plugin registration</td></tr><tr><td style="text-align:left"><code>bootstrap</code></td><td style="text-align:left">First-run setup</td></tr><tr><td style="text-align:left"><code>setting</code></td><td style="text-align:left">Site and API key settings</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="c2-publish-pipeline-conceptual">C.2 Publish pipeline (conceptual)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#c2-publish-pipeline-conceptual" class="hash-link" aria-label="Direct link to C.2 Publish pipeline (conceptual)" title="Direct link to C.2 Publish pipeline (conceptual)" translate="no">​</a></h3>
<p>When an author clicks Publish:</p>
<ol>
<li class="">Admin sends authenticated request via Toolkit</li>
<li class=""><code>article.service</code> loads draft, validates fields</li>
<li class=""><code>HookService.applyFilters('article.beforePublish')</code> — plugins adjust summary, SEO slug, etc.</li>
<li class="">Persist to SQLite/MySQL with status <code>publish</code></li>
<li class=""><code>HookService.doAction('article.afterPublish')</code> — side effects</li>
<li class=""><code>webhookService.dispatch</code> — external systems</li>
<li class="">Theme ISR/SSR fetches updated content on next request</li>
</ol>
<p>Understanding this pipeline explains <strong>where plugins belong</strong> (steps 3–6) and <strong>where themes belong</strong> (step 7).</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="c3-database-options">C.3 Database options<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#c3-database-options" class="hash-link" aria-label="Direct link to C.3 Database options" title="Direct link to C.3 Database options" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Mode</th><th style="text-align:left">When</th></tr></thead><tbody><tr><td style="text-align:left"><strong>SQLite</strong></td><td style="text-align:left">Local dev, solo blogs, desktop local mode</td></tr><tr><td style="text-align:left"><strong>MySQL</strong></td><td style="text-align:left">Concurrent editors, larger catalogs, managed DB</td></tr></tbody></table>
<p>TypeORM entities live in server; themes never import them.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="c4-public-vs-authenticated-routes">C.4 Public vs authenticated routes<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#c4-public-vs-authenticated-routes" class="hash-link" aria-label="Direct link to C.4 Public vs authenticated routes" title="Direct link to C.4 Public vs authenticated routes" translate="no">​</a></h3>
<p>Headless list endpoints expose <strong>published</strong> content suitable for CDNs and static regeneration. Mutations require JWT or API key. <strong>Fail closed</strong> on auth — publishing platforms must not leak draft content through misconfigured caches.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-d-module-deep-dive--admin-web">Appendix D: Module deep dive — Admin (web)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-d-module-deep-dive--admin-web" class="hash-link" aria-label="Direct link to Appendix D: Module deep dive — Admin (web)" title="Direct link to Appendix D: Module deep dive — Admin (web)" translate="no">​</a></h2>
<p>Admin is a <strong>Vite + React SPA</strong> optimized for interactive editing — no SSR required.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="d1-why-spa-for-admin">D.1 Why SPA for Admin<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#d1-why-spa-for-admin" class="hash-link" aria-label="Direct link to D.1 Why SPA for Admin" title="Direct link to D.1 Why SPA for Admin" translate="no">​</a></h3>
<p>Admin users are authenticated; SEO irrelevant. SPA enables fast interactions, rich editors, and client-side routing without Next.js server complexity on the same port as theme.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="d2-list-state-in-url">D.2 List state in URL<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#d2-list-state-in-url" class="hash-link" aria-label="Direct link to D.2 List state in URL" title="Direct link to D.2 List state in URL" translate="no">​</a></h3>
<p>List views (articles, media, comments) sync filters to <code>searchParams</code> — shareable URLs, refresh-safe state. Small DX choice that matters for support ("send me the link to that filtered view").</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="d3-plugin-admin-slots">D.3 Plugin Admin slots<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#d3-plugin-admin-slots" class="hash-link" aria-label="Direct link to D.3 Plugin Admin slots" title="Direct link to D.3 Plugin Admin slots" translate="no">​</a></h3>
<p><code>AdminSlot</code> + <code>PluginAdminProvider</code> let plugins render React UI beside core screens. The SEO plugin's article sidebar is the reference implementation — authors see <strong>contextual configuration</strong>, not a separate plugin app.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="d4-api-proxy-in-production">D.4 API proxy in production<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#d4-api-proxy-in-production" class="hash-link" aria-label="Direct link to D.4 API proxy in production" title="Direct link to D.4 API proxy in production" translate="no">​</a></h3>
<p>Visitor port <code>:3001</code> reverse-proxies <code>/admin/</code> to Admin assets and API paths to <code>:3002</code>. Authors experience <strong>one origin</strong> — simpler cookies and CORS mental model.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-e-module-deep-dive--cli">Appendix E: Module deep dive — CLI<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-e-module-deep-dive--cli" class="hash-link" aria-label="Direct link to Appendix E: Module deep dive — CLI" title="Direct link to Appendix E: Module deep dive — CLI" translate="no">​</a></h2>
<p><code>@fecommunity/reactpress</code> is the <strong>only package end users must know</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="e1-commands">E.1 Commands<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#e1-commands" class="hash-link" aria-label="Direct link to E.1 Commands" title="Direct link to E.1 Commands" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Command</th><th style="text-align:left">Action</th></tr></thead><tbody><tr><td style="text-align:left"><code>reactpress</code> / <code>reactpress init</code></td><td style="text-align:left">Initialize and start stack</td></tr><tr><td style="text-align:left"><code>reactpress init --force</code></td><td style="text-align:left">Re-initialize existing project</td></tr><tr><td style="text-align:left"><code>reactpress doctor</code></td><td style="text-align:left">Diagnose Node, ports, DB, URLs</td></tr><tr><td style="text-align:left"><code>reactpress logs</code></td><td style="text-align:left">Tail API logs</td></tr><tr><td style="text-align:left"><code>reactpress stop</code></td><td style="text-align:left">Stop API and site processes</td></tr><tr><td style="text-align:left"><code>reactpress plugin list/install</code></td><td style="text-align:left">Plugin management</td></tr><tr><td style="text-align:left"><code>reactpress theme add</code></td><td style="text-align:left">Install npm theme</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="e2-bundled-runtime-40">E.2 Bundled runtime (4.0)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#e2-bundled-runtime-40" class="hash-link" aria-label="Direct link to E.2 Bundled runtime (4.0)" title="Direct link to E.2 Bundled runtime (4.0)" translate="no">​</a></h3>
<p>CLI tarball embeds toolkit and server runtime — <strong>global install does not pull six peer packages</strong>. This mirrors how WordPress ships "the thing you need" not "the composer graph you must understand."</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="e3-doctor-philosophy">E.3 <code>doctor</code> philosophy<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#e3-doctor-philosophy" class="hash-link" aria-label="Direct link to e3-doctor-philosophy" title="Direct link to e3-doctor-philosophy" translate="no">​</a></h3>
<p>When a user says "it doesn't work," the first response should not be "read architecture docs." <code>doctor</code> checks Node version, port collisions, database file permissions, and health endpoints — <strong>support automation as product feature</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="e4-process-orchestration">E.4 Process orchestration<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#e4-process-orchestration" class="hash-link" aria-label="Direct link to E.4 Process orchestration" title="Direct link to E.4 Process orchestration" translate="no">​</a></h3>
<p>CLI spawns and supervises API process, theme dev/prod server, and optionally Admin in monorepo dev. Users think in <strong>one command</strong>; CLI thinks in <strong>multi-process supervision</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-f-content-model-reference">Appendix F: Content model reference<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-f-content-model-reference" class="hash-link" aria-label="Direct link to Appendix F: Content model reference" title="Direct link to Appendix F: Content model reference" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Entity</th><th style="text-align:left">Purpose</th><th style="text-align:left">Theme exposure</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Article</strong></td><td style="text-align:left">Blog posts, news</td><td style="text-align:left"><code>/blog/[slug]</code></td></tr><tr><td style="text-align:left"><strong>Page</strong></td><td style="text-align:left">About, landing</td><td style="text-align:left">Custom routes</td></tr><tr><td style="text-align:left"><strong>Knowledge</strong></td><td style="text-align:left">Docs tree</td><td style="text-align:left"><code>/docs/[...slug]</code></td></tr><tr><td style="text-align:left"><strong>Category</strong></td><td style="text-align:left">Grouping</td><td style="text-align:left">Archives, filters</td></tr><tr><td style="text-align:left"><strong>Tag</strong></td><td style="text-align:left">Labels</td><td style="text-align:left">Tag pages</td></tr><tr><td style="text-align:left"><strong>Comment</strong></td><td style="text-align:left">Discussion</td><td style="text-align:left">Article threads</td></tr><tr><td style="text-align:left"><strong>Media</strong></td><td style="text-align:left">Images, files</td><td style="text-align:left">URLs in Markdown</td></tr><tr><td style="text-align:left"><strong>Setting</strong></td><td style="text-align:left">Site config</td><td style="text-align:left">Public vs private keys</td></tr></tbody></table>
<p>Plugins may add derived fields (SEO metadata) without new tables in simple cases — stored on article JSON or extension columns per plugin design.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-g-troubleshooting-guide">Appendix G: Troubleshooting guide<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-g-troubleshooting-guide" class="hash-link" aria-label="Direct link to Appendix G: Troubleshooting guide" title="Direct link to Appendix G: Troubleshooting guide" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Symptom</th><th style="text-align:left">Likely cause</th><th style="text-align:left">Fix</th></tr></thead><tbody><tr><td style="text-align:left">Port 3001 in use</td><td style="text-align:left">Another process</td><td style="text-align:left"><code>reactpress doctor</code>, change port in config</td></tr><tr><td style="text-align:left">API health fails</td><td style="text-align:left">DB lock or crash</td><td style="text-align:left"><code>reactpress logs</code>, check SQLite permissions</td></tr><tr><td style="text-align:left">Admin 404</td><td style="text-align:left">Theme proxy misconfig</td><td style="text-align:left">Re-run <code>init</code>, verify <code>.reactpress/config.json</code></td></tr><tr><td style="text-align:left">Theme blank</td><td style="text-align:left">API URL wrong</td><td style="text-align:left">Check <code>NEXT_PUBLIC_API_URL</code> in theme env</td></tr><tr><td style="text-align:left">Plugin not loading</td><td style="text-align:left">Not built / not enabled</td><td style="text-align:left"><code>pnpm build:plugins</code>, enable in Admin</td></tr><tr><td style="text-align:left">Desktop cannot sync</td><td style="text-align:left">CORS / auth</td><td style="text-align:left">Verify remote API URL and admin JWT</td></tr><tr><td style="text-align:left">Images 404</td><td style="text-align:left"><code>uploads/</code> path</td><td style="text-align:left">Confirm file module and disk permissions</td></tr></tbody></table>
<p>Full reference: <a class="" href="https://reactpress.cc/docs/reference/troubleshooting">Troubleshooting docs</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-h-glossary">Appendix H: Glossary<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-h-glossary" class="hash-link" aria-label="Direct link to Appendix H: Glossary" title="Direct link to Appendix H: Glossary" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Term</th><th style="text-align:left">Meaning</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Publishing platform</strong></td><td style="text-align:left">API + Admin + visitor delivery + tooling as one product category</td></tr><tr><td style="text-align:left"><strong>Headless CMS</strong></td><td style="text-align:left">Content API with separate presentation responsibility</td></tr><tr><td style="text-align:left"><strong>Theme</strong></td><td style="text-align:left">Swappable Next.js visitor application</td></tr><tr><td style="text-align:left"><strong>Plugin</strong></td><td style="text-align:left">Server-side Hook extension via <code>plugin.json</code></td></tr><tr><td style="text-align:left"><strong>Toolkit</strong></td><td style="text-align:left"><code>@fecommunity/reactpress-toolkit</code> shared types and HTTP clients</td></tr><tr><td style="text-align:left"><strong>Hook</strong></td><td style="text-align:left">In-process filter/action extension point</td></tr><tr><td style="text-align:left"><strong>Webhook</strong></td><td style="text-align:left">Outbound HTTP notification on events</td></tr><tr><td style="text-align:left"><strong>Registry</strong></td><td style="text-align:left">Source-of-truth list of installable themes/plugins</td></tr><tr><td style="text-align:left"><strong>Materialized</strong></td><td style="text-align:left">Copied build under <code>.reactpress/</code> ready to run</td></tr><tr><td style="text-align:left"><strong>Extend</strong></td><td style="text-align:left">ReactPress 4.0 codename — plugins, desktop, catalogs</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-i-seo-keyword-guide-for-authors-republishing-this-article">Appendix I: SEO keyword guide (for authors republishing this article)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-i-seo-keyword-guide-for-authors-republishing-this-article" class="hash-link" aria-label="Direct link to Appendix I: SEO keyword guide (for authors republishing this article)" title="Direct link to Appendix I: SEO keyword guide (for authors republishing this article)" translate="no">​</a></h2>
<p>If you adapt this content for your own blog, these natural keyword clusters performed well in our research:</p>
<p><strong>Primary:</strong> React CMS · Next.js CMS · WordPress alternative · React publishing platform · Open source CMS</p>
<p><strong>Secondary:</strong> self-hosted blog · headless REST API · Electron writing app · NestJS CMS · npm theme · Hook plugin system</p>
<p><strong>Long-tail:</strong> "wordpress alternative react", "next.js cms self hosted", "open source publishing platform react", "strapi alternative complete platform"</p>
<p>Place keywords in title, first 100 words, one H2, image alt text, and meta description — not stuffed in every paragraph.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-j-licensing-and-commercial-use">Appendix J: Licensing and commercial use<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-j-licensing-and-commercial-use" class="hash-link" aria-label="Direct link to Appendix J: Licensing and commercial use" title="Direct link to Appendix J: Licensing and commercial use" translate="no">​</a></h2>
<p>ReactPress is <strong>MIT licensed</strong>. You may:</p>
<ul>
<li class="">Use commercially without royalty</li>
<li class="">Modify and redistribute</li>
<li class="">Fork for private platforms</li>
</ul>
<p>You must:</p>
<ul>
<li class="">Include license notice in distributions</li>
<li class="">Accept software AS IS</li>
</ul>
<p>No trademark grant — "ReactPress" branding should not imply official endorsement of unaffiliated forks without clarity.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-k-building-a-content-team-on-reactpress">Appendix K: Building a content team on ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-k-building-a-content-team-on-reactpress" class="hash-link" aria-label="Direct link to Appendix K: Building a content team on ReactPress" title="Direct link to Appendix K: Building a content team on ReactPress" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="k1-roles">K.1 Roles<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#k1-roles" class="hash-link" aria-label="Direct link to K.1 Roles" title="Direct link to K.1 Roles" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Role</th><th style="text-align:left">Tooling</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Author</strong></td><td style="text-align:left">Admin or Desktop</td></tr><tr><td style="text-align:left"><strong>Editor</strong></td><td style="text-align:left">Admin moderation, schedules</td></tr><tr><td style="text-align:left"><strong>Designer</strong></td><td style="text-align:left">Theme repo, Storybook</td></tr><tr><td style="text-align:left"><strong>Engineer</strong></td><td style="text-align:left">Plugins, API, deploy</td></tr><tr><td style="text-align:left"><strong>SEO</strong></td><td style="text-align:left">SEO plugin fields + Search Console</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="k2-editorial-workflow-example">K.2 Editorial workflow example<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#k2-editorial-workflow-example" class="hash-link" aria-label="Direct link to K.2 Editorial workflow example" title="Direct link to K.2 Editorial workflow example" translate="no">​</a></h3>
<ol>
<li class="">Author drafts in Desktop offline on flight</li>
<li class="">Sync to staging API on landing</li>
<li class="">Editor reviews in Admin, requests changes via comments</li>
<li class="">SEO owner fills meta fields in plugin slot</li>
<li class="">Editor publishes — Hook notifies Slack</li>
<li class="">Theme ISR shows new article within seconds</li>
<li class="">Sitemap regenerates on next crawl</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="k3-governance">K.3 Governance<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#k3-governance" class="hash-link" aria-label="Direct link to K.3 Governance" title="Direct link to K.3 Governance" translate="no">​</a></h3>
<ul>
<li class="">Production API keys only on server secrets</li>
<li class="">Staging Admin for training new authors</li>
<li class="">Plugin installs restricted to engineers</li>
<li class="">Theme changes via PR + preview deployment</li>
</ul>
<p>This is how <strong>React publishing platforms</strong> replace "email Word doc to developer" workflows without returning to PHP.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-l-future-of-the-react-publishing-category">Appendix L: Future of the React publishing category<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-l-future-of-the-react-publishing-category" class="hash-link" aria-label="Direct link to Appendix L: Future of the React publishing category" title="Direct link to Appendix L: Future of the React publishing category" translate="no">​</a></h2>
<p>We predict five trends:</p>
<ol>
<li class=""><strong>Consolidation</strong> — teams tired of five-repo Headless assembly seek platforms</li>
<li class=""><strong>AI plugins</strong> — summary, tagging, translation via Hook points, not core bloat</li>
<li class=""><strong>Edge themes</strong> — Next on Vercel + central API becomes default split pattern</li>
<li class=""><strong>Marketplaces</strong> — npm-distributed themes/plugins with semver contracts</li>
<li class=""><strong>Desktop resurgence</strong> — local-first writing returns as latency and travel return</li>
</ol>
<p>ReactPress 4.0 positions on all five — not with hype, with <strong>shipping code</strong>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-m-detailed-walkthrough--first-production-week">Appendix M: Detailed walkthrough — first production week<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-m-detailed-walkthrough--first-production-week" class="hash-link" aria-label="Direct link to Appendix M: Detailed walkthrough — first production week" title="Direct link to Appendix M: Detailed walkthrough — first production week" translate="no">​</a></h2>
<p>This appendix narrates a realistic <strong>first week</strong> deploying ReactPress as a <strong>WordPress alternative</strong> for a ten-person startup marketing site.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="m1-day-1--proof-of-concept">M.1 Day 1 — Proof of concept<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#m1-day-1--proof-of-concept" class="hash-link" aria-label="Direct link to M.1 Day 1 — Proof of concept" title="Direct link to M.1 Day 1 — Proof of concept" translate="no">​</a></h3>
<p>The lead engineer runs:</p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir acme-blog &amp;&amp; cd acme-blog</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<p>She shares screenshots in Slack: Admin at <code>/admin/</code>, public site on <code>:3001</code>, Lighthouse run on default theme. Product approves direction — <strong>no Strapi sprint</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="m2-day-2--theme-fork">M.2 Day 2 — Theme fork<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#m2-day-2--theme-fork" class="hash-link" aria-label="Direct link to M.2 Day 2 — Theme fork" title="Direct link to M.2 Day 2 — Theme fork" translate="no">​</a></h3>
<p>Design wants custom typography. Engineer forks <code>reactpress-theme-starter</code>, connects <code>pnpm dev:mock</code> for UI-only iteration, then points <code>NEXT_PUBLIC_API_URL</code> at local API. Brand colors ship in theme Git — <strong>content untouched in CMS</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="m3-day-3--seo-and-analytics">M.3 Day 3 — SEO and analytics<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#m3-day-3--seo-and-analytics" class="hash-link" aria-label="Direct link to M.3 Day 3 — SEO and analytics" title="Direct link to M.3 Day 3 — SEO and analytics" translate="no">​</a></h3>
<p>Enable <code>seo</code> plugin. Configure site settings (title, description, social image). Add Google Search Console verification file as static asset in theme <code>public/</code>. Plugin Hook stub queued for Plausible script injection — <strong>logic in plugin</strong>, not hacked in theme layout.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="m4-day-4--staging-vps">M.4 Day 4 — Staging VPS<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#m4-day-4--staging-vps" class="hash-link" aria-label="Direct link to M.4 Day 4 — Staging VPS" title="Direct link to M.4 Day 4 — Staging VPS" translate="no">​</a></h3>
<p>Provision small VPS. <code>reactpress init</code> on staging with MySQL mode. <code>reactpress doctor</code> clean. TLS via Caddy reverse proxy. Marketing creates accounts, practices drafts.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="m5-day-5--content-migration">M.5 Day 5 — Content migration<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#m5-day-5--content-migration" class="hash-link" aria-label="Direct link to M.5 Day 5 — Content migration" title="Direct link to M.5 Day 5 — Content migration" translate="no">​</a></h3>
<p>Script pulls 40 WordPress posts via REST, maps to ReactPress <code>POST /api/article</code>. Media downloaded to <code>uploads/</code>. Slugs preserved. Theme routes verified — <strong>redirect map</strong> added in Next config for changed paths only.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="m6-day-6--comments-and-moderation">M.6 Day 6 — Comments and moderation<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#m6-day-6--comments-and-moderation" class="hash-link" aria-label="Direct link to M.6 Day 6 — Comments and moderation" title="Direct link to M.6 Day 6 — Comments and moderation" translate="no">​</a></h3>
<p>Enable comments in settings. JWT flow tested. Akismet-style plugin planned for 4.x catalog; until then, moderation queue in Admin daily.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="m7-day-7--go-live">M.7 Day 7 — Go live<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#m7-day-7--go-live" class="hash-link" aria-label="Direct link to M.7 Day 7 — Go live" title="Direct link to M.7 Day 7 — Go live" translate="no">​</a></h3>
<p>DNS cutover. Monitor API logs via <code>reactpress logs</code>. First organic search impressions in Search Console within two weeks — SSR confirmed via "View page source."</p>
<p><strong>Total engineering time:</strong> far below a greenfield Headless + Next build. <strong>Total repos:</strong> one site directory + one theme fork.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-n-strapi-vs-payload-vs-reactpress-feature-level">Appendix N: Strapi vs Payload vs ReactPress (feature-level)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-n-strapi-vs-payload-vs-reactpress-feature-level" class="hash-link" aria-label="Direct link to Appendix N: Strapi vs Payload vs ReactPress (feature-level)" title="Direct link to Appendix N: Strapi vs Payload vs ReactPress (feature-level)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="n1-content-modeling">N.1 Content modeling<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#n1-content-modeling" class="hash-link" aria-label="Direct link to N.1 Content modeling" title="Direct link to N.1 Content modeling" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Capability</th><th style="text-align:left">Strapi</th><th style="text-align:left">Payload</th><th style="text-align:left">ReactPress</th></tr></thead><tbody><tr><td style="text-align:left">Custom content types</td><td style="text-align:left">Core strength</td><td style="text-align:left">Core strength</td><td style="text-align:left">Opinionated core types</td></tr><tr><td style="text-align:left">Field-level plugins</td><td style="text-align:left">Via extensions</td><td style="text-align:left">Hooks</td><td style="text-align:left">Hook filters on entities</td></tr><tr><td style="text-align:left">Relations</td><td style="text-align:left">Rich</td><td style="text-align:left">Rich</td><td style="text-align:left">Categories, tags, knowledge tree</td></tr><tr><td style="text-align:left">Draft/publish</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td><td style="text-align:left">Yes</td></tr><tr><td style="text-align:left">Revisions</td><td style="text-align:left">Varies</td><td style="text-align:left">Yes</td><td style="text-align:left">Article revisions</td></tr></tbody></table>
<p><strong>Takeaway:</strong> if you need exotic content graphs (marketplace listings, multi-tenant products), Headless may fit better. If you need <strong>articles, pages, docs, media</strong>, ReactPress defaults suffice.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="n2-author-experience">N.2 Author experience<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#n2-author-experience" class="hash-link" aria-label="Direct link to N.2 Author experience" title="Direct link to N.2 Author experience" translate="no">​</a></h3>
<p>Strapi Admin is customizable but still "configure the CMS" energy. Payload Admin is React-native and beloved by developers. ReactPress Admin is narrower and <strong>opinionated for publishing</strong> — closer to WordPress task focus than infinite schema admin.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="n3-developer-experience">N.3 Developer experience<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#n3-developer-experience" class="hash-link" aria-label="Direct link to N.3 Developer experience" title="Direct link to N.3 Developer experience" translate="no">​</a></h3>
<p>Strapi/Payload excel when <strong>the API is the product</strong> you sell to internal teams.</p>
<p>ReactPress excels when <strong>the published site is the product</strong> and API is implementation detail — classic marketing site / blog / docs.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="n4-total-repositories">N.4 Total repositories<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#n4-total-repositories" class="hash-link" aria-label="Direct link to N.4 Total repositories" title="Direct link to N.4 Total repositories" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Approach</th><th style="text-align:left">Typical repo count</th></tr></thead><tbody><tr><td style="text-align:left">Strapi + Next</td><td style="text-align:left">2–4</td></tr><tr><td style="text-align:left">Payload + Next</td><td style="text-align:left">2–4</td></tr><tr><td style="text-align:left">ReactPress</td><td style="text-align:left">1 (+ optional theme fork)</td></tr></tbody></table>
<p>Fewer repos ≠ simpler architecture automatically — but fewer <strong>integration surfaces</strong> reduce bus factor and on-call pages.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-o-wordpress-timeline--lessons-for-reactpress">Appendix O: WordPress timeline — lessons for ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-o-wordpress-timeline--lessons-for-reactpress" class="hash-link" aria-label="Direct link to Appendix O: WordPress timeline — lessons for ReactPress" title="Direct link to Appendix O: WordPress timeline — lessons for ReactPress" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Year</th><th style="text-align:left">WordPress milestone</th><th style="text-align:left">Lesson for React</th></tr></thead><tbody><tr><td style="text-align:left">2003</td><td style="text-align:left">Fork of b2/cafelog</td><td style="text-align:left">Start from real user pain, not abstract framework</td></tr><tr><td style="text-align:left">2005</td><td style="text-align:left">Themes directory</td><td style="text-align:left">Distribution creates ecosystem</td></tr><tr><td style="text-align:left">2010</td><td style="text-align:left">Custom post types</td><td style="text-align:left">Extensibility without fork</td></tr><tr><td style="text-align:left">2012</td><td style="text-align:left">REST API plugins emerge</td><td style="text-align:left">Headless demand appears early</td></tr><tr><td style="text-align:left">2015</td><td style="text-align:left">REST in core</td><td style="text-align:left">API becomes standard, still not default UX</td></tr><tr><td style="text-align:left">2018</td><td style="text-align:left">Gutenberg</td><td style="text-align:left">Writing UI is product differentiator</td></tr><tr><td style="text-align:left">2020s</td><td style="text-align:left">Headless agencies</td><td style="text-align:left">Developers want JS front, keep wp-admin</td></tr></tbody></table>
<p>React is at the "2012–2015 REST plugins" moment — <strong>API exists everywhere, integrated platform does not</strong>. ReactPress bets the integrated platform is the missing layer.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-p-performance-tuning-checklist">Appendix P: Performance tuning checklist<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-p-performance-tuning-checklist" class="hash-link" aria-label="Direct link to Appendix P: Performance tuning checklist" title="Direct link to Appendix P: Performance tuning checklist" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="p1-theme-layer">P.1 Theme layer<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#p1-theme-layer" class="hash-link" aria-label="Direct link to P.1 Theme layer" title="Direct link to P.1 Theme layer" translate="no">​</a></h3>
<ul>
<li class="">Enable ISR on high-traffic list pages</li>
<li class="">Use <code>next/image</code> for media URLs from API</li>
<li class="">Limit client-side JS on article template</li>
<li class="">Prefetch critical navigation only</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="p2-api-layer">P.2 API layer<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#p2-api-layer" class="hash-link" aria-label="Direct link to P.2 API layer" title="Direct link to P.2 API layer" translate="no">​</a></h3>
<ul>
<li class="">Move SQLite → MySQL before traffic spikes</li>
<li class="">Put API behind CDN only for <strong>public GET</strong> routes — never cache authenticated responses</li>
<li class="">Enable gzip/brotli at reverse proxy</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="p3-media-layer">P.3 Media layer<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#p3-media-layer" class="hash-link" aria-label="Direct link to P.3 Media layer" title="Direct link to P.3 Media layer" translate="no">​</a></h3>
<ul>
<li class="">Run <code>image-optimizer</code> plugin on legacy PNG/JPEG uploads</li>
<li class="">Consider OSS CDN for <code>uploads/</code> in production China/global split</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="p4-admin-layer">P.4 Admin layer<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#p4-admin-layer" class="hash-link" aria-label="Direct link to P.4 Admin layer" title="Direct link to P.4 Admin layer" translate="no">​</a></h3>
<ul>
<li class="">Admin CSR acceptable — do not SSR Admin for "performance scores"</li>
<li class="">Keep heavy plugin UI lazy-loaded in slots</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-q-international-teams">Appendix Q: International teams<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-q-international-teams" class="hash-link" aria-label="Direct link to Appendix Q: International teams" title="Direct link to Appendix Q: International teams" translate="no">​</a></h2>
<p>ReactPress docs ship in <strong>English and Chinese</strong> (<code>reactpress.cc</code> i18n). Core Admin UI strings are localization-ready via toolkit locale files.</p>
<p>For multi-language <strong>content</strong>:</p>
<ul>
<li class="">Option A: category per locale (simple)</li>
<li class="">Option B: custom plugin adding <code>locale</code> field + theme routing <code>/en/blog</code>, <code>/zh/blog</code></li>
<li class="">Option C: separate ReactPress instances per region (operational isolation)</li>
</ul>
<p>Core stays lean; <strong>i18n is a plugin/theme concern</strong> — same WordPress pattern (WPML, Polylang as plugins, not core bloat).</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-r-common-objections-answered">Appendix R: Common objections answered<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-r-common-objections-answered" class="hash-link" aria-label="Direct link to Appendix R: Common objections answered" title="Direct link to Appendix R: Common objections answered" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="just-use-wordpress-with-headless">"Just use WordPress with Headless."<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#just-use-wordpress-with-headless" class="hash-link" aria-label="Direct link to &quot;Just use WordPress with Headless.&quot;" title="Direct link to &quot;Just use WordPress with Headless.&quot;" translate="no">​</a></h3>
<p>Valid if you already run WordPress and only need a Next front. Greenfield JS teams still inherit PHP ops, plugin security reviews, and dual-stack hiring. ReactPress is <strong>single-stack publishing</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="just-use-mdx-in-the-repo">"Just use MDX in the repo."<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#just-use-mdx-in-the-repo" class="hash-link" aria-label="Direct link to &quot;Just use MDX in the repo.&quot;" title="Direct link to &quot;Just use MDX in the repo.&quot;" translate="no">​</a></h3>
<p>Valid for solo devs who love Git. Breaks down when marketing hires a non-developer author — then you rebuild CMS features in ad-hoc Google Docs workflows.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="platforms-are-opinionated--well-outgrow-it">"Platforms are opinionated — we'll outgrow it."<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#platforms-are-opinionated--well-outgrow-it" class="hash-link" aria-label="Direct link to &quot;Platforms are opinionated — we'll outgrow it.&quot;" title="Direct link to &quot;Platforms are opinionated — we'll outgrow it.&quot;" translate="no">​</a></h3>
<p>True for exotic marketplaces. Most blogs, docs, and marketing sites <strong>do not outgrow articles + pages + media</strong>. Escape hatches exist: Headless API, custom theme, plugins.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="another-cms-nobody-asked-for">"Another CMS nobody asked for."<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#another-cms-nobody-asked-for" class="hash-link" aria-label="Direct link to &quot;Another CMS nobody asked for.&quot;" title="Direct link to &quot;Another CMS nobody asked for.&quot;" translate="no">​</a></h3>
<p>Fair skepticism. ReactPress growth is community-driven (FECommunity, contributors, dogfood on gaoredu.com). Niche: <strong>React teams wanting WordPress workflow</strong> — a large niche given React's market share.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="electron-desktop-is-niche">"Electron desktop is niche."<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#electron-desktop-is-niche" class="hash-link" aria-label="Direct link to &quot;Electron desktop is niche.&quot;" title="Direct link to &quot;Electron desktop is niche.&quot;" translate="no">​</a></h3>
<p>So was laptop computing until remote work. Offline writing is <strong>peak niche until airplane Wi-Fi fails</strong> — then it's essential.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-s-code-reference--theme-page-example">Appendix S: Code reference — theme page example<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-s-code-reference--theme-page-example" class="hash-link" aria-label="Direct link to Appendix S: Code reference — theme page example" title="Direct link to Appendix S: Code reference — theme page example" translate="no">​</a></h2>
<p>Illustrative article page pattern (simplified):</p>
<div class="language-typescript codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-typescript codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// theme: app/blog/[slug]/page.tsx</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> createThemeApi </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@fecommunity/reactpress-toolkit/theme'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> notFound </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'next/navigation'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> api </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createThemeApi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> baseURL</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">env</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">NEXT_PUBLIC_API_URL</span><span class="token operator" style="color:#393A34">!</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">generateMetadata</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params </span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> slug</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> article </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> api</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">bySlug</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">params</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">slug</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">metaTitle </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">title</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">metaDescription </span><span class="token operator" style="color:#393A34">??</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    openGraph</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> images</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cover </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cover</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ArticlePage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params </span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> params</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> slug</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> article </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> api</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">bySlug</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">params</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">slug</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">notFound</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">article</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">h1</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">title</span><span class="token punctuation" style="color:#393A34">}</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">h1</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">div dangerouslySetInnerHTML</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> __html</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">html </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">article</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Real starter theme adds layout, JSON-LD, comments, and ISR — but the <strong>contract</strong> is always API → SSR.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-t-code-reference--plugin-filter-chain">Appendix T: Code reference — plugin filter chain<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-t-code-reference--plugin-filter-chain" class="hash-link" aria-label="Direct link to Appendix T: Code reference — plugin filter chain" title="Direct link to Appendix T: Code reference — plugin filter chain" translate="no">​</a></h2>
<p>Multiple plugins can subscribe to one Hook — execution order matters for filters:</p>
<div class="language-typescript codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-typescript codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Plugin A — enforce slug format</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">hooks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addFilter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'article.beforePublish'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">slug </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">slug</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toLowerCase</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-flags" style="color:#36acaa">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'-'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Plugin B — default summary</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">hooks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addFilter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'article.beforePublish'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">content</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">slice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">160</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> article</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p><code>HookService</code> applies filters sequentially; each receives previous output. <strong>Composable publishing rules</strong> without merging PRs into core.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-u-operations-runbook-minimal">Appendix U: Operations runbook (minimal)<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-u-operations-runbook-minimal" class="hash-link" aria-label="Direct link to Appendix U: Operations runbook (minimal)" title="Direct link to Appendix U: Operations runbook (minimal)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="daily">Daily<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#daily" class="hash-link" aria-label="Direct link to Daily" title="Direct link to Daily" translate="no">​</a></h3>
<ul>
<li class="">Glance Admin comment queue</li>
<li class="">Check disk space for <code>uploads/</code> and SQLite file</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="weekly">Weekly<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#weekly" class="hash-link" aria-label="Direct link to Weekly" title="Direct link to Weekly" translate="no">​</a></h3>
<ul>
<li class=""><code>npm i -g @fecommunity/reactpress@latest</code> on servers if release notes mention security</li>
<li class="">Review API error logs via <code>reactpress logs</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="monthly">Monthly<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#monthly" class="hash-link" aria-label="Direct link to Monthly" title="Direct link to Monthly" translate="no">​</a></h3>
<ul>
<li class="">Restore test from backup tarball</li>
<li class="">Rotate API keys if team changes</li>
<li class="">Lighthouse spot check on top URLs</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="incident-site-down">Incident: site down<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#incident-site-down" class="hash-link" aria-label="Direct link to Incident: site down" title="Direct link to Incident: site down" translate="no">​</a></h3>
<ol>
<li class=""><code>reactpress doctor</code></li>
<li class=""><code>curl /api/health</code></li>
<li class="">Check reverse proxy TLS cert expiry</li>
<li class="">Restart processes via <code>reactpress stop</code> then start command from your deploy docs</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-v-why-mit-license">Appendix V: Why MIT license<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-v-why-mit-license" class="hash-link" aria-label="Direct link to Appendix V: Why MIT license" title="Direct link to Appendix V: Why MIT license" translate="no">​</a></h2>
<p>We chose <strong>MIT</strong> over copyleft to maximize adoption:</p>
<ul>
<li class="">Corporate blogs without legal friction</li>
<li class="">Agencies white-labeling internal platforms</li>
<li class="">Theme authors selling premium skins without GPL contagion concerns</li>
</ul>
<p>Copyleft has noble goals; <strong>platform standards often spread through permissive licenses</strong> (BSD Unix, MIT React ecosystem). Data still belongs to operators — license does not cloud-host your posts.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-w-reading-list">Appendix W: Reading list<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-w-reading-list" class="hash-link" aria-label="Direct link to Appendix W: Reading list" title="Direct link to Appendix W: Reading list" translate="no">​</a></h2>
<p>Further reading for publishing platform designers:</p>
<ul>
<li class="">WordPress Plugin Handbook — Hook mental models</li>
<li class="">Next.js App Router docs — SSR/ISR semantics</li>
<li class="">NestJS modular architecture — extension boundaries</li>
<li class=""><a href="https://github.com/fecommunity/reactpress/blob/master/ARCHITECTURE.md" target="_blank" rel="noopener noreferrer" class="">ReactPress ARCHITECTURE.md</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">ReactPress vs WordPress doc</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/tutorial-extras/reactpress-4-0">ReactPress 4.0 guide</a></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-x-document-changelog">Appendix X: Document changelog<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-x-document-changelog" class="hash-link" aria-label="Direct link to Appendix X: Document changelog" title="Direct link to Appendix X: Document changelog" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Date</th><th style="text-align:left">Change</th></tr></thead><tbody><tr><td style="text-align:left">2026-07-12</td><td style="text-align:left">Initial long-form English edition with architecture diagrams, Admin screenshots, GIF demos, appendices A–X</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-y-full-faq-extended-edition">Appendix Y: Full FAQ extended edition<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-y-full-faq-extended-edition" class="hash-link" aria-label="Direct link to Appendix Y: Full FAQ extended edition" title="Direct link to Appendix Y: Full FAQ extended edition" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="installation-and-environment">Installation and environment<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#installation-and-environment" class="hash-link" aria-label="Direct link to Installation and environment" title="Direct link to Installation and environment" translate="no">​</a></h3>
<p><strong>Q: Does ReactPress run on Windows?</strong><br>
<!-- -->A: Yes for CLI and Desktop. Windows 10+ supported for Electron installer. WSL also works for CLI workflows.</p>
<p><strong>Q: Apple Silicon Mac support?</strong><br>
<!-- -->A: Yes — DMG builds include arm64. Desktop CI matrix covers macOS architectures.</p>
<p><strong>Q: Can I run multiple sites on one machine?</strong><br>
<!-- -->A: Yes — separate directories per site, distinct ports in each <code>.reactpress/config.json</code>.</p>
<p><strong>Q: Node 18 works?</strong><br>
<!-- -->A: Current releases target Node 20+. Use <code>reactpress doctor</code> to verify.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="content-and-editing">Content and editing<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#content-and-editing" class="hash-link" aria-label="Direct link to Content and editing" title="Direct link to Content and editing" translate="no">​</a></h3>
<p><strong>Q: WYSIWYG editor instead of Markdown?</strong><br>
<!-- -->A: Default is Markdown for technical audiences. Rich text can be added via Admin customization or plugins — not core default today.</p>
<p><strong>Q: Scheduled publishing?</strong><br>
<!-- -->A: Check current server article module for schedule fields in your release; roadmap items may expand cron publishing.</p>
<p><strong>Q: Multi-author roles?</strong><br>
<!-- -->A: Admin supports role separation via server auth module — see docs for current role matrix.</p>
<p><strong>Q: Knowledge base vs articles?</strong><br>
<!-- -->A: Separate content types — articles for chronological blog, knowledge for hierarchical docs.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="themes-and-front-end">Themes and front end<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#themes-and-front-end" class="hash-link" aria-label="Direct link to Themes and front end" title="Direct link to Themes and front end" translate="no">​</a></h3>
<p><strong>Q: Remix or Astro instead of Next?</strong><br>
<!-- -->A: Use Headless API + those frameworks. Default bundled theme is Next.js only.</p>
<p><strong>Q: Can themes use Tailwind?</strong><br>
<!-- -->A: Official starter uses Tailwind — any CSS stack works in your theme repo.</p>
<p><strong>Q: App Router required?</strong><br>
<!-- -->A: 4.x official themes target App Router. Pages Router possible in custom themes if you maintain routing.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="plugins-and-extensions">Plugins and extensions<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#plugins-and-extensions" class="hash-link" aria-label="Direct link to Plugins and extensions" title="Direct link to Plugins and extensions" translate="no">​</a></h3>
<p><strong>Q: Publish plugin to npm?</strong><br>
<!-- -->A: Roadmap catalog supports npm-spec plugins; follow <code>plugins/README.md</code> manifest rules.</p>
<p><strong>Q: Plugin breaks site — recovery?</strong><br>
<!-- -->A: Disable via filesystem (remove from enabled list in DB) or Admin safe mode patterns documented in troubleshooting.</p>
<p><strong>Q: Can plugins add database tables?</strong><br>
<!-- -->A: Advanced — prefer JSON fields on entities or separate plugin-owned storage patterns; follow security guidelines in plugin README.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="api-and-integrations">API and integrations<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#api-and-integrations" class="hash-link" aria-label="Direct link to API and integrations" title="Direct link to API and integrations" translate="no">​</a></h3>
<p><strong>Q: GraphQL?</strong><br>
<!-- -->A: REST is standard. GraphQL gateway could be a custom plugin or sidecar — not bundled.</p>
<p><strong>Q: Rate limiting?</strong><br>
<!-- -->A: Implement at reverse proxy (nginx, Caddy) for public endpoints.</p>
<p><strong>Q: Webhook signature verification?</strong><br>
<!-- -->A: Follow server webhook module docs for signing secrets per destination.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="desktop">Desktop<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#desktop" class="hash-link" aria-label="Direct link to Desktop" title="Direct link to Desktop" translate="no">​</a></h3>
<p><strong>Q: Mobile app?</strong><br>
<!-- -->A: Not currently — Desktop is Electron for desktop OS. Mobile could consume Headless API.</p>
<p><strong>Q: Local DB location?</strong><br>
<!-- -->A: Embedded SQLite path documented in desktop README — under app user data directory.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="business-and-license">Business and license<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#business-and-license" class="hash-link" aria-label="Direct link to Business and license" title="Direct link to Business and license" translate="no">​</a></h3>
<p><strong>Q: SaaS hosted version from official team?</strong><br>
<!-- -->A: Self-hosted open source is primary model; managed hosting may come via partners on roadmap.</p>
<p><strong>Q: Trademark usage?</strong><br>
<!-- -->A: Refer to project and MIT license; do not imply official partnership without agreement.</p>
<p><strong>Q: Enterprise support?</strong><br>
<!-- -->A: Contact via <a href="mailto:admin@gaoredu.com" target="_blank" rel="noopener noreferrer" class="">admin@gaoredu.com</a> or GitHub discussions for commercial support inquiries.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-z-the-case-for-a-react-native-publishing-standard">Appendix Z: The case for a React-native publishing standard<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-z-the-case-for-a-react-native-publishing-standard" class="hash-link" aria-label="Direct link to Appendix Z: The case for a React-native publishing standard" title="Direct link to Appendix Z: The case for a React-native publishing standard" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="z1-standards-emerge-from-repetition">Z.1 Standards emerge from repetition<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#z1-standards-emerge-from-repetition" class="hash-link" aria-label="Direct link to Z.1 Standards emerge from repetition" title="Direct link to Z.1 Standards emerge from repetition" translate="no">​</a></h3>
<p>Every React team repeated the same assembly:</p>
<ol>
<li class="">Pick Headless vendor</li>
<li class="">Build Admin workarounds</li>
<li class="">Ship Next theme</li>
<li class="">Wire SEO</li>
<li class="">Rebuild on vendor pricing changes</li>
</ol>
<p>Standards appear when <strong>the repetition cost exceeds the cost of agreeing on defaults</strong>. WordPress became a standard not because PHP was perfect, but because <strong>the assembly was repeated billions of times</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="z2-what-a-standard-would-include">Z.2 What a standard would include<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#z2-what-a-standard-would-include" class="hash-link" aria-label="Direct link to Z.2 What a standard would include" title="Direct link to Z.2 What a standard would include" translate="no">​</a></h3>
<p>A React publishing standard (de facto, not necessarily a RFC) would specify:</p>
<ul>
<li class="">Content entities and REST shapes</li>
<li class="">Theme contract (environment variables, route expectations)</li>
<li class="">Plugin manifest and Hook names</li>
<li class="">CLI lifecycle commands</li>
<li class="">Security baseline for public comments and uploads</li>
</ul>
<p>ReactPress open-sources one answer. Competition and forks are healthy — <strong>category clarity</strong> matters more than monopoly.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="z3-interop-dreams">Z.3 Interop dreams<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#z3-interop-dreams" class="hash-link" aria-label="Direct link to Z.3 Interop dreams" title="Direct link to Z.3 Interop dreams" translate="no">​</a></h3>
<p>Future possibilities:</p>
<ul>
<li class="">Import/export package between ReactPress and Strapi/Payload</li>
<li class="">Theme porting guides from Ghost Handlebars → Next</li>
<li class="">Shared npm <code>@reactpress/*</code> utility packages</li>
</ul>
<p>Interop reduces lock-in fear — important for <strong>open source CMS</strong> adoption.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="z4-call-to-action-for-platform-builders">Z.4 Call to action for platform builders<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#z4-call-to-action-for-platform-builders" class="hash-link" aria-label="Direct link to Z.4 Call to action for platform builders" title="Direct link to Z.4 Call to action for platform builders" translate="no">​</a></h3>
<p>If you build developer tools:</p>
<ul>
<li class=""><strong>Don't only ship APIs</strong> — ask who writes at 6pm Friday</li>
<li class=""><strong>Don't only ship templates</strong> — ask who approves comments Monday</li>
<li class=""><strong>Respect boundaries</strong> — theme vs plugin vs core</li>
<li class=""><strong>Ship diagnostics</strong> — <code>doctor</code> beats Discord support</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="z5-final-word-before-conclusion">Z.5 Final word before conclusion<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#z5-final-word-before-conclusion" class="hash-link" aria-label="Direct link to Z.5 Final word before conclusion" title="Direct link to Z.5 Final word before conclusion" translate="no">​</a></h3>
<p>Ten years from now, we hope this article reads like early WordPress manifestos — obvious in hindsight, controversial at publish time. The question was never "Can React render a blog?" It was always <strong>"Can React teams publish like grown-ups without PHP?"</strong></p>
<p>ReactPress 4.0 answers: <strong>yes, with one CLI, one Admin, and a theme you are allowed to replace.</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-aa-economics-of-the-five-repo-assembly">Appendix AA: Economics of the five-repo assembly<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-aa-economics-of-the-five-repo-assembly" class="hash-link" aria-label="Direct link to Appendix AA: Economics of the five-repo assembly" title="Direct link to Appendix AA: Economics of the five-repo assembly" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="aa1-hidden-line-items">AA.1 Hidden line items<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#aa1-hidden-line-items" class="hash-link" aria-label="Direct link to AA.1 Hidden line items" title="Direct link to AA.1 Hidden line items" translate="no">​</a></h3>
<p>When a engineering manager approves "we'll use Headless CMS X plus Next.js," the budget often counts <strong>initial sprint weeks</strong> but not:</p>
<table><thead><tr><th style="text-align:left">Hidden cost</th><th style="text-align:left">Typical annual load</th></tr></thead><tbody><tr><td style="text-align:left">Dependency upgrades (CMS major versions)</td><td style="text-align:left">1–2 weeks engineering</td></tr><tr><td style="text-align:left">Front-end framework migrations (Next major)</td><td style="text-align:left">2–4 weeks</td></tr><tr><td style="text-align:left">SEO regression fixes after redesign</td><td style="text-align:left">1 week</td></tr><tr><td style="text-align:left">Author support ("why can't I upload?")</td><td style="text-align:left">Ongoing PM time</td></tr><tr><td style="text-align:left">On-call for API + front deploy pipelines</td><td style="text-align:left">Rotation burden</td></tr><tr><td style="text-align:left">Vendor price step-ups</td><td style="text-align:left">Unpredictable OPEX</td></tr></tbody></table>
<p>A <strong>React publishing platform</strong> collapses several line items into one maintained surface — not because magic, because <strong>integrated vendors internalize integration cost</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="aa2-when-assembly-is-rational">AA.2 When assembly is rational<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#aa2-when-assembly-is-rational" class="hash-link" aria-label="Direct link to AA.2 When assembly is rational" title="Direct link to AA.2 When assembly is rational" translate="no">​</a></h3>
<p>Assembly wins when:</p>
<ul>
<li class="">Content model is the product (marketplace, PIM, complex relations)</li>
<li class="">Multiple brands need different Admins but one API</li>
<li class="">Regulatory requirements mandate specific storage geography per service</li>
</ul>
<p>Assembly loses for <strong>standard publishing</strong> — blog, docs, marketing, changelog, community news.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="aa3-opportunity-cost-narrative">AA.3 Opportunity cost narrative<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#aa3-opportunity-cost-narrative" class="hash-link" aria-label="Direct link to AA.3 Opportunity cost narrative" title="Direct link to AA.3 Opportunity cost narrative" translate="no">​</a></h3>
<p>Every sprint spent wiring Disqus + sitemap + Admin auth is a sprint not spent on core product. ReactPress does not eliminate customization — it <strong>defaults the boring 80%</strong> so engineering spends marginal hours on the differentiating 20% (brand theme motion, custom plugin integrations).</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="aa4-team-skill-alignment">AA.4 Team skill alignment<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#aa4-team-skill-alignment" class="hash-link" aria-label="Direct link to AA.4 Team skill alignment" title="Direct link to AA.4 Team skill alignment" translate="no">​</a></h3>
<p>Hiring "WordPress developer" vs "React developer" vs "Strapi administrator" creates three salary bands and three interview rubrics. <strong>ReactPress aligns hiring with React job descriptions</strong> you already use — Admin and theme are React/Next; plugins are NestJS TypeScript familiar to full-stack JS hires.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-ab-security-deep-dive--comments-and-uploads">Appendix AB: Security deep dive — comments and uploads<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-ab-security-deep-dive--comments-and-uploads" class="hash-link" aria-label="Direct link to Appendix AB: Security deep dive — comments and uploads" title="Direct link to Appendix AB: Security deep dive — comments and uploads" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ab1-comment-threat-model">AB.1 Comment threat model<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ab1-comment-threat-model" class="hash-link" aria-label="Direct link to AB.1 Comment threat model" title="Direct link to AB.1 Comment threat model" translate="no">​</a></h3>
<p>Public comment endpoints attract:</p>
<ul>
<li class="">Spam bots</li>
<li class="">Stored XSS payloads in Markdown</li>
<li class="">SSRF via link previews (if enabled elsewhere)</li>
</ul>
<p>ReactPress mitigations (3.7+):</p>
<ul>
<li class="">JWT required for creation — raises bot cost</li>
<li class="">HTML sanitization after Markdown render</li>
<li class="">CSP headers via Helmet — limits blast radius</li>
</ul>
<p>Themes must <strong>not</strong> disable sanitization or bypass API to render raw author HTML from untrusted commenters.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ab2-upload-threat-model">AB.2 Upload threat model<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ab2-upload-threat-model" class="hash-link" aria-label="Direct link to AB.2 Upload threat model" title="Direct link to AB.2 Upload threat model" translate="no">​</a></h3>
<p>Media uploads risk:</p>
<ul>
<li class="">Malware masquerading as images</li>
<li class="">Oversized files filling disk</li>
<li class="">Path traversal filenames</li>
</ul>
<p>Server file module should validate MIME, size caps, and storage paths — configure OSS credentials with least privilege (Aliyun OSS client modules in server).</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ab3-api-key-theft-scenarios">AB.3 API key theft scenarios<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ab3-api-key-theft-scenarios" class="hash-link" aria-label="Direct link to AB.3 API key theft scenarios" title="Direct link to AB.3 API key theft scenarios" translate="no">​</a></h3>
<p>Leaked <code>X-API-Key</code> equals admin access. Mitigations:</p>
<ul>
<li class="">Short-lived keys for CI</li>
<li class="">Separate read-only keys (roadmap enhancement — verify current server capabilities in docs)</li>
<li class="">IP allow lists at reverse proxy for <code>/api</code> mutation routes</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ab4-supply-chain">AB.4 Supply chain<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ab4-supply-chain" class="hash-link" aria-label="Direct link to AB.4 Supply chain" title="Direct link to AB.4 Supply chain" translate="no">​</a></h3>
<p><code>npm i -g @fecommunity/reactpress</code> — pin versions in production AMIs; verify checksums; monitor <a href="https://github.com/fecommunity/reactpress/security" target="_blank" rel="noopener noreferrer" class="">GitHub security advisories</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-ac-narrative--why-we-named-it-reactpress">Appendix AC: Narrative — why we named it ReactPress<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-ac-narrative--why-we-named-it-reactpress" class="hash-link" aria-label="Direct link to Appendix AC: Narrative — why we named it ReactPress" title="Direct link to Appendix AC: Narrative — why we named it ReactPress" translate="no">​</a></h2>
<p><strong>React</strong> — the UI stack our users already chose.</p>
<p><strong>Press</strong> — shorthand for publishing, echoing WordPress, printing press, and "press publish."</p>
<p>We avoided "ReactCMS" as a product name because acronyms blur in search — <strong>React CMS</strong> is the SEO category; <strong>ReactPress</strong> is the product. Similar to how "WordPress" is a name, not the literal phrase "PHP CMS."</p>
<p>Codenames <strong>Platform</strong> (3.0) and <strong>Extend</strong> (4.0) mark internal phase transitions — public releases stay semver.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-ad-copy-paste-social-snippets">Appendix AD: Copy-paste social snippets<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-ad-copy-paste-social-snippets" class="hash-link" aria-label="Direct link to Appendix AD: Copy-paste social snippets" title="Direct link to Appendix AD: Copy-paste social snippets" translate="no">​</a></h2>
<p>Share this launch in your networks — adapt freely:</p>
<p><strong>Twitter/X (280 chars):</strong><br>
<!-- -->React has no WordPress — until now. ReactPress 4.0: NestJS API + Admin + Next.js theme + plugins + desktop. One CLI. MIT. <code>npm i -g @fecommunity/reactpress</code> → <code>reactpress init</code> #ReactCMS #NextJS</p>
<p><strong>LinkedIn (short):</strong><br>
<!-- -->We built ReactPress 4.0 because every React team was assembling Strapi + Next + SEO + deploy from scratch. One CLI ships the full open-source publishing platform — WordPress workflow, modern SSR front end.</p>
<p><strong>Dev.to tags:</strong> <code>react</code>, <code>nextjs</code>, <code>cms</code>, <code>opensource</code>, <code>wordpress</code></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-ae-maintainers-note--what-we-will-not-build">Appendix AE: Maintainer's note — what we will not build<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-ae-maintainers-note--what-we-will-not-build" class="hash-link" aria-label="Direct link to Appendix AE: Maintainer's note — what we will not build" title="Direct link to Appendix AE: Maintainer's note — what we will not build" translate="no">​</a></h2>
<p>Clarity requires saying <strong>no</strong>:</p>
<ul>
<li class=""><strong>Not a ecommerce platform</strong> — use WooCommerce or dedicated commerce stacks; plugins may integrate carts, core will not become Shopify.</li>
<li class=""><strong>Not a drag-and-drop page builder for marketers</strong> — themes are code; Figma-to-production stays in front-end repos.</li>
<li class=""><strong>Not a hosted-only SaaS lock-in</strong> — self-host first; partners may host, data must remain portable.</li>
<li class=""><strong>Not a PHP compatibility layer</strong> — migration guides yes, runtime PHP no.</li>
<li class=""><strong>Not a microservices explosion</strong> — monorepo multi-process stays understandable on one VPS.</li>
</ul>
<p>Saying no keeps ReactPress a <strong>publishing platform</strong> instead of an everything bagel that collapses under its own surface area.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-af-one-page-cheat-sheet">Appendix AF: One-page cheat sheet<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-af-one-page-cheat-sheet" class="hash-link" aria-label="Direct link to Appendix AF: One-page cheat sheet" title="Direct link to Appendix AF: One-page cheat sheet" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain"># Install</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># New site</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir site &amp;&amp; cd site &amp;&amp; reactpress init</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># URLs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Site:  http://localhost:3001</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Admin: http://localhost:3001/admin/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># API:   http://localhost:3002/api/health</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Diagnose</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress doctor</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Plugins (Admin UI or CLI)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress plugin install seo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Theme</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress theme add @fecommunity/reactpress-theme-starter@1.0.0-beta.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Headless fetch</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -H "X-API-Key: KEY" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  "http://localhost:3002/api/article/headless/list?status=publish&amp;page=1&amp;pageSize=10"</span><br></div></code></pre></div></div>
<table><thead><tr><th style="text-align:left">Layer</th><th style="text-align:left">Tech</th><th style="text-align:left">Swappable?</th></tr></thead><tbody><tr><td style="text-align:left">CLI</td><td style="text-align:left">Node</td><td style="text-align:left">—</td></tr><tr><td style="text-align:left">API</td><td style="text-align:left">NestJS</td><td style="text-align:left">Config only</td></tr><tr><td style="text-align:left">Admin</td><td style="text-align:left">Vite React</td><td style="text-align:left">No (use as-is)</td></tr><tr><td style="text-align:left">Theme</td><td style="text-align:left">Next.js</td><td style="text-align:left"><strong>Yes</strong></td></tr><tr><td style="text-align:left">Plugin</td><td style="text-align:left">Hooks</td><td style="text-align:left"><strong>Yes</strong></td></tr><tr><td style="text-align:left">DB</td><td style="text-align:left">SQLite/MySQL</td><td style="text-align:left">Config</td></tr></tbody></table>
<p><strong>Keywords:</strong> React CMS · Next.js CMS · WordPress alternative · React publishing platform · Open source CMS</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="appendix-ag-reader-feedback-and-corrections">Appendix AG: Reader feedback and corrections<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#appendix-ag-reader-feedback-and-corrections" class="hash-link" aria-label="Direct link to Appendix AG: Reader feedback and corrections" title="Direct link to Appendix AG: Reader feedback and corrections" translate="no">​</a></h2>
<p>This document lives in the ReactPress repository at <code>docs/blog/why-react-still-doesnt-have-wordpress-reactpress-4.md</code>. If you find factual errors, outdated CLI flags, or broken links:</p>
<ol>
<li class="">Open a GitHub Issue with section reference</li>
<li class="">Or submit a PR editing the markdown directly</li>
<li class="">Or email <a href="mailto:admin@gaoredu.com" target="_blank" rel="noopener noreferrer" class="">admin@gaoredu.com</a></li>
</ol>
<p>We treat this article as <strong>living documentation</strong> — semver releases update CLI commands, port defaults, and roadmap checkboxes. The narrative thesis ("React lacks an integrated publishing platform; ReactPress provides one") should remain stable across minor doc edits.</p>
<p>Thank you for reading this far. Long-form exists because <strong>publishing platform decisions are multi-year</strong> — they deserve more than a landing page bullet list.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ag1-suggested-reading-paths">AG.1 Suggested reading paths<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ag1-suggested-reading-paths" class="hash-link" aria-label="Direct link to AG.1 Suggested reading paths" title="Direct link to AG.1 Suggested reading paths" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Reader</th><th style="text-align:left">Start here</th><th style="text-align:left">Then read</th></tr></thead><tbody><tr><td style="text-align:left"><strong>CTO evaluating stacks</strong></td><td style="text-align:left">Executive summary, §1, §3, Appendix A</td><td style="text-align:left">§16, Appendix R</td></tr><tr><td style="text-align:left"><strong>Front-end lead</strong></td><td style="text-align:left">§5, §8, Appendix S</td><td style="text-align:left">Theme development docs</td></tr><tr><td style="text-align:left"><strong>Content ops</strong></td><td style="text-align:left">§7, §12</td><td style="text-align:left">User guide in docs</td></tr><tr><td style="text-align:left"><strong>DevOps</strong></td><td style="text-align:left">§14, Appendix U</td><td style="text-align:left">Docker deployment doc</td></tr><tr><td style="text-align:left"><strong>WordPress agency</strong></td><td style="text-align:left">§2, §15, Appendix O</td><td style="text-align:left">ReactPress vs WordPress doc</td></tr><tr><td style="text-align:left"><strong>Plugin author</strong></td><td style="text-align:left">§9, Appendix T</td><td style="text-align:left">plugins/README.md</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ag2-print--pdf-export">AG.2 Print / PDF export<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ag2-print--pdf-export" class="hash-link" aria-label="Direct link to AG.2 Print / PDF export" title="Direct link to AG.2 Print / PDF export" translate="no">​</a></h3>
<p>Docusaurus renders this post at <code>/blog/why-react-still-doesnt-have-wordpress-reactpress-4</code>. Use browser Print → Save as PDF for offline reading. Diagrams are Mermaid — ensure print CSS expands diagrams or screenshot architecture sections separately.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ag3-citation">AG.3 Citation<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ag3-citation" class="hash-link" aria-label="Direct link to AG.3 Citation" title="Direct link to AG.3 Citation" translate="no">​</a></h3>
<p>If citing in academic or industry reports:</p>
<blockquote>
<p>ReactPress Contributors. (2026). <em>Why React Still Doesn't Have Its WordPress — And Why We Built ReactPress 4.0</em>. <a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4" target="_blank" rel="noopener noreferrer" class="">https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4</a></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ag4-document-statistics">AG.4 Document statistics<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ag4-document-statistics" class="hash-link" aria-label="Direct link to AG.4 Document statistics" title="Direct link to AG.4 Document statistics" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Metric</th><th style="text-align:left">Value</th></tr></thead><tbody><tr><td style="text-align:left">Language</td><td style="text-align:left">English (default)</td></tr><tr><td style="text-align:left">Target length</td><td style="text-align:left">~100,000 characters</td></tr><tr><td style="text-align:left">Main sections</td><td style="text-align:left">20</td></tr><tr><td style="text-align:left">Appendices</td><td style="text-align:left">A–AG (33 appendix blocks)</td></tr><tr><td style="text-align:left">Architecture diagrams</td><td style="text-align:left">2 Mermaid flowcharts</td></tr><tr><td style="text-align:left">Screenshots / GIFs</td><td style="text-align:left">10 embedded images</td></tr><tr><td style="text-align:left">Primary SEO keywords</td><td style="text-align:left">5 (see frontmatter)</td></tr><tr><td style="text-align:left">Code samples</td><td style="text-align:left">CLI, curl, TypeScript theme + plugin</td></tr><tr><td style="text-align:left">Last updated</td><td style="text-align:left">2026-07-12</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ag5-image-asset-index">AG.5 Image asset index<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ag5-image-asset-index" class="hash-link" aria-label="Direct link to AG.5 Image asset index" title="Direct link to AG.5 Image asset index" translate="no">​</a></h3>
<p>All images served from <code>/img/blog/</code> (copied from repository <code>public/</code> for docs static hosting):</p>
<table><thead><tr><th style="text-align:left">File</th><th style="text-align:left">Description</th></tr></thead><tbody><tr><td style="text-align:left"><code>poster.png</code></td><td style="text-align:left">Hero banner — The Modern Web Creation Platform</td></tr><tr><td style="text-align:left"><code>usage.gif</code></td><td style="text-align:left">CLI init ~60 second demo</td></tr><tr><td style="text-align:left"><code>demo.gif</code></td><td style="text-align:left">Official theme visitor features</td></tr><tr><td style="text-align:left"><code>lighthouse.png</code></td><td style="text-align:left">Performance and SEO scores</td></tr><tr><td style="text-align:left"><code>desktop.gif</code></td><td style="text-align:left">Electron offline writing</td></tr><tr><td style="text-align:left"><code>post.png</code></td><td style="text-align:left">Admin Markdown editor</td></tr><tr><td style="text-align:left"><code>midia.png</code></td><td style="text-align:left">Media library</td></tr><tr><td style="text-align:left"><code>plugins.png</code></td><td style="text-align:left">Plugin management UI</td></tr><tr><td style="text-align:left"><code>theme-custom.png</code></td><td style="text-align:left">Appearance / themes</td></tr><tr><td style="text-align:left"><code>settings.png</code></td><td style="text-align:left">Site settings panel</td></tr></tbody></table>
<p>When republishing off-site, prefer linking to <code>https://reactpress.cc/img/blog/...</code> or GitHub <code>raw.githubusercontent.com</code> URLs for CDN stability.</p>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="ag6-translation-note">AG.6 Translation note<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#ag6-translation-note" class="hash-link" aria-label="Direct link to AG.6 Translation note" title="Direct link to AG.6 Translation note" translate="no">​</a></h3>
<p>This article is authored in <strong>English</strong> as the default locale per project documentation rules (<code>english-docs.mdc</code>). A Chinese summary may appear in community channels or future <code>docs/i18n/zh/docusaurus-plugin-content-blog/</code> translations — technical terms (React CMS, Next.js CMS, WordPress alternative) should remain consistent for search continuity across locales.</p>
<p>If you translate: keep code blocks and CLI commands unchanged; localize prose; adapt cultural analogies (e.g. Chinese teams may compare to legacy PHP CMS — clarify ReactPress is Node/React stack).</p>
<p><strong>End of appendices.</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="20-conclusion">20. Conclusion<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#20-conclusion" class="hash-link" aria-label="Direct link to 20. Conclusion" title="Direct link to 20. Conclusion" translate="no">​</a></h2>
<p>React changed how we build interfaces. It did not equally change how we <strong>publish</strong> — not because developers lack skill, but because the industry shipped <strong>parts</strong> while WordPress shipped a <strong>platform</strong>.</p>
<p>WordPress taught us that publishing winners combine:</p>
<ul>
<li class=""><strong>One front door</strong> — low decision fatigue</li>
<li class=""><strong>Clear boundaries</strong> — core, theme, plugin</li>
<li class=""><strong>Author-first workflows</strong> — writing is the product</li>
<li class=""><strong>Extension economies</strong> — markets around stable contracts</li>
<li class=""><strong>Portable data</strong> — self-hosting stays credible</li>
</ul>
<p>ReactPress 4.0 translates those lessons into the React era:</p>
<table><thead><tr><th style="text-align:left">Capability</th><th style="text-align:left">What you get</th></tr></thead><tbody><tr><td style="text-align:left"><strong>CLI</strong></td><td style="text-align:left"><code>reactpress init</code> in ~60 seconds</td></tr><tr><td style="text-align:left"><strong>Admin</strong></td><td style="text-align:left">WordPress-familiar content operations</td></tr><tr><td style="text-align:left"><strong>API</strong></td><td style="text-align:left">Headless REST + Swagger + API keys</td></tr><tr><td style="text-align:left"><strong>Theme</strong></td><td style="text-align:left">Swappable Next.js SSR with SEO defaults</td></tr><tr><td style="text-align:left"><strong>Plugins</strong></td><td style="text-align:left">Hook + <code>plugin.json</code> extensibility</td></tr><tr><td style="text-align:left"><strong>Desktop</strong></td><td style="text-align:left">Offline SQLite writing, sync when ready</td></tr><tr><td style="text-align:left"><strong>License</strong></td><td style="text-align:left">MIT open source</td></tr></tbody></table>
<p>We are not claiming 60,000 plugins tomorrow. We are claiming the <strong>mechanism and integrated defaults</strong> so React teams stop rebuilding the same five-repo assembly for every blog, docs site, and marketing property.</p>
<p>If you searched for <strong>React CMS</strong>, <strong>Next.js CMS</strong>, <strong>WordPress alternative</strong>, <strong>open source CMS</strong>, or <strong>React publishing platform</strong> — start here:</p>
<div class="language-bash codeBlockContainer_JGC8 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_JA40"><pre tabindex="0" class="prism-code language-bash codeBlock_tiUZ thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_tulI"><div class="token-line" style="color:#393A34"><span class="token plain">npm i -g @fecommunity/reactpress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mkdir my-blog &amp;&amp; cd my-blog</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">reactpress init</span><br></div></code></pre></div></div>
<p>Sixty seconds later, open <a href="http://localhost:3001/admin/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3001/admin/</a> and write post number one.</p>
<p><strong>Build. Manage. Extend.</strong></p>
<p>This concludes the long-form guide. For shorter onboarding, start with <a class="" href="https://reactpress.cc/docs/getting-started/first-site">5-minute first site</a> or <a class="" href="https://reactpress.cc/docs/tutorial-extras/reactpress-4-0">ReactPress 4.0 overview</a>. Return here when you need the full industry context, comparison matrices, and operational appendices that justify choosing a <strong>React publishing platform</strong> over yet another weekend of Headless assembly.</p>
<p><em>Document ID: <code>why-react-still-doesnt-have-wordpress-reactpress-4</code> · Character target: 100,000 · Language: English</em></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="related-links">Related links<a href="https://reactpress.cc/blog/why-react-still-doesnt-have-wordpress-reactpress-4#related-links" class="hash-link" aria-label="Direct link to Related links" title="Direct link to Related links" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/fecommunity/reactpress" target="_blank" rel="noopener noreferrer" class="">GitHub — fecommunity/reactpress</a></li>
<li class=""><a href="https://blog.gaoredu.com/" target="_blank" rel="noopener noreferrer" class="">Live demo — blog.gaoredu.com</a></li>
<li class=""><a href="https://reactpress-theme-starter.vercel.app/" target="_blank" rel="noopener noreferrer" class="">Theme demo — reactpress-theme-starter.vercel.app</a></li>
<li class=""><a href="https://reactpress.cc/" target="_blank" rel="noopener noreferrer" class="">Documentation — reactpress.cc</a></li>
<li class=""><a href="https://reactpress.cc/zh/blog/why-react-still-doesnt-have-wordpress-reactpress-4" target="_blank" rel="noopener noreferrer" class="">中文版 / Chinese version</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/tutorial-extras/reactpress-4-0">ReactPress 4.0 guide</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/reactpress-vs-wordpress">ReactPress vs WordPress</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/architecture-overview">Architecture overview</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/tutorial-extras/desktop-client">Desktop client</a></li>
<li class=""><a class="" href="https://reactpress.cc/blog">Changelog</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/plugin-development">Plugin development</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/theme-development">Theme development</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/developer-guide/headless-api">Headless API guide</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/getting-started/installation">Installation</a></li>
<li class=""><a class="" href="https://reactpress.cc/docs/reference/troubleshooting">Troubleshooting</a></li>
<li class=""><a href="https://www.npmjs.com/package/@fecommunity/reactpress" target="_blank" rel="noopener noreferrer" class="">npm — @fecommunity/reactpress</a></li>
</ul>
<hr>
<p><em>ReactPress is developed by <a href="https://github.com/fecommunity" target="_blank" rel="noopener noreferrer" class="">fecommunity</a> and released under the MIT License. Keywords: React CMS, Next.js CMS, WordPress alternative, React publishing platform, Open source CMS. Thank you for reading — now go run <code>reactpress init</code>.</em></p>
<blockquote>
<p><strong>Length note:</strong> This article intentionally exceeds 100,000 characters so search engines and LLM crawlers receive full context in one canonical URL — not a teaser linking to twelve part-two posts. Estimated body length: <strong>~100k characters</strong> · <strong>~13,000 English words</strong> · 10 embedded images · 2 Mermaid diagrams · 33 appendices. <strong>Complete long-form edition.</strong> Published July 2026.</p>
</blockquote>]]></content>
        <author>
            <name>reactpress</name>
            <uri>https://github.com/fecommunity/reactpress</uri>
        </author>
        <category label="Article" term="Article"/>
        <category label="ReactPress" term="ReactPress"/>
        <category label="React CMS" term="React CMS"/>
        <category label="WordPress alternative" term="WordPress alternative"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Changelog]]></title>
        <id>https://reactpress.cc/blog/changelog</id>
        <link href="https://reactpress.cc/blog/changelog"/>
        <updated>2026-06-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[4.0.0 (2026-08-09)]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="400-2026-08-09"><a href="https://github.com/fecommunity/reactpress/compare/v4.0.0-beta.18...v4.0.0" target="_blank" rel="noopener noreferrer" class="">4.0.0</a> (2026-08-09)<a href="https://reactpress.cc/blog/changelog#400-2026-08-09" class="hash-link" aria-label="Direct link to 400-2026-08-09" title="Direct link to 400-2026-08-09" translate="no">​</a></h2>
<p><strong>ReactPress 4.0.0 stable</strong> — npm <code>@latest</code> (<a href="https://github.com/fecommunity/reactpress/issues/88" target="_blank" rel="noopener noreferrer" class="">#88</a>). Install: <code>npm i -g @fecommunity/reactpress</code>.</p>
<ul>
<li class=""><strong>Release</strong>: promotes 4.x from <code>@beta</code> to <code>@latest</code></li>
<li class=""><strong>Docs / README / Admin</strong>: default install path is stable 4.0.0</li>
<li class=""><strong>Publish CLI</strong>: <code>promote to stable</code> version mode; <code>resolveNpmTag</code> maps <code>4.0.0</code> → <code>latest</code></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="400-beta18-2026-07-12"><a href="https://github.com/fecommunity/reactpress/compare/v4.0.0-beta.0...v4.0.0-beta.18" target="_blank" rel="noopener noreferrer" class="">4.0.0-beta.18</a> (2026-07-12)<a href="https://reactpress.cc/blog/changelog#400-beta18-2026-07-12" class="hash-link" aria-label="Direct link to 400-beta18-2026-07-12" title="Direct link to 400-beta18-2026-07-12" translate="no">​</a></h2>
<p><strong>ReactPress 4.0 beta.18</strong> — npm <code>@beta</code> at the time. Install: <code>npm i -g @fecommunity/reactpress@beta</code>.</p>
<ul>
<li class=""><strong>CLI</strong>: zero-dependency bundled runtime, theme install/proxy improvements, <code>doctor</code> / logging polish</li>
<li class=""><strong>Desktop</strong>: cross-platform installer workflow; uploads to GitHub Releases on publish</li>
<li class=""><strong>Docs</strong>: Algolia DocSearch, changelog sidebar, hero version tags; README and demo media refresh</li>
<li class=""><strong>Assets</strong>: star history charts under <code>public/star-history/</code></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="400-beta0-2026-06-27"><a href="https://github.com/fecommunity/reactpress/compare/v3.7.0...v4.0.0-beta.0" target="_blank" rel="noopener noreferrer" class="">4.0.0-beta.0</a> (2026-06-27)<a href="https://reactpress.cc/blog/changelog#400-beta0-2026-06-27" class="hash-link" aria-label="Direct link to 400-beta0-2026-06-27" title="Direct link to 400-beta0-2026-06-27" translate="no">​</a></h2>
<p><strong>ReactPress 4.0 Extend (beta)</strong> — plugins, desktop client, theme catalog. Install: <code>npm i -g @fecommunity/reactpress@beta</code>.</p>
<ul>
<li class=""><strong>Plugins</strong> (<a href="https://github.com/fecommunity/reactpress/issues/69" target="_blank" rel="noopener noreferrer" class="">#69</a>): Hook system, <code>plugin.json</code> manifest, Admin slots; built-in <code>hello-world</code>, <code>seo</code>, <code>image-optimizer</code></li>
<li class=""><strong>Desktop</strong> (<a href="https://github.com/fecommunity/reactpress/issues/70" target="_blank" rel="noopener noreferrer" class="">#70</a>): Electron + SQLite local mode; remote API + sync to server</li>
<li class=""><strong>Themes</strong> (<a href="https://github.com/fecommunity/reactpress/issues/71" target="_blank" rel="noopener noreferrer" class="">#71</a>): npm catalog (<code>theme-starter</code>), <code>theme add</code>/<code>list</code>, preview pool; hello-world docs refresh</li>
<li class=""><strong>Migration</strong>: <a class="" href="https://reactpress.cc/docs/tutorial-extras/migration-3-to-4">3.x → 4.0 guide</a></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="370-2026-06-23"><a href="https://github.com/fecommunity/reactpress/compare/v3.6.0...v3.7.0" target="_blank" rel="noopener noreferrer" class="">3.7.0</a> (2026-06-23)<a href="https://reactpress.cc/blog/changelog#370-2026-06-23" class="hash-link" aria-label="Direct link to 370-2026-06-23" title="Direct link to 370-2026-06-23" translate="no">​</a></h2>
<p><strong>Security</strong> — SQL injection and stored XSS fixes.</p>
<ul>
<li class=""><strong>SQL injection</strong>: whitelist filter column names in public list API <code>findAll()</code> handlers</li>
<li class=""><strong>Stored XSS</strong>: sanitize comment HTML after markdown parsing; require JWT for <code>POST /comment</code>; CSP headers via Helmet</li>
<li class="">Credit: reported by <a href="https://github.com/lsr365400" target="_blank" rel="noopener noreferrer" class="">lsr365400</a></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="360-2026-06-14"><a href="https://github.com/fecommunity/reactpress/compare/v3.5.0...v3.6.0" target="_blank" rel="noopener noreferrer" class="">3.6.0</a> (2026-06-14)<a href="https://reactpress.cc/blog/changelog#360-2026-06-14" class="hash-link" aria-label="Direct link to 360-2026-06-14" title="Direct link to 360-2026-06-14" translate="no">​</a></h2>
<p><strong>Docs CI/CD &amp; deployment</strong> — automated docs pipeline and Vercel migration.</p>
<ul>
<li class=""><strong>Docs deployment</strong>: GitHub Actions CI/CD for documentation site</li>
<li class=""><strong>Vercel</strong>: config moved to repo root; links updated to new deployment URL</li>
<li class=""><strong>CI</strong>: deprecated deploy workflow removed; MySQL image via AWS ECR mirror for faster GHA builds</li>
<li class=""><strong>Config</strong>: improved <code>DOCS_SITE_URL</code> handling in deployment</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="350-2026-06-14"><a href="https://github.com/fecommunity/reactpress/compare/v3.4.0...v3.5.0" target="_blank" rel="noopener noreferrer" class="">3.5.0</a> (2026-06-14)<a href="https://reactpress.cc/blog/changelog#350-2026-06-14" class="hash-link" aria-label="Direct link to 350-2026-06-14" title="Direct link to 350-2026-06-14" translate="no">​</a></h2>
<p><strong>Theme catalog</strong> — npm-based theme discovery and management.</p>
<ul>
<li class="">Added <code>theme.catalog.schema.json</code> and <code>themes/package.json</code></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="340-2026-06-12"><a href="https://github.com/fecommunity/reactpress/compare/v3.3.0...v3.4.0" target="_blank" rel="noopener noreferrer" class="">3.4.0</a> (2026-06-12)<a href="https://reactpress.cc/blog/changelog#340-2026-06-12" class="hash-link" aria-label="Direct link to 340-2026-06-12" title="Direct link to 340-2026-06-12" translate="no">​</a></h2>
<p><strong>Community</strong> — clearer issue reporting.</p>
<ul>
<li class="">Updated bug report, feature request, and config issue templates</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="330-2026-06-07"><a href="https://github.com/fecommunity/reactpress/compare/v3.2.0...v3.3.0" target="_blank" rel="noopener noreferrer" class="">3.3.0</a> (2026-06-07)<a href="https://reactpress.cc/blog/changelog#330-2026-06-07" class="hash-link" aria-label="Direct link to 330-2026-06-07" title="Direct link to 330-2026-06-07" translate="no">​</a></h2>
<p><strong>Community &amp; security</strong> — governance and vulnerability reporting.</p>
<ul>
<li class="">Added <code>CODE_OF_CONDUCT.md</code> and <code>SECURITY.md</code></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="320-2026-06-07"><a href="https://github.com/fecommunity/reactpress/compare/v3.1.1...v3.2.0" target="_blank" rel="noopener noreferrer" class="">3.2.0</a> (2026-06-07)<a href="https://reactpress.cc/blog/changelog#320-2026-06-07" class="hash-link" aria-label="Direct link to 320-2026-06-07" title="Direct link to 320-2026-06-07" translate="no">​</a></h2>
<p><strong>Theme development</strong> — Next.js tooling for theme authors.</p>
<ul>
<li class="">Next.js configuration and node helpers for theme development workflow</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="311-2026-06-07"><a href="https://github.com/fecommunity/reactpress/compare/v3.1.0...v3.1.1" target="_blank" rel="noopener noreferrer" class="">3.1.1</a> (2026-06-07)<a href="https://reactpress.cc/blog/changelog#311-2026-06-07" class="hash-link" aria-label="Direct link to 311-2026-06-07" title="Direct link to 311-2026-06-07" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="bug-fixes">Bug Fixes<a href="https://reactpress.cc/blog/changelog#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h3>
<ul>
<li class="">Corrected <code>theme.manifest.schema.json</code> <code>$id</code> URL for accuracy</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="310-2026-06-07"><a href="https://github.com/fecommunity/reactpress/compare/v3.0.0...v3.1.0" target="_blank" rel="noopener noreferrer" class="">3.1.0</a> (2026-06-07)<a href="https://reactpress.cc/blog/changelog#310-2026-06-07" class="hash-link" aria-label="Direct link to 310-2026-06-07" title="Direct link to 310-2026-06-07" translate="no">​</a></h2>
<p><strong>Toolkit theme refactor</strong> — modular exports, first-class theme development.</p>
<ul>
<li class=""><strong>Toolkit 3.1</strong>: split into <code>theme</code> / <code>ui</code> / <code>app</code> / <code>plugin</code> submodules; theme manifest, appearance config (Formily), SSR bootstrap, site settings &amp; preview</li>
<li class=""><strong>CLI 3.0.3</strong>: <code>reactpress nginx</code> reverse proxy; Docker <code>mysqldump</code> in <code>db backup</code>; build target selection &amp; step logging; improved UX</li>
<li class=""><strong>Brand assets</strong>: centralized <code>public/brand/</code> + <code>pnpm export:brand</code> to sync logos/favicons across server, web, cli, and themes</li>
<li class=""><strong>Docs</strong>: official theme section, Lighthouse scores; theme manifest schema URL updated</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="300-2026-05-17"><a href="https://github.com/fecommunity/reactpress/compare/v2.0.2...v3.0.0" target="_blank" rel="noopener noreferrer" class="">3.0.0</a> (2026-05-17)<a href="https://reactpress.cc/blog/changelog#300-2026-05-17" class="hash-link" aria-label="Direct link to 300-2026-05-17" title="Direct link to 300-2026-05-17" translate="no">​</a></h2>
<p><strong>ReactPress 3.0 Platform</strong> — one package, one command, your CMS in about a minute.</p>
<ul>
<li class=""><strong>Zero config</strong>: <code>reactpress init</code> + <code>reactpress dev</code>, embedded Docker MySQL</li>
<li class=""><strong>Single entry</strong>: <code>@fecommunity/reactpress@3</code></li>
<li class=""><strong>DX</strong>: interactive menu, <code>doctor</code>, <code>status</code>, Headless (API Key, Webhook, health)</li>
<li class=""><strong>Breaking</strong>: <code>@fecommunity/reactpress-server</code> deprecated — <a class="" href="https://reactpress.cc/docs/tutorial-extras/migration-2-to-3">migration guide</a></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="201-2025-09-26"><a href="https://github.com/fecommunity/reactpress/compare/v2.0.0...v2.0.1" target="_blank" rel="noopener noreferrer" class="">2.0.1</a> (2025-09-26)<a href="https://reactpress.cc/blog/changelog#201-2025-09-26" class="hash-link" aria-label="Direct link to 201-2025-09-26" title="Direct link to 201-2025-09-26" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="bug-fixes-1">Bug Fixes<a href="https://reactpress.cc/blog/changelog#bug-fixes-1" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h3>
<ul>
<li class="">correct HttpClient filename case sensitivity (<a href="https://github.com/fecommunity/reactpress/commit/7dd892a8d5b05a3ab24eaf73577848eb25b06450" target="_blank" rel="noopener noreferrer" class="">7dd892a</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="features">Features<a href="https://reactpress.cc/blog/changelog#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h3>
<ul>
<li class="">add config for toolkit package (<a href="https://github.com/fecommunity/reactpress/commit/0ed839d4667d671ea06b088c0bac5a2890680445" target="_blank" rel="noopener noreferrer" class="">0ed839d</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="200-2025-09-21"><a href="https://github.com/fecommunity/reactpress/compare/v1.10.0...v2.0.0" target="_blank" rel="noopener noreferrer" class="">2.0.0</a> (2025-09-21)<a href="https://reactpress.cc/blog/changelog#200-2025-09-21" class="hash-link" aria-label="Direct link to 200-2025-09-21" title="Direct link to 200-2025-09-21" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="bug-fixes-2">Bug Fixes<a href="https://reactpress.cc/blog/changelog#bug-fixes-2" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h3>
<ul>
<li class="">server load issue (<a href="https://github.com/fecommunity/reactpress/commit/a6f759b386e32727501b0eea3ea38f5a89dfe700" target="_blank" rel="noopener noreferrer" class="">a6f759b</a>)</li>
<li class="">type defs (<a href="https://github.com/fecommunity/reactpress/commit/d6491d56f2ffdd19d5a47fda7273958cd4243fb3" target="_blank" rel="noopener noreferrer" class="">d6491d5</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="features-1">Features<a href="https://reactpress.cc/blog/changelog#features-1" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h3>
<ul>
<li class="">add hello-world template (<a href="https://github.com/fecommunity/reactpress/commit/7e2c9487ddc6023d7b382250b131fbe828013680" target="_blank" rel="noopener noreferrer" class="">7e2c948</a>)</li>
<li class="">add reactpress toolkit (<a href="https://github.com/fecommunity/reactpress/commit/58f9312644736aceb362e517fad8c3b3a83f275f" target="_blank" rel="noopener noreferrer" class="">58f9312</a>)</li>
<li class="">add swagger v2 ui (<a href="https://github.com/fecommunity/reactpress/commit/ef9fdc166955b4659c81fb559138ce38ef599cfe" target="_blank" rel="noopener noreferrer" class="">ef9fdc1</a>)</li>
<li class="">add twentytwentyfive theme (<a href="https://github.com/fecommunity/reactpress/commit/715281fedcf8072348e4b8b6794891c7e67e1f99" target="_blank" rel="noopener noreferrer" class="">715281f</a>)</li>
<li class="">support npx install server (<a href="https://github.com/fecommunity/reactpress/commit/e7f7b970bb4dd8b845fcd8dde4048678a403557a" target="_blank" rel="noopener noreferrer" class="">e7f7b97</a>)</li>
<li class="">support quick install (<a href="https://github.com/fecommunity/reactpress/commit/96c1d0a7cc1c72b7f6c489ba236ab6eb78472dee" target="_blank" rel="noopener noreferrer" class="">96c1d0a</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="1100-2025-08-03"><a href="https://github.com/fecommunity/reactpress/compare/v1.9.0...v1.10.0" target="_blank" rel="noopener noreferrer" class="">1.10.0</a> (2025-08-03)<a href="https://reactpress.cc/blog/changelog#1100-2025-08-03" class="hash-link" aria-label="Direct link to 1100-2025-08-03" title="Direct link to 1100-2025-08-03" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="features-2">Features<a href="https://reactpress.cc/blog/changelog#features-2" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h3>
<ul>
<li class="">add type defs for config (<a href="https://github.com/fecommunity/reactpress/commit/d8a6fed7bc13f74be0916f80497590c7e737fb86" target="_blank" rel="noopener noreferrer" class="">d8a6fed</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="190-2025-05-21"><a href="https://github.com/fecommunity/reactpress/compare/v1.8.0...v1.9.0" target="_blank" rel="noopener noreferrer" class="">1.9.0</a> (2025-05-21)<a href="https://reactpress.cc/blog/changelog#190-2025-05-21" class="hash-link" aria-label="Direct link to 190-2025-05-21" title="Direct link to 190-2025-05-21" translate="no">​</a></h2>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="180-2025-03-22"><a href="https://github.com/fecommunity/reactpress/compare/v1.7.0...v1.8.0" target="_blank" rel="noopener noreferrer" class="">1.8.0</a> (2025-03-22)<a href="https://reactpress.cc/blog/changelog#180-2025-03-22" class="hash-link" aria-label="Direct link to 180-2025-03-22" title="Direct link to 180-2025-03-22" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="features-3">Features<a href="https://reactpress.cc/blog/changelog#features-3" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h3>
<ul>
<li class="">upgrade next version (<a href="https://github.com/fecommunity/reactpress/commit/64cac4dcb9268a6bbb14fbbfe6995406638f7508" target="_blank" rel="noopener noreferrer" class="">64cac4d</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_aIG4" id="100-2024-09-28"><a href="https://github.com/fecommunity/reactpress/compare/a6b73a189090e0199cc6f803bfb498cdeb7868a5...v1.0.0" target="_blank" rel="noopener noreferrer" class="">1.0.0</a> (2024-09-28)<a href="https://reactpress.cc/blog/changelog#100-2024-09-28" class="hash-link" aria-label="Direct link to 100-2024-09-28" title="Direct link to 100-2024-09-28" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_aIG4" id="features-4">Features<a href="https://reactpress.cc/blog/changelog#features-4" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h3>
<ul>
<li class="">init easy-blog project (<a href="https://github.com/fecommunity/reactpress/commit/a6b73a189090e0199cc6f803bfb498cdeb7868a5" target="_blank" rel="noopener noreferrer" class="">a6b73a1</a>)</li>
</ul>]]></content>
        <author>
            <name>reactpress</name>
            <uri>https://github.com/fecommunity/reactpress</uri>
        </author>
        <category label="ReactPress" term="ReactPress"/>
        <category label="Release" term="Release"/>
    </entry>
</feed>