<?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>Forem: Kyrylo Yezholov</title>
    <description>The latest articles on Forem by Kyrylo Yezholov (@kyrylo_yezholov_88619a99a).</description>
    <link>https://forem.com/kyrylo_yezholov_88619a99a</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3595917%2F9ee5611d-3286-458f-bf9c-f7c773c75ea5.png</url>
      <title>Forem: Kyrylo Yezholov</title>
      <link>https://forem.com/kyrylo_yezholov_88619a99a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kyrylo_yezholov_88619a99a"/>
    <language>en</language>
    <item>
      <title>How I Fought the "Content Bottleneck" with a Pragmatic Stack (Prisma, Redis &amp; React)</title>
      <dc:creator>Kyrylo Yezholov</dc:creator>
      <pubDate>Tue, 04 Nov 2025 16:03:38 +0000</pubDate>
      <link>https://forem.com/kyrylo_yezholov_88619a99a/how-i-fought-the-content-bottleneck-with-a-pragmatic-stack-prisma-redis-react-4po6</link>
      <guid>https://forem.com/kyrylo_yezholov_88619a99a/how-i-fought-the-content-bottleneck-with-a-pragmatic-stack-prisma-redis-react-4po6</guid>
      <description>&lt;h2&gt;
  
  
  Part 1: "The Pain"
&lt;/h2&gt;

&lt;p&gt;It's Friday, 4:00 PM. You're finally in the zone, refactoring a complex piece of logic. Then, the ticket comes in: "Urgent! Need to change the text on the promo banner by 5:00 PM." &lt;/p&gt;

&lt;p&gt;It's that ticket. The one that kills your flow. The one that takes 5 minutes of work but costs an hour of productivity.&lt;/p&gt;

&lt;p&gt;This "content bottleneck" problem was driving me crazy. Instead of writing another quick script, I decided to build a proper, scalable solution from the ground up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: "The Core" (Admin Panel First)
&lt;/h2&gt;

&lt;p&gt;I knew I needed a reliable admin panel before I even thought about a landing page. This was a tool, not a brochure.&lt;/p&gt;

&lt;p&gt;My main architectural problem was simple: how do I let a marketer update content (a write to Postgres) and have that change instantly reflect for thousands of users (a read from an API) without killing the database?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;"Source of Truth"&lt;/strong&gt; (Prisma + Postgres): I chose Prisma to manage my Postgres DB. Its schema-first approach gave me full type safety for my notification model. It was reliable, clean, and fast. This became my "source of truth."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;"Delivery Mechanism"&lt;/strong&gt; (Express + Redis Cache-on-Demand): But constantly hitting Postgres for every user's page load is inefficient.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I implemented a pragmatic read-through (cache-on-demand) workflow on Express, using Redis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logic&lt;/strong&gt;: The API first checks Redis. If it's a cache miss, it hits Postgres (via Prisma), caches the data, and then returns it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invalidation&lt;/strong&gt;: When the marketer hits "Publish" in the admin panel, I simply invalidate (clear) the relevant key in Redis. The very next API request automatically refreshes the cache.&lt;/p&gt;

&lt;p&gt;The result: blazing-fast notification delivery that doesn't overload the main database.&lt;/p&gt;

&lt;ol start="3"&gt;
  &lt;li&gt;The Admin UI Itself (Vite + MUI + Tiptap): For the admin panel UI, the stack was straightforward: Vite + React for instant HMR, MUI for a professional UI without the CSS headache, and Tiptap as a lightweight WYSIWYG editor to give non-technical users basic formatting.&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2Fs4atur85ty37ib617sz4.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.amazonaws.com%2Fuploads%2Farticles%2Fs4atur85ty37ib617sz4.png" alt="Admin page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3: "The Shop Window" (The Landing Page Last)
&lt;/h2&gt;

&lt;p&gt;Only after the core product (the admin panel and the cached API) was working did I think about the "shop window."&lt;/p&gt;

&lt;p&gt;Here, I didn't need a heavy SPA. I needed a fast, static-first (SSG) site that would index well on Google. Next.js is the king of this. And Tailwind CSS let me build a custom, clean design that didn't just look like my standard MUI admin panel.&lt;/p&gt;

&lt;p&gt;Funnily enough, the development process mirrored the product's philosophy: the core "Head" (Vite/Prisma/Redis) was built completely separate from its "Presentation" (Next.js/Tailwind).&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fd7ejfvw2woic3bteshq2.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.amazonaws.com%2Fuploads%2Farticles%2Fd7ejfvw2woic3bteshq2.png" alt="Landing page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The "Real" Solution
&lt;/h2&gt;

&lt;p&gt;This project grew into Korrero (&lt;a href="https://korrero.com?utm_source=devto" rel="noopener noreferrer"&gt;https://korrero.com&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;It's not a tool that promises to do everything. It's a solution that does one thing well: it's a lightweight content layer just for notifications.&lt;/p&gt;

&lt;p&gt;It gives marketers the simple UI they need, and it gives developers the clean, cached API (powered by Prisma &amp;amp; Redis) that "just works".&lt;/p&gt;

&lt;p&gt;We're launching on Product Hunt this Wednesday, November 5th. As a solo founder, I'd be grateful for any honest feedback on the approach.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/hiwvqCLPcLM"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>saas</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
