<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Tech blog posts by Punit Sethi on </title>
    <link>https://punits.dev/blog/</link>
    <description>Recent content in Tech blog posts by Punit Sethi on </description>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Mon, 13 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://punits.dev/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Strapi Cron Running Multiple Times? Here&#39;s How to Fix It</title>
      <link>https://punits.dev/blog/strapi-cron-running-multiple-times/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/strapi-cron-running-multiple-times/</guid>
      <description>Strapi Cron Running Multiple Times? Here&amp;rsquo;s How to Fix It  13th Apr, 2026    Table of contents    1. Problem: Cron runs multiple times in production 2. Solution: distributed locking 2.1. Where can we maintain a distributed lock 2.2. Choosing database-native locking 2.3. Implementation 2.3.1. MySQL 2.3.2. Postgres 2.3.3. Usage with Strapi cron  2.4. What happens at runtime  3. Practical considerations and limitations 4.</description>
    </item>
    
    <item>
      <title>&#39;use client&#39; in Next.js: What It Does, What It Costs, and When to Use It</title>
      <link>https://punits.dev/blog/use-client-in-nextjs/</link>
      <pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/use-client-in-nextjs/</guid>
      <description>&amp;lsquo;use client&amp;rsquo; in Next.js: What It Does, What It Costs, and When to Use It  body.content :not(pre):not(h1):not(h2):not(h3)  code { color: #332F37; background: #f4eef0; } body.content h1 code, h2 code, h3 code { background: transparent !important; }  28th Mar, 2026 Featured in: React Digest #554, NextJSWeekly #125     Table of contents    1. Example code repositories for this post 1.1. Server Component version 1.</description>
    </item>
    
    <item>
      <title>Vercel vs Netlify vs Cloudflare: Serverless Cold Starts Compared</title>
      <link>https://punits.dev/blog/vercel-netlify-cloudflare-serverless-cold-starts/</link>
      <pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/vercel-netlify-cloudflare-serverless-cold-starts/</guid>
      <description>Vercel vs Netlify vs Cloudflare: Serverless Cold Starts Compared 17th Jan, 2026 Featured in: JavaScript weekly #770, NextJSWeekly #114     Table of contents    1. Why cold start delays need to be measured 2. How I measured the cold-start delays 2.1. The Nextjs project that was benchmarked 2.2. Cold start detection mechanism 2.3. The script to measure cold start delays 2.4. Running the benchmarks  3.</description>
    </item>
    
    <item>
      <title>Payload CMS vs Strapi : Choosing the Right Headless CMS</title>
      <link>https://punits.dev/blog/payloadcms-vs-strapi/</link>
      <pubDate>Thu, 23 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/payloadcms-vs-strapi/</guid>
      <description>Payload CMS vs Strapi : Choosing the Right Headless CMS  23rd Oct, 2025    Table of contents    1. Core difference 1.1. Developer-first framework vs Editor-friendly platform 1.2. Next.js-integrated backend vs standalone headless CMS  2. Comparing the content management features 2.1. Content versioning 2.2. Media uploads 2.3. Components / Group Fields 2.4. Dynamic Zone / Blocks Field 2.5. Live Preview 2.6. Managing content translations 2.</description>
    </item>
    
    <item>
      <title>Think Cloudflare Always Speeds You Up? Not in India</title>
      <link>https://punits.dev/blog/cloudflare-latency-india/</link>
      <pubDate>Mon, 15 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/cloudflare-latency-india/</guid>
      <description>Think Cloudflare Always Speeds You Up? Not in India  15th Sep, 2025    Table of contents    1. The initial issue I observed 2. Initial experiments: measuring latency 2.1. Baseline - no CDN 2.2. Cloudflare Free plan 2.3. Cloudflare Pro plan 2.4. Cloudflare Pro plan with Argo routing  3. More checks: decoding Cloudflare routing 3.1. Cloudflare routing for other Indian ISPs 3.2. Routing for other sites on Cloudflare  4.</description>
    </item>
    
    <item>
      <title>Vercel Hosting: When to Use It and Alternatives to Compare</title>
      <link>https://punits.dev/blog/vercel-hosting-when-to-use-and-alternatives/</link>
      <pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/vercel-hosting-when-to-use-and-alternatives/</guid>
      <description>Vercel Hosting: When to Use It and Alternatives to Compare  1st Sep, 2025    Table of contents    1. Three core Vercel capabilities to know first 1.1. Understanding Vercel’s serverless model 1.2. How deployments work on Vercel 1.3. Vercel’s deep Next.js integration  2. Factors to consider 2.1. Hosting Cost 2.2 Cold start delays 2.3. Scalability during traffic spikes 2.4. Limits on long running tasks 2.</description>
    </item>
    
    <item>
      <title>Headless CMS vs WordPress: Which Is Better &amp; When to Use Each</title>
      <link>https://punits.dev/blog/headless-cms-vs-wordpress/</link>
      <pubDate>Fri, 15 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/headless-cms-vs-wordpress/</guid>
      <description>Headless CMS vs WordPress: Which Is Better &amp;amp; When to Use Each  15th Aug, 2025    Table of contents    1. Fundamental Difference 2. Factors to Consider  2.1 Website Flexibility 2.2. Leveraging Modern Standards and Tooling 2.3. Tech Skills and Resources 2.4. Time, Effort and Budget 2.5. Website Performance 2.6. SEO Compliance 2.7. CMS Setup Security 2.8. WYSIWYG Content Publishing 2.9. Plugin Ecosystem  3.</description>
    </item>
    
    <item>
      <title>MCP with Postgres - Querying my data in plain English</title>
      <link>https://punits.dev/blog/mcp-with-postgres/</link>
      <pubDate>Tue, 15 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/mcp-with-postgres/</guid>
      <description>MCP with Postgres - Querying my data in plain English  2nd July, 2026   When coding, most of us have become comfortable using LLMs with our codebases to write features, fix bugs, understand logic flows, and examine code architecture. This has improved both our efficiency and the quality of our work.
I have found that LLMs can offer similar benefits when working with data. For about a year, I have been using them to query data in situations such as these:</description>
    </item>
    
    <item>
      <title>How I&#39;m using Gen AI for my software development tasks [videos]</title>
      <link>https://punits.dev/blog/how-i-am-using-gen-ai-for-software-development-tasks/</link>
      <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/how-i-am-using-gen-ai-for-software-development-tasks/</guid>
      <description>How I&amp;rsquo;m using Gen AI for my software development tasks  19th Apr, 2025   
TL;DR - Take me to the first screencast.
First things first - given how much my Gen AI usage has evolved in the last few months, I expect myself to feel embarrassed reading this post in a year or two from now. 😊
Beginning 2025, I decided to temporarily reduce my project workload to dive deeper into using Gen AI.</description>
    </item>
    
    <item>
      <title>Strapi Custom Development: Choosing the Right Customization Option</title>
      <link>https://punits.dev/blog/strapi-custom-development-guide/</link>
      <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/strapi-custom-development-guide/</guid>
      <description>Strapi Custom Development: Choosing the Right Customization Option  3rd Sep, 2025    Table of contents    1. Controllers 2. Custom APIs / Routes 3. Route middlewares 4. Policies 5. Lifecycle Hooks 6. Cron tasks 7. Plugins 8. Overriding the core Strapi admin Conclusion     function toggleMobileTOC(button) { const content = document.getElementById(&#39;mobile-toc-content&#39;); const icon = button.querySelector(&#39;svg&#39;); const isExpanded = button.getAttribute(&#39;aria-expanded&#39;) === &#39;true&#39;; if (isExpanded) { content.</description>
    </item>
    
    <item>
      <title>My experience with upgrading Strapi v4 to v5</title>
      <link>https://punits.dev/blog/my-experience-with-upgrading-strapi-v4-to-v5/</link>
      <pubDate>Sat, 11 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/my-experience-with-upgrading-strapi-v4-to-v5/</guid>
      <description>My experience with upgrading Strapi v4 to v5  11th Jan, 2025  
Note 1: The above screencast is of an example Strapi project. The actual Strapi setup that we upgraded contains about a hundred collections with thousands of rows of data.
If you are looking for Strapi v3 → v4 migration, please check out this post.  1. About our setup With the release of version 5, Strapi introduced some major changes:</description>
    </item>
    
    <item>
      <title>How we built observability with Google Cloud services</title>
      <link>https://punits.dev/blog/building-observability-with-google-cloud-services/</link>
      <pubDate>Mon, 30 Dec 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/building-observability-with-google-cloud-services/</guid>
      <description>How we built observability with Google Cloud services  30th Dec, 2024   
A common approach to addressing a production issue is to try to reproduce it in a non-production environment. Once reproduced, the fix can be coded and tested in the non-production environment before applying to production.
While this approach worked well for most of our issues, it left two vital gaps:
 There were always some issues (functional bugs, slowness, crashes) that we could not reproduce and thus not fix.</description>
    </item>
    
    <item>
      <title>Common NewRelic RUM queries for web performance optimization</title>
      <link>https://punits.dev/blog/common-newrelic-rum-queries-for-web-performance-optimization/</link>
      <pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/common-newrelic-rum-queries-for-web-performance-optimization/</guid>
      <description>Common NewRelic RUM queries for web performance optimization  16th Sep, 2024   
Every time I have to sift through NewRelic RUM data when optimizing a website&amp;rsquo;s speed, I have to go through past notes, reports and messages. I want to use this blog post to collect the most common queries &amp;amp; other information I use as a starting point for RUM data analysis.
Major NewRelic RUM tables and the data they contain NewRelic RUM captures the data in the following tables:</description>
    </item>
    
    <item>
      <title>Customizing the Strapi Admin panel</title>
      <link>https://punits.dev/blog/overriding-the-strapi-admin-ui/</link>
      <pubDate>Tue, 16 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/overriding-the-strapi-admin-ui/</guid>
      <description>Customizing the Strapi Admin panel  16th Jul, 2024    1. Introduction Strapi enables various kinds of changes to the Strapi Admin panel. Some changes like modifying the favicons or the default theme tone are straight forward. However, when it comes to overriding the behavior of the Strapi Admin panel out of the box, it requires complicated handling. This post details these steps (for Strapi v5 as well as Strapi v4.</description>
    </item>
    
    <item>
      <title>How we invalidate cache for resource-heavy &amp; long-running requests</title>
      <link>https://punits.dev/blog/cache-invalidation-strategy-for-heavy-requests/</link>
      <pubDate>Fri, 28 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/cache-invalidation-strategy-for-heavy-requests/</guid>
      <description>How we invalidate cache for resource-heavy &amp;amp; long-running requests  28th June, 2024    What problem did we encounter Before I detail our cache invalidation strategy, let&amp;rsquo;s look at the problem we had at hand:
 We cache some of our API responses on Redis (AWS Elasticache) These API responses are cached with a fixed TTL expiry duration (this expiry duration varies from one API to another depending on the business case).</description>
    </item>
    
    <item>
      <title>How we prevented CDN bandwidth abuse &amp; mitigated AWS billing spike</title>
      <link>https://punits.dev/blog/preventing-cdn-bandwidth-abuse/</link>
      <pubDate>Sat, 16 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/preventing-cdn-bandwidth-abuse/</guid>
      <description>How we prevented CDN bandwidth abuse &amp;amp; mitigated AWS billing spike  16th March, 2024  body.content pre code { white-space: pre-wrap; overflow-x: scroll; font-size: 14px; }     A few weeks ago, at one of my clients, our AWS billing showed a 20% rise for the previous day as compared to the earlier days in the week. Having experienced a few AWS billing nightmares in the past, we actively watch for any unusual increase in our AWS resources consumption &amp;amp; billing.</description>
    </item>
    
    <item>
      <title>How we setup our Strapi API test automation using Jest</title>
      <link>https://punits.dev/blog/strapi-api-testing-with-jest/</link>
      <pubDate>Fri, 23 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/strapi-api-testing-with-jest/</guid>
      <description>How we setup our Strapi API test automation using Jest  23rd Feb, 2024   
One early morning of July 2023, I received an SOS call from a colleague. Some of our Strapi based Rest APIs were serving our website users with data that should not be served to them. Say, users were seeing not only their own orders, but also other users&#39; orders! I panicked. But, I was also puzzled.</description>
    </item>
    
    <item>
      <title>Directus vs Strapi : Choosing the Right Headless CMS</title>
      <link>https://punits.dev/blog/directus-vs-strapi/</link>
      <pubDate>Fri, 26 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/directus-vs-strapi/</guid>
      <description>Directus vs Strapi : Choosing the Right Headless CMS  7th Jul, 2025    Table of contents    1. Key difference in approach 1.1. Data engine vs. code-driven headless CMS 1.2. Dealing with the database  2. Comparing the features 2.1. Versioning the content changes made via the Admin UI 2.2. Draft and Publish mode for Content  2.3. File uploads  2.4. Single Sign-on 2.5. Dynamic Zones / M2A Relationships 2.</description>
    </item>
    
    <item>
      <title>My experience with Gatsby v5 to Next v13 frontend migration</title>
      <link>https://punits.dev/blog/migrating-frontend-from-from-gatsby-to-next/</link>
      <pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/migrating-frontend-from-from-gatsby-to-next/</guid>
      <description>My experience with Gatsby v5 to Next v13 frontend migration  1st Jan, 2024   
Our Gatsby based statically generated frontend had been serving us well in production for 3+ years. But, after living with some major content publishing pain-points (detailed below) for long, we decided to move to Next.js to permanently resolve them. Also, to remain future-ready, we moved to the Next.js App router instead of the older Next.</description>
    </item>
    
    <item>
      <title>Headless Node.js CMS comparison by popularity</title>
      <link>https://punits.dev/blog/comparison-of-the-headless-node-cms-by-popularity/</link>
      <pubDate>Wed, 27 Sep 2023 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/comparison-of-the-headless-node-cms-by-popularity/</guid>
      <description>Headless Node.js CMS comparison by popularity  10th Oct, 2025    The most reliable way to identify the right CMS framework for your needs is to list your requirements in detail and then look for the CMS with features that match those requirements. But, often not all the requirements are clear at the outset. In such cases, a common approach is to resort to the wisdom of the crowd.</description>
    </item>
    
    <item>
      <title>My experience with migrating Strapi v3 to v4</title>
      <link>https://punits.dev/blog/my-experience-with-upgrading-strapi-v3-to-v4/</link>
      <pubDate>Wed, 16 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/my-experience-with-upgrading-strapi-v3-to-v4/</guid>
      <description>My experience with migrating Strapi v3 to v4  16th Aug, 2023    Update (Jan, 2025) : If you are looking for Strapi v4 ⇒ v5 upgrade, please check out this post. 
Because of the large number of breaking changes introduced with Strapi v4, upgrading a Strapi setup from v3 ⇒ v4 is tricky in general.
It didn&amp;rsquo;t help that our Strapi v3 setup (in production since 2019) consisted of many collections with dynamic zones, components &amp;amp; relationships that translated into 1000+ database tables (a lot of data to migrate and test!</description>
    </item>
    
    <item>
      <title>How we setup custom input validations for components in Strapi</title>
      <link>https://punits.dev/blog/input-validations-for-components-in-strapi/</link>
      <pubDate>Thu, 06 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/input-validations-for-components-in-strapi/</guid>
      <description>How we setup custom input validations for components in Strapi  6th July, 2023    Update [Feb, 2025] :The approach detailed in this blog post works for Strapi v4 (except for certain Strapi v4 versions due to this Strapi v4 bug) and v5. It does not work with Strapi v3. 
Note : If you are just interested in the code changes to make this customization happen, please check out this github repo.</description>
    </item>
    
    <item>
      <title>Executing stress free Strapi version upgrades : My experiences &amp; attempts</title>
      <link>https://punits.dev/blog/strapi-version-upgrades-my-experiences-and-attempts/</link>
      <pubDate>Mon, 26 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/strapi-version-upgrades-my-experiences-and-attempts/</guid>
      <description>Executing stress free Strapi version upgrades : My experiences &amp;amp; attempts  26th June, 2023    Note: This post is specifically about minor version upgrades with Strapi v4 (eg: 4.2 ⇒ 4.5) and not Strapi v3 - Strapi v4 upgrade. That&#39;s a different beast altogether. 😊 
Upgrading the Strapi version for a setup is necessary not only to bring the latest Strapi features to it, but also to keep the setup secure from the latest known vulnerabilities.</description>
    </item>
    
    <item>
      <title>How to integrate Elasticsearch with Strapi</title>
      <link>https://punits.dev/blog/integrating-elasticsearch-with-strapi/</link>
      <pubDate>Mon, 22 May 2023 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/integrating-elasticsearch-with-strapi/</guid>
      <description>How to integrate Elasticsearch with Strapi  22nd May, 2023   Update [18th Sep, 2023] : Based on the feedback received from the readers of this blog post, I have created a plugin for Strapi-Elasticsearch integration (here).  Note: If you are just interested in the code changes to make this customization happen, please check out this github repo.
1. Goal The goal of this post is to provide the implementation specifics to integrate Elasticsearch with Strapi so that:</description>
    </item>
    
    <item>
      <title>Mitigating serverless cold start delays : My experiments &amp; observations</title>
      <link>https://punits.dev/blog/mitigating-serverless-cold-start-delays/</link>
      <pubDate>Wed, 01 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/mitigating-serverless-cold-start-delays/</guid>
      <description>Mitigating serverless cold start delays : My experiments &amp;amp; observations  1st Mar, 2023   
Additional Context : Serverless is a vast area. This post specifically evaluates if frequently pinging one or more Urls is a reliable approach to mitigate cold start delays for websites hosted on Node based serverless platforms like Vercel or Netlify.
Update (Jan, 2026) : I have undertaken a thorough comparison of cold start delays for Vercel, Netlify and Cloudflare when serving a Nextjs v16 project.</description>
    </item>
    
    <item>
      <title>Customizing the Strapi upload plugin</title>
      <link>https://punits.dev/blog/customizing-the-strapi-upload-plugin/</link>
      <pubDate>Sat, 17 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/customizing-the-strapi-upload-plugin/</guid>
      <description>Customizing the Strapi upload plugin  15th Dec, 2022   [Update : 15th Jul, 2024] If you are trying to customize the Strapi upload plugin for Strapi v4.15.1 or later (including Strapi v5), please also refer to this post. 
Note: To directly look at the code changes to make this customization work, please check out this github repo.
1. Goal My goal with this post is to describe how Strapi&amp;rsquo;s upload plugin can be customized to enable uploading assets to different destinations based on what the Admin UI user selects during the file upload.</description>
    </item>
    
    <item>
      <title>How we made Sentry work to swiftly identify production issues</title>
      <link>https://punits.dev/blog/how-we-made-sentry-work-to-identify-production-issues/</link>
      <pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/how-we-made-sentry-work-to-identify-production-issues/</guid>
      <description>How we made Sentry work to swiftly identify production issues  30th June, 2022  body.content pre code { white-space: pre-wrap; overflow-x: scroll; font-size: 14px; }    Why are some production issues as difficult to uncover as the camouflaging chameleons!  Back in April 2022, one of my clients identified the need to check if our website code had issues in production that were not known to our team.</description>
    </item>
    
    <item>
      <title>My experiences with customizing the Strapi CMS</title>
      <link>https://punits.dev/blog/my-experiences-with-customizing-strapi-cms/</link>
      <pubDate>Fri, 08 Apr 2022 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/my-experiences-with-customizing-strapi-cms/</guid>
      <description>My experiences with customizing the Strapi CMS Last Updated : 26th Jan, 2023 (First published : 8th April, 2022)    Update: The original post was written based on customizations performed on Strapi 3.6.6. We have, since then, upgraded to Strapi 4.x. I have updated the post to reflect the customizations for Strapi 4.x
A CMS solution that is built in-house from the ground-up offers maximum flexibility. But, it also requires a substantial initial time-to-build.</description>
    </item>
    
    <item>
      <title>My Experiences with Optimizing CSS for React Frontends</title>
      <link>https://punits.dev/blog/my-experiences-with-optimizing-css-for-react-frontends/</link>
      <pubDate>Thu, 03 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/my-experiences-with-optimizing-css-for-react-frontends/</guid>
      <description>My Experiences with Optimizing CSS for React Frontends  3rd Feb, 2022   Haircut mishaps and CSS optimization - what do they have in common?  Between the start of 2021 and now, I got opportunities to optimize CSS loading for three different React Server Side Rendered (SSR) websites. Each of these websites was delivering 500+ KBytes of CSS before their pages could render anything. And, in each of these cases, the styling code had gathered over the years, as separating unused CSS from used CSS isn&amp;rsquo;t trivial.</description>
    </item>
    
    <item>
      <title>Zero runtime CSS-in-JS : Is this where great DX meets top-notch web performance?</title>
      <link>https://punits.dev/blog/zero-runtime-css-in-js/</link>
      <pubDate>Fri, 19 Nov 2021 00:00:00 +0000</pubDate>
      
      <guid>https://punits.dev/blog/zero-runtime-css-in-js/</guid>
      <description>Zero runtime CSS-in-JS : Is this where great DX meets top-notch Web Performance?  19th Nov, 2021 A few weeks ago, a client team asked for my inputs on the performance impact of the styled-components library. They were already using styled-components for one of their website frontends. But, as they were about to build a different frontend (for a different website), they wanted to evaluate if styled-components was the right choice in the ever-evolving frontend ecosystem.</description>
    </item>
    
  </channel>
</rss>
