<?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: Khalid Siyanbola</title>
    <description>The latest articles on DEV Community by Khalid Siyanbola (@khalid_siyanbola_36d2ca51).</description>
    <link>https://dev.to/khalid_siyanbola_36d2ca51</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%2Fuser%2Fprofile_image%2F3489715%2Fbd52a239-2692-40a1-9631-52c6cb700222.png</url>
      <title>DEV Community: Khalid Siyanbola</title>
      <link>https://dev.to/khalid_siyanbola_36d2ca51</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khalid_siyanbola_36d2ca51"/>
    <language>en</language>
    <item>
      <title>Pulse Wall: I Let Sanity Run My Repost Marketplace's Content</title>
      <dc:creator>Khalid Siyanbola</dc:creator>
      <pubDate>Sat, 19 Sep 2026 01:42:38 +0000</pubDate>
      <link>https://dev.to/khalid_siyanbola_36d2ca51/pulse-wall-i-let-sanity-run-my-repost-marketplaces-content-4741</link>
      <guid>https://dev.to/khalid_siyanbola_36d2ca51/pulse-wall-i-let-sanity-run-my-repost-marketplaces-content-4741</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two: Vibe-Code Something Strange&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Pulse Wall, a Sanity-powered showcase of repost campaigns and promoter spotlights. It's a spin-off of Pulse, a community-powered social promotion marketplace I'm building separately (businesses run repost campaigns, promoters earn money sharing them). Instead of reimplementing Pulse's full backend (Go, MongoDB, Paystack), I reused Pulse's Next.js UI and turned the campaign marketplace into pure content. Every campaign and promoter spotlight lives in Sanity and is editable in Studio, no redeploy needed for new content to go live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pulse-sanity.onrender.com" rel="noopener noreferrer"&gt;https://pulse-sanity.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/siyanbolagiggs1/pulse-sanity" rel="noopener noreferrer"&gt;https://github.com/siyanbolagiggs1/pulse-sanity&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Build Process
&lt;/h2&gt;

&lt;p&gt;I used Claude Code as my AI-native IDE for this build. I started by pointing it at my existing Pulse repo and asking it to reuse the Next.js UI (Tailwind theme, shadcn/ui components, marketing shell) rather than starting from scratch, then strip out everything backend-coupled (auth, wallet, Paystack, the Go API) and replace the campaign marketplace with a Sanity content layer.&lt;/p&gt;

&lt;p&gt;What worked well: defining two schemas (campaign with a playful vibeScore field, spotlight) and embedding Sanity Studio directly into the Next.js app at /studio using next-sanity, so there's one deployable app instead of two.&lt;/p&gt;

&lt;p&gt;Where it got stuck: CORS. Sanity blocks Studio API calls from origins it doesn't recognize, so both localhost and the deployed Render URL had to be explicitly added as CORS origins with credentials allowed before Studio would even load, not obvious until we hit a CorsOriginError in the browser console.&lt;/p&gt;

&lt;p&gt;The bigger one: after publishing new campaigns in Studio, they weren't showing up on the live site. Turned out Next.js route segment config (revalidate/dynamic) only takes effect in page.tsx/layout.tsx files, not in an arbitrary component I'd put it in. It was silently ignored, so the homepage got fully statically prerendered at build time and never picked up new Sanity content, directly undercutting the "live from Sanity, no rebuild" pitch. Moving export const dynamic = "force-dynamic" into page.tsx fixed it.&lt;/p&gt;

&lt;p&gt;I deployed to Render instead of Vercel, using a render.yaml blueprint for one-click deploy, and added a GitHub Actions workflow to ping the free-tier instance every 5 minutes so it doesn't spin down between judge visits.&lt;/p&gt;

&lt;p&gt;I didn't reach into the App SDK or Workflows for this one, kept scope to the Content Lake, Studio, and GROQ queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;Project ID: b2izifpg, dataset: production&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Pulse Wall: Claude Code build transcript (curated) Sanity Challenge, Path Two submission Tool: Claude Code (Sonnet 5)&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        0 of 0 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fidl5quhfui0tehyybfsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fidl5quhfui0tehyybfsp.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
