<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Draftbase</title>
    <description>The latest articles on DEV Community by Draftbase (draftbase).</description>
    <link>https://dev.to/draftbase</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14331%2F104f2d52-5e73-4aec-be76-bf2378926285.png</url>
      <title>DEV Community: Draftbase</title>
      <link>https://dev.to/draftbase</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/draftbase"/>
    <language>en</language>
    <item>
      <title>Headless CMS vs traditional CMS — the honest version, including where WordPress still wins</title>
      <dc:creator>Samer Alsayegh</dc:creator>
      <pubDate>Fri, 14 Aug 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/draftbase/headless-cms-vs-traditional-cms-the-honest-version-including-where-wordpress-still-wins-l9f</link>
      <guid>https://dev.to/draftbase/headless-cms-vs-traditional-cms-the-honest-version-including-where-wordpress-still-wins-l9f</guid>
      <description>&lt;p&gt;Most "headless vs traditional" posts are written by headless vendors, so the scoreboard comes out 10–0. Here's the version with the losses included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where traditional actually wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Turnkey SEO.&lt;/strong&gt; Yoast and Rank Math bolt onto the rendering layer. Meta tags, sitemaps, schema, redirects — a settings panel, no code. A headless CMS ships none of that. You model &lt;code&gt;metaTitle&lt;/code&gt; and &lt;code&gt;metaDescription&lt;/code&gt; on the content type yourself, then render them into &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; from your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The editing loop.&lt;/strong&gt; Change a heading, see it render, publish. No developer in the middle. Headless breaks that by design — content lives in a database, not on a rendered page, so "preview" means asking a frontend to fetch a draft and render it separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup cost.&lt;/strong&gt; Someone builds a frontend. Someone picks SSR vs SSG vs ISR. Someone maintains a deploy pipeline. For a five-page site with one editor, that's more machinery than the job needs.&lt;/p&gt;

&lt;p&gt;WordPress runs 41.9% of all websites (&lt;a href="https://w3techs.com/technologies/details/cm-wordpress" rel="noopener noreferrer"&gt;W3Techs&lt;/a&gt;). That number isn't an accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where headless wins
&lt;/h2&gt;

&lt;p&gt;Control, and channels. URL structure, schema markup, and redirect logic live in your code instead of a plugin's defaults. One entry feeds a website, a mobile app, and an email — each pulling only the fields it needs. Adding a second channel to WordPress usually means duplicating content or bolting on a REST layer the platform wasn't built to expose.&lt;/p&gt;

&lt;p&gt;And "run WordPress headless" mostly inherits the worst of both: full hosting cost, minus the plugin ecosystem that justified WordPress in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The framing nobody uses
&lt;/h2&gt;

&lt;p&gt;It stopped being a two-way choice. The &lt;a href="https://machalliance.org" rel="noopener noreferrer"&gt;MACH Alliance&lt;/a&gt; folded headless into a four-part standard — Microservices, API-first, Cloud-native, Headless.&lt;/p&gt;

&lt;p&gt;So the real question isn't &lt;em&gt;headless or not&lt;/em&gt;. It's &lt;em&gt;how much of MACH do you actually need&lt;/em&gt;. One React site talking to one content API needs the API-first piece and the headless piece. Not microservices. Not a cloud-native commerce engine.&lt;/p&gt;

&lt;p&gt;Full post covers the SEO tradeoff in detail, the React fit, and the cost math:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://draftbase.co/blog/headless-cms-vs-traditional-cms" rel="noopener noreferrer"&gt;Headless CMS vs Traditional CMS: React, SEO, and When Each Wins →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We build &lt;a href="https://draftbase.co/pricing" rel="noopener noreferrer"&gt;Draftbase&lt;/a&gt; for exactly that slice — MDX over REST and GraphQL, links and media resolved inline, drafts readable through the same API. Hobby free, Startup $49/mo.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>react</category>
      <category>webdev</category>
      <category>cms</category>
    </item>
    <item>
      <title>A static Astro site + a headless CMS is three moving parts (and one thing every tutorial skips)</title>
      <dc:creator>Samer Alsayegh</dc:creator>
      <pubDate>Wed, 12 Aug 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/draftbase/a-static-astro-site-a-headless-cms-is-three-moving-parts-and-one-thing-every-tutorial-skips-3hjh</link>
      <guid>https://dev.to/draftbase/a-static-astro-site-a-headless-cms-is-three-moving-parts-and-one-thing-every-tutorial-skips-3hjh</guid>
      <description>&lt;p&gt;Fetch at build. One route per entry. Webhook that rebuilds on publish. That's the whole integration — Astro does the first two natively, so most of the work is wiring.&lt;/p&gt;

&lt;p&gt;The fetch goes in the frontmatter script, which runs on the server at build time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
const res = await fetch('https://api.draftbase.co/delivery/entries?templateId=blogPost', {
  headers: { Authorization: `Bearer ${import.meta.env.DRAFTBASE_KEY}` },
});
const { items } = await res.json();
---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No key in the bundle. No API call from the browser. No loading spinner.&lt;/p&gt;

