<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><language>en</language><title>Blog posts by Hanskumar Tripathi</title> <link>https://world.optimizely.com/blogs/hanskumar-tripathi/</link><description></description><ttl>60</ttl><generator>Optimizely World</generator><item> <title>You’re not headless. You’re hybrid — and that’s the CMS 12 default.</title>            <link>https://world.optimizely.com/blogs/hanskumar-tripathi/dates/2026/8/youre-not-headless.-youre-hybrid--and-thats-the-cms-12-default</link>            <description>&lt;p&gt;&lt;em&gt;For CMS 12 / Commerce teams with a React (or similar) storefront who keep hearing &amp;ldquo;just go headless&amp;rdquo; or &amp;ldquo;just move to Graph.&amp;rdquo; This is &lt;strong&gt;Part 1&lt;/strong&gt; of &lt;strong&gt;Find &amp;rarr; Graph: the hybrid storefront&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Optimizely CMS 12 sites that look &amp;ldquo;headless&amp;rdquo; in the browser are usually hybrid.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Editors still work in the CMS. Catalog still lives in Commerce. Preview and on-page edit still need a server-rendered page. React (or similar) is a storefront shell, not the system of record.&lt;/p&gt;
&lt;p&gt;If you skip that, CMS 13 + Optimizely Graph feels like a frontend rewrite. It isn&amp;rsquo;t. Graph replaces Search &amp;amp; Navigation (Find) as the query/index layer.&lt;/p&gt;
&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; replace:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Content types and &lt;code&gt;IContentRepository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Commerce catalog, pricing, and cart&lt;/li&gt;
&lt;li&gt;Edit mode and preview&lt;/li&gt;
&lt;li&gt;Your React / SSR host&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Three layers people mix up&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;CMS 12 today&lt;/th&gt;
&lt;th&gt;After Graph / CMS 13&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Authoring&lt;/td&gt;
&lt;td&gt;CMS UI, content types&lt;/td&gt;
&lt;td&gt;Still CMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storefront&lt;/td&gt;
&lt;td&gt;Razor + React / Content Delivery API&lt;/td&gt;
&lt;td&gt;Same hybrid, or more CDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search and listings&lt;/td&gt;
&lt;td&gt;Find (&lt;code&gt;IClient&lt;/code&gt;, facets, conventions)&lt;/td&gt;
&lt;td&gt;Optimizely Graph&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Content Delivery API is &lt;strong&gt;content over HTTP&lt;/strong&gt;. Find/Graph is &lt;strong&gt;query, facet, rank, and index&lt;/strong&gt;. Using CDA as your product-listing search is how teams paint themselves into a corner.&lt;/p&gt;
&lt;h2&gt;A hybrid shape that survives Graph&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;CMS/Commerce owns content and catalog.&lt;/li&gt;
&lt;li&gt;A thin .NET host does auth, cart, preview, and first paint (SSR).&lt;/li&gt;
&lt;li&gt;React hydrates listing / PDP / checkout islands.&lt;/li&gt;
&lt;li&gt;Listings talk to a query module (&lt;code&gt;IProductSearch&lt;/code&gt;, &lt;code&gt;IPageSearch&lt;/code&gt;) &amp;mdash; not &lt;code&gt;IClient&lt;/code&gt; in 40 controllers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That last point &lt;em&gt;is&lt;/em&gt; the migration. Find behind a port &amp;rarr; Graph is an adapter. Find in every controller &amp;rarr; Graph is a rewrite.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public interface IProductSearch
{
    Task&amp;lt;ProductSearchResult&amp;gt; SearchAsync(
        ProductSearchRequest request,
        CancellationToken cancellationToken);
}

// CMS 12: Find adapter implements this.
// CMS 13: Graph adapter implements this.
// Controllers and React never take a dependency on IClient.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Do this before&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Draw the line: CDA vs Find vs &lt;code&gt;IContentLoader&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Put Find behind interfaces (search, facets, paging).&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t let React own search URLs the server doesn&amp;rsquo;t know.&lt;/li&gt;
&lt;li&gt;Measure three numbers: time from publish until the listing shows the new item in Find; listing p95; percent of searches with zero hits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is &lt;strong&gt;Part 1&lt;/strong&gt; of &lt;strong&gt;Find &amp;rarr; Graph: the hybrid storefront&lt;/strong&gt;. Next: typed Find query builders, facets, and &lt;code&gt;GetContentResultAsync&lt;/code&gt; &amp;mdash; so a Graph adapter can sit beside them later.&lt;/p&gt;</description>            <guid>https://world.optimizely.com/blogs/hanskumar-tripathi/dates/2026/8/youre-not-headless.-youre-hybrid--and-thats-the-cms-12-default</guid>            <pubDate>Thu, 13 Aug 2026 14:38:03 GMT</pubDate>           <category>Blog post</category></item></channel>
</rss>