&lt;p&gt;A page per entry is &lt;code&gt;src/pages/blog/[slug].astro&lt;/code&gt; plus &lt;code&gt;getStaticPaths&lt;/code&gt;, returning &lt;code&gt;params&lt;/code&gt; for the URL and &lt;code&gt;props&lt;/code&gt; so the page doesn't fetch the same entry twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part every tutorial skips
&lt;/h2&gt;

&lt;p&gt;Delivery APIs serve published content only. Your build literally cannot see a draft. So editors have no preview, and you find that out the day after launch.&lt;/p&gt;

&lt;p&gt;Two workable fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On-demand preview route.&lt;/strong&gt; Add an adapter, set &lt;code&gt;export const prerender = false&lt;/code&gt; on one route, read drafts from the management API with a server-side token. The rest of the site stays static.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview deploy.&lt;/strong&gt; A branch that pulls drafts too. Simpler to reason about, costs an extra build.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First one if editors preview constantly. Second one if it's occasional. Either way the management token stays server-side — it can write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four things that break in production
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Silent truncation.&lt;/strong&gt; Delivery APIs cap page size. Nobody follows the cursor. Site looks fine at 40 entries, drops posts at 101.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stale pages after a delete.&lt;/strong&gt; Webhook fires on publish only, so a removed post keeps its page until some unrelated deploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images served from the CMS origin.&lt;/strong&gt; Undoes the whole CDN benefit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A broken build takes the site down.&lt;/strong&gt; Confirm your host keeps the last good deploy live.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full guide has the code for each step, the MDX rendering choice (compile at build vs. client island), and Astro-vs-Next.js for CMS-backed sites:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://draftbase.co/frameworks/how-to/astro-headless-cms" rel="noopener noreferrer"&gt;How to Build a Static Astro Site with a Headless CMS →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Samples use &lt;a href="https://draftbase.co/pricing" rel="noopener noreferrer"&gt;Draftbase&lt;/a&gt; — our headless CMS. Rich text is plain MDX, which Astro renders natively, so there's no converter to maintain. Hobby free, Startup $49/mo.&lt;/p&gt;

</description>
      <category>astro</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Jamstack didn't die. It won so hard nobody says the word anymore.</title>
      <dc:creator>Samer Alsayegh</dc:creator>
      <pubDate>Mon, 10 Aug 2026 14:12:18 +0000</pubDate>
      <link>https://dev.to/draftbase/jamstack-didnt-die-it-won-so-hard-nobody-says-the-word-anymore-2mjo</link>
      <guid>https://dev.to/draftbase/jamstack-didnt-die-it-won-so-hard-nobody-says-the-word-anymore-2mjo</guid>
      <description>&lt;p&gt;Netlify pulled "Jamstack" off its own homepage in October 2023. The community Discord closed. The State of Jamstack survey, running since 2020, ended.&lt;/p&gt;

&lt;p&gt;Easy read: the architecture failed.&lt;/p&gt;

&lt;p&gt;Wrong read. Pre-rendering, API-first content, edge delivery, decoupled front ends — those all ship as defaults now in Next.js, Astro, Nuxt, and SvelteKit. Nobody needs a name for the normal thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that actually changed
&lt;/h2&gt;

&lt;p&gt;The original Jamstack answer to dynamic content was "fetch it in the browser after load." That still works for a view counter. It ages badly everywhere else — client fetches hurt LCP, and crawlers see an empty slot.&lt;/p&gt;

&lt;p&gt;So the current shape is three tiers, not two:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Runs at&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pre-rendered&lt;/td&gt;
&lt;td&gt;Build time&lt;/td&gt;
&lt;td&gt;Posts, docs, marketing pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-demand render&lt;/td&gt;
&lt;td&gt;Request time&lt;/td&gt;
&lt;td&gt;Search results, per-user pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client fetch&lt;/td&gt;
&lt;td&gt;After load&lt;/td&gt;
&lt;td&gt;Counters, badges, live widgets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Put each piece of content in the cheapest tier that meets its freshness need. That one rule replaces most 2019-era Jamstack advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means when you pick tools
&lt;/h2&gt;

&lt;p&gt;Stop filtering on the label. Judge the traits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it pre-render?&lt;/li&gt;
&lt;li&gt;Does it serve from an edge?&lt;/li&gt;
&lt;li&gt;Does content arrive over an API?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same test applies to your CMS, and it rules out more of them than you'd expect. A build step can't call a browser-only SDK. Three things to check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A plain HTTP API with a server-side key&lt;/li&gt;
&lt;li&gt;Webhooks on publish, so builds trigger themselves&lt;/li&gt;
&lt;li&gt;A portable content format, not a vendor-specific tree&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last one is the expensive one to get wrong. A proprietary rich-text tree means writing a converter, then rewriting it when the front end changes.&lt;/p&gt;

&lt;p&gt;The full write-up covers how a page moves through the whole chain, why Netlify moved to "composable," and the arithmetic for deciding if static fits at all:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://draftbase.co/frameworks/guide/static-site-architecture-jamstack" rel="noopener noreferrer"&gt;Static Site Architecture and the Jamstack, Explained →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We build &lt;a href="https://draftbase.co/pricing" rel="noopener noreferrer"&gt;Draftbase&lt;/a&gt;, a headless CMS that stores rich text as plain MDX and serves it over cached REST and GraphQL. Hobby is free, and easy to start with our templates.&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>cms</category>
    </item>
  </channel>
</rss>
