<?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: Chris Lojniewski</title>
    <description>The latest articles on DEV Community by Chris Lojniewski (@itschrislojniewski).</description>
    <link>https://dev.to/itschrislojniewski</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%2F284483%2Fae5af044-f8bc-4e7c-96f1-a0954d886f24.jpg</url>
      <title>DEV Community: Chris Lojniewski</title>
      <link>https://dev.to/itschrislojniewski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itschrislojniewski"/>
    <language>en</language>
    <item>
      <title>Best CMS in 2025: Sanity vs WordPress</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Thu, 18 Sep 2025 09:34:10 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/best-cms-in-2025-sanity-vs-wordpress-23d9</link>
      <guid>https://dev.to/pagepro_agency/best-cms-in-2025-sanity-vs-wordpress-23d9</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity and WordPress for Content Management&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When building a new website or app, picking a CMS &lt;strong&gt;can affect your site’s current and future performance&lt;/strong&gt;. For many teams, the decision comes down to Sanity vs WordPress, and their two very different approaches to content management.&lt;/p&gt;

&lt;p&gt;WordPress offers familiarity, a huge plugin ecosystem, and community support. Sanity has a structured, API-first approach, real-time collaboration, and integration with frameworks like &lt;a href="https://pagepro.co/services/nextjs-development" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Today, we’ll &lt;strong&gt;compare Sanity and WordPress side by side&lt;/strong&gt;. This article will cover performance, workflows, costs, ease of use, and security, all to help with choosing the right content management for your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Headless CMS vs Traditional CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before comparing Sanity and WordPress directly, we need to understand the &lt;strong&gt;difference between a headless and traditional CMS platforms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A traditional CMS&lt;/strong&gt; like WordPress bundles everything together: content storage, editing interface, design templates, and the frontend that displays your site. With that, &lt;strong&gt;launching your site is very easy&lt;/strong&gt;. However, since your content is coupled to one presentation layer (the website), &lt;strong&gt;delivering the same content to an app or a digital display can be tricky&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A headless CMS&lt;/strong&gt; separates content management from presentation. Content is stored in a structured way and delivered via APIs, so developers can connect it to any frontend. It allows for &lt;strong&gt;more control&lt;/strong&gt;, but &lt;strong&gt;requires expert knowledge for set up and maintenance&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Overview of Sanity and WordPress&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is Sanity CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity is a &lt;a href="https://pagepro.co/blog/what-is-sanity/" rel="noopener noreferrer"&gt;&lt;strong&gt;headless content operating system&lt;/strong&gt;&lt;/a&gt; launched in 2017. Unlike WordPress, which is monolithic, Sanity separates content from presentation, letting you deliver content to any frontend via APIs. It’s built for developers who want structured content models, modern workflows, and easy collaboration in content editing.&lt;/p&gt;

&lt;h4&gt;
  
  
  Who Owns Sanity CMS?
&lt;/h4&gt;

&lt;p&gt;Sanity was founded in Oslo, Norway, by Even Westvang, Simen Svale Skogsrud, and Magnus Hillestad. The company, Sanity.io, continues to maintain and develop the platform, which has attracted global clients and investors, including notable brands like &lt;a href="https://www.sanity.io/customers/puma" rel="noopener noreferrer"&gt;&lt;strong&gt;Puma&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.sanity.io/customers/morning-brew" rel="noopener noreferrer"&gt;&lt;strong&gt;Morning Brew&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.sanity.io/customers/cloudflare" rel="noopener noreferrer"&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://www.sanity.io/customers/att" rel="noopener noreferrer"&gt;&lt;strong&gt;AT&amp;amp;T&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Use Cases of Sanity&lt;/strong&gt; 
&lt;/h3&gt;

&lt;p&gt;Sanity is often chosen when teams need a &lt;strong&gt;developer-first CMS that’s easy to scale&lt;/strong&gt;, but it also has its uses for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content-rich websites and apps.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;E-commerce solutions.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-channel publishing.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise content hubs.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design-driven websites.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is WordPress?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;WordPress is a &lt;strong&gt;traditional CMS&lt;/strong&gt; that allows you to create, publish, and manage websites without building everything from scratch. It powers more than &lt;a href="https://w3techs.com/technologies/overview/content_management" rel="noopener noreferrer"&gt;&lt;strong&gt;40% of all websites worldwide&lt;/strong&gt;&lt;/a&gt; and holds around &lt;strong&gt;60% of the CMS market share&lt;/strong&gt;. Its popularity comes from accessibility: with over &lt;strong&gt;tens of thousands of free themes&lt;/strong&gt; and &lt;a href="https://wordpress.com/blog/2025/04/17/wordpress-market-share/" rel="noopener noreferrer"&gt;&lt;strong&gt;65,000+ plugins&lt;/strong&gt;&lt;/a&gt;, it offers options to extend features and get a website up and running quickly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Who Developed WordPress?
&lt;/h4&gt;

&lt;p&gt;WordPress was created by &lt;strong&gt;Matt Mullenweg and Mike Little&lt;/strong&gt; in 2003 as a fork of a blogging tool called b2/cafelog. Today, it is an open-source project maintained by a large community of contributors and &lt;strong&gt;backed commercially by Automattic&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Use Cases of WordPress&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;WordPress is used for everything from &lt;strong&gt;personal blogs&lt;/strong&gt; to &lt;strong&gt;enterprise websites&lt;/strong&gt;, and its most common uses include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Blogging and publishing.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Business sites.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Online stores.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Membership and community sites.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise websites.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Need Help Deciding Between Sanity vs WordPress?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Talk to Our Experts&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is the Difference Between Sanity vs WordPress for Developers?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Choosing between Sanity and WordPress depends on how you want to build and scale your site over time. Here’s how the two compare across the areas that matter most.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Content Modeling&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Pages, posts, custom post types; rigid for advanced needs&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Schema-based, structured, reusable content&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Free core; costs for hosting, themes, plugins, or VIP&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Free tier; usage-based pricing as projects grow&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Depends on hosting, caching, and plugins&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;API-first; fast with frameworks like Next.js&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Integrations&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;59k+ plugins and 11k+ themes&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;API-driven; integrates with Vercel, Shopify, Algolia&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;DevEx &amp;amp; UX&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Easy for beginners; limited flexibility for devs&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Developer-first; code-defined models, customizable Studio&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Workflows&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Basic publishing; advanced workflows need plugins&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Real-time collaboration, versioning, structured flows&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Relies on hosting and plugin updates; vulnerable if outdated&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Managed backend; API-based security, smaller attack surface&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Hosting&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Requires separate hosting (shared, managed, or VIP)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;CMS is fully managed; only host the frontend&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Content Modeling&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt;: Since it’s a traditional CMS, it uses the classic model of pages and posts. It allows for the customization of post types, fields, or plugins. However, its structure is relatively rigid, which can lead to complex workarounds for more advanced needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;: Its structure is built around schemas, which are sets of rules defining how your content is structured. You can specify exactly what types of content you need, and Sanity enforces that structure. Thanks to that, reusing content across different platforms becomes much easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pricing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt;: The core CMS is free and open source. You still need to factor in hosting, premium themes, and paid plugins. The final costs can vary widely depending on whether you run a small site on shared hosting or an enterprise setup on WordPress VIP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;: Has a free plan with limited API requests and users, plus paid plans that scale based on usage (API calls, storage, seats). It can be cost-effective for small projects, but as your traffic or content needs grow, so do the costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Performance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt;: Runs on PHP and MySQL. Its performance depends heavily on hosting quality, caching plugins, and CDN setup. The right configuration can handle large traffic, but out of the box, WordPress is less optimized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;: Headless by design, it serves content via APIs. When paired with &lt;a href="https://pagepro.co/blog/what-is-nextjs/" rel="noopener noreferrer"&gt;&lt;strong&gt;modern frameworks like Next.js&lt;/strong&gt;&lt;/a&gt;, sites can be pre-rendered for fast load times and excellent Core Web Vitals. Scaling is handled by Sanity’s managed infrastructure, so heavy traffic is less of a problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaling a 100K+ Page Medical Platform with Next.js &amp;amp; Sanity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/case-studies/gpnotebook" rel="noopener noreferrer"&gt;&lt;strong&gt;READ CASE STUDY&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Integrations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt;: Famous for its plugin ecosystem, and for good reason. WordPress offers thousands of plugins and themes, and you can add SEO tools, payment gateways, and more without custom coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;: Its flexibility comes from APIs, not prebuilt add-ons. Doesn’t use plugins in the same way. Instead, it integrates with developer tools and modern platforms like &lt;a href="https://pagepro.co/blog/optimizing-vercel-hosting-costs/" rel="noopener noreferrer"&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;/a&gt;, Shopify, or Algolia. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;DevEx &amp;amp; UX&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt;  Non-developers find WordPress easy to pick up, thanks to a visual dashboard, &lt;strong&gt;What You See Is What You Get&lt;/strong&gt; (WYSIWYG) editing, and prebuilt templates. Developers, however, might find customizing beyond themes and plugins cumbersome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity:&lt;/strong&gt; Geared towards developers. Content models are code-first, and frontends are built with frameworks like React and Next.js. For editors, Sanity Studio offers a smooth experience and a customizable UI. Its initial setup does require some technical expertise.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Workflows&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Content creation is pretty straightforward, but advanced workflows (approval chains, editorial review, versioning) often require extra plugins. Collaboration features are limited compared to modern tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity:&lt;/strong&gt; Focuses a lot on the workflows. Real-time collaboration, version history, and structured editing make it a great choice for larger teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building a Super-Fast Sanity Website for the Extraordinary Hotel at the Edge of the World&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/case-studies/lyngen-north" rel="noopener noreferrer"&gt;&lt;strong&gt;READ CASE STUDY&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Security&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; The security of your WordPress site depends largely on hosting and regular updates. Vulnerabilities often come from outdated plugins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity: Security is centralized rather than plugin-driven.&lt;/strong&gt; Its headless architecture reduces the attack surface since the CMS doesn’t directly serve the website. Content is delivered through secure APIs, and infrastructure is managed by Sanity.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Hosting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress:&lt;/strong&gt; Requires hosting to run. Since its performance and security can vary depending on your provider, enterprise users often opt for WordPress VIP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;: A fully managed, cloud-based platform, letting you scale as you please. You don’t need to worry about hosting the CMS itself; you only host your frontend (e.g., on Vercel or Netlify).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity: Pros and Cons&lt;/strong&gt;
&lt;/h2&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%2Fl8y5h2t22quwn16nz30z.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%2Fl8y5h2t22quwn16nz30z.png" alt="A comparison card showing the pros and cons of Sanity CMS.Pros (left, with check marks): Flexible, Real-time collaboration, Developer-first, Customizable backend, Performant, Reusable content.Cons (right, with red crosses): Steep learning curve, No traditional plugins, Scaling costs, Hosting split, Smaller ecosystem.Branding includes the Sanity logo at the top and the Pagepro logo in the corner." width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are the Benefits of Using Sanity?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity stands out from other CMS options as a modern, &lt;a href="https://pagepro.co/blog/what-is-headless-cms/" rel="noopener noreferrer"&gt;&lt;strong&gt;headless CMS&lt;/strong&gt;&lt;/a&gt; built for flexibility and performance. Its main advantages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible content modeling&lt;/strong&gt;. Define custom schemas to structure your content just the way your project requires.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time collaboration&lt;/strong&gt;. Multiple team members can edit content at the same time in Sanity Studio, with updates appearing instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer-first approach&lt;/strong&gt;. Sanity allows a seamless integration with third-party tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customizable editor&lt;/strong&gt;. You can tailor the editing environment to match your content needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performant and scalable&lt;/strong&gt;. Content is delivered through Sanity’s managed Content Lake, optimized for speed and large-scale usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reusable content&lt;/strong&gt;. Write once, publish anywhere: websites, mobile apps, IoT, or digital displays.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What are the Cons of Sanity CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Teams without technical resources can find some aspects of Sanity challenging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Steep learning curve.&lt;/strong&gt; Setting up schemas and connecting a frontend requires coding knowledge, unlike WordPress’s plug-and-play approach.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No traditional themes or plugins&lt;/strong&gt;. You can’t just install a theme or plugin to get started. You’ll need a developer to build and integrate the feature you want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scaling costs.&lt;/strong&gt; Sanity’s free plan is a great value for small projects, but heavy API usage, large datasets, or many team members can increase monthly costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hosting split&lt;/strong&gt;. While Sanity hosts the CMS, you must host your frontend separately (e.g., on Vercel or Netlify), which adds an extra step for setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smaller ecosystem.&lt;/strong&gt; Sanity has strong community support, but its ecosystem of third-party integrations is much smaller compared to WordPress.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;WordPress: Pros and Cons&lt;/strong&gt;
&lt;/h2&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%2Fqa4eha4vd7s6ceqfeak1.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%2Fqa4eha4vd7s6ceqfeak1.png" alt="A comparison card showing the pros and cons of WordPress CMS.Pros (left, with check marks): Free and open-source, Huge plugin ecosystem, Thousands of themes, Ease of use, Community support, Scalable.Cons (right, with red crosses): Performance issues, Security problems, Plugin dependence, Maintenance, Content modeling limit, Limited design.Branding includes the WordPress logo at the top and the Pagepro logo in the corner." width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are the Benefits of Using WordPress?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;WordPress is one of the most popular content management solutions for modern web development for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free and open-source CMS.&lt;/strong&gt; Anyone can install and use WordPress at no cost, making it accessible or individuals and businesses both.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Huge plugin ecosystem&lt;/strong&gt;. With nearly 60,000 plugins, you can add features like SEO optimization, e-commerce (WooCommerce), contact forms, and analytics to your site without custom code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thousands of themes&lt;/strong&gt;. Free and premium WordPress themes allow you to get your website running quickly with no experience needed!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ease of use.&lt;/strong&gt; The dashboard and WYSIWYG editor make content management approachable even for non-developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community support&lt;/strong&gt;. WordPress has a massive global community that shares tutorials and support, lowering the barrier for learning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability.&lt;/strong&gt; With the right hosting and setup, WordPress can handle all types of websites, personal blogs, and high-traffic enterprise sites alike.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Disadvantages of a WordPress Site&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While WordPress offers plenty of strengths, it also comes with limitations and risks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance issues.&lt;/strong&gt; Out of the box, WordPress might be slow. Performance metrics often rely on caching plugins, CDNs, and optimized hosting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security vulnerabilities.&lt;/strong&gt; Its popularity makes it a frequent target for hackers. Many breaches come from outdated themes or plugins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugin dependence&lt;/strong&gt;. Extending functionality often means installing multiple plugins, which can lead to compatibility issues and heavier sites.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintenance overhead&lt;/strong&gt;. Regular updates for plugins, themes, and WordPress core are necessary to keep a site secure and stable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited content modeling&lt;/strong&gt;. The post/page/custom post type structure is less flexible compared to modern headless CMS platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design limitations without coding.&lt;/strong&gt; While themes help, customizing them deeply often requires PHP, HTML, or CSS knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;When to Choose Sanity vs WordPress&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Choose Sanity if…&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Choose WordPress if…&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Project Type&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Multi-channel platforms, apps, and scalable sites&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Blogs, portfolios, small business sites&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Content Needs&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Structured content, reusable across channels&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Simple pages and posts managed in one place&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Team&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Developer-led teams who can define schemas and build frontends&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Non-technical teams managing content via dashboard&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High performance, Core Web Vitals, and scalability are priorities&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;“Good enough” performance with plugins and decent hosting&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;You’re okay with a steeper setup for long-term flexibility&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Non-technical teams managing content via a dashboard&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Workflows&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;You need a fast, out-of-the-box setup with themes/plugins&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Basic content publishing without complex workflows&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Budget&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Prepared for usage-based pricing as you scale&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Relying on free core + low-cost hosting and plugins&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Future Goals&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Long-term growth, custom experiences, future-proof architecture&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Quick launch, affordable maintenance, and community support&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt; works best for &lt;strong&gt;projects that need flexibility and plan to scale in the future&lt;/strong&gt;, though it requires some technical expertise. A structured content model, headless architecture, and integrations with frameworks like Next.js make it a great choice for &lt;strong&gt;high performance and developer-driven workflows&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt; is a practical choice for blogs, small businesses, and content-focused sites where ease of use matters more than technical flexibility. Free at its core with affordable hosting, WordPress allows for a quick site launch, thanks to the numerous themes and plugins. Non-technical teams &lt;strong&gt;can manage sites through their dashboard&lt;/strong&gt;, with add-ons like WooCommerce or Yoast extending core functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;WordPress and Sanity: Which CMS is Best for You?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So, which one is the best CMS? Both Sanity and WordPress are powerful platforms, but they serve different needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt; is a tried-and-true choice for quick setup, affordability, and ease of use, especially for smaller websites, blogs, or businesses that rely on plugins to extend functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;, by contrast, offers a modern, developer-first approach and performance built for the future of the web.&lt;/p&gt;

&lt;p&gt;Already on WordPress but feel limited by its performance or extensive plugin setup? At Pagepro, we specialize in helping teams &lt;strong&gt;migrate from WordPress to modern stacks like Sanity and Next.js&lt;/strong&gt; to provide your website with the best performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to Develop Your Website with Sanity?&lt;/strong&gt; &lt;a href="https://pagepro.co/services/sanity-development" rel="noopener noreferrer"&gt;&lt;strong&gt;Get Experts on the Job&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity Free or Paid?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity offers both options. It has a &lt;strong&gt;free plan&lt;/strong&gt; with generous limits on users, content, and API calls. For larger projects, users can purchase &lt;strong&gt;usage-based paid plans&lt;/strong&gt; that scale with their traffic, storage, and team needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is WordPress Still The Most Popular CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;​​Yes. As of 2025, &lt;a href="https://w3techs.com/technologies/overview/content_management" rel="noopener noreferrer"&gt;&lt;strong&gt;WordPress powers about 43% of all websites and holds over 60% of the CMS market share&lt;/strong&gt;&lt;/a&gt;. Its huge ecosystem of plugins, themes, and community support keeps it the most widely adopted CMS in the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Which CMS Is Better Than WordPress?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It depends on your needs. WordPress is quick to set up and affordable, making it the favorite of blogs, small businesses, and content-driven sites. Headless CMS platforms like Sanity, Contentful, or Strapi c*&lt;em&gt;an be better for projects that need multi-channel publishing and modern developer workflows&lt;/em&gt;*.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity Better Than WordPress?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity is better if you need flexibility and developer-first workflows. It also holds a &lt;a href="https://www.g2.com/products/sanity/reviews" rel="noopener noreferrer"&gt;&lt;strong&gt;4.7/5 rating&lt;/strong&gt;&lt;/a&gt; on G2, compared to &lt;a href="https://www.g2.com/products/wordpress-com/reviews" rel="noopener noreferrer"&gt;&lt;strong&gt;WordPress’s 4.4/5&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;WordPress is better if you want simplicity and speed. It’s free at its core, easy for non-technical users, and backed by a massive plugin ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Can You Self-Host Sanity CMS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity Studio is self-hostable&lt;/strong&gt;, which means you can customize and deploy the editing environment on your own servers or domain. However, its backend, &lt;strong&gt;Sanity Content Lake&lt;/strong&gt;, where all your content is stored and delivered, &lt;strong&gt;cannot be self-hosted.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity Open-Source?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity is a &lt;strong&gt;proprietary platform&lt;/strong&gt;, but some of its parts are open source. The &lt;strong&gt;Sanity Studio&lt;/strong&gt; framework is open source and customizable, and the core content infrastructure (Sanity Content Lake) is hosted and managed by Sanity.io. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/sanity-and-nextjs-for-ci-cd/" rel="noopener noreferrer"&gt;Sanity and Nextjs for CI / CD&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/why-sanity-is-the-best-cms-for-the-healthcare-industry/" rel="noopener noreferrer"&gt;Why Sanity is the Best CMS for the Healthcare Industry&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/contentful-migration/" rel="noopener noreferrer"&gt;Contentful Migration in 2025: What are the Alternatives?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/sanity-vs-contentful/" rel="noopener noreferrer"&gt;Headless CMS Guide: Sanity vs Contentful&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/top-5-best-headless-cms-platforms/" rel="noopener noreferrer"&gt;5 Best Headless CMS Platforms in 2025&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sources&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://wordpress.org/about/" rel="noopener noreferrer"&gt;About WordPress&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.sanity.io/sanity-vs-wordpress" rel="noopener noreferrer"&gt;Sanity.io: Sanity vs WordPress&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://w3techs.com/technologies/overview/content_management" rel="noopener noreferrer"&gt;Usage Statistics and Market Shares of Content Management Systems&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>wordpress</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Build a Music Streaming App with React Native</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Tue, 02 Sep 2025 08:09:24 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/how-to-build-a-music-streaming-app-with-react-native-16mf</link>
      <guid>https://dev.to/pagepro_agency/how-to-build-a-music-streaming-app-with-react-native-16mf</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Most of us use different music streaming apps daily. Spotify and YouTube Music are the most popular options, but did you know &lt;strong&gt;you can easily build a music streaming app with React Native&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;In this article, I will introduce you to &lt;strong&gt;React Native Track Player&lt;/strong&gt;, a &lt;a href="https://pagepro.co/services/react-native-development/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/a&gt; library that we can use to create a music app. It’s easy to implement, has a simple configuration, and functions that will make your music streaming application look fully professional on digital platforms.&lt;/p&gt;

&lt;p&gt;We will discuss its most important functions, &lt;strong&gt;and finally, I will demonstrate how to build a music streaming app with React Native.&lt;/strong&gt; With a little work, in terms of functionality, &lt;strong&gt;it will not differ from the top music mobile apps&lt;/strong&gt; that you can find on Google Play and the App Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;React Native Track Player&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As I mentioned earlier, the article will be devoted to the React Native Track Player package. So it’s worth explaining what it is at the very beginning. As the welcome text in the documentation says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;A fully fledged audio module created for music apps. Provides audio playback, external media controls, background mode and more!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds good, right? By using i,t &lt;strong&gt;we will create a fully functional music application that we can control&lt;/strong&gt; from the application level and externally.&lt;/p&gt;

&lt;p&gt;Since we’re talking about the React Native library, we don’t have to build separate native apps for iOS and Android, but &lt;strong&gt;one music streaming service for both of them using the same code.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Features of React Native Track Player&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimized Resource Usage:&lt;/strong&gt; Designed to use minimal resources for optimal performance for app performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-platform compatibility:&lt;/strong&gt; Works across iOS and Android platforms, aligning with the native design rules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Media Control Accessibility:&lt;/strong&gt; Let users control the application through Bluetooth devices, lock screens, notifications, smartwatches, and car systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Caching Capability:&lt;/strong&gt; Allows for the caching of media files, enabling playback when the internet connection is disrupted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Background Playback Support:&lt;/strong&gt; Continues audio playback when the app is in the background.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extensive Customization:&lt;/strong&gt; Offers customization options like customizable notification icons and lets devs tailor the UI as they want.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Native Modules&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React Native Track Player &lt;strong&gt;operates on both iOS and Android devices.&lt;/strong&gt; Underlying this compatibility are two native modules: SwiftAudioEx and KotlinAudio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/doublesymmetry/SwiftAudioEx" rel="noopener noreferrer"&gt;&lt;strong&gt;SwiftAudioEx&lt;/strong&gt;&lt;/a&gt; is dedicated to operations for iOS devices. &lt;a href="https://github.com/doublesymmetry/KotlinAudio" rel="noopener noreferrer"&gt;&lt;strong&gt;KotlinAudio&lt;/strong&gt;&lt;/a&gt; works for Android to guarantee an optimized experience on this platform.&lt;/p&gt;

&lt;p&gt;These native modules play a critical role in improving performance by using platform-specific functionalities. Specifically, &lt;strong&gt;they enable the storage of playlists in native data structures, which affects the app’s efficiency and performance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With SwiftAudioEx and KotlinAudio, React Native Track Player delivers great UX, optimizing the library’s functionalities to the core features of each platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Choose React Native Track Player?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/doublesymmetry/react-native-track-player" rel="noopener noreferrer"&gt;&lt;strong&gt;React Native Track Player&lt;/strong&gt;&lt;/a&gt; is an optimal choice for a music app because of its &lt;strong&gt;streamlined integration process and cross-platform compatibility across iOS and Android.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The newest version of React Native Track Player, &lt;a href="https://www.npmjs.com/package/react-native-track-player" rel="noopener noreferrer"&gt;&lt;strong&gt;4.1.2&lt;/strong&gt;&lt;/a&gt;, was released in August 2025. Using native modules for platform-specific functionalities means high performance, and the library’s flexibility allows for easy customization of the app’s UI and functionalities.&lt;/p&gt;

&lt;p&gt;A rich feature set, including audio playback controls, background mode support, and easy integration with external devices, &lt;strong&gt;offers efficient and optimized performance&lt;/strong&gt; while saving resources**.**&lt;/p&gt;

&lt;p&gt;Supported by extensive documentation and an active community, &lt;strong&gt;React Native Track Player is a reliable solution for creating music streaming apps in React Native.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Working with React Native Track Player has truly simplified my approach to building music streaming apps. Its efficiency and user-friendly design make it a standout choice for seamless cross-platform development. From synchronizing audio playback controls to creating immersive user experiences, this library has transformed the way I work with the apps.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;br&gt;Michal Moroz, React Native Developer at Pagepro&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Don’t have time to build a music app on your own?&lt;/strong&gt; &lt;a href="https://pagepro.co/services/react-native-development/" rel="noopener noreferrer"&gt;&lt;strong&gt;Use our experience.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Platform Support&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before making your very own music streaming app, you have to understand that compatibility across different platforms is key. That’s why in this section, we’ll &lt;strong&gt;compare the supported streaming types and casting features on both iOS and Android platforms.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Stream Types&lt;/strong&gt;
&lt;/h3&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%2Fp81b46nbcq9s657lj22g.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%2Fp81b46nbcq9s657lj22g.png" alt="Comparison chart showing streaming format support for iOS and Android when you build a music streaming app with React Native. Both platforms support regular streams. Android supports DASH and SmoothStreaming, while iOS does not. iOS supports HLS (HTTP Live Streaming), while Android also supports it." width="600" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Casting&lt;/strong&gt;
&lt;/h3&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%2Fan3l8v72ph7rcvgtr26v.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%2Fan3l8v72ph7rcvgtr26v.png" alt="Casting feature comparison for iOS and Android when you build a music streaming app with React Native. Android supports Google Cast, while iOS does not. Both platforms lack support for Miracast/DLNA and AirPlay within this setup." width="600" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Miscellaneous&lt;/strong&gt;
&lt;/h3&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%2Fjz0wq9is5qa63cjskpx9.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%2Fjz0wq9is5qa63cjskpx9.png" alt="Miscellaneous feature comparison for iOS and Android when you build a music streaming app with React Native. Both platforms support media controls and background mode. Android supports caching, while iOS does not." width="600" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;React Native Track Player functions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now we can discuss &lt;strong&gt;the most basic functions provided by the library&lt;/strong&gt;, which we will use later while building the app.&lt;/p&gt;

&lt;p&gt;If you are interested in all the events and functions provided by the library (and there are a lot of them’s quite a lot of them), be sure to check the official documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Player&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;setupPlayer(options)&lt;/td&gt;
&lt;td&gt;Setup player with options. Sample options: minBuffer, maxBuffer, maxCacheSize.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;play()&lt;/td&gt;
&lt;td&gt;Plays/resumes current track&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pause()&lt;/td&gt;
&lt;td&gt;Pause track&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stop()&lt;/td&gt;
&lt;td&gt;Stops playback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;retry()&lt;/td&gt;
&lt;td&gt;Replays the current track if it was stopped due to an error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seekBy(offset)&lt;/td&gt;
&lt;td&gt;Seeks by a relative time offset in the current track&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seekTo(seconds)&lt;/td&gt;
&lt;td&gt;Seeks current track to specified time position&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setVolume(volume)&lt;/td&gt;
&lt;td&gt;Sets the volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getVolume()&lt;/td&gt;
&lt;td&gt;Gets player volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setRate(rate)&lt;/td&gt;
&lt;td&gt;Sets the playback rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getProgress()&lt;/td&gt;
&lt;td&gt;Gets the playback progress – position, duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getPlaybackState()&lt;/td&gt;
&lt;td&gt;Gets the PlaybackState – e.g.ready, playing, paused, stopped.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getPlayWhenReady()&lt;/td&gt;
&lt;td&gt;Gets the state of playWhenReady&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Queue&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;add(tracks, insertBeforeIndex)&lt;/td&gt;
&lt;td&gt;Adds tracks to the queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;remove(tracks)&lt;/td&gt;
&lt;td&gt;Clears the current queue and adds tracks to the empty queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skip(index, initialPosition)&lt;/td&gt;
&lt;td&gt;Skips to a track in the queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipToNext(initialPosition)&lt;/td&gt;
&lt;td&gt;Skips to the next track&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipToPrevious(initialPosition)&lt;/td&gt;
&lt;td&gt;Skips to the previous track&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reset()&lt;/td&gt;
&lt;td&gt;Resets the player and clear the queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getTrack(index)&lt;/td&gt;
&lt;td&gt;Gets a track object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getActiveTrack()&lt;/td&gt;
&lt;td&gt;Gets active track object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getQueue()&lt;/td&gt;
&lt;td&gt;Gets a queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;removeUpcomingTracks()&lt;/td&gt;
&lt;td&gt;Clears upcoming tracks from the queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setRepeatMode(mode)&lt;/td&gt;
&lt;td&gt;Sets the repeat mode – Loops the current track / Repeats the whole queue / Does Not repeat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Building React Native Spotify&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since you’re familiar with React Native Track Player and its capabilities, &lt;strong&gt;let’s start with the development of our music app!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Features of Your App&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A &lt;strong&gt;fully functional music player&lt;/strong&gt; showing a sample playlist of music tracks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Core functionalities include &lt;strong&gt;play and pause controls&lt;/strong&gt; for the active song.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An &lt;strong&gt;interactive progress bar&lt;/strong&gt; illustrating the playback status of the selected track.   &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Creating A Simple Music Streaming APp&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I assume you already have a new React Native project created. If not, read &lt;a href="https://docs.expo.dev/get-started/create-a-project/" rel="noopener noreferrer"&gt;&lt;strong&gt;the official Expo documentation&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To begin, start the installation process by adding the React Native Track Player library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;yarn&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;native&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;track&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;player&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we’ll proceed by installing the progress bar package. For this scenario, we’ve opted for &lt;code&gt;@miblanchard/react-native-slider&lt;/code&gt; because of the extensive functionality and easy styling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;yarn&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;miblanchard&lt;/span&gt;&lt;span class="sr"&gt;/react-native-slide&lt;/span&gt;&lt;span class="err"&gt;r
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Add Service&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next, let’s incorporate the playback service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It’s crucial to register the playback service immediately after registering the primary React Native application component,&lt;/strong&gt; typically found in the &lt;code&gt;index.js&lt;/code&gt; file located in the project’s root directory:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IMPORTANT NOTE:&lt;/strong&gt; The configuration and components will be stored in the &lt;code&gt;src&lt;/code&gt; directory. If you don’t have one, create it or do it according to your own convention. I will add the paths to the files I used above the code.&lt;/p&gt;

&lt;p&gt;To enable background mode functionality in RN Track Player, &lt;strong&gt;we need to configure the player to sustain audio playback&lt;/strong&gt; even when the application is in the background.&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;RNTP-service.js&lt;/code&gt; file to manage this configuration.&lt;/p&gt;

&lt;p&gt;src/setup/RNTP-service.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-track-player&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RNTPService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RemotePlay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
 &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RemotePause&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the project root, create an &lt;code&gt;index.js&lt;/code&gt; file and import the service and App there.&lt;/p&gt;

&lt;p&gt;index.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;registerRootComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;expo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-track-player&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RNTPService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/setup/rntp-service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nf"&gt;registerRootComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerPlaybackService&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;RNTPService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we need to set up the player. In &lt;code&gt;App.js&lt;/code&gt; file add &lt;code&gt;setupPlayer&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;App.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SafeAreaView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;AppKilledPlaybackBehavior&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-track-player&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;setupPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setupPlayer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateOptions&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
       &lt;span class="na"&gt;android&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="na"&gt;appKilledPlaybackBehavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
           &lt;span class="nx"&gt;AppKilledPlaybackBehavior&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StopPlaybackAndRemoveNotification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="na"&gt;alwaysPauseOnInterruption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;},&lt;/span&gt;
       &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
         &lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Pause&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SkipToNext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SkipToPrevious&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SeekTo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;],&lt;/span&gt;
       &lt;span class="na"&gt;compactCapabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Pause&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
       &lt;span class="na"&gt;progressUpdateEventInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="p"&gt;})&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="nf"&gt;setupPlayer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

 &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SafeAreaView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;MUSIC&lt;/span&gt; &lt;span class="nx"&gt;APP&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;paddingHorizontal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f53340&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;textAlign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;marginTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;marginBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you’ve completed these steps, you’ll have the groundwork laid for a fully functional music player.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Add Player Playlist&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before creating the first component, create an array of songs that the music player will use.&lt;/p&gt;

&lt;p&gt;For each song, &lt;strong&gt;ensure to include a URL pointing to the audio file&lt;/strong&gt;. It could be either a file path or a direct URL.&lt;/p&gt;

&lt;p&gt;App.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tracks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;YOUR_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;01. Track 1 sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playlist sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;YOUR_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;02. Track 2 sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playlist sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;YOUR_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;03. Track 3 sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playlist sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;YOUR_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;04. Track 4 sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playlist sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;YOUR_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;05. Track 5 sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Playlist sample&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Create Track List&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the components directory, the initial addition is the &lt;code&gt;TrackList&lt;/code&gt; component. &lt;strong&gt;This component serves as a clickable list of songs.&lt;/strong&gt; Upon selecting a song, it activates the track and generates the music queue.&lt;/p&gt;

&lt;p&gt;Pay special attention to the &lt;code&gt;PlaybackActiveTrackChanged&lt;/code&gt; event and the &lt;code&gt;onTrackPress&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;App.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FlatList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Pressable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;useTrackPlayerEvents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-track-player&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TrackList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;activeTrackIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setActiveTrackIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="nf"&gt;useTrackPlayerEvents&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PlaybackActiveTrackChanged&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nf"&gt;setActiveTrackIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PlaybackActiveTrackChanged&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
     &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeTrackItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getActiveTrack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

     &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;activeTrackItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;

     &lt;span class="nf"&gt;setActiveTrackIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activeTrackItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;

 &lt;span class="nf"&gt;useTrackPlayerEvents&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PlaybackQueueEnded&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;repeatMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRepeatMode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seekTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repeatMode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;

 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onTrackPress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentTrackIndex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trackPlayerQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getQueue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sameTrackFromQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trackPlayerQueue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentTrackIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentTrack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentTrackIndex&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentTrack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;sameTrackFromQueue&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newQueue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
       &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="na"&gt;playlist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;},&lt;/span&gt;
       &lt;span class="na"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="p"&gt;}))&lt;/span&gt;

     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newQueue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentTrackIndex&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newQueue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentTrackIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentTrackIndex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FlatList&lt;/span&gt;
       &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;renderItem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt;
         &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;playlistId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
       &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isActiveTrack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;activeTrackIndex&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;

         &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt;
             &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isActiveTrack&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listItemActive&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
           &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
             &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Pressable&lt;/span&gt;
               &lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
                 &lt;span class="nf"&gt;onTrackPress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;}&lt;/span&gt;
             &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
               &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;
                 &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isActiveTrack&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textActive&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
               &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
               &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;               &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;
                 &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;
                   &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="nx"&gt;isActiveTrack&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textActive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="p"&gt;]}&lt;/span&gt;
               &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;playlistName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
               &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;             &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Pressable&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;           &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;         &lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="p"&gt;}}&lt;/span&gt;
       &lt;span class="nx"&gt;alwaysBounceVertical&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;keyExtractor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
     &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TrackList&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;listItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;paddingVertical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#E21515&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;marginBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;paddingHorizontal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;paddingVertical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;listItemActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;marginBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;textActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#E21515&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Create Player&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The final element you need is the component called player. This component will include the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Current song display&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Song timer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clickable progress bar (utilizing the &lt;code&gt;@miblanchard/react-native-slider&lt;/code&gt; package)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Play/pause button functionality&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Pressable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Slider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@miblanchard/react-native-slider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;useProgress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;usePlaybackState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;useTrackPlayerEvents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-track-player&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Dimensions&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;AudioPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useProgress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;playbackState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;usePlaybackState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsPlaying&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playbackState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Playing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;activeTrackData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setActiveTrackData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isPlayButtonDisabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsPlayButtonDisabled&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="c1"&gt;// Util for time format&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeInSeconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;minutes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeInSeconds&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeInSeconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;

 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;play&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="nf"&gt;setIsPlayButtonDisabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pause&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trackTimeProgress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;formatTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trackTimeLeft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;formatTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playbackState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Playing&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nf"&gt;setIsPlaying&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="nx"&gt;playbackState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Paused&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playbackState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stopped&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nf"&gt;setIsPlaying&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isPlaying&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;playbackState&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

 &lt;span class="nf"&gt;useTrackPlayerEvents&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PlaybackActiveTrackChanged&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PlaybackActiveTrackChanged&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
     &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;activeTrackItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getActiveTrack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

     &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;activeTrackItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;

     &lt;span class="nf"&gt;setIsPlayButtonDisabled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

     &lt;span class="nf"&gt;setActiveTrackData&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
       &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;activeTrackItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="na"&gt;playlist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;activeTrackItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playlist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="p"&gt;})&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;})&lt;/span&gt;

 &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeTrackData&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeTrack&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeTrackTitle&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeTrackData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeTrackDescription&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeTrackData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playlist&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="p"&gt;)}&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Slider&lt;/span&gt;
       &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;progressBar&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;trackStyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
         &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Dimensions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;window&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;}}&lt;/span&gt;
       &lt;span class="nx"&gt;thumbTouchSize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
       &lt;span class="nx"&gt;animationType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
       &lt;span class="nx"&gt;trackClickable&lt;/span&gt;
       &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;minimumValue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;maximumValue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;thumbTintColor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;minimumTrackTintColor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;maximumTrackTintColor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="nx"&gt;onSlidingComplete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="nx"&gt;TrackPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seekTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
       &lt;span class="p"&gt;}}&lt;/span&gt;
     &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;trackTimeProgress&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/ {trackTimeLeft&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Pressable&lt;/span&gt;
         &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPlayButtonDisabled&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
         &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isPlayButtonDisabled&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buttonDisabled&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
         &lt;span class="nx"&gt;onPress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPlaying&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;pause&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;play&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buttonText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isPlaying&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PAUSE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Pressable&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;AudioPlayer&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
 &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flex-end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f53340&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;paddingVertical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;activeTrack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;marginBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;activeTrackTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;activeTrackDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;flexDirection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;row&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;justifyContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flex-end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flex-end&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;marginBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;paddingVertical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;paddingHorizontal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;marginLeft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;buttonText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;textAlign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f53340&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;buttonDisabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;progressBar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;alignItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;center&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;marginTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;marginBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Getting it all together&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that we have the components ready, all that remains is to put everything together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the&lt;/strong&gt; &lt;code&gt;App.js&lt;/code&gt; file we import the list and player components. In addition to the components, we need to import a const containing a list of songs.&lt;/p&gt;

&lt;p&gt;App.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AudioPlayer&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/components/AudioPlayer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TrackList&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/components/TrackList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tracks&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/consts/index&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we add the components and pass the tracks array as props to the list component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SafeAreaView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;MUSIC&lt;/span&gt; &lt;span class="nx"&gt;APP&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TrackList&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;tracks&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AudioPlayer&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now you have your own music streaming app!&lt;/p&gt;

&lt;p&gt;Play around with the player’s functionalities and then add additional functions such as scrolling to the next/previous song, volume control or support for more than one playlist.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this short tutorial, &lt;strong&gt;you created a simple music player.&lt;/strong&gt; As you have noticed, the functions and events provided by React Native Track Player make our work much easier, so &lt;strong&gt;we can focus more on how the functionality should work rather than how to create it.&lt;/strong&gt; And this is only a fraction of what this music library provides us.&lt;/p&gt;

&lt;p&gt;After analysing the API, you will realize that you can create a React Native track player that supports several playlists with full control over the song being played. &lt;strong&gt;Offline support will allow you to download a few tracks to your device and play them offline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of course, you can always use the expertise of a mobile app development company to help you build a music streaming app that will work anywhere and that you will be able to monetize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need someone to build a music streaming app for you?&lt;/strong&gt; &lt;a href="https://pagepro.co/services/react-native-development/" rel="noopener noreferrer"&gt;&lt;strong&gt;Use our help&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is React Native good for building apps like Spotify or Apple Music?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes, React Native is a solid choice for building apps similar to Spotify or Apple Music. It supports cross-platform development, integrates with audio libraries like &lt;strong&gt;React Native Track Player&lt;/strong&gt;, and allows you to implement features like streaming, playlists, and background playback on both iOS and Android.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is the best library to build a music streaming app in React Native?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The most widely recommended library is &lt;strong&gt;React Native Track Player&lt;/strong&gt;. It offers cross-platform support, background playback, lock-screen controls, and now includes features like adaptive streaming (HLS, DASH) and caching for offline use. It’s actively maintained and well-suited for building production-grade music apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Does React Native Track Player support offline playback?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes, React Native Track Player supports offline playback through its &lt;strong&gt;caching feature&lt;/strong&gt;. Developers can allow users to download tracks for later listening, making it possible to enjoy music even without an internet connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How do I add background audio playback in React Native?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Background audio playback can be added using &lt;strong&gt;React Native Track Player&lt;/strong&gt;. After installing and configuring the library, you register a service that keeps playback running when the app is minimized. This setup enables media controls on the lock screen, notification area, and external devices like headphones.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read more&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/why-react-native-updates-are-important/" rel="noopener noreferrer"&gt;Why React Native Updates Are Important?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/publishing-expo-react-native-app-to-ios-and-android/" rel="noopener noreferrer"&gt;Publishing Expo React Native Apps&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/the-best-react-native-tech-stack-in-2024/" rel="noopener noreferrer"&gt;Best React Native Tech Stack&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-native-pros-and-cons/" rel="noopener noreferrer"&gt;React Native Pros and Cons For App Development&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sources&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://rntp.dev/docs/basics/getting-started" rel="noopener noreferrer"&gt;https://rntp.dev/docs/basics/getting-started&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/doublesymmetry/react-native-track-player" rel="noopener noreferrer"&gt;https://github.com/doublesymmetry/react-native-track-player&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/miblanchard/react-native-slider" rel="noopener noreferrer"&gt;https://github.com/miblanchard/react-native-slider&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mobile</category>
      <category>reactnative</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What is Next.js Framework and Why Should You Use It in 2025?</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 01 Sep 2025 06:45:13 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/what-is-nextjs-framework-and-why-should-you-use-it-in-2025-5dp6</link>
      <guid>https://dev.to/pagepro_agency/what-is-nextjs-framework-and-why-should-you-use-it-in-2025-5dp6</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Why Choose Web Development with Next.js?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In 2025, we have plenty of tools to choose from for &lt;a href="https://pagepro.co/services/reactjs-development" rel="noopener noreferrer"&gt;&lt;strong&gt;React application development&lt;/strong&gt;&lt;/a&gt;. Small startups and global brands like Spotify and Nike, more teams are &lt;strong&gt;choosing Next.js to power their web apps.&lt;/strong&gt; But what is Next.js, and what makes it stand out?&lt;/p&gt;

&lt;p&gt;Since it’s a JavaScript framework, &lt;a href="https://pagepro.co/services/nextjs-development" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/a&gt;  supports &lt;strong&gt;building performant JS web apps&lt;/strong&gt;, providing developers a familiar foundation. To show why it’s a framework worth considering for your project, I’ll discuss its core features and explore the most common &lt;strong&gt;use cases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before we do that, however, we should start with the basics.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Next.js and Why Is It Used?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Developed by Vercel, &lt;strong&gt;Next.js is built on top of React. It’s a full-stack framework, meaning it can handle both frontend and backend development tasks in a single project&lt;/strong&gt;. It has become one of the most recommended frameworks for React-based web applications.&lt;/p&gt;

&lt;p&gt;The 2025 Stack Overflow survey listed it as &lt;strong&gt;the fourth most popular among web frameworks and technologies.&lt;/strong&gt; &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%2F045oststx0cg8a6c6eax.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%2F045oststx0cg8a6c6eax.png" alt="Bar chart from the 2025 Stack Overflow Developer Survey showing the most popular web frameworks and technologies among all respondents. Node.js leads with 48.7%, followed by React (44.7%), jQuery (23.4%), and Next.js (20.8%). Other widely used tools include Express (19.9%), ASP.NET Core (19.7%), Angular (18.2%), Vue.js (17.6%), and FastAPI (14.8%). Lower-ranked but notable frameworks are Spring Boot (14.7%), Flask (14.4%), WordPress (13.6%), Django (12.6%), and Laravel (8.9%). Emerging technologies like Svelte (7.2%), Astro (4.5%), and Nuxt.js (4%) also appear, while older options like Drupal (2.2%) and AngularJS (7.2%) remain in use." width="800" height="1060"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://survey.stackoverflow.co/2025" rel="noopener noreferrer"&gt;&lt;strong&gt;Stack Overflow 2025 Developer Survey&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Versatile features, like &lt;strong&gt;server-side rendering&lt;/strong&gt; (SSR), &lt;strong&gt;incremental static regeneration&lt;/strong&gt; (ISR), and &lt;strong&gt;integrated API routes&lt;/strong&gt;, offer flexibility for React developers and NextJS teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How Next.js Works&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next.js provides a set of features (like SSR, SSG, file-based routing, and API routes) that make it &lt;strong&gt;easier and faster to build modern web applications with React&lt;/strong&gt;. You can read more about it in &lt;a href="https://nextjs.org/docs" rel="noopener noreferrer"&gt;&lt;strong&gt;the official Next.js docs&lt;/strong&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s New in Next.js 15&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://pagepro.co/blog/react-tldr/next-js-15-stable-release-is-live/" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js 15&lt;/strong&gt;&lt;/a&gt; introduced a series of transformative updates that reshaped both dev experience and production performance. Across its minor releases, the framework refined React 19 support, redefined caching behavior, stabilized experimental features, and began preparing for version 16.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React 19 Integration:&lt;/strong&gt; Started with RC support in 15.0, reaching full stable support in both App and Pages Router by 15.1. It improved hydration error handling and introduced the experimental React Compiler.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New API and Caching Semantics:&lt;/strong&gt; Request APIs (&lt;code&gt;cookies&lt;/code&gt;, &lt;code&gt;headers&lt;/code&gt;, &lt;code&gt;params&lt;/code&gt;, &lt;code&gt;searchParams&lt;/code&gt;) became asynchronous in 15.0, requiring codemod-assisted migration. Caching behavior changed as well. &lt;code&gt;GET&lt;/code&gt; route handlers and client router cache are now uncached by default, making caching an explicit choice. The &lt;code&gt;after()&lt;/code&gt; API moved from experimental (15.0) to stable (15.1), allowing tasks to run after responses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer Experience: Error handling&lt;/strong&gt; was improved by redesigning error UI and stack traces in 15.2, highlighting actual error sources and integrating React’s owner stacks. Improved debugging, new Auth utilities, navigation hooks, and better observability further elevated the DevEx in NextJS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turbopack Maturity:&lt;/strong&gt; Turbopack builds have achieved full compatibility (8,298 tests passed) and now power production sites like vercel.com.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Version 15 also includes plenty of &lt;strong&gt;experimental features&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Streaming Metadata (15.2):&lt;/strong&gt; Enables faster initial UI rendering while metadata streams in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React View Transitions API (15.2):&lt;/strong&gt; Smooth page-to-page animations under a feature flag.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Node.js Middleware Runtime:&lt;/strong&gt; Experimental in 15.2, stable by 15.5&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rspack Support (15.3):&lt;/strong&gt; A Webpack-compatible alternative build system via plugin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CacheComponents (15.4 preview of Next.js 16):&lt;/strong&gt; A unified caching layer that brings together existing cache features, &lt;code&gt;use cache&lt;/code&gt;, and partial prerendering.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next.js 15 feels like a turning point. React 19 is fully supported, caching became more predictable, and Turbopack achieved full maturiy. For us, that means less time fighting performance bottlenecks and more confidence in how apps behave at scale. Next.js is a stable tool, that still pushes innovation and creativity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Rafal Dabrowski, Next.js Expert at Pagepro&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Is Next.js a perfect fit for your project?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Contact Us&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Features of Next.js&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;NextJS is currently &lt;strong&gt;one of the most popular frameworks for&lt;/strong&gt; &lt;a href="https://pagepro.co/services/web-app-development" rel="noopener noreferrer"&gt;&lt;strong&gt;web applications&lt;/strong&gt;&lt;/a&gt;. Its advanced features made it the favorite of developers and companies alike.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hybrid Rendering
&lt;/h4&gt;

&lt;p&gt;The ability to mix Server-Side Rendering and Static Site Generation, with Client-Side Rendering (CSR) within a single application is a major perk. &lt;strong&gt;Developers can choose whether to pre-render content at build time or handle it at runtime&lt;/strong&gt;, optimizing performance, SEO, and user experience. For example, using SSG for blog posts, SSR for dynamic user dashboards, and CSR for interactive components.&lt;/p&gt;

&lt;h4&gt;
  
  
  Serverless and Edge Functions
&lt;/h4&gt;

&lt;p&gt;The framework &lt;strong&gt;supports serverless deployment&lt;/strong&gt; and edge functions, allowing devs to run code closer to users for faster response times, and limiting the need for complex server management.&lt;/p&gt;

&lt;h4&gt;
  
  
  Incremental Static Regeneration (ISR)
&lt;/h4&gt;

&lt;p&gt;ISR allows static pages to be &lt;strong&gt;updated without a full rebuild&lt;/strong&gt;, making it possible to serve up-to-date content while maintaining the speed of static generation. &lt;/p&gt;

&lt;h4&gt;
  
  
  File-Based Routing
&lt;/h4&gt;

&lt;p&gt;Next.js’s file-based routing makes it easy to create routes &lt;strong&gt;by simply adding files to the pages directory&lt;/strong&gt;. There’s no need to configure routing by hand, which reduces boilerplate code and improves maintenance.&lt;/p&gt;

&lt;h4&gt;
  
  
  API Routes
&lt;/h4&gt;

&lt;p&gt;The ability to create backend API endpoints directly within a NextJS project supports &lt;strong&gt;full-stack development without the need for separate server infrastructure&lt;/strong&gt;. You can build complex applications much easier, thanks to simplified data fetching, processing, and handling.&lt;/p&gt;

&lt;h4&gt;
  
  
  Built-In Image Optimization
&lt;/h4&gt;

&lt;p&gt;The Image component automatically optimizes images, resizing them and serving modern formats, which boosts page load. This feature saves developers from handling image optimization and unifies UX across different devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get the CTO’s Ultimate Guide to Next.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Discover the full potential of Next.js. Gain insights into advanced methodologies and real-world applications tailored for technology pioneers.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;User Experience and Search Engine Optimization in Next.js&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This framework provides features that impact both UX and SEO. Its support for SSG and SSR improves page load times, an important factor for user retention and search engine rankings.&lt;/p&gt;

&lt;p&gt;Built-in functions like image optimization and lazy loading &lt;strong&gt;improve performance across devices&lt;/strong&gt;, contributing to better UXs and reduced bounce rates. &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%2Fq0ulzbl8aomzayzafjqy.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%2Fq0ulzbl8aomzayzafjqy.png" alt="User experience benefits of using Next.js" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Moreover, the pre-rendered content from SSR &lt;strong&gt;improves visibility on search engines&lt;/strong&gt;, potentially attracting organic traffic. These capabilities allow developers to build responsive, efficient, and search-friendly applications. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Next.js Used For?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next.js can be used to build many different types of projects, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Complex Web Applications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Web Platforms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-Market Solutions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Advanced eCommerce and Retail Platforms&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SaaS Products&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interactive User Interfaces&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its capability to manage high-traffic websites has made Next.js &lt;strong&gt;a trusted choice for some of the largest companies on the market&lt;/strong&gt;, so here are 3 &lt;a href="https://pagepro.co/blog/nextjs-websites-examples/" rel="noopener noreferrer"&gt;examples of web applications built in Next.js&lt;/a&gt;:&lt;/p&gt;

&lt;h4&gt;
  
  
  Spotify
&lt;/h4&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%2Fgplbibevbb7yvq65czzb.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%2Fgplbibevbb7yvq65czzb.png" alt="Spotify Web App" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Spotify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A top music streaming service in the world, Spotify allows fans to enjoy their favourite artists anywhere they go.&lt;/p&gt;

&lt;h4&gt;
  
  
  Proofed
&lt;/h4&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%2Fgapw0ojmb5oddl8wdblu.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%2Fgapw0ojmb5oddl8wdblu.png" alt="Proofed Website" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Proofed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A professional editing and proofreading service helping individuals and businesses improve their written content. &lt;strong&gt;Their team includes experts who can provide quick turnaround times while maintaining high-quality standards&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/case-studies/proofed" rel="noopener noreferrer"&gt;&lt;strong&gt;READ CASE STUDY&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Claude AI
&lt;/h4&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%2Fp6xjhe648hk749ip9p40.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%2Fp6xjhe648hk749ip9p40.png" alt="View of the Claude AI interface." width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Claude AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI model by Anthropic, Claude generates text for tasks like answering questions and engaging in conversations. It’s one of the AI models prioritising safety and ethics. &lt;/p&gt;

&lt;h4&gt;
  
  
  Nike
&lt;/h4&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%2Fz9zwfq9fehyruauc2a83.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%2Fz9zwfq9fehyruauc2a83.png" alt="Nike Storefront" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Nike&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Known for its iconic products and innovative designs, Nike is a global leader in sportswear. The company designs, manufactures, and markets athletic footwear, apparel, and accessories appreciated by athletes from all walks of life and levels of skill.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why We Chose Next.js for Our Web Page&lt;/strong&gt;
&lt;/h3&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%2Fjmm6bk8cipu1l383q3yl.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%2Fjmm6bk8cipu1l383q3yl.png" alt="Pagepro Website" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The decision to use Next.js for our website was both strategic and practical. Search engine optimization was an important consideration since we rely on organic traffic and invest heavily in SEO. &lt;strong&gt;This framework provides the technical foundation to support those efforts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Page speed is another priority. &lt;strong&gt;The framework’s ability to deliver fast loading times enhances the UX while reinforcing our SEO strategy&lt;/strong&gt;. In terms of content management, using a modern decoupled architecture with Next.js offers us free reign over the frontend, letting our marketing team integrate tools like Storybook for dynamic content management.&lt;/p&gt;

&lt;p&gt;And let’s not forget our developers. &lt;strong&gt;They appreciate the framework for its efficiency, scalability, and active community support&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Pros and Cons of Next.js&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next.js is a great framework for building websites and apps. While it boasts many powerful features, it does have a few disadvantages. Have a look at the Next.js &lt;a href="https://pagepro.co/blog/pros-and-cons-of-nextjs/" rel="noopener noreferrer"&gt;&lt;strong&gt;pros and cons&lt;/strong&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Advantages of Next.js for Business&lt;/strong&gt;
&lt;/h3&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%2Fmk2noqw9bk26rnzpxh7z.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%2Fmk2noqw9bk26rnzpxh7z.png" alt="a graph with business benefits of using Next.js" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Scalability and Security
&lt;/h4&gt;

&lt;p&gt;Since this framework is built to handle complex, high-traffic websites and applications, &lt;strong&gt;it’s great for businesses that require scalable and highly customizable solutions&lt;/strong&gt;. It also addresses key security concerns, such as authentication and data validation, ensuring user trust and data integrity.&lt;/p&gt;

&lt;h4&gt;
  
  
  Performance Optimization
&lt;/h4&gt;

&lt;p&gt;Next.js boosts performance with features like lazy loading, image optimization, automatic code splitting, and route prefetching, &lt;strong&gt;ensuring faster load times and a better UX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One of our clients, an e-learning platform, migrated from an outdated Drupal tech stack to Next.js and Sanity with our help. This transition resulted in significant performance improvements and enhanced security.&lt;/p&gt;

&lt;p&gt;Learn Squared - &lt;strong&gt;Boosting the Performance of e-Learning Platform with Next.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/case-studies/learn-squared" rel="noopener noreferrer"&gt;&lt;strong&gt;READ CASE STUDY&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Faster Time to Market
&lt;/h4&gt;

&lt;p&gt;The framework speeds up development with pre-built components. It’s &lt;strong&gt;ideal for building MVPs quickly and efficiently&lt;/strong&gt;, reducing time and cost to market.&lt;/p&gt;

&lt;h4&gt;
  
  
  Improved User Experience and Increased Traffic
&lt;/h4&gt;

&lt;p&gt;This React framework allows businesses to create customized, fast, and lightweight static sites that align with their design vision and goals. As these sites are SEO-friendly, &lt;strong&gt;they improve search rankings and drive organic traffic&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Omnichannel Presence
&lt;/h4&gt;

&lt;p&gt;Next.js also ensures accessibility across all devices, resulting in an omnichannel presence. &lt;strong&gt;Fast load times and an enhanced UX contribute to higher conversion rates, as satisfied users are more likely to return and engage.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The universal compatibility of Next.js ensures modern web solutions function flawlessly across all devices, broadening customer reach and accessibility. We’ve seen improvements in conversion rates and performance since adopting Next.js&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;cite&gt;Jakub Dakowicz, CTO at Pagepro&lt;/cite&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Cost Efficiency
&lt;/h4&gt;

&lt;p&gt;Hosting on Vercel not only helps your apps and websites keep stellar performance but also lowers costs. &lt;strong&gt;It’s all due to the integration between Next.js and the hosting environment.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  AI Integration
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Next.js allows devs to incorporate advanced AI technologies&lt;/strong&gt; into their applications through built-in support for the Vercel AI SDK.&lt;/p&gt;

&lt;h4&gt;
  
  
  Unified Full-Stack Development
&lt;/h4&gt;

&lt;p&gt;This technology offers comprehensive full-stack capabilities, streamlining development by building entire applications with a single, unified framework. &lt;strong&gt;It reduces the need for multiple tools&lt;/strong&gt;, which improves efficiency and developer experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rich Ecosystem
&lt;/h4&gt;

&lt;p&gt;This framework benefits from a strong ecosystem, &lt;strong&gt;supported by companies like Vercel and Meta&lt;/strong&gt;, with a large, active community. Developers can easily access resources, plugins, and a vast talent pool, making it easier to recruit and share knowledge.&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%2Fy4nlo77nc7ajzoa0s78r.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%2Fy4nlo77nc7ajzoa0s78r.png" alt="Screenshot of Next.js reviews on G2 showing a 4.9 out of 5 star rating based on 5 reviews. All reviewers gave Next.js 5 stars. Listed pros include ease of use (2 mentions), components (1), comprehensive features (1), development speed (1), and overall features (1). Reported cons include difficult setup (1), error handling (1), learning curve (1), poor customer support (1), and time-consuming (1)." width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js on&lt;/strong&gt; &lt;a href="https://www.g2.com/products/next-js/reviews" rel="noopener noreferrer"&gt;&lt;strong&gt;G2&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are the Downsides of Next.js?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While very versatile and performance-friendly, building with NextJS comes with a few roadblocks. Here are some of the potential issues to consider before implementing it in your tech stack. &lt;/p&gt;

&lt;h4&gt;
  
  
  Development and Management
&lt;/h4&gt;

&lt;p&gt;The flexibility offered by Next has its cost – continuous management. To make all desired changes properly, you will need a dedicated person, familiar with the system, to manage it. The good news is that &lt;strong&gt;this person doesn’t have to be a developer&lt;/strong&gt;!&lt;/p&gt;

&lt;h4&gt;
  
  
  Ongoing Cost 
&lt;/h4&gt;

&lt;p&gt;Since Next.js does not provide many built-in front pages, &lt;strong&gt;you have to create one yourself&lt;/strong&gt;. The frontend will require changes or updates from time to time, meaning you’ll have to hire a dedicated dev to get the job done.&lt;/p&gt;

&lt;h4&gt;
  
  
  No Built-In State Management
&lt;/h4&gt;

&lt;p&gt;Like many frameworks, it does not include built-in state management. &lt;strong&gt;Developers can integrate popular solutions like Redux, MobX, or React’s Context API to handle state the way they want.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Get Started with NextJS Framework&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next.js is a versatile framework that &lt;strong&gt;balances flexibility and scalability&lt;/strong&gt;. Its features make the framework ideal for a variety of projects, from simple static sites to complex web applications. &lt;/p&gt;

&lt;p&gt;It simplifies development with easy setup, great performance optimizations, like React compatibility, and integrated tools, all while ensuring excellent SEO benefits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js applications and websites are a great investment into future of your project&lt;/strong&gt;. Established companies like Spotify, Anthropic, Nike, and Proofed have leveraged NextJS’ capabilities, proving its value for developers and businesses both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to start a new project with Next.js?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Contact Us&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is Next.js?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next.js is a &lt;strong&gt;React framework&lt;/strong&gt; that adds features like server-side rendering, static site generation, and file-based routing. It helps developers build fast, SEO-friendly, and scalable applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Next.js Better than React?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React is a library for building UI components, while Next.js is a framework built on top of it. Next.js is often better for production apps because it includes routing, rendering options, and performance optimizations out of the box.&lt;/p&gt;

&lt;p&gt;Our article &lt;a href="https://pagepro.co/blog/next-js-vs-react/" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js vs React&lt;/strong&gt;&lt;/a&gt; talks more about choosing between the two solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;When Should Next.js Be Used?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Next.js is best for projects where speed, scalability, and SEO matter. It’s also worth considering for e-commerce, SaaS products, content-heavy sites, and dashboards.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Next.js a Coding Language?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No, Next.js is not a coding language. It’s a framework built on top of JavaScript (and optionally TypeScript). You still write code in JavaScript/TypeScript, but Next.js provides structure and performance features.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Next.js Frontend or Backend?&lt;/strong&gt; 
&lt;/h3&gt;

&lt;p&gt;Next.js is mainly a frontend framework, but it also supports backend tasks like API routes and server-side rendering. It can function like a full-stack framework in many projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Does Next.js Require a Backend?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Not always. You can build static sites in Next.js without a backend, or add one if your app needs dynamic data, authentication, or database connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Next.js Worth Learning in 2025?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes, Next.js remains one of the most popular React frameworks, widely used by startups and enterprises. Its strong community, frequent updates, and demand in the job market make it a valuable asset in 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/astro-nextjs/" rel="noopener noreferrer"&gt;Astro vs Next.js&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/next-js-vs-react/" rel="noopener noreferrer"&gt;Next.js vs React&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/nextjs-vs-gatsbyjs-comparison/" rel="noopener noreferrer"&gt;Next JS vs Gatsby JS&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/how-can-next-js-improve-ux-in-ecommerce/" rel="noopener noreferrer"&gt;How Can Next.js Improve UX in eCommerce?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/benefits-of-next-js/" rel="noopener noreferrer"&gt;Benefits of Next JS for Building Websites and Apps&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/how-to-use-next-js-static-site-generator/" rel="noopener noreferrer"&gt;How To Use Next.js as a Static Site Generator&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/5-lessons-for-next-js-performance-optimization-in-large-projects/" rel="noopener noreferrer"&gt;5 Lessons for Next js Performance Optimization in Large Projects&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sources&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://survey.stackoverflow.co/2025/technology/" rel="noopener noreferrer"&gt;Stack Overflow 2025 Survey&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://nextjs.org/blog/next-15-5" rel="noopener noreferrer"&gt;Next.js 15.5&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://nextjs.org/showcase" rel="noopener noreferrer"&gt;Next.js Showcase&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Headless CMS Guide: Sanity vs Contentful</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Thu, 14 Aug 2025 12:30:00 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/headless-cms-guide-sanity-vs-contentful-g6f</link>
      <guid>https://dev.to/pagepro_agency/headless-cms-guide-sanity-vs-contentful-g6f</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;How to Pick the Right CMS in 2025?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When it comes to content solutions, two of the most popular picks in 2025 are &lt;strong&gt;Sanity vs Contentful&lt;/strong&gt;. Both are headless, API-driven platforms, but they differ in flexibility, pricing, and how much control they give you. &lt;/p&gt;

&lt;p&gt;Picking the right CMS solution starts with knowing your team’s needs. &lt;strong&gt;There is a difference in how developers want to work and the kind of editing experience content teams expect&lt;/strong&gt;. At the same time, you have to consider how the future platform might scale with your website, if it’s within the budget.. The list goes on. &lt;/p&gt;

&lt;p&gt;For those trying to choose between &lt;strong&gt;Contentful and Sanity&lt;/strong&gt;, we’ve prepared a quick comparison of both. Let’s find out which is the better choice for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Features of Contentful vs Sanity&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Contentful&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Content Operating System offering schema-as-code flexibility and real-time content collaboration.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;A headless CMS with a structured, UI-first approach.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;G2 Rating&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;a rel="noreferrer noopener nofollow" href="https://www.g2.com/products/sanity/reviews"&gt;4.7/5&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;a rel="noreferrer noopener nofollow" href="https://www.g2.com/products/contentful/reviews"&gt;4.2/5&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Developer Experience&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Sequential editorial workflows with a clear structure.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Models created via UI or migration scripts. Less flexibility but faster setup for non-technical teams.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Collaborative Editing&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Real-time edits and live updates.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Studio is fully customizable via React and the structure builder.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Querying &amp;amp; API&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;GROQ (proprietary and highly flexible) plus REST and GraphQL.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Supports REST and GraphQL.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Customization &amp;amp; UI&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Studio is fully customizable via React and structure builder.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Limited UI customization. Offers an App Framework.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Optimized for low-latency, real-time updates. Uses distributed Content Lake, with optional CDN layer.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Contentful offers enterprise-grade performance with global CDN, 99.99% uptime SLA, handles massive API volumes.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Ecosystem&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Open-source ecosystem with strong developer engagement.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Marketplace with a large partner network and extensive integrations.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Pricing Model&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Sanity offers usage-based pricing, flexible for smaller projects.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Fixed-tier pricing that may become costly with scale.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Developer-led teams seeking flexibility, real-time content workflows, and custom UIs.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Teams needing structure, enterprise governance, and predictable scaling.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;PUMA, Morning Brew, Cloudflare&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;KFC, BMW, Notion&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Have questions about Headless CMS Solutions?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Ask our experts&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity: Content Operating System&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As a Content Operating System, &lt;a href="https://pagepro.co/blog/what-is-sanity/" rel="noopener noreferrer"&gt;&lt;strong&gt;Sanity&lt;/strong&gt;&lt;/a&gt; gives developers &lt;strong&gt;complete control over how content is structured&lt;/strong&gt;, edited, and delivered. Unlike CMSs with rigid, UI-driven models, Sanity stores content as structured data defined entirely in code. The content model can evolve alongside the product without fighting platform limitations, and it works seamlessly with frontend solutions like &lt;a href="https://pagepro.co/services/nextjs-development/" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Many frontend developers like that Sanity’s schema-as-code fits right into their version control workflow, so content model changes are tracked and reviewed just like any other part of the codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Rafał Dąbrowski, Pagepro Developer&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sanity is a leader in the headless CMS industry. It’s aimed at teams that want &lt;strong&gt;real-time collaboration and the ability to tailor the editing environment&lt;/strong&gt; to their needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sanity Core Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Schema-as-code,&lt;/strong&gt; which lets you define your entire content structure in JavaScript or TypeScript.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sanity Studio&lt;/strong&gt;, a highly customizable, open-source editing environment built with React.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time editing for multiple users&lt;/strong&gt;. They can edit the same document simultaneously, with changes synced instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content Lake&lt;/strong&gt;, a cloud-hosted datastore that delivers content updates in milliseconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GROQ query language&lt;/strong&gt; with a powerful, flexible syntax for fetching exactly the data you need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build or install plugins&lt;/strong&gt; for workflows, integrations, and custom field types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built-in image CDN&lt;/strong&gt; with automatic transformations and optimization.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2F7310dmpsm373ama4292g.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%2F7310dmpsm373ama4292g.png" alt="G2 rating summary for Sanity, showing customer satisfaction scores, feature evaluations, and user reviews for the content platform." width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Sanity on&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://www.g2.com/products/sanity/reviews" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;G2&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Pros of Sanity&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Flexibility
&lt;/h4&gt;

&lt;p&gt;Because the schema is defined in code, &lt;strong&gt;developers can model and manage content&lt;/strong&gt; exactly as they need it without working around a UI’s constraints.&lt;/p&gt;

&lt;h4&gt;
  
  
  Real-Time Collaboration
&lt;/h4&gt;

&lt;p&gt;Editors see changes instantly, making it easier to &lt;strong&gt;work without overwriting&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fully Customizable Studio
&lt;/h4&gt;

&lt;p&gt;You can &lt;strong&gt;adapt the editing interface&lt;/strong&gt; to match the project’s needs and add custom input components.&lt;/p&gt;

&lt;h4&gt;
  
  
  Version Control for Content Models
&lt;/h4&gt;

&lt;p&gt;Since schemas live in your codebase, they &lt;strong&gt;can be tracked, reviewed, and deployed&lt;/strong&gt; like any other part of the application.&lt;/p&gt;

&lt;h4&gt;
  
  
  Performance
&lt;/h4&gt;

&lt;p&gt;Content Lake &lt;strong&gt;delivers low-latency data and supports live updates&lt;/strong&gt; to the front end.&lt;/p&gt;

&lt;h4&gt;
  
  
  Plugin Ecosystem
&lt;/h4&gt;

&lt;p&gt;Growing &lt;strong&gt;library of official and community plugins&lt;/strong&gt; for analytics, localization, e-commerce, and workflow enhancements.&lt;/p&gt;

&lt;h4&gt;
  
  
  Generous Free Tier
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Suitable for prototypes or small sites&lt;/strong&gt; before scaling up to paid usage.&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%2F7g5le0gzk3hqhjp4hw9z.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%2F7g5le0gzk3hqhjp4hw9z.png" alt="Sanity vs Contentful: Visual summary of Sanity’s pros and cons, featuring strengths like real-time collaboration and customizable studio, alongside challenges like developer setup requirements." width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Cons of Sanity&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Steeper Setup for Non-Developers
&lt;/h4&gt;

&lt;p&gt;Without a developer to define schemas, the content platform has &lt;strong&gt;no ready-to-use structure&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Learning Curve for GROQ
&lt;/h4&gt;

&lt;p&gt;While powerful, Sanity’s proprietary query language &lt;strong&gt;isn’t as widely known as GraphQ&lt;/strong&gt;L, so teams need time to get up to speed.&lt;/p&gt;

&lt;h4&gt;
  
  
  Usage-Based Pricing
&lt;/h4&gt;

&lt;p&gt;Sanity &lt;strong&gt;costs can spike if you have high traffic&lt;/strong&gt;, many API requests, or large amounts of stored data.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fewer Turnkey Integrations 
&lt;/h4&gt;

&lt;p&gt;While the plugin ecosystem is growing, &lt;strong&gt;it’s smaller than Contentful’s&lt;/strong&gt; established marketplace.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is Sanity.io Used For?&lt;/strong&gt;
&lt;/h3&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%2Feqwhoen6fkxmeyhap22s.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%2Feqwhoen6fkxmeyhap22s.png" alt="PUMA's site, made with Sanity" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Sanity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sanity is widely &lt;a href="https://pagepro.co/blog/best-use-cases-of-sanity/" rel="noopener noreferrer"&gt;&lt;strong&gt;used for projects&lt;/strong&gt;&lt;/a&gt; where content complexity and flexibility are essential:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-platform content delivery&lt;/strong&gt; to push content to websites, apps, and in-store displays from a single source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom editorial workflows&lt;/strong&gt; and matching a brand’s content process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sites that need collaborative publishing&lt;/strong&gt;, live dashboards, or apps where content changes need to appear instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Design- and content-rich sites&lt;/strong&gt; that need a CMS to adapt to unique layouts or structures.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well-known brands like &lt;a href="https://www.sanity.io/customers/puma" rel="noopener noreferrer"&gt;&lt;strong&gt;PUMA&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.sanity.io/customers/morning-brew" rel="noopener noreferrer"&gt;&lt;strong&gt;Morning Brew&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://www.sanity.io/customers/cloudflare" rel="noopener noreferrer"&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/a&gt; have used Sanity for projects that require both creative freedom and scalable performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity Development for UK’s Top Insurance Company -&lt;/strong&gt; &lt;a href="https://pagepro.co/case-studies/toolbox" rel="noopener noreferrer"&gt;&lt;strong&gt;READ CASE STUDY&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Contentful: Headless CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Contentful is a cloud-native, API-first &lt;a href="https://pagepro.co/blog/what-is-headless-cms/" rel="noopener noreferrer"&gt;&lt;strong&gt;headless CMS&lt;/strong&gt;&lt;/a&gt;, sometimes referred to as a “&lt;strong&gt;composable content platform&lt;/strong&gt;”. It decouples content storage from presentation, offering content as JSON data via REST or GraphQL APIs. &lt;/p&gt;

&lt;p&gt;This architecture makes it flexible and channel-agnostic, ideal for modern omnichannel publishing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Contentful Core Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API-first architecture&lt;/strong&gt; with REST and GraphQL endpoints for content delivery.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured content modelling&lt;/strong&gt; for defining content types, fields, and relationships.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Role-based permissions&lt;/strong&gt; for editorial governance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content versioning&lt;/strong&gt; with history and rollback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;App Framework and Marketplace&lt;/strong&gt; for integrations with analytics, e-commerce, translation, and marketing tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global CDN&lt;/strong&gt; for fast content delivery worldwide.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fj6citz75yl8kku2g6fm7.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%2Fj6citz75yl8kku2g6fm7.png" alt="Contenful's rating on G2" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Contentful on&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://www.g2.com/products/contentful/reviews" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;G2&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Pros of Contentful&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Contentful has become a go-to choice for many enterprises because it blends t*&lt;em&gt;he stability of a mature platform with the flexibility of a headless setup&lt;/em&gt;*. Its features are built to support large teams and high-traffic projects.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reliability
&lt;/h4&gt;

&lt;p&gt;Contentful is known for &lt;strong&gt;uptime and stability&lt;/strong&gt;, backed by SLAs and global CDN infrastructure.&lt;/p&gt;

&lt;h4&gt;
  
  
  Predictable Workflows
&lt;/h4&gt;

&lt;p&gt;A structured, UI-driven content model is &lt;strong&gt;easy for non-technical editors and marketers&lt;/strong&gt; to follow, reducing errors in large teams.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integrated Ecosystem
&lt;/h4&gt;

&lt;p&gt;The App Marketplace and strong partner network make it &lt;strong&gt;straightforward to connect with third-party services&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Omnichannel
&lt;/h4&gt;

&lt;p&gt;The API-first approach lets you &lt;strong&gt;push the same content to multiple platforms&lt;/strong&gt; easily.&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%2F4q054mep0eyz93376yka.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%2F4q054mep0eyz93376yka.png" alt="Visual summary of Contentful’s pros and cons, highlighting benefits like enterprise reliability and drawbacks such as limited flexibility and API rate limits." width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Cons of Contentful&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Contentful is a great option if you’re &lt;strong&gt;looking for reliability and governance&lt;/strong&gt;, but it has some significant trade-offs:&lt;/p&gt;

&lt;h4&gt;
  
  
  Rigid Content Modelling
&lt;/h4&gt;

&lt;p&gt;The structured approach is great for governance but &lt;strong&gt;can feel inflexible when requirements change&lt;/strong&gt;. For example, introducing a new nested relationship or restructuring content types often requires multiple migration scripts and extensive testing.&lt;/p&gt;

&lt;h4&gt;
  
  
  Limited Previews
&lt;/h4&gt;

&lt;p&gt;Out of the box, &lt;strong&gt;Contentful doesn’t offer a true real-time preview&lt;/strong&gt;. Editors may need to publish or set up complex preview environments to see how changes look, which slows feedback loops.&lt;/p&gt;

&lt;h4&gt;
  
  
  Workflow Gaps
&lt;/h4&gt;

&lt;p&gt;There’s &lt;strong&gt;no built-in real-time collaborative editing&lt;/strong&gt; (like Google Docs or Sanity’s live editing). Two people editing the same entry risk overwriting each other’s changes.&lt;/p&gt;

&lt;h4&gt;
  
  
  API Rate Limits
&lt;/h4&gt;

&lt;p&gt;Build processes, especially in static site generators or large migrations, &lt;strong&gt;can hit rate limits&lt;/strong&gt;. On busy projects, this can cause delays unless you move to a higher-cost plan.&lt;/p&gt;

&lt;h4&gt;
  
  
  High Scaling Costs
&lt;/h4&gt;

&lt;p&gt;Contentful pricing is tiered by users, locales, and content types. &lt;strong&gt;A project might start affordably but become expensive&lt;/strong&gt; as you add editorial staff, expand into multiple regions, or store more entries.&lt;/p&gt;

&lt;h4&gt;
  
  
  Learning Curve
&lt;/h4&gt;

&lt;p&gt;While editors can pick up the UI quickly, &lt;strong&gt;developers must learn Contentful’s specific APIs&lt;/strong&gt;, content modelling patterns, and migration tooling, which adds onboarding time.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Which Companies Use Contentful?&lt;/strong&gt;
&lt;/h3&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%2Fwt5r8xibmg4ibav543cg.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%2Fwt5r8xibmg4ibav543cg.png" alt="Screenshot from Contentful’s official website featuring KFC as one of the well-known brands using the Contentful headless CMS." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Contentful&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contentful is often chosen for projects where &lt;strong&gt;structured governance, scalability, and predictable workflows&lt;/strong&gt; are more important than extreme flexibility. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise-scale websites&lt;/strong&gt; that need strict content structures and localization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-channel publishing&lt;/strong&gt; to deliver consistent content across websites, mobile apps, kiosks, and other digital touchpoints.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Marketing and campaign sites&lt;/strong&gt; where content needs to be updated quickly without involving developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Global brand platforms&lt;/strong&gt; maintain brand consistency across regions with role-based permissions and approval workflows.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;High-profile organisations, like &lt;a href="https://www.contentful.com/case-studies/kfc-global/" rel="noopener noreferrer"&gt;&lt;strong&gt;KFC&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.contentful.com/case-studies/bmw-tmwx/" rel="noopener noreferrer"&gt;&lt;strong&gt;BMW&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://www.contentful.com/case-studies/notion/" rel="noopener noreferrer"&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/a&gt;, rely on Contentful for enterprise-scale and multi-platform content delivery. However, many teams are &lt;a href="https://pagepro.co/blog/contentful-mig" rel="noopener noreferrer"&gt;&lt;strong&gt;migrating from Contentful&lt;/strong&gt;&lt;/a&gt; due to its high costs and rigid architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is the Difference Between Contentful and Sanity?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Both Contentful and Sanity are API-first, headless platforms&lt;/strong&gt;. However, they approach content management very differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contentful takes a UI-first, structured approach&lt;/strong&gt;. You model content types within its dashboard, define fields through the interface, and let non-technical editors work within a predictable, governed environment. This way, onboarding is much easier for large teams and helps to keep content consistent across regions and channels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanity, on the other hand, is schema-as-code from the ground up&lt;/strong&gt;. Content models live in the codebase, so developers have complete control over the structure. Studio editing environment in Sanity is open-source and fully configurable. The real-time collaboration feature means multiple editors can work on the same content simultaneously without conflicts.&lt;/p&gt;

&lt;p&gt;The result is that Contentful often appeals to &lt;strong&gt;enterprises that need predictability&lt;/strong&gt; and a ready-made editorial interface. Sanity is well-liked by developer and editorial teams looking for flexibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity vs Contentful Pricing&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s the Cost of Sanity?&lt;/strong&gt;
&lt;/h3&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%2F8sgxb4u3slp7sortsmd6.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%2F8sgxb4u3slp7sortsmd6.png" alt="Sanity pricing table comparing the Free, Team, Business, and Enterprise plans, including limits on usage, API calls, and customization features." width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.sanity.io/pricing" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Sanity Pricing&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;&lt;em&gt;as of August 2025&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Paid Plans in Sanity
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Growth: $15/seat/month&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Up to 50 seats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;5 roles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Private/public datasets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comments, tasks, and content releases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI Assist features&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Higher limits for API requests, bandwidth, and assets (overages billed separately)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Enterprise: Custom pricing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Unlimited seats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Advanced access control and governance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSO, SLAs, dedicated support, onboarding, and training&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Media library add-ons and extended retention options&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Is Sanity Free?
&lt;/h4&gt;

&lt;p&gt;Yes, &lt;strong&gt;Sanity has a free tier&lt;/strong&gt;. It includes full access to the Studio, schema-as-code modeling, and real-time features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Up to 20 user seats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2 roles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2 datasets (public)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unlimited content types/locales&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Real-time collaboration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic compute, API, and asset limits&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s generous enough for &lt;strong&gt;prototypes, internal tools, or small sites&lt;/strong&gt; before upgrading to Growth or Enterprise.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How Much Does Contentful Cost?&lt;/strong&gt;
&lt;/h3&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%2Fovx24se22embnv03gy5f.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%2Fovx24se22embnv03gy5f.png" alt="Contentful pricing table showing Free, Lite, and Premium tiers with details on users, API limits, bandwidth, and key included features." width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.contentful.com/pricing/" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Contentful Pricing&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;&lt;em&gt;as of August 2025&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contentful uses a &lt;strong&gt;tiered pricing model&lt;/strong&gt; with clear limits at each level.&lt;/p&gt;

&lt;h4&gt;
  
  
  Paid Tiers in Contentful
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Lite: $300/Month&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;20 users, 3 roles, 3 locales&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1M API calls/month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;100 GB/month CDN bandwidth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comments &amp;amp; task management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scheduled publishing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Live collaboration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 Starter Space (with option to add 1 Lite Space)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Premium: Custom pricing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Everything in Lite, and a few more features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Custom users, roles, and locales&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unlimited API calls/month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom CDN bandwidth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced governance, compliance, and security&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Up to 99.99% uptime SLA&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dedicated customer success and 24/7 support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unlimited Spaces and advanced features (e.g., Personalization, Studio, AI Actions)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Is There a Free Version of Contentful?
&lt;/h4&gt;

&lt;p&gt;Yes. &lt;strong&gt;Contentful’s free plan is suitable for learning, prototyping, or very small sites&lt;/strong&gt;. Most production projects with multiple locales, higher traffic, or more complex workflows will need to move to Lite or Premium. It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;10 users, 2 roles, 2 locales&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;100K API calls/month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;50 GB/month CDN bandwidth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Structured content, developer tools, and editorial experience&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 Starter Space&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pricing Comparison Table&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Contentful&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;– 20 seats&lt;br&gt;– 2 roles&lt;br&gt;– 2 public datasets&lt;br&gt;– Unlimited content types/locales&lt;br&gt;– Real-time collaboration&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;– 10 users&lt;br&gt;– 2 roles&lt;br&gt;– 2 locales100K API calls/mo&lt;br&gt;– 50 GB CDN&lt;br&gt;– 1 Starter Space&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Mid-Tier&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;– $15/seat/mo&lt;br&gt;– Up to 50 seats&lt;br&gt;– 5 roles&lt;br&gt;– Private/public datasets&lt;br&gt;– Comments&lt;br&gt;– Tasks&lt;br&gt;– Content releases&lt;br&gt;– AI Assist&lt;br&gt;– Usage-based overages&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;– $300/mo&lt;br&gt;– 20 users&lt;br&gt;– 3 roles&lt;br&gt;– 3 locales&lt;br&gt;– 1M API calls/mo&lt;br&gt;– 100 GB CDN&lt;br&gt;– Comments&lt;br&gt;– Scheduled publishing&lt;br&gt;– Live collaboration&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;– Custom pricing&lt;br&gt;– Unlimited seats&lt;br&gt;– Advanced access control SSO&lt;br&gt;– SLAs&lt;br&gt;– Dedicated onboarding/support&lt;br&gt;– Media library add-ons&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;– Custom pricing&lt;br&gt;– Unlimited API calls&lt;br&gt;– Custom bandwidth&lt;br&gt;– Unlimited Spaces&lt;br&gt;– Advanced governance&lt;br&gt;– 24/7 support&lt;br&gt;– Up to 99.99% SLA&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Pricing Model&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Seat-based pricing + usage-based add-ons&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Fixed-tier pricing with defined limits&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Flexible scaling, custom workflows, collaborative editing&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Predictable budgets, strict governance, enterprise-scale delivery&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Pricing as of August 2025&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity vs Contentful: Choosing the Right Option&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Both Sanity and Contentful are capable, modern platforms; &lt;strong&gt;the better choice comes down to your team’s needs&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pick Sanity if…&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Full control over content structure through schema-as-code is important.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Real-time collaboration between editors is a core requirement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A fully customizable editing environment is needed to match unique workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flexible, usage-based pricing is preferred for smaller projects with room to scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The content model is complex or expected to change frequently.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Choose Contentful if…&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A ready-to-use, structured editorial environment will speed up adoption for non-technical users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Predictable pricing and defined limits outweigh the need for deep customization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Large, distributed teams rely on strict governance, roles, and approval workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enterprise-grade reliability, global content delivery, and strong SLAs are top priorities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A wide ecosystem of integrations and proven enterprise deployments is essential.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, &lt;strong&gt;Sanity&lt;/strong&gt; shines when flexibility, customization, and live collaboration matter most, while &lt;strong&gt;Contentful&lt;/strong&gt; excels in structured governance, predictable workflows, and enterprise scalability.&lt;/p&gt;

&lt;p&gt;Did you choose Sanity over Contentful? Our development team &lt;strong&gt;can design, customize, and launch a solution tailored to your needs&lt;/strong&gt;. &lt;a href="https://pagepro.co/services/sanity-development" rel="noopener noreferrer"&gt;&lt;strong&gt;Learn more about our Sanity development services&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity vs Contetnful FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Kind of CMS is Contentful?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Contentful is a headless CMS&lt;/strong&gt;. It stores content in a structured way and delivers it through APIs, allowing developers to use any technology to display that content on websites, apps, or other digital platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Which CMS is Better, Sanity or Contentful?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity is &lt;strong&gt;ideal for developer-led projects&lt;/strong&gt; that need flexibility, real-time collaboration, and a fully customizable editing experience. Contentful &lt;strong&gt;works best for larger teams&lt;/strong&gt; that value a ready-to-use interface, structured governance, and predictable pricing. Both are powerful headless CMS platforms, but the right one for you comes down to &lt;strong&gt;workflow preferences, budget, and long-term scalability&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is a Headless CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A headless CMS &lt;strong&gt;separates the content management back end from the front-end presentation&lt;/strong&gt;. Content is created and stored in the CMS, then delivered via an API to any channel.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity a CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity is a Content Operating System&lt;/strong&gt;. It offers more customization, real-time collaboration, and schema-as-code content modeling than traditional CMS options.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s the Difference Between Headless CMS and Content Operating System?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A headless CMS solution &lt;strong&gt;focuses on storing and delivering content via APIs&lt;/strong&gt;. A Content Operating System, like Sanity, does that too but &lt;strong&gt;adds deeper customization&lt;/strong&gt;, real-time collaboration, and the ability to fully control the content model and editing environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity CMS Open-Source?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity Studio, the editing interface, is open source&lt;/strong&gt; and can be customized or extended by developers. The hosted Content Lake (where your content is stored and delivered) is not open source.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why is Contentful So Expensive?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Contentful can become costly because &lt;strong&gt;pricing increases with the number of users, locales, API calls, and content spaces&lt;/strong&gt;. Enterprise plans also include advanced features, SLAs, and dedicated support, which add to the price.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/why-sanity-is-the-best-cms-for-the-healthcare-industry/" rel="noopener noreferrer"&gt;Why Sanity is the Best CMS for the Healthcare Industry&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/sanity-spring-release-2025-6-ways-sanity-empowers-teams/" rel="noopener noreferrer"&gt;Sanity Spring Release 2025: 6 Ways Sanity Empowers Teams&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/top-5-best-headless-cms-platforms/" rel="noopener noreferrer"&gt;Top 5 Best Headless CMS Platforms&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/sanity-and-nextjs-for-ci-cd/" rel="noopener noreferrer"&gt;Sanity and Nextjs for CI / CD&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>sanity</category>
      <category>contentful</category>
      <category>programming</category>
    </item>
    <item>
      <title>Contentful Migration in 2025: What are the Alternatives?</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 28 Jul 2025 13:20:25 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/contentful-migration-in-2025-what-are-the-alternatives-3ep2</link>
      <guid>https://dev.to/pagepro_agency/contentful-migration-in-2025-what-are-the-alternatives-3ep2</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Why Teams Are Migrating from Contentful&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When one of our clients first approached us about Contentful migration, their dev team had just spent weeks &lt;strong&gt;untangling a React component spanning over 500 lines&lt;/strong&gt;. Why? To get rich text to render properly. &lt;/p&gt;

&lt;p&gt;That was only one of their problems. Previewing content wasn’t possible without publishing it. Updating the schema meant &lt;strong&gt;rewriting GraphQL fragments across 70+ files&lt;/strong&gt;. To make matters worse, &lt;strong&gt;they had already outgrown the 25 content type limit&lt;/strong&gt; and were paying extra for every new user and environment.&lt;/p&gt;

&lt;p&gt;Their story isn’t unique. &lt;strong&gt;For many mid-sized teams,&lt;/strong&gt; &lt;strong&gt;Contentful migration is no longer a question of if, but when&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The good news is, if you’re looking for an alternative to Contentful or planning a full CMS migration, &lt;strong&gt;you have plenty of choices&lt;/strong&gt;. Modern content management tools offer clear editorial UX and easy integration with frameworks like &lt;a href="https://pagepro.co/services/nextjs-development" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;To help you pick the best candidate for your CMS migration, we’ve prepared a list of recommendations. All of them were chosen based on our experience and &lt;strong&gt;how easy they are to work with&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Migrate from Contentful?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Contentful can be a great choice for some teams, but &lt;strong&gt;problems begin as they start to gro&lt;/strong&gt;w.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The costs scale with usage:&lt;/strong&gt; Contentful pricing is based on users, environments, and content types. Teams expanding their size or adding staging layers will quickly see higher monthly expenses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content type limits require careful planning:&lt;/strong&gt; Teams on lower-tier plans may reach the 25 content type cap much earlier than expected. When that happens, they might need to spend extra time reworking models or pay more for an upgraded plan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rich text requires custom handling:&lt;/strong&gt; Contentful stores rich text as structured JSON. It’s a flexible solution, but if you’re using a framework like React or Next.js, you’ll need extensive frontend logic to render it consistently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Previewing isn’t always easy:&lt;/strong&gt; Editors working with Contentful often have to publish content before seeing how it appears on the live site. Feedback loops are much slower as a result, and it might introduce more problems during intense publishing cycles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Frontend and backend are tightly integrated:&lt;/strong&gt; A mix of GraphQL and rigid content structures can make even small schema changes in Contentful a challenge.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sounds familiar? If so, a &lt;strong&gt;headless CMS migration&lt;/strong&gt; might be a natural next step for you. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thinking about Migrating to a Headless CMS?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Our Experts Can Help&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Choosing a Contentful Alternative&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/what-is-headless-cms/" rel="noopener noreferrer"&gt;&lt;strong&gt;Headless CMS&lt;/strong&gt;&lt;/a&gt; (Content Management System) platforms offer plenty of options, but aren’t a one-size-fits-all solution.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;“A headless CMS separates the content layer from the presentation layer. Developers can build flexible frontends using any technology, while content teams manage everything in one centralized backend.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Jakub Dakowicz, CTO at Pagepro&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Migrating to a headless CMS can be a great benefit to the business. According to the &lt;a href="https://www.storyblok.com/mp/state-of-cms-2024" rel="noopener noreferrer"&gt;&lt;strong&gt;State of CMS survey&lt;/strong&gt;&lt;/a&gt;, over 99% of people experienced some kind of benefit after switching to headless solutions.&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%2F42n1zyvflday40j7l4h8.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%2F42n1zyvflday40j7l4h8.png" alt="A horizontal bar chart shows the top reasons organizations adopt certain technologies or solutions, based on percentage of respondents selecting each benefit. The bars are color-coded and ranked from highest to lowest:Increased ROI (lower budget spend and/or higher revenue) – 61% (dark grey)Time-saving/Productivity – 58% (blue)Easier scaling/localizations – 54% (orange)Better user experience/personalization – 54% (red)Improved performance/faster loading times – 49% (grey)Better security – 49% (green)Meeting KPIs – 34% (pink)None of the above – 0.25% (light grey)The chart highlights ROI, productivity, and scalability as the most common drivers, while very few respondents indicated “none of the above.”" width="737" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://www.storyblok.com/mp/state-of-cms-2024" rel="noopener noreferrer"&gt;&lt;strong&gt;Stoyblok State of CMS 2024&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each has its own strengths and weaknesses, so before migrating from Contentful, &lt;strong&gt;consider what your team might need&lt;/strong&gt; most.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Usability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Is your CMS easy to master for non-technical users?&lt;/strong&gt; Can editors preview changes in real time? Some headless CMS platforms focus on developer workflows first, and others offer visual editors and drag-and-drop layouts easier to use for content creators.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pricing&lt;/strong&gt; 
&lt;/h3&gt;

&lt;p&gt;Know what you’re committing to long-term. &lt;strong&gt;Is the pricing model predictable, or will it change with usage like Contentful’s?&lt;/strong&gt; Open-source options like Strapi let you have full control at the cost of maintenance. Meanwhile, SaaS platforms range from flat-fee to usage-based billing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Flexibility&lt;/strong&gt; 
&lt;/h3&gt;

&lt;p&gt;Your content structure won’t stay the same. Look for a CMS that &lt;strong&gt;makes schema changes easy to implement&lt;/strong&gt; without breaking the whole site.&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%2Funq2p0v463sgi565bqj0.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%2Funq2p0v463sgi565bqj0.png" alt="A bar chart titled “Contentful Migration Ease” compares how difficult it is to migrate from Contentful to four alternative headless CMS platforms. The Y-axis ranges from 1 (Easy) to 5 (Hard). Sanity scores the lowest difficulty at 2, followed by Storyblok at 3, Prismic at 4, and Strapi at 5. The bars are red and rounded at the top. A caption at the bottom reads “Recommended Headless CMS Options,” and the Pagepro logo appears in the bottom " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tech Stack Compatibility&lt;/strong&gt; 
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Make sure the CMS plays nicely with your frontend setup.&lt;/strong&gt; If you’re using Next.js, features like incremental static regeneration, flexible previews, and fast API access can make a difference in site speed. And speaking of…&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Performance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What will happen when your traffic spikes?&lt;/strong&gt; Some CMS platforms might enforce rate limits or bandwidth caps. Others offer global edge caching and content delivery optimizations. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Localization and Integrations&lt;/strong&gt; 
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Does your site support multiple languages or connects with third-party tools?&lt;/strong&gt; Choose a CMS that handles localization well and will work well with your tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Best Alternatives to Contentful in 2025&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that you know what to pay attention to, we can move to &lt;strong&gt;comparing Contentful alternatives&lt;/strong&gt;. We’ll start with our favorite.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;CMS&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Tradeoffs&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Localisation&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Contentful&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Structured enterprise projects, cross-functional teams&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Stable platform, GraphQL support, strong integrations&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High cost at scale, rigid content modeling, and preview limitations&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Built-in, but locale limits apply by plan&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Sanity&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Dev-led teams, complex models&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Schema-as-code, GROQ, fast preview&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Dev setup needed, usage pricing&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Unlimited locales, API-driven&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Storyblok&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Visual editing, localization&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Visual editor, block-based model&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Structure is opinionated&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Built-in tools, folder-based&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Strapi&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Self-hosting, custom backends&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Fully customizable, open-source&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Maintenance overhead&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Plugin-based (i18n), customizable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Prismic&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Fast setup, structured sites&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Slices, good docs, fast UI&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Less flexible for complex models&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Locale support, user-friendly UI&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sanity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Dev-led teams and structured content at scale&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Used by:&lt;/strong&gt; &lt;a href="https://www.sanity.io/customers/puma?ref=customers" rel="noopener noreferrer"&gt;&lt;strong&gt;Puma&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.sanity.io/customers/morning-brew" rel="noopener noreferrer"&gt;&lt;strong&gt;Morning Brew&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; A great fit for teams using Next.js or building complex content workflows. &lt;a href="https://pagepro.co/blog/what-is-sanity/" rel="noopener noreferrer"&gt;&lt;strong&gt;Sanity Content Operating System&lt;/strong&gt;&lt;/a&gt; has strong developer control. It comes with schema-as-code, GROQ querying, and excellent support for live previews. &lt;/p&gt;

&lt;p&gt;Editors can use real-time collaboration and a customizable Studio interface without hard limits on content types or locales. To make the switch easier, Sanity offers &lt;a href="https://www.sanity.io/plugins/contentful-to-sanity" rel="noopener noreferrer"&gt;&lt;strong&gt;an official Contentful migration plugin&lt;/strong&gt;&lt;/a&gt; that automates schema and content migration in minutes.&lt;/p&gt;

&lt;p&gt;Sanity’s initial setup requires a lot of technical involvement early on, but it pays off in long-term flexibility and performance.&lt;/p&gt;

&lt;p&gt;You can read more about it in our article, &lt;a href="https://pagepro.co/blog/best-use-cases-of-sanity/" rel="noopener noreferrer"&gt;&lt;strong&gt;Best Use Cases of Sanity&lt;/strong&gt;&lt;/a&gt;.&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%2Fimxtujqhb6qupn4v5og5.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%2Fimxtujqhb6qupn4v5og5.png" alt="View of Sanity's Dashboard" width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Pricing
&lt;/h4&gt;

&lt;p&gt;Sanity’s free plan includes &lt;strong&gt;20 user seats&lt;/strong&gt;, two datasets, unlimited content types/locales, and live preview. The Growth plan starts at &lt;strong&gt;$15 per non-admin seat/month&lt;/strong&gt;, adding features like content releases, comments, and AI Assist. Enterprise plans offer extras like SSO, audit logs, and SLAs (custom pricing).&lt;/p&gt;

&lt;h4&gt;
  
  
  What Are The Differences Between Contentful And Sanity?
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;“We’ve worked with all major headless CMS platforms, and&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://pagepro.co/services/sanity-development" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Sanity has the best balance between developer control and editorial usability&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;. For teams migrating from Contentful, it solves a lot of long-standing issues without locking you into rigid pricing or workflows.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Jakub Dakowicz, Pagepro CTO&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sanity uses a schema-as-code model. &lt;strong&gt;Developers can define content structure in JavaScript&lt;/strong&gt; and version it like any other code. &lt;strong&gt;Contentful, meanwhile, relies on a UI-based model&lt;/strong&gt;, which is easier to get started with but harder to scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;GROQ query language used by Sanity&lt;/strong&gt; gives full control over content fetching. &lt;strong&gt;Contentful uses GraphQL and REST&lt;/strong&gt;, which often requires workarounds for complex queries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Contentful supports content preview, but &lt;strong&gt;often requires more setup&lt;/strong&gt; and doesn’t reflect changes until after publishing. Sanity, on the other hand, &lt;strong&gt;offers real-time collaboration&lt;/strong&gt; and live preview features from the get-go.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When it comes to pricing, &lt;strong&gt;Contentful charges per user&lt;/strong&gt;, environment, and content type. &lt;strong&gt;Sanity charges are based on your usage&lt;/strong&gt;, like API calls, bandwidth, and data storage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Storyblok&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Content teams that want visual control&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Used by:&lt;/strong&gt; &lt;a href="https://www.storyblok.com/cs/oatly" rel="noopener noreferrer"&gt;&lt;strong&gt;Oatly&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.storyblok.com/cs/octopus-energy" rel="noopener noreferrer"&gt;&lt;strong&gt;Octopus Energy&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Storyblok shines with its &lt;strong&gt;visual editor and block-based content model&lt;/strong&gt;, making it easy for marketers and editors to manage pages without developer input. &lt;strong&gt;Built-in localization tools&lt;/strong&gt; are also a plus. However, the CMS &lt;strong&gt;has a more opinionated structure&lt;/strong&gt;, which may be limiting for custom or deeply nested content models.&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%2Fs1ep8hum2yxzjjcbs1ny.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%2Fs1ep8hum2yxzjjcbs1ny.png" alt="A screenshot of the Storyblok dashboard inside a space titled " width="720" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Pricing
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Storyblok’s free Starter plan includes one user and one space&lt;/strong&gt;. The Entry plan starts at ~&lt;strong&gt;$90/month&lt;/strong&gt; (billed annually) for five users, one space, a visual editor, and &lt;strong&gt;400 GB of traffic&lt;/strong&gt;. Additional bandwidth costs apply.&lt;/p&gt;

&lt;h4&gt;
  
  
  What Are the Differences Between Contentful and Storyblok?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Storyblok is built around a visual editor and block-based content model, making it especially &lt;strong&gt;appealing to marketers and content teams&lt;/strong&gt;. It allows editors to preview and edit pages visually without developer help. Contentful, by contrast, &lt;strong&gt;is more structured and developer-oriented&lt;/strong&gt;. It has a form-based editor and fewer built-in visual controls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In terms of modeling, &lt;strong&gt;Contentful has flexibility in defining content types&lt;/strong&gt;, but &lt;strong&gt;Storyblok’s component-based structure promotes more consistency&lt;/strong&gt; across pages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the technical side, both support modern frameworks like Next.js. Still, &lt;strong&gt;Contentfu requires more manual GraphQL work&lt;/strong&gt; and richer frontend logic. &lt;strong&gt;Storyblok has a simpler setup&lt;/strong&gt; with REST APIs and SDKs for faster integration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Their pricing differs a lot, since Storyblok is more focused on &lt;strong&gt;project tiers and team roles&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Strapi&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams that want full control and self-hosting&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Used by:&lt;/strong&gt; &lt;a href="https://strapi.io/user-stories/airbus" rel="noopener noreferrer"&gt;&lt;strong&gt;Airbus&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://strapi.io/user-stories/tesco" rel="noopener noreferrer"&gt;&lt;strong&gt;Tesco&lt;/strong&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Strapi is &lt;strong&gt;open-source and fully customizable&lt;/strong&gt;, and supports custom backends and APIs. It’s great for developers who want control over every part of the stack. However, with that freedom comes a cost. &lt;strong&gt;Ongoing maintenance and hosting responsibilities fall entirely on your team&lt;/strong&gt;.&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%2Fw5m5w4q0udluksctchz1.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%2Fw5m5w4q0udluksctchz1.png" alt="A screenshot of the Strapi admin panel showing a welcome screen. It greets the user with “Welcome 👋” and offers links to Documentation, Code Examples, Tutorials, and Blog. The left sidebar includes navigation items like Content Manager, Content-Type Builder, Media Library, and Plugins. On the right, there’s a community section with links to GitHub, Discord, Reddit, and more. The UI features soft pastel colors and a friendly, developer-centric layout." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Pricing
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://strapi.io/blog/introducing-the-free-plan-for-strapi-cloud" rel="noopener noreferrer"&gt;&lt;strong&gt;Strapi Cloud&lt;/strong&gt;&lt;/a&gt; offers a free tier with &lt;strong&gt;10k API calls, 10 GB storage, and 100 emails&lt;/strong&gt;. The Essential plan starts at &lt;strong&gt;$15/month&lt;/strong&gt; with more storage and domains. Higher tiers scale up to 1M–10M API calls and 1 TB bandwidth.&lt;/p&gt;

&lt;h4&gt;
  
  
  What Are the Differences Between Contentful and Stapi?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The biggest difference is hosting and control. &lt;strong&gt;Contentful is a fully managed&lt;/strong&gt;, cloud-based CMS with a proprietary backend. &lt;strong&gt;Strapi is open-source and self-hosted&lt;/strong&gt;, offering you complete control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strapi is ideal for teams that want to &lt;strong&gt;build custom APIs, enforce specific security rules, or control deployment environments&lt;/strong&gt;. Contentful trades that flexibility for &lt;strong&gt;ease of use and reduced maintenance&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In terms of development, &lt;strong&gt;Strapi uses a REST or GraphQL API&lt;/strong&gt; that you can fully customize, while Contentful provides &lt;strong&gt;a structured GraphQL and REST mix&lt;/strong&gt; with stricter limits and conventions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In terms of pricing, &lt;strong&gt;Strapi is free to use if self-hosted&lt;/strong&gt;, but this requires dev time for setup and maintenance. &lt;strong&gt;Contentful charges based on users&lt;/strong&gt;, content types, and environments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Prismic&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Simple, structured websites that need to launch fast&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Used by:&lt;/strong&gt; &lt;a href="https://prismic.io/customers/7mesh" rel="noopener noreferrer"&gt;&lt;strong&gt;7mesh&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://prismic.io/customers/evri" rel="noopener noreferrer"&gt;&lt;strong&gt;Evri&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prismic offers a slick UI, fast setup, and “Slice” components&lt;/strong&gt; that make repeatable layouts easy. It’s &lt;strong&gt;ideal for lean teams&lt;/strong&gt; or projects that don’t need much customization. Its tradeoff is &lt;strong&gt;less flexibility for complex content models&lt;/strong&gt;.&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%2Flhlkrox36syccf88icnp.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%2Flhlkrox36syccf88icnp.png" alt="A screenshot of the Prismic content editing interface for a page titled " width="706" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Pricing
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Prismic offers a free plan for one user&lt;/strong&gt;. Paid plans (Medium, Platinum, Enterprise) scale by users, locales, API limits, and features. Even paid tiers now &lt;a href="https://prismic.io/blog/prismic-pricing-2024" rel="noopener noreferrer"&gt;&lt;strong&gt;include locale limits&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  What Are the Differences Between Contentful and Prismic?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contentful is flexible in content modeling.&lt;/strong&gt; You can define any type of content model and use GraphQL or REST APIs to fetch data. It’s powerful, but often requires more developer involvement. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prismic is very approachable for non-technical users.&lt;/strong&gt; It uses a Slice-based approach for reusable content components. It also includes a built-in preview system and easy-to-use editor UI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the downside, &lt;strong&gt;Prismic is less flexible for complex or deeply nested schemas&lt;/strong&gt;. Its querying options are more limited compared to Contentful’s API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prismic offers a simple tier-based pricing&lt;/strong&gt;, which may be easier to predict for smaller teams than Contentful’s.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pricing Comparison&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;CMS&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Free Plan&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Starting Paid Plan&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Pricing Model&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;a rel="noreferrer noopener nofollow" href="https://www.contentful.com/pricing/"&gt;&lt;strong&gt;Contentful&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Yes (10 users, 2 locales)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;~$300/mo (Lite)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Users, environments, and content types&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;a rel="noreferrer noopener nofollow" href="https://www.sanity.io/pricing"&gt;&lt;strong&gt;Sanity&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Yes (unlimited types, 1 dataset)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;~$15/mo per seat (Growth)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;API calls, bandwidth, and users&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;a rel="noreferrer noopener nofollow" href="https://www.storyblok.com/pricing"&gt;&lt;strong&gt;Storyblok&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Yes (1 user, 1 space)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;~$90/mo (Growth)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Project tiers and roles&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;a rel="noreferrer noopener nofollow" href="https://strapi.io/pricing-self-hosted"&gt;&lt;strong&gt;Strapi&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Yes (self-hosted, full features)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;$0 (self-hosted only)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Hosting and maintenance&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;a rel="noreferrer noopener nofollow" href="https://prismic.io/pricing"&gt;&lt;strong&gt;Prismic&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Yes (1 user, 1 locale)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;$180/mo (Medium)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Users and features&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;*Pricing as of July 2025&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Checklist: How to Migrate from Contentful to a Headless CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Migrating from Contentful is a delicate process&lt;/strong&gt;. One mistake can result in missing content or a blow to your SEO rankings. Before attempting it yourself, make sure you’re prepared or have the support of &lt;strong&gt;Contentful migration specialists&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’ve prepared a seven-step checklist you can use to migrate from Contentful to a headless CMS of your choice. &lt;strong&gt;Follow it along for the best results&lt;/strong&gt;.&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%2Frpd3v7fgwunip608iqnr.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%2Frpd3v7fgwunip608iqnr.png" alt="An infographic titled “Contentful Migration Checklist by Pagepro” outlines seven clear steps for a smooth and effective migration from Contentful to a headless CMS. Each step includes a checkbox icon and a short description:Discovery and Planning – Map site structure, track SEO performance, identify integrations, and analyze Google Analytics and Search Console data.UX &amp;amp; UI Design – Design intuitive user experiences, optimize navigation for SEO, and align layout with user behavior.Front-End Development – Use Next.js, prioritize Core Web Vitals, build with reusable components, and ensure accessible HTML.Data Integration – Connect CMS to frontend using APIs, normalize design data, and align content with existing URLs.Optimization – Fix render-blocking scripts, configure 301 redirects, and add meta, canonical, and structured tags.Release – Update DNS, and verify robots.txt, sitemap, and indexing settings.SEO Monitoring – Track 404s, redirects, keyword performance, traffic, bounce rates, and Core Web Vitals for fast fixes.The background is dark with white and red text, and the Pagepro logo appears at the bottom right. Designed to help teams plan a reliable and SEO-safe CMS migration." width="800" height="2000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/wp-content/uploads/2025/07/Infographic-7-Steps-to-a-Successful-Contentful-Migration.pdf" rel="noopener noreferrer"&gt;Download Our Checklist&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step One: Rebuilding Content Schemas&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before anything moves, &lt;strong&gt;your new CMS needs to match the structure of your existing content.&lt;/strong&gt; This may mean rethinking models to take advantage of your new platform’s strengths.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step Two: Exporting Content from Contentful&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Using Contentful’s CLI or API, &lt;strong&gt;you’ll extract all your entries, assets, and metadata&lt;/strong&gt;. For large projects, this step often includes custom scripts to handle edge cases or nested relationships.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step Three: Transforming the Data&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Every CMS stores content differently. You’ll need to &lt;strong&gt;write a script that reshapes Contentful’s output&lt;/strong&gt; into a format your new CMS understands.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step Four: Importing to the New CMS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once transformed, &lt;strong&gt;content is imported using the new platform’s API or CLI tools&lt;/strong&gt;. This is usually done in stages to allow for testing and adjustments.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step Five: Updating your Frontend&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your site’s data fetching layer &lt;strong&gt;will need updates to reflect new APIs, schema changes, and preview setups&lt;/strong&gt;. This is a good moment to simplify logic or remove legacy workarounds.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step Six: Testing and Validation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Everything gets reviewed: &lt;strong&gt;content accuracy, internal links, media assets, SEO tags, and redirects&lt;/strong&gt;. The goal is a seamless switch with no broken URLs or missing pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step Seven: (Optional) Redesign or Refactor&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A migration is often a good time to &lt;strong&gt;modernize your component library&lt;/strong&gt; or refresh the design.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Make Your Migration Count&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Contentful migration should start with finding the best solution for your team.&lt;/strong&gt; If you’re hitting limits, fighting with previews, or watching costs climb, it may be time to move on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For companies using frameworks like Next.js, Sanity, Storyblok, and Strapi offer more flexibility, clearer pricing, and better alignment with modern development workflows.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Still, choosing the right alternative is only half the challenge. &lt;strong&gt;A smooth CMS migration takes planning, precision, and experience.&lt;/strong&gt; If you’re considering replatforming from Contentful, we’re here to help.&lt;/p&gt;

&lt;p&gt;Pagepro has supported many successful CMS migrations, and &lt;strong&gt;we’re always available if you need Contentful migration experts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to Migrate from Contentful?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Contact Us&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Frequently Asked Questions&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Should I Migrate from Contentful?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Many teams outgrow Contentful’s pricing model, content limits, or technical constraints. &lt;strong&gt;If your team is struggling with slow previews, complex rich text rendering, or rising CMS costs&lt;/strong&gt;, a migration may help streamline workflows and reduce long-term overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is the Website Migration Cost?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Costs vary depending on project size and complexity&lt;/strong&gt;. A basic migration with minimal schema changes and no frontend updates might cost a few thousand pounds. A full migration can range higher.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How Long Does a Typical CMS Migration Take?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At Pagepro, smaller projects can be migrated in &lt;strong&gt;2 to 4 weeks&lt;/strong&gt;. For larger sites with complex schemas, multiple locales, or custom logic, migrations may take &lt;strong&gt;from&lt;/strong&gt; &lt;strong&gt;6 to 10 weeks&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What CMS Works Best with Next.js?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity is a popular choice for teams using Next.js&lt;/strong&gt;. Its fast APIs, schema-as-code approach, and support for live preview make it a strong fit. Strapi and Storyblok also offer solid Next.js support, though with different tradeoffs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Will I Lose Content or SEO Rankings if I Migrate from Contentful?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Not if the migration is planned carefully. A proper CMS migration includes redirect handling, SEO tag preservation, structured content mapping, and link validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why is Contentful So Expensive?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Contentful’s pricing is based on multiple factors: users, environments, content types, locales, and API usage.&lt;/strong&gt; For small teams, this can be manageable, but as your content model grows or you scale your team, the costs can increase sharply. Many teams also pay more for features like staging environments or localization.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity the Best CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Depends on your needs. &lt;strong&gt;Sanity is one of the most flexible and developer-friendly CMS platforms available&lt;/strong&gt;, especially for teams using React or Next.js. It offers schema-as-code, live preview, fast APIs, and strong customization options.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are the Disadvantages of Sanity CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity has a steeper learning curve&lt;/strong&gt;, especially for non-technical teams. Its schema-as-code approach is powerful but requires developer setup. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More:&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/wordpress-cms-migration-seo/" rel="noopener noreferrer"&gt;WordPress CMS Migration Checklist: Avoid These SEO Mistakes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/why-sanity-is-the-best-cms-for-the-healthcare-industry/" rel="noopener noreferrer"&gt;Why Sanity is the Best CMS for the Healthcare Industry&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/sanity-and-nextjs-for-ci-cd/" rel="noopener noreferrer"&gt;Sanity and Nextjs for CI / CD&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/top-5-best-headless-cms-platforms/" rel="noopener noreferrer"&gt;Top 5 Best Headless CMS Platforms&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sources:&lt;/strong&gt; 
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.storyblok.com/mp/state-of-cms-2024" rel="noopener noreferrer"&gt;The State of CMS 2024: 1,700+ Users Share What Makes A CMS Great&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.sanity.io/blog/contentful-to-sanity" rel="noopener noreferrer"&gt;How to Easily Migrate from Contentful to Sanity&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>frontend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>React Native Pros and Cons For App Development in 2025</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 07 Jul 2025 07:32:10 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/react-native-pros-and-cons-for-app-development-in-2025-1849</link>
      <guid>https://dev.to/pagepro_agency/react-native-pros-and-cons-for-app-development-in-2025-1849</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Should You Choose React Native in 2025?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Considering mobile apps generated over &lt;strong&gt;$935 billion in revenue in 2024&lt;/strong&gt;, having one for your business is a no-brainer. Take Payhip, for example – after the Pagepro team helped them create a mobile app MVP for their e-learning platform, the company discovered a whole new market to explore.&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%2Fqwdgbk4953wu7w50s24h.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%2Fqwdgbk4953wu7w50s24h.png" alt="Revenue of mobile apps worldwide 2019-2027, by segment" width="723" height="595"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source: Statista – Revenue of mobile apps worldwide 2019-2027, by segment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developing a mobile app used to be a lengthy and expensive process, but mobile frameworks like React Native &lt;strong&gt;made it faster and less expensive&lt;/strong&gt;. While &lt;a href="https://pagepro.co/services/react-native-development/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Native app development&lt;/strong&gt;&lt;/a&gt; offers many advantages, like cross-platform development and code reusability, it also comes with some limitations.&lt;/p&gt;

&lt;p&gt;To help you find the best solution for your mobile app, I’ll explain &lt;strong&gt;React Native pros and cons,&lt;/strong&gt; when it works best, and when you might be better off with an alternative.&lt;/p&gt;

&lt;p&gt;Let’s start by answering the first question…&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is React Native?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/what-is-react-native/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/a&gt; is an open-source framework created in JavaScript by Facebook (now Meta). Its cross-platform nature allows for developing mobile apps for both Android and iOS operating systems &lt;strong&gt;at the same time and with one codebase&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Although React Native is now over a decade old, it continues to evolve, thanks to the excellent community and Meta’s dedication to keeping it alive. &lt;a href="https://pagepro.co/blog/react-tldr/react-native-0-80-ships-with-react-19-1/" rel="noopener noreferrer"&gt;&lt;strong&gt;The most recent update, 0.80&lt;/strong&gt;&lt;/a&gt;, has added support for React 19.1 and officially froze Legacy Architecture among many other changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to create cross-platform apps?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Contact Us&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Is The Primary Purpose of React Native?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React Native is designed &lt;strong&gt;to simplify and speed up mobile app development&lt;/strong&gt; across platforms like iOS and Android.&lt;/p&gt;

&lt;p&gt;Instead of writing separate native code for each platform (Swift/Objective-C for iOS and Kotlin/Java for Android), &lt;strong&gt;React Native lets developers reuse most of the code while still delivering a native-like performance and user experience&lt;/strong&gt;. It does this by rendering components using native APIs, not web views.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are React Native Alternatives?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Although according to the &lt;a href="https://survey.stackoverflow.co/2024/technology" rel="noopener noreferrer"&gt;&lt;strong&gt;Stack Overflow 2024 survey&lt;/strong&gt;&lt;/a&gt;, React Native is one of the more popular options for mobile development, there are a few &lt;a href="https://pagepro.co/blog/cross-platform-app-development-frameworks/" rel="noopener noreferrer"&gt;&lt;strong&gt;alternatives&lt;/strong&gt;&lt;/a&gt; to it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Native Development&lt;/strong&gt; – In situations where React Native doesn’t meet your expectations, there is always the option of developing two separate apps for iOS and Android. &lt;strong&gt;While it might take more time and resources, it can be beneficial to some projects.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flutter&lt;/strong&gt; – A UI toolkit by Google that uses Dart to build fast, natively compiled apps for mobile, web, and desktop. It offers rich, customizable widgets and delivers consistent UI and performance across platforms. You can read our &lt;a href="https://pagepro.co/blog/react-native-vs-flutter-which-is-better-for-cross-platform-app/" rel="noopener noreferrer"&gt;&lt;strong&gt;article comparing Flutter and React Native&lt;/strong&gt;&lt;/a&gt; to learn more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lynx&lt;/strong&gt; – A &lt;a href="https://pagepro.co/blog/react-tldr/introducing-lynx-a-new-cross-platform-development-framework/" rel="noopener noreferrer"&gt;&lt;strong&gt;cross-platform framework written in Rust&lt;/strong&gt;&lt;/a&gt;, focused on performance, memory safety, and minimal runtime overhead. Still in early development, but promising for Rust enthusiasts and future-looking mobile projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Xamarin&lt;/strong&gt; – A Microsoft-backed framework that uses C# and .NET to build cross-platform apps. Allows code sharing and native performance, often used in enterprise and Windows-based environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capacitor&lt;/strong&gt; – Created by the Ionic team, Capacitor lets you build mobile apps with web technologies (HTML, CSS, JS/TS). It bridges web apps to native functionality using plugins, ideal for teams with strong web backgrounds.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Is React Native Best For?&lt;/strong&gt;
&lt;/h2&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%2Fwi19rbcxfcziz2a2sr05.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%2Fwi19rbcxfcziz2a2sr05.png" alt="Big brands using React Native" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React Native can work great for any type of mobile app. &lt;strong&gt;However, it’s the best for feature-rich, cross-platform mobile applications that need to stay innovative.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can find over 120 examples of React Native apps &lt;a href="https://pagepro.co/blog/react-native-apps/?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;in this article&lt;/strong&gt;&lt;/a&gt;, but for now, here are some of them:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Social Media and Networking Apps&lt;/strong&gt;
&lt;/h3&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%2F9f30dfcvnic93dksk8ko.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%2F9f30dfcvnic93dksk8ko.png" alt="Discord App on AppStore" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These types of apps often require real-time interactions, dynamic content updates, and integration with various APIs and third-party services. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React Native’s flexibility and performance&lt;/strong&gt; help develop responsive and interactive social experiences across multiple platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt; Facebook, Instagram, Bluesky, and Discord.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;On-Demand Services and Marketplaces&lt;/strong&gt;
&lt;/h3&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%2Fwh1s1nazvcunpluq6d6i.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%2Fwh1s1nazvcunpluq6d6i.png" alt="Evouchers App Screenshot" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re planning to develop an app for wide audiences and catering to multiple markets, React Native’s cross-platform capabilities let your business deploy visually consistent apps. &lt;strong&gt;Whether it’s food delivery or a marketplace, React Native has you covered.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Uber Eats and &lt;a href="https://pagepro.co/case-studies/evouchers" rel="noopener noreferrer"&gt;Evouchers&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;E-commerce and Retail Apps&lt;/strong&gt;
&lt;/h3&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%2Fkmo70w5bidfjtr61by1l.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%2Fkmo70w5bidfjtr61by1l.png" alt="Puma app on AppStore" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The framework’s ability to deliver performant and beautiful interfaces with smooth navigation makes it perfect for building e-commerce and retail apps. &lt;strong&gt;Shop owners can add features like product catalogues, user reviews, secure payment gateways, and personalized recommendations&lt;/strong&gt; to improve their stores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt; Puma and Flipkart &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Travel and Hospitality Apps&lt;/strong&gt;
&lt;/h3&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%2Fh6cmc9yj9e40l7zc3uqq.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%2Fh6cmc9yj9e40l7zc3uqq.png" alt="Airbnb app" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Businesses aiming to provide a good mobile experience to their customers across various devices&lt;/strong&gt; will appreciate React Native’s functions. Integration with location-based services, push notifications, and interactive maps present in React Native improves the UX and engagement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Airbnb&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;IoT and Smart Home Applications&lt;/strong&gt;
&lt;/h3&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%2Fyyrk6nqeq8o043dndnig.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%2Fyyrk6nqeq8o043dndnig.png" alt="Amazon Alexa App" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the Internet of Things (IoT) continues to shape the future, React Native is a valuable tool for developing mobile apps that control and monitor IoT devices and smart homes. &lt;strong&gt;Its compatibility with various IoT protocols&lt;/strong&gt;, and ability to communicate with embedded systems allows for integration between the mobile app and smart devices. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Yeti Smart Home and Amazon Alexa&lt;/p&gt;

&lt;p&gt;If you’d like to find other examples of React Native Apps, &lt;strong&gt;check our free eBook&lt;/strong&gt;, which &lt;strong&gt;lists over 100 mobile application&lt;/strong&gt;s developed with it. &lt;strong&gt;Get&lt;/strong&gt; &lt;a href="https://pagepro.co/ebook/ebook-react-native-apps" rel="noopener noreferrer"&gt;&lt;strong&gt;the list of Over 100 React Native App Examples&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since you know more about the framework, it’s time to focus on React Native pros and cons. I’ll start with its benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Are the Advantages of React Native?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Considering how functional it is, the advantages of React Native can be divided into two groups: &lt;strong&gt;business and development&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros of React Native for Business&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. One Codebase for Two Platforms
&lt;/h4&gt;

&lt;p&gt;Since it’s a cross-platform framework, &lt;strong&gt;React Native teams can build for both iOS and Android using a single codebase&lt;/strong&gt;. It’s a great way to &lt;a href="https://pagepro.co/blog/how-react-native-can-cut-your-development-costs/?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;save develop&lt;/strong&gt;&lt;/a&gt;&lt;a href="https://pagepro.co/blog/how-react-native-can-cut-your-development-costs/?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;ment costs&lt;/strong&gt;&lt;/a&gt; and time, which startups and teams with limited resources will appreciate.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Faster Time-to-Market
&lt;/h4&gt;

&lt;p&gt;Code reusability and fast build cycles make React Native ideal for prototyping and MVPs. &lt;strong&gt;One of Pagepro’s clients, a UK-based insurance company, received its experimental MVP in just 6 weeks&lt;/strong&gt;, letting them quickly validate the product idea and prepare it for further development. &lt;a href="https://pagepro.co/case-studies/veygo" rel="noopener noreferrer"&gt;&lt;strong&gt;Read our case study&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Lower Maintenance Costs
&lt;/h4&gt;

&lt;p&gt;Maintaining one codebase for both platforms &lt;strong&gt;lowers the long-term effort and cost of bug fixes,&lt;/strong&gt; feature updates, and security patches.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Easier Hiring
&lt;/h4&gt;

&lt;p&gt;You don’t have to rely on separate iOS and Android specialists to make apps. Thanks to the framework’s popularity, &lt;strong&gt;the community of React Native offers a large talent pool of developers&lt;/strong&gt; to build and scale apps. &lt;/p&gt;

&lt;h4&gt;
  
  
  5. Native-Like User Experience
&lt;/h4&gt;

&lt;p&gt;Apps built with React Native use native APIs under the hood, &lt;strong&gt;delivering fluid and responsive experiences&lt;/strong&gt; as close to fully native apps as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Advantages of React Native for Development&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Easy to Learn
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;If your team already uses React for web development, React Native is easy to pick up.&lt;/strong&gt; The component-based architecture and familiar syntax help developers onboard quickly.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Hot Reloading for Fast Feedback
&lt;/h4&gt;

&lt;p&gt;The hot reloading and fast refresh features in React Native &lt;strong&gt;help developers see UI changes during development instantly,&lt;/strong&gt; which is great for fast iteration.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Over-the-Air (OTA) Updates
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;OTA functionality allows you to push critical fixes and feature updates directly to users without waiting for App Store or Google Play approvals.&lt;/strong&gt; This is especially valuable during testing or active rollouts. You can read more about OTA updates in &lt;a href="https://pagepro.co/blog/ota-updates-with-expo/" rel="noopener noreferrer"&gt;&lt;strong&gt;our dedicated article&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Active Community &amp;amp; Third-Party Support
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;The community around React Native is massive, with countless plugins, libraries, and support tools that accelerate development.&lt;/strong&gt; This means a lot of resources you can use freely if your work ever stalls or you need help with developing a new feature for your app.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Access to Native Modules
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;React Native app developers can use native code when needed&lt;/strong&gt;. Through platform-specific bridges, apps can access device hardware, APIs, and performance-optimized modules.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Component-Based UI Development
&lt;/h4&gt;

&lt;p&gt;The framework’s declarative UI model and component primitives (like View, Text, Image) &lt;strong&gt;make mobile interface development simpler and encourage creating reusable code&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Expo Ecosystem for Speed and Simplicity
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/what-is-expo-js/?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;Expo&lt;/strong&gt;&lt;/a&gt; offers a managed workflow that makes it easier to build, preview, and test apps without native configuration. &lt;strong&gt;It’s especially helpful for small teams and fast experiments.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to publish your app without friction?&lt;/strong&gt; Get our &lt;a href="https://pagepro.co/ebook/ebook-publishing-expo-react-native-apps" rel="noopener noreferrer"&gt;Essential Checklist for Publishing Expo React Native Apps&lt;/a&gt; - a step-by-step guide to deploying apps with confidence and ease.&lt;/p&gt;

&lt;h4&gt;
  
  
  8. EAS (Expo Application Services)
&lt;/h4&gt;

&lt;p&gt;With Expo’s cloud services, &lt;strong&gt;you can run cloud builds, manage assets, and automate your CI/CD pipeline&lt;/strong&gt;, all without needing to configure native environments.&lt;/p&gt;

&lt;h4&gt;
  
  
  9. Great for Demos and Stakeholder Reviews
&lt;/h4&gt;

&lt;p&gt;With Expo Go and demo mode, developers can share working prototypes with stakeholders without submitting to app stores. &lt;strong&gt;Perfect for client presentations or quick feedback&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;When You Should Use React Native&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building cross-platform apps without doubling the workload&lt;/strong&gt; – React Native lets you build for both iOS and Android using a single codebase, which can dramatically reduce development time and effort.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When your team already knows React or JavaScript&lt;/strong&gt; – No need to learn platform-specific languages, since React Native fits right into the workflow of web developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fast time to market is critical&lt;/strong&gt; – Hot reloading, a large ecosystem, and shared code make it easier to ship MVPs or iterate quickly based on user feedback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The app doesn’t require deep native integrations&lt;/strong&gt; – React Native handles most common mobile features well. Unless you’re building something very platform-specific, it’s usually enough.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delivering a native-like user experience&lt;/strong&gt; – Apps built with React Native use real native UI components, so users get smooth, responsive interactions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Focusing on long-term flexibility and scalability&lt;/strong&gt; – The framework is actively maintained, widely adopted, and supports adding native modules when needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You want a native-like UI and performance&lt;/strong&gt; – React Native renders UI using native components, so the experience feels more fluid than hybrid solutions like Cordova or Capacitor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Future scalability is your goal&lt;/strong&gt; – With community support, active development, and tools like Expo, React Native gives you flexibility to scale your app, integrate with native code when needed, and take advantage of third-party services.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Disadvantages Does React Native Have?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;While React Native is an amazing choice for &lt;a href="https://pagepro.co/services/mobile-app-development?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;cross-platform mobile development&lt;/strong&gt;&lt;/a&gt;, some of its cons can have an impact on your app and its functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Performance Limitations
&lt;/h4&gt;

&lt;p&gt;While React Native performs well for most apps, &lt;strong&gt;it doesn’t match the speed and efficiency of fully native solutions&lt;/strong&gt;. This is largely due to the JavaScript bridge, which can become a bottleneck. The Hermes engine helps optimize performance, but it’s not a complete fix for every use case.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Not Ideal for Highly Complex Interfaces
&lt;/h4&gt;

&lt;p&gt;Building apps with pixel-perfect UI or advanced, interactive animations &lt;strong&gt;can be challenging in React Native&lt;/strong&gt;. Native frameworks still provide more precise rendering and smoother animation control. Libraries like Reanimated and Lottie can improve things.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Limited Access to Native APIs
&lt;/h4&gt;

&lt;p&gt;Some device-specific features or the latest OS-level APIs in native platforms may not be accessible out of the box. In these cases, &lt;strong&gt;you’ll need to build custom modules&lt;/strong&gt;, which adds complexity and requires knowledge of Swift, Kotlin, or Objective-C.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Debugging Can Be Tricky
&lt;/h4&gt;

&lt;p&gt;Because React Native sits between JavaScript and native code, debugging isn’t always straightforward. &lt;strong&gt;Native crashes may not show up in JavaScript logs&lt;/strong&gt; and often call for tools like Xcode, Android Studio, Flipper, or Sentry to track down and resolve.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Updating and Maintenance Overhead
&lt;/h4&gt;

&lt;p&gt;Keeping React Native and its dependencies up to date &lt;strong&gt;can be a headache&lt;/strong&gt;. Breaking changes, version mismatches, or third-party library issues are common. This is one of the reasons why Expo is such a great addition to your mobile stack.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;“*When it comes to updating issues in React Native, Expo provides a simplified update process and offers over-the-air updates that eliminate the need for users to manually update the app through app stores. Deploying bug fixes and feature updating is much quicker.&lt;/em&gt;”&lt;/strong&gt;*&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Kornel Kwiatkowski, React Native Developer at Pagepro&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  6. Heavy Reliance on Third-Party Libraries
&lt;/h4&gt;

&lt;p&gt;React Native’s strength lies in its ecosystem, but that can open you up to some risks. Many features depend on third-party libraries, and if those libraries become outdated or unsupported, &lt;strong&gt;it can introduce bugs or compatibility issues during updates&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Larger App Sizes
&lt;/h4&gt;

&lt;p&gt;React Native apps can be larger than native apps since they include the JavaScript runtime and other dependencies, which &lt;strong&gt;can affect users who own low-end devices or are on slow networks.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8. Occasional Compatibility Issues
&lt;/h4&gt;

&lt;p&gt;Code reuse between platforms can sometimes backfire, especially when working with platform-specific features like &lt;strong&gt;push notifications, deep linking, or native UI components&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;When You Should Not Use React Native&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You need top-tier performance&lt;/strong&gt; – Compared to native solutions, React Native may fall short in apps that require very fast, low-latency processing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deep native integrations are a core requirement&lt;/strong&gt; – Apps that depend on platform-specific APIs (e.g. Bluetooth, advanced sensors, background services) are often better suited to fully native development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The app must support brand-new OS features immediately&lt;/strong&gt; – React Native doesn’t always support the latest iOS or Android features out of the box, so native development is safer when early adoption is important&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;App’s size must be small&lt;/strong&gt; – Because of its runtime and dependencies, React Native might result in larger binaries, which can be problematic for low-end devices or data-sensitive users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your project relies heavily on complex visuals&lt;/strong&gt; – If your product design depends on UI and platform-native look and feel, especially when it comes to animations, native tools offer more precise rendering and flexibility.  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2F73fzppi9ufh7aaf912zw.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%2F73fzppi9ufh7aaf912zw.png" alt="A two-column infographic titled “React Native: Pros and Cons” compares the main advantages and disadvantages of using React Native for mobile app development. The background is dark, with white and red text and icons for better contrast and clarity.The left column lists the Advantages of React Native with red icons next to each point. It includes:Easy to Learn – React Native is familiar to React developers, making onboarding fast.Hot Reloading – Developers see instant UI updates without restarting the app.OTA Updates (Over-the-Air) – Push bug fixes and updates without waiting for app store approval.Active Community – A large community provides access to plugins, tools, and support.Native Modules – Allows the use of native code for direct access to device hardware.Component-Based UI – Encourages modular, reusable UI development for faster iteration.Expo Ecosystem – Offers tools and libraries that simplify development and testing.EAS (Expo Application Services) – Enables cloud builds and continuous deployment (CI/CD) automation.The right column outlines the Disadvantages of React Native with gray icons:Performance Limitations – May be slower for complex animations or heavy computational tasks.Complex Interfaces – Creating pixel-perfect designs can be challenging.Limited Native APIs – Some features require building custom native modules.Tricky Debugging – Bugs are harder to trace across the JavaScript and native code boundary.Maintenance Overhead – Frequent library updates and dependency conflicts can increase development burden.The infographic is branded with the Pagepro logo at the bottom-right corner, representing the agency behind the content. The graphic provides a high-level summary of when React Native might be a good or poor fit, supporting developers, CTOs, and product owners in tech stack decisions." width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;React Native Pros and Cons Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since you got this far, here’s a quick sum-up of React Native pros and cons:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Business Benefits&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Developer Benefits&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;React Native Limitations&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Lower costs and faster MVP delivery&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Fast iteration with hot reloading&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Slower performance vs. fully native&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;One codebase for iOS and Android&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Reusable components and UI primitives&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Not ideal for complex animations or visuals&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Shorter time-to-market&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;OTA updates and Expo ecosystem&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Limited native API access without bridges&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Easier hiring and team scaling&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Familiar for React/JS developers&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Dependency on third-party libraries&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Native-like user experience&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Access to native modules&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Larger app bundle sizes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Flexibility for testing and prototyping&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Strong community and support&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Occasional compatibility or debugging issues&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;React Native Pros and Cons for Cross-Platform App Development&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React Native development remains a strong option for mobile apps in 2025&lt;/strong&gt;. The framework is tailor-made for businesses looking to launch faster, test ideas quickly, and reduce development costs. What’s more, its shared codebase, active ecosystem, and near-native performance make it ideal for building high-quality apps across platforms.&lt;/p&gt;

&lt;p&gt;That said, &lt;strong&gt;it’s not always the best fit for highly complex, animation-heavy, or deeply integrated native applications&lt;/strong&gt;. The right decision depends on your goals, team skills, and the app’s technical needs.&lt;/p&gt;

&lt;p&gt;When it comes to React Native pros and cons, there isn’t one solution to fit all applications. If you’re unsure whether React Native is the right choice, our team at Pagepro is happy to help. &lt;strong&gt;We’ve delivered everything from MVPs to cross-platform apps, so feel free to get in touch for advice&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kickstart your project with React Native experts -&lt;/strong&gt; &lt;a href="https://pagepro.co/contact?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;contact us&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/publishing-expo-react-native-app-to-ios-and-android/" rel="noopener noreferrer"&gt;How to Publish Expo React Native App to IOS and Android&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-native-for-startups-is-it-really-a-good-idea/" rel="noopener noreferrer"&gt;React Native For Startups: Is It Really a Good Idea?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-native-nativescript-comparison/" rel="noopener noreferrer"&gt;NativeScript vs React Native: Comparison&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-native-vs-xamarin-pros-and-cons/" rel="noopener noreferrer"&gt;React Native vs Xamarin: Pros and Cons&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-native-vs-ionic-and-cordova-comparison/" rel="noopener noreferrer"&gt;React Native vs Ionic vs Cordova: Comparison&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sources&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://buildfire.com/app-statistics/" rel="noopener noreferrer"&gt;Mobile App Download Statistics &amp;amp; Usage Statistics&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://reactnative.dev/showcase" rel="noopener noreferrer"&gt;React Native Showcase&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.statista.com/forecasts/1262892/mobile-app-revenue-worldwide-by-segment" rel="noopener noreferrer"&gt;Statista – Revenue of mobile apps worldwide 2019-2027, by segment&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://reactnative.dev/versions" rel="noopener noreferrer"&gt;React Native Versions&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are The Main Advantages Of React Native?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Native lets you build for both iOS and Android using a single codebase.&lt;/strong&gt; This makes development much faster and reduces potential costs. If you’re familiar with React, you’ll have little problems &lt;/p&gt;

&lt;p&gt;Additionally, the framework &lt;strong&gt;supports fast iteration through hot reloading&lt;/strong&gt;, offers access to native APIs , and has a strong ecosystem with tools like Expo and OTA updates. Its learning curve is also gentle for teams already using React.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are The Disadvantages Of React Native?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While it’s very versatile, &lt;strong&gt;React Native still has limitations&lt;/strong&gt;. Performance doesn’t always reach the level of native apps, especially for animation-heavy or complex tasks. Some native features aren’t accessible without custom bridges, and &lt;strong&gt;debugging can be more complex&lt;/strong&gt;. There’s also a reliance on third-party libraries and the potential for larger app bundle sizes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is React Native Still Relevant In 2025?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Native is very relevant in 2025&lt;/strong&gt;, thanks to the support of its active community and the parent company Meta. The framework continues to improve, with updates like &lt;strong&gt;version 0.80 adding React 19 support and freezing the old architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Who Uses React Native?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Popular apps like &lt;strong&gt;Facebook, Instagram, Bluesky, Amazon, Discord, Uber Eats, Walmart, Shopify, and Airbnb&lt;/strong&gt; all use React Native in some way. It’s also been used by Pagepro clients like Payhip and Learn Squared to launch MVPs and explore new markets.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is React Native Good for MVP Development?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes, &lt;strong&gt;React Native is a great choice for MVPs&lt;/strong&gt; thanks to its fast build cycles, code reusability, and the ability to launch on both iOS and Android at once. It helps teams validate ideas quickly and cost-effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Is React Native Best For?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Native works best for cross-platform mobile apps that need to be built quickly&lt;/strong&gt;, updated often, and delivered with a native-like experience. It’s ideal for social apps, marketplaces, e-commerce platforms, travel services, and even IoT interfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Can React Native Handle Complex Apps?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It depends. &lt;strong&gt;React Native handles many complex features well, especially with the help of native modules and libraries&lt;/strong&gt;, but apps featuring intensive animations, advanced graphics, or deep hardware integrations might be better suited to native development.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Lower Vercel Hosting Costs by 35%</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 16 Jun 2025 12:33:25 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/how-to-lower-vercel-hosting-costs-by-35-1mg4</link>
      <guid>https://dev.to/pagepro_agency/how-to-lower-vercel-hosting-costs-by-35-1mg4</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;High Vercel Hosting Costs? Check the Code&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When it comes to hosting Next.js apps for SaaS, few other solutions are as comfortable and performant as Vercel. However, &lt;strong&gt;Vercel hosting costs can still increase quite fast&lt;/strong&gt;, especially at production scale.&lt;/p&gt;

&lt;p&gt;If your first thought is to blame Vercel for this, &lt;strong&gt;it would be wrong&lt;/strong&gt;. The company has recently implemented numerous changes, which have helped cut costs across its services for thousands of users, but even that might not be enough if your code is to blame.&lt;/p&gt;

&lt;p&gt;In our recent project, we &lt;strong&gt;worked with a SaaS platform struggling to keep its hosting budget under control&lt;/strong&gt;. Despite having a relatively lean app, their monthly Vercel invoice kept growing. After a full audit, we discovered numerous optimization issues in their setup and, by addressing them, &lt;strong&gt;reduced the client’s Vercel costs by 35%,  increased traffic capacity by 1.5×, and reduced build time by 40%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Today, we’ll use the experience gained from working on that project to show you &lt;strong&gt;four easy ways you can optimize your code&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;First, let’s see what exactly you are paying for when using Vercel.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Much Does Vercel Hosting Cost?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;However, the problems start when your app &lt;strong&gt;gets hit with a sudden growth&lt;/strong&gt;. Even the best-prepared teams might not anticipate how variable usage changes, like function execution and bandwidth, &lt;strong&gt;can add up behind the scenes&lt;/strong&gt;.&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%2F6gys140aduvj44vudx3t.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%2F6gys140aduvj44vudx3t.png" alt="Vercel Pricing" width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Vercel Pricing in June 2025&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vercel offers three separate tiers for its users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hobby&lt;/strong&gt;, a generous free tier for small personal projects or developers starting a new web app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt;, a $20/month + additional usage, which works best for professional projects and businesses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;, an option that gives everything your advanced project needs. Unlike the two other options, it tends to have custom pricing, depending on your needs and usage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Vercel Tiers Comparison&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each of Vercel’s tiers offers great features and developer experience &lt;strong&gt;depending on your needs&lt;/strong&gt;. When deploying a web application, you should keep in mind its limitations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Hobby Plan (Free)&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Pro Tier ($20/user/mo)&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Enterprise Plan &lt;/strong&gt;&lt;br&gt;&lt;strong&gt;(Custom Pricing)&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Function Execution Limits&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;100 GB-hours&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;1 TB-hours&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Custom (typically higher)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;100 GB&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;1 TB&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Custom (e.g., 5TB+)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Build Execution&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;600 minutes/month&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;1,000 minutes/month&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Custom (up to unlimited)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Team Seats&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;1 user&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;$20 per additional user&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Negotiated&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Analytics &amp;amp; Monitoring&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Basic&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Enhanced&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Full observability + integrations&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;SLAs &amp;amp; Support&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;None&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Community support&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Custom SLAs, dedicated support&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Vercel pricing features as of June 2025&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;When Should You Commit to the Enterprise Plan?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is a question &lt;a href="https://pagepro.co/blog/optimizing-vercel-hosting-costs/#when-do-you-need-vercel-enterprise" rel="noopener noreferrer"&gt;&lt;strong&gt;we hear often&lt;/strong&gt;&lt;/a&gt;, especially when comparing Pro vs Enterprise.&lt;/p&gt;

&lt;p&gt;If you find yourself going over usage limits of Vercel Pro, it might be worth checking if you won’t be better off upgrading, rather than paying overcharges. Alternatively, &lt;strong&gt;those who need better security solutions&lt;/strong&gt; could pick Vercel Enterprise because it supports SOC 2, ISO 27001, and HIPAA data policies, and includes features like Single Sign-On (SSO), role-based access control, private networking, and dedicated infrastructure.&lt;/p&gt;

&lt;p&gt;Many dev teams upgrade their plan, only to find they’re now paying more to scale inefficiencies that remain in their apps. While the Enterprise Plan includes many advanced features, more security, and customer support, &lt;strong&gt;it’s not the best solution for every team&lt;/strong&gt;. If you want to start saving on Vercel hosting costs quickly, your best option is to first look into your code and see if there aren’t any &lt;a href="https://pagepro.co/blog/optimizing-vercel-hosting-costs/" rel="noopener noreferrer"&gt;&lt;strong&gt;opportunities there&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Looking for Savings in Your Vercel Set Up?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Contact Us&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Where to Start Optimizing Your Vercel Hosting Costs&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Do an Architectural Audit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before making any changes, take a step back and audit how your app is structured. For our client, &lt;strong&gt;we began by analyzing their deployment architecture&lt;/strong&gt;, how routes were handled, where serverless functions were triggered, and how often they were executed.&lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;Vercel’s built-in analytics alongside our own monitoring tools&lt;/strong&gt;, we were able to identify inefficiencies that weren’t visible from the code alone, like bottlenecks affecting execution time or data transfer.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Identify Cost Drains&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once the big picture was clear, we drilled into the specifics. Where was bandwidth being consumed most? Which pages relied too heavily on SSR? Which API routes were generating the most function invocations?&lt;/p&gt;

&lt;p&gt;Answering these questions &lt;strong&gt;helped us isolate the most expensive parts of the app&lt;/strong&gt;, often things the client didn’t even realize were driving costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Begin Targeted Optimizations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With the data in hand, we prioritized quick wins. &lt;strong&gt;We replaced unnecessary SSR with SSG and ISR&lt;/strong&gt;, adjusted or added some caching for API responses, and slimmed down bloated bundles.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Four Optimizations That Helped Our Client Save 35% on Vercel hosting costs&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Optimization 1: Monitor Your Vercel Setup&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aside from the rising cost, one of the biggest issues our client’s team had was &lt;strong&gt;the lack of visibility into the cost drivers&lt;/strong&gt;. To help them get a better view of their app, &lt;strong&gt;we used Vercel’s analytics to get insights&lt;/strong&gt; into function invocations, build times, and bandwidth usage.&lt;/p&gt;

&lt;p&gt;Immediately, we were able to find areas for improvement and showed our client what exactly was affecting their costs. Knowing where the problems lay helped find optimal solutions and &lt;strong&gt;made the client’s team aware of what to pay attention to in the future&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Optimization 2: Replace SSR with SSG and ISR Where Needed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Many SaaS teams use SSR for all dynamic content by default. That’s understandable, since it feels like the most flexible solution. &lt;strong&gt;But SSR triggers serverless functions on every request, even for data that rarely changes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this project, we started with a full audit of all dynamic routes. We found that many pages could be served statically or semi-statically. For marketing pages and documentation, we switched to SSG. &lt;strong&gt;For user dashboards with semi-frequent updates, we used Incremental Static Regeneration (ISR)&lt;/strong&gt; with refresh intervals based on how often the data actually changed.&lt;/p&gt;

&lt;p&gt;We also made sure fallback behavior and cache invalidation were configured correctly &lt;strong&gt;to avoid stale data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/ebook/ebook-next-js-vercel-cost-optimization-guide" rel="noopener noreferrer"&gt;&lt;strong&gt;Get Next.js Vercel Cost Optimization Guide&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Optimization 3: Cut Down on Function Invocations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;SSR wasn’t the only thing influencing the bills in this project. &lt;strong&gt;Several client-side components in the app were making repeated fetches for unchanged data&lt;/strong&gt;. It was happening particularly often on route transitions or periodic refreshes.&lt;/p&gt;

&lt;p&gt;To stop this loop, we introduced &lt;strong&gt;SWR&lt;/strong&gt; (stale-while-revalidate) on the frontend to cache requests. On the backend, we added caching for frequently accessed API responses to reduce redundant processing and improve response times.&lt;/p&gt;

&lt;p&gt;These changes reduced the number of daily invocations, which &lt;strong&gt;helped to save hundreds of dollars per month&lt;/strong&gt; and reduce the load on our client’s backend services.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Optimization 4: Slim Down Your Bundle &amp;amp; Build&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Our client’s app was using a few heavy dependencies unnecessarily and bundling entire icon libraries when it only needed a few icons. &lt;strong&gt;Bloated JavaScript bundles increase build times and hosting costs&lt;/strong&gt;, so changes had to be implemented immediately. &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%2Fl0jdh5sgc2tkz7o96oom.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%2Fl0jdh5sgc2tkz7o96oom.png" alt="Code example" width="800" height="800"&gt;&lt;/a&gt;&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%2Fjct2w9vs9m4bfvhm22uc.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%2Fjct2w9vs9m4bfvhm22uc.png" alt="Code example after optimization" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We ran a full bundle analysis using &lt;code&gt;@next/bundle-analyzer&lt;/code&gt;. Based on the output, we removed unused packages, swapped out heavier libraries for native alternatives, and deferred rendering of complex components using dynamic imports. &lt;strong&gt;We also used image optimization to increase performance where possible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With those changes, we managed to drop the build time by &lt;strong&gt;40%&lt;/strong&gt; and improved perceived app speed for users thanks to a smaller initial JS payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Results&lt;/strong&gt;
&lt;/h3&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%2Fib13nmpsx6h8gxv8a3dt.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%2Fib13nmpsx6h8gxv8a3dt.png" alt="Our client’s Vercel billing after optimizations" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Our client’s Vercel billing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our client’s project launched in a controlled beta in December 2024. Since implementing our optimizations, &lt;strong&gt;they have seen several notable improvements&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Their monthly Vercel costs dropped &lt;strong&gt;by 35%&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By streamlining builds, we managed to reduce their deployment times by 40%.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The platform now handles &lt;strong&gt;1.5x the user traffic&lt;/strong&gt; without additional costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;cost monitoring dashboard&lt;/strong&gt; helped our client’s team manage usage proactively.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/case-studies/vercel-cost-optimization-for-saas-scalability" rel="noopener noreferrer"&gt;&lt;strong&gt;READ THE FULL CASE STUDY&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vercel uses a &lt;a href="https://vercel.com/docs/pricing" rel="noopener noreferrer"&gt;&lt;strong&gt;pay-as-you-go&lt;/strong&gt;&lt;/a&gt; pricing structure, which means you pay for only the services you really use. Their recent changes to the pricing model (like introducing &lt;a href="https://pagepro.co/blog/react-tldr/vercels-fluid-compute-reduces-compute-costs-by-85/" rel="noopener noreferrer"&gt;&lt;strong&gt;Fluid Compute&lt;/strong&gt;&lt;/a&gt;) helped users to lower the costs even more.&lt;/p&gt;

&lt;p&gt;The project is constantly being improved, based on the usage data and user feedback, which has been positive so far. &lt;strong&gt;The users reported faster load times and no disruptions during peak usage&lt;/strong&gt;. We continue to support the client, making sure the platform stays optimal.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Optimize Vercel Now, Scale Without Surprises Later&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Deploying the Next.js app on Vercel doesn’t have to mean breaking the bank.&lt;/strong&gt; It’s a comprehensive solution that works perfectly well for Next.js apps and offers excellent built-in functions, like its analytics tools. &lt;/p&gt;

&lt;p&gt;While some code inefficiencies can raise your bills on Vercel, you don’t need to spend months fixing them. T*&lt;em&gt;he solutions we offered for our clients didn’t require huge changes to their architecture&lt;/em&gt;*, but resulted in real improvements and savings. &lt;/p&gt;

&lt;p&gt;If you’re &lt;strong&gt;spending over&lt;/strong&gt; &lt;strong&gt;$1,500/month on Vercel&lt;/strong&gt; and haven’t yet looked into optimizations like this, you’re almost certainly overpaying for features you might not need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We can fix it in two weeks&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Book &lt;strong&gt;a free 30-minute cost audit&lt;/strong&gt; now and see what can be done to help you save money on hosting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start Saving on Vercel Now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Book Free Consultation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/nextjs-websites-examples/" rel="noopener noreferrer"&gt;40+ Great Examples of Next.js Websites&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/astro-nextjs/" rel="noopener noreferrer"&gt;Astro vs Next.js: Choose the Right Framework in 2025&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/optimizing-next-js-hosting-costs/" rel="noopener noreferrer"&gt;Optimizing Next.js Hosting Costs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/self-hosting-nextjs-apps/" rel="noopener noreferrer"&gt;Self-Hosting Nextjs Apps&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/optimizing-vercel-hosting-costs/" rel="noopener noreferrer"&gt;Optimizing Vercel Hosting Costs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How Much Does Vercel Cost?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It varies. With Pro Plan, you’ll be paying $20 + additional usage per month, but unoptimized SaaS apps often end up spending far more than expected. Enterprise Plan allows for more customized, but not always lower, pricing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Vercel Enterprise Worth It?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It can be, if you’ve already optimized your setup, hit the Pro Plan limits, or need SLAs or dedicated infrastructure. Otherwise, try optimizing your current setup on the Pro first.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Can Next.js Apps Be Cheaper to Host Elsewhere?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They can be under some circumstances. If you’re primarily using static content or want full control over costs, self-hosting or different hosting platforms like Cloudflare, Netlify, or AWS can be more affordable. However, that solution requires more technical expertise and prevents you from enjoying many of Vercel’s built-in functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Vercel Free?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Vercel Hobby Plan is a free option for those who work on small projects, or are experimenting. While it’s limited, Vercel provides a generous set of features that make it worthwhile.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s the Fastest Way to Reduce My Vercel Hosting Costs?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To optimize Vercel costs, replace unnecessary SSR with ISR and SSG, minimize bundle sizes, and add monitoring to spot cost spikes early.&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>webdev</category>
      <category>performance</category>
      <category>programming</category>
    </item>
    <item>
      <title>What is Sanity.io: 2025 Headless CMS Guide</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 02 Jun 2025 12:41:09 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/what-is-sanityio-2025-headless-cms-guide-1gnb</link>
      <guid>https://dev.to/pagepro_agency/what-is-sanityio-2025-headless-cms-guide-1gnb</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Headless Content Management with Sanity.io&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Have you been wondering why Sanity is becoming so popular with modern development teams? &lt;strong&gt;You’re in the right place.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;At its core, &lt;strong&gt;Sanity is a headless CMS&lt;/strong&gt;, but with the recent changes, it has evolved past that and become a structured content platform built to support multi-channel publishing, real-time collaboration, and fully customizable editorial workflows.&lt;/p&gt;

&lt;p&gt;As long-time fans of &lt;a href="https://pagepro.co/services/sanity-development?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;Sanity.io&lt;/strong&gt;&lt;/a&gt;, we’ve decided to prepare an introduction to this amazing content management platform and why it might be the best choice for your next project&lt;/p&gt;

&lt;p&gt;We’ve also prepared a video on &lt;strong&gt;why we think Sanity is a great choice&lt;/strong&gt; for most projects – &lt;a href="https://youtu.be/n1WN4YIkpYA?si=nrZA3zyEy7EP_Cg6" rel="noopener noreferrer"&gt;give it a watch&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;But before we explore what sets it apart from other platforms, we should start by answering the question what is Sanity.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Is Sanity CMS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Like we’ve mentioned, Sanity is a headless content management system. In &lt;a href="https://pagepro.co/blog/best-cms/" rel="noopener noreferrer"&gt;&lt;strong&gt;traditional CMS platforms&lt;/strong&gt;&lt;/a&gt; like &lt;strong&gt;WordPress or Joomla&lt;/strong&gt;, the content and its presentation are tightly joined, which can be very limiting when you need to deliver content across different platforms. A &lt;a href="https://pagepro.co/blog/top-5-best-headless-cms-platforms/" rel="noopener noreferrer"&gt;&lt;strong&gt;headless CMS&lt;/strong&gt;&lt;/a&gt;, on the other hand, treats content as structured data and delivers it via APIs. &lt;/p&gt;

&lt;p&gt;Sanity also fits into the broader composable CMS category and can be integrated with other services in your tech stack, like frontend frameworks (&lt;strong&gt;Next.js, React&lt;/strong&gt;), eCommerce platforms (&lt;strong&gt;Shopify&lt;/strong&gt;), or analytics tools.&lt;/p&gt;

&lt;p&gt;In May 2025, the Sanity team unveiled the &lt;a href="https://pagepro.co/blog/sanity-spring-release-2025-6-ways-sanity-empowers-teams/" rel="noopener noreferrer"&gt;&lt;strong&gt;Spring Release 2025&lt;/strong&gt;&lt;/a&gt;, marking the platform’s evolution from a headless CMS to a &lt;strong&gt;Content Operating System&lt;/strong&gt;. This change came in with completely new tools, which greatly improved the workflows of content creation, management, and distribution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sanity Dashboard&lt;/strong&gt;: A central hub that provides quick access to Studios, Canvas, Media Library, and custom apps. It offers a complete view of content operations across teams and apps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Canvas&lt;/strong&gt;: Previously named Sanity Create, Canvas is an AI-assisted, free-form writing environment. It allows for preparing content with non-intrusive AI support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Media Library&lt;/strong&gt;: An asset management system that organizes media across teams and datasets. It supports role-based access, versioning, and automation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;App SDK&lt;/strong&gt;: Developers can build custom applications within Sanity, tailored to specific workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Functions&lt;/strong&gt;: Spring release introduced serverless functions, enabling complex backend logic, such as data synchronization and integration, directly within Sanity. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent Actions&lt;/strong&gt;: Brings AI capabilities to content workflows through a programmatic interface. It can audit documents, identify gaps, suggest updates, and organize them into manageable work packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Insights&lt;/strong&gt;: Offers visibility into content performance and workflow bottlenecks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Sanity CMS  Works&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Sanity’s architecture is built around &lt;strong&gt;three main components&lt;/strong&gt; that work together to deliver a &lt;strong&gt;developer-first content platform&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Content Lake&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At the heart of Sanity is &lt;strong&gt;the Content Lake&lt;/strong&gt;. It’s a fully managed backend where content is stored as structured data, not HTML, which makes it reusable across any frontend. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Lake supports real-time updates&lt;/strong&gt;. That means changes made in the Studio are instantly reflected in apps and websites. It also scales automatically with content versioning and document-level access. With that, you’re able to build once and distribute your content anywhere – &lt;strong&gt;no need to rewrite logic for each platform&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Sanity Studio&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity Studio is an editing environment&lt;/strong&gt; in which users can create, manage, and organize content. It’s open source, written &lt;strong&gt;in React&lt;/strong&gt;, and fully customizable. Instead of rigid templates, Sanity Studio lets you define your content model using JavaScript.&lt;/p&gt;

&lt;p&gt;What’s more, it includes plugin support for adding things like &lt;strong&gt;AI assistants, visual previews, or third-party integrations&lt;/strong&gt;. The themeable interface that matches your brand or client needs and custom content types makes Sanity Studio &lt;strong&gt;one of the few platforms that adapts to your team&lt;/strong&gt;.&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%2Fi3sfuxnyw8tzevtb8jn1.jpg" 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%2Fi3sfuxnyw8tzevtb8jn1.jpg" alt="A dark-themed interface of Sanity Studio being used for a music festival project. The left sidebar lists schema types like “Artist,” “Program,” and “Blog posts.” The main panel displays rich text editing with collaborative comments, change tracking, and an image cropping tool showing an artist’s photo." width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://www.sanity.io/studio" rel="noopener noreferrer"&gt;&lt;strong&gt;Sanity.io&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;GROQ and APIs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity uses GROQ (&lt;strong&gt;Graph-Relational Object Queries&lt;/strong&gt;), a language designed for structured content. Although its syntax is &lt;strong&gt;similar to GraphQL&lt;/strong&gt;, GROQ was built from the ground up to handle deeply nested structures and fetch exactly the shape of data you need in a single query. &lt;/p&gt;

&lt;p&gt;In addition to GROQ, &lt;strong&gt;Sanity provides APIs that support different development styles&lt;/strong&gt;. You can use the auto-generated GraphQL API or tap into the REST API for simple integrations with third-party services like &lt;strong&gt;Zapier or Netlify&lt;/strong&gt;. Real-time listeners are also available, so your application can instantly respond to content changes.&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%2Fia8kvdsd9idxgl5m8zo8.jpg" 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%2Fia8kvdsd9idxgl5m8zo8.jpg" alt="A split-screen developer environment. On the left, React code fetches blog post data using a GROQ query via sanityClient. On the right, the execution result is displayed in JSON format, showing a post with title, slug, ID, and main image URL from the Sanity CMS." width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/sanity-io/vscode-sanity" rel="noopener noreferrer"&gt;&lt;strong&gt;Sanity.io on Github&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Pros and Cons of Sanity Content Management System&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;While &lt;strong&gt;it can be a good fit for most organizations and businesses&lt;/strong&gt;, Sanity has some drawbacks that should be taken into account before making a decision. Let’s have a look at some of them:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros of Sanity CMS&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer-First&lt;/strong&gt;: Since the content model in Sanity is defined in the code (JavaScript or TypeScript), it can live in version control, evolve with your project, and adapt to edge cases that more traditional CMS platforms can struggle with.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Portable Content&lt;/strong&gt;: Because it’s JSON-based and delivered via APIs, content in this CMS can be reused across different platforms, even between web and mobile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-Time Collaboration&lt;/strong&gt;: In Sanity, editors can collaborate on the same document and see updates as they happen, a very helpful feature for distributed teams chasing deadlines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom Editorial Interfaces&lt;/strong&gt;: If your content team has unique needs, Sanity gives you the option to build your own editorial interfaces, which can be great for brands managing multiple markets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Powerful Ecosystem&lt;/strong&gt;: The Spring Release 2025 expanded Sanity’s capabilities. The Media Library, Canvas AI editor, and App SDK let you build entire workflows within the Sanity environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cons of Sanity CMS&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learning GROQ&lt;/strong&gt;: GROQ is powerful, but it’s not as well-known as GraphQL or SQL. It may take time for new developers to get comfortable with its syntax.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complex Initial Setup&lt;/strong&gt;: Sanity Studio is very customizable, but has no templating system like you’d find in WordPress or Webflow. Non-developers will likely need expert help to define schemas and configure Studio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintenance Responsibility&lt;/strong&gt;: Because you can customize so much, you’re also responsible for maintaining those customizations. While it’s manageable, you should keep it in mind if your team has limited frontend resources.&lt;br&gt;&lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that you have a better understanding of Sanity’s capabilities, we can move on to analyze &lt;strong&gt;who benefits most from it&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Who is Sanity for?&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Developers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Developers have full control over Sanity’s content architecture, frontend integration, and editorial workflows&lt;/strong&gt;. The schema definitions are easy to maintain and version with the rest of your project, since they live in code. Additionally, the App SDK and serverless Functions allow for building fully custom content tools within the Sanity ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Content Teams and Marketers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity is full of features meant to make the work of editors smoother&lt;/strong&gt;, such as real-time collaboration, live previews, and structured content. The Canvas interface with AI-assisted drafting and the centralized Media Library help content specialists move faster, without needing devs to implement every change.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Startups and Growing Teams&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The generous free tier and modular setup make Sanity a &lt;strong&gt;great fit for early-stage startups&lt;/strong&gt;. You can start small with a simple Studio, and then scale content delivery as your needs grow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Enterprise Teams&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For companies managing large content operations, &lt;strong&gt;Sanity supports a variety of functions&lt;/strong&gt;: role-based access control, dataset partitioning, and complex integrations with CDNs, eCommerce platforms, and analytics tools. Insights and Agent Actions offer visibility and automation for future expansions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Non-technical users&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Although the initial setup usually calls for developer input, once the Studio is set up, &lt;strong&gt;even non-technical users can work with the content&lt;/strong&gt;. Editors don’t need to understand how the frontend works to work inside a custom interface designed around their tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity CMS Pricing&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Sanity’s &lt;a href="https://sanity.io/pricing" rel="noopener noreferrer"&gt;&lt;strong&gt;usage-based pricing&lt;/strong&gt;&lt;/a&gt; scales from solo developers to enterprise teams, making it accessible for a wide range of content needs.&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%2F43u8cph8sad0tauenoz1.jpg" 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%2F43u8cph8sad0tauenoz1.jpg" alt="A dark-themed pricing table comparing three tiers:Free ($0 forever): For small projects. Includes up to 20 users, 2 public datasets, real-time content, and basic editing tools.Growth ($15/seat/month, recommended): Adds private datasets, up to 50 users, content releases, AI assist, and more collaboration tools.Enterprise (Custom pricing): Tailored for large teams with custom roles, SSO, dedicated support, and advanced usage options." width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Sanity.io&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Free Plan: For Individual Developers or Small Teams&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ideal for personal projects, MVPs, or learning Sanity. You get &lt;strong&gt;20 seats, 2 datasets, and enough bandwidth and storage to support simple use cases&lt;/strong&gt;. Real-time collaboration and access to the Media Library are included, but advanced features such as comments and AI Assist are missing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Growth Plan: For scaling teams&lt;/strong&gt; 
&lt;/h3&gt;

&lt;p&gt;At &lt;strong&gt;$15 per seat/month&lt;/strong&gt;, this plan is perfect for startups or growing teams that want more roles (&lt;strong&gt;up to 5&lt;/strong&gt;), private datasets, collaboration features (like comments and tasks), and optional pay-as-you-go overages. You can also purchase add-ons like SSO and extended quotas.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Enterprise Plan: For large organizations with complex needs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This custom-priced tier is tailored for &lt;strong&gt;companies that need enterprise-grade support&lt;/strong&gt;, SAML SSO, uptime SLAs, advanced access control, and high usage quotas. It includes onboarding, custom retention, audit trails, and premium dataset features.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sanity Use Cases&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To prove Sanity’s flexibility, here are a few real-world examples showing how different teams use Sanity to solve practical content challenges:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Ecommerce&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Modern eCommerce sites require speed, high personalization, and integration with product data to perform well. Sanity fits right in, &lt;strong&gt;giving teams a structured content layer&lt;/strong&gt; they can shape around customer journeys.&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%2Fw4r2fkh0m9itfe8j5tc4.jpg" 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%2Fw4r2fkh0m9itfe8j5tc4.jpg" alt="A modern beauty product site with a pastel pink aesthetic. The header showcases models in a promotional banner with the phrase “Remastered Icon 💖.” Below, a “Best Sellers” section displays a clean grid of cosmetic products including lip pencils, lipsticks, and glosses." width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Siella Beauty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://karvedigital.com/case-studies/siella-beauty-shopify-and-sanity-case-study" rel="noopener noreferrer"&gt;&lt;strong&gt;Siella Beauty&lt;/strong&gt;&lt;/a&gt;‘s Shopify store uses Sanity to manage campaign content, editorial, and landing pages, separately from their product catalog. This way, their team has more control over storytelling while &lt;strong&gt;Shopify handles transactions&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Marketing Websites&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Marketing teams often need to update copy, swap visuals, or launch landing pages with no time to wait for a developer. Sanity Studio makes that possible by &lt;strong&gt;offering a CMS custom-made for their workflow&lt;/strong&gt;.&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%2F1ad6wsu28sjn9tf2cj5e.jpg" 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%2F1ad6wsu28sjn9tf2cj5e.jpg" alt="A visually striking homepage for a Norwegian hotel, featuring a scenic night view of glass igloos under a vivid aurora borealis. The text “Glass Igloo Hotel” appears in the center, with a description below inviting users to visit the hotel with friends or loved ones." width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Lyngen North&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lyngen-north.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Lyngen North&lt;/strong&gt;&lt;/a&gt;, an arctic luxury hotel, wanted a high-performance website that reflected their brand and offered easy content updates. &lt;strong&gt;Combining Sanity with the power of Next.js&lt;/strong&gt;, &lt;a href="https://pagepro.co/case-studies/lyngen-north" rel="noopener noreferrer"&gt;we delivered a fast frontend&lt;/a&gt; and a custom Studio that lets the team update text, imagery, and packages whenever they need.&lt;strong&gt;Documentation &amp;amp; Knowledge Bases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured documentation is where Sanity shows its full potential&lt;/strong&gt;. It allows for building scalable docs with ease thanks to rich text support, nested references, and real-time updates.&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%2F7rdbtjlg4vwplw7tv47u.jpg" 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%2F7rdbtjlg4vwplw7tv47u.jpg" alt="A clean, light-themed UI showing the Causal documentation portal. The sidebar contains navigation links such as " width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Carousal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.causal.app/blog/how-we-built-our-documentation-nextjs-sanity-cms" rel="noopener noreferrer"&gt;&lt;strong&gt;Causal&lt;/strong&gt;&lt;/a&gt; built their entire documentation system using Sanity and Next.js. They structured everything in portable blocks of content, which link related topics, let them add code snippets, and &lt;strong&gt;serve docs between different platforms&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Is Sanity Right for You?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If your team needs a CMS that adapts to your tech stack, supports custom workflows, and scales with your content operations, Sanity is one of the most capable options out there.&lt;/strong&gt; It’s especially well-suited for teams that value developer control, structured content, and multi-channel delivery.&lt;/p&gt;

&lt;p&gt;At Pagepro, we’ve helped companies implement Sanity to streamline marketing workflows, migrate from legacy CMSs, and build scalable, content-driven products. If you’re considering Sanity for your next project, &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;get in touch with us&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;or check out our&lt;/strong&gt; &lt;a href="https://pagepro.co/case-studies/category/sanity?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;case studies&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to see what’s possible&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Frequently Asked Questions About Sanity CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity a CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes, &lt;strong&gt;Sanity is a headless CMS (Content Management System)&lt;/strong&gt;. Unlike traditional CMSs, it separates content management from presentation, making it ideal for multi-platform publishing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Sanity Free?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity offers a free tier with basic features and usage limits&lt;/strong&gt;. For larger projects or team collaboration, paid plans are available with added capabilities like increased API quotas, user roles, and usage analytics.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What is Sanity Studio?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity Studio is an open-source editing environment built with React&lt;/strong&gt;. It’s fully customizable, letting you design and edit project workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Language Does Sanity Use?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sanity uses JavaScript and React for its Studio&lt;/strong&gt;, and its query language is called GROQ (Graph-Relational Object Queries), which is designed specifically for querying structured content.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are the Benefits of Using Sanity?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Some key benefits include real-time collaboration, content modeling, portable APIs, and developer freedom&lt;/strong&gt;. It’s a great fit for content-rich, scalable applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Who Uses Sanity?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sanity is used by companies ranging from startups to enterprises. Notable users include &lt;strong&gt;Nike, Figma, and National Geographic&lt;/strong&gt;. It’s especially popular among teams building eCommerce, marketing websites, and digital experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Are the Alternatives to Sanity?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Alternatives include traditional CMSs like &lt;strong&gt;WordPress and Webflow&lt;/strong&gt;, or other headless CMSs like &lt;strong&gt;Strapi, Contentful, and Prismic.&lt;/strong&gt; Sanity stands out for its real-time editing and Studio customization.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/best-use-cases-of-sanity/" rel="noopener noreferrer"&gt;Best Use Cases of Sanity&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/why-sanity-is-the-best-cms-for-the-healthcare-industry/" rel="noopener noreferrer"&gt;Why Sanity is the Best CMS for the Healthcare Industry&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/what-is-headless-cms/" rel="noopener noreferrer"&gt;What is Headless CMS And What Are The Advantages?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/sanity-and-nextjs-for-ci-cd/" rel="noopener noreferrer"&gt;Sanity and Nextjs for CI / CD&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sanity</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>5 Top CMS Platforms in 2025: Pagepro Picks</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 26 May 2025 12:01:53 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/5-top-cms-platforms-in-2025-pagepro-picks-2l4j</link>
      <guid>https://dev.to/pagepro_agency/5-top-cms-platforms-in-2025-pagepro-picks-2l4j</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;How to Choose the Best CMS Platform in 2025?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When our clients ask me, &lt;a href="https://pagepro.co/services/custom-cms-development" rel="noopener noreferrer"&gt;“Which CMS is best for my website?”&lt;/a&gt; my answer usually depends on what kind of project they’re running. &lt;strong&gt;No CMS is a one-size-fits-all solution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To help you decide on the right one for the job, I’ve prepared a list of &lt;strong&gt;five platforms Pagepro recommends in 2025&lt;/strong&gt;. These CMSes are fast to set up, supported by large plugin ecosystems, and ideal for a variety of use cases.&lt;/p&gt;

&lt;p&gt;I’ll be focusing specifically on traditional CMS platforms that come with a built-in frontend and handle both content management and page rendering in one place. If you’re looking for something &lt;strong&gt;more modern and API-driven&lt;/strong&gt;, where your CMS powers apps, websites, and more, check out our guide to the &lt;a href="https://pagepro.co/blog/top-5-best-headless-cms-platforms/" rel="noopener noreferrer"&gt;&lt;strong&gt;Top 5 Headless CMS Platforms&lt;/strong&gt;&lt;/a&gt;. You can also read more about &lt;a href="https://pagepro.co/blog/what-is-headless-cms/" rel="noopener noreferrer"&gt;&lt;strong&gt;What is Headless CMS&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What to Consider When Choosing the Best CMS for You&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before we go over specific platforms, we need to understand &lt;strong&gt;what matters the most for your websit&lt;/strong&gt;e. The best CMS for one site might not necessarily be the perfect choice for the other, since their priorities and technical support might differ. When choosing a solution for yourself, &lt;strong&gt;here’s what you should pay attention to&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Ease of Use&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you’re not a developer, this is probably at the very top of your list. &lt;strong&gt;Some CMS platforms come with visual editors or drag-and-drop interfaces that make building and editing content easy&lt;/strong&gt; for non-technical users like marketers. Others are more flexible, but have a steeper learning curve or need developer involvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Plugin and Theme Ecosystems&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The bigger the ecosystem, the more likely you’ll find pre-built tools or designs to use in your project&lt;/strong&gt;. WordPress, for example, has tens of thousands of plugins available. Smaller CMSes might require more custom work to have the same level of functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Security and Maintenance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Every CMS needs to be updated regularly, and while there are platforms that automate this process, &lt;strong&gt;many put the responsibility on you&lt;/strong&gt;. The more complex your CMS setup, the more you’ll need a plan for maintenance and hosting security. Consider platforms that actively patch vulnerabilities and have regular update cycles. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Support and Community&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A vibrant community can be just as valuable as official support&lt;/strong&gt;. Active forums, documentation, third-party tutorials, and developer networks can help you solve problems faster. That means mature platforms like Joomla and Drupal often have the benefit of established communities with hundreds of developers able to answer your questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Customizability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Many CMS offer you all the functionalities, b*&lt;em&gt;ut some give you a base to build custom components on top of&lt;/em&gt;*. If your project has specific design or feature needs, a platform that gives your developers room to work without restrictions is the best CMS.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Multilingual Capabilities&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Are you targeting users in multiple countries or regions?&lt;/strong&gt; If so, multilingual support is a must. There are CMS platforms (like Joomla and Drupal) that handle this natively.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;SEO and Performance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your CMS should help improve your SEO. Look for tools that support custom metadata, clean URLs, sitemaps, and fast page loads. &lt;strong&gt;CMS platforms that let you control image optimization, caching, and performance settings give you more options to stay search-friendly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Since we know what we’re looking for, time to introduce you to the five best CMS platforms Pagepro recommends in 2025: &lt;strong&gt;WordPress, Webflow, Joomla, Drupal, and Umbraco&lt;/strong&gt;.&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%2Fdtmym5s6xogi2vclz2lh.webp" 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%2Fdtmym5s6xogi2vclz2lh.webp" alt="Infographic comparing the pros and cons of all 5 CMS platforms mentioned in the article: WordPress, Webflow, Joomla, Drupal, and Umbraco" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not Sure Which CMS Your Website Needs?&lt;/strong&gt; &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;&lt;strong&gt;Ask Our Experts&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;WordPress CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Still the world’s most popular CMS, WordPress &lt;a href="https://www.wpzoom.com/blog/wordpress-statistics/" rel="noopener noreferrer"&gt;&lt;strong&gt;powers over 40% of the web&lt;/strong&gt;&lt;/a&gt;. It’s loved for its ease of use, massive plugin library, and flexible theming system. All of these make it suitable for everything from personal blogs to full-scale business websites, but &lt;strong&gt;WordPress is not without its flaws&lt;/strong&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros of WordPress&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Most Flexible CMS Available&lt;/strong&gt; – WordPress is &lt;strong&gt;incredibly versatile&lt;/strong&gt; and capable of becoming almost anything you need it to be, even a headless CMS. It offers the tools to create the perfect website for users of all skill levels and needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low Cost&lt;/strong&gt; – WordPress.org, the self-hosted version, is completely free to use. WordPress.com, on the other hand, is a hosted service with various pricing plans. When using WordPress.org, your primary expense will be securing a hosting provider, which can be as affordable as &lt;strong&gt;$3 per month&lt;/strong&gt;. Bigger businesses can pay from &lt;strong&gt;$20 to $50+/month&lt;/strong&gt; to get better performance and support for their sites.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technical Expertise Not Required&lt;/strong&gt; – You don’t need advanced web dev skills or a team to get your website up and running with WordPress. The platform is designed to be &lt;strong&gt;accessible for beginners&lt;/strong&gt;, but experienced users can also take advantage of its more complex and powerful features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free Resources&lt;/strong&gt; – WordPress offers access to over &lt;strong&gt;60,000 plugins&lt;/strong&gt; you can use to create your projects for free. Users can easily manage backups, improve security, optimize SEO, and handle any other functionality they might need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Largest CMS Community in the World&lt;/strong&gt; – The platform is known for its &lt;strong&gt;big and active community&lt;/strong&gt;. The huge number of community resources available guarantees that you can quickly find an answer to your questions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fzkc2wg2t3wgfqa01wybx.webp" 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%2Fzkc2wg2t3wgfqa01wybx.webp" alt="Wordpress view" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Jetpack.com&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cons of WordPress&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-Maintenance Security&lt;/strong&gt; – The freedom WordPress offers comes with the added &lt;strong&gt;responsibility of managing backups and security&lt;/strong&gt;, which can be a burden on smaller teams.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Needs Frequent Updates&lt;/strong&gt; – To keep your site running smoothly, &lt;strong&gt;your plugins must be updated regularly&lt;/strong&gt;. Although WordPress allows for automatic updates, monitoring these updates is still a good practice. It lets you avoid compatibility issues that can slow down your site or introduce security risks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Potential for Performance Issues&lt;/strong&gt; – Going overboard with the plugins or themes offered by WordPress and its community &lt;strong&gt;can bloat your site&lt;/strong&gt;, leading to slow loading times and a negative user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependent on Third-Party Plugins&lt;/strong&gt; – WordPress relies heavily on third-party plugins to extend its functionality, which can be a double-edged sword, since they can introduce compatibility issues and functionality problems into your system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is WordPress The Best CMS For Me?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;If you value control, scalability, and community support, a CMS like WordPress might be the best choice.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a platform, WordPress offers great value and flexibility, with the added benefit of great community support. &lt;strong&gt;It’s one of the best content management systems on the marke&lt;/strong&gt;t for users of all skill levels, and supports a wide range of different projects.&lt;/p&gt;

&lt;p&gt;It can be difficult to maintain, however,  and &lt;strong&gt;the bloat tendency&lt;/strong&gt; has to be always considered when choosing custom plugins.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Webflow CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/services/webflow-development?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;Webflow&lt;/strong&gt;&lt;/a&gt; is a no-code website builder that allows users to create custom themes and design layouts from scratch without traditional coding. &lt;strong&gt;It generates clean HTML, CSS, and JavaScript in the background&lt;/strong&gt;, achieving front-end results through a visual interface.&lt;/p&gt;

&lt;p&gt;If you want to learn more about Webflow, check out our article: &lt;a href="https://pagepro.co/blog/what-is-webflow-everything-you-need-to-know/?swcfpc=1" rel="noopener noreferrer"&gt;&lt;strong&gt;What is Webflow?&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros of Webflow&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fully Customizable Drag &amp;amp; Drop Menu&lt;/strong&gt; – It has an &lt;strong&gt;intuitive drag-and-drop builder&lt;/strong&gt; for creating custom websites without HTML, CSS, or JavaScript. This focus on visual design lets users customize components to their liking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-Quality Resources&lt;/strong&gt; – The platform provides &lt;strong&gt;great customer support&lt;/strong&gt; and an active online community for finding help and sharing knowledge. High-quality tutorials available through Webflow University offer written instructions and video tutorials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Attractive Free Plan&lt;/strong&gt; – Webflow’s free plan &lt;strong&gt;lets you launch projects without providing credit card information&lt;/strong&gt;, which is great for quick setup and experimentation. As long as users keep the Webflow branding in the URL, they can create original designs without additional costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SEO Control&lt;/strong&gt; – Webflow gives you control over meta tags, structured data, and sitemap generation, which is a big plus for marketing-focused sites.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fr58dg5yzbxzx2tr0e9l8.webp" 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%2Fr58dg5yzbxzx2tr0e9l8.webp" alt="Webflow view" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Webflow&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cons of Webflow&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better for Smaller Projects&lt;/strong&gt; – Webflow might struggle to meet the needs of larger, more complex projects. Although it supports dynamic content through CMS Collections, its limitations around advanced logic &lt;strong&gt;make it a better pick for smaller or content-driven projects&lt;/strong&gt; over complex apps or platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No Advanced Blogging&lt;/strong&gt; – Webflow lets you build blogs with its CMS, but &lt;strong&gt;lacks features like post scheduling, native comments, and multi-author support&lt;/strong&gt;. Adding advanced functionality sometimes calls for third-party tools or other solutions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Export Limitations&lt;/strong&gt; – While Webflow does allow HTML/CSS/JS export for static sites, &lt;strong&gt;you cannot export CMS content or logic&lt;/strong&gt;. This is very restricting for users who may want to migrate their sites or switch hosting options in the future.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependency on Webflow Hosting&lt;/strong&gt; – Sites created on this platform r*&lt;em&gt;ely on Webflow for hosting&lt;/em&gt;*, and that might not always align with your preferences or needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Basic User Permissions&lt;/strong&gt; – User role customization (especially for clients or teams) &lt;strong&gt;is limited&lt;/strong&gt;. Enterprise workarounds exist but are not standard in lower plans.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Webflow the Best CMS for Me?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;If you prioritize ease of use and need a customizable solution for smaller projects, Webflow might be best suited for your website development.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Webflow is a great option for &lt;strong&gt;creating custom websites without coding&lt;/strong&gt;. The intuitive drag-and-drop builder supports full customization, meaning it’s suitable for marketing sites and galleries.&lt;/p&gt;

&lt;p&gt;Still, it might not handle larger projects as well as its competitors. The basic blogging features and migration issues limit flexibility. &lt;strong&gt;The lack of hosting freedom can also feel very restricting&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Joomla CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Joomla is a free and open-source CMS platform built on PHP. Suitable for a wide range of web projects, it also &lt;strong&gt;comes with a pretty steep learning curve&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros of Joomla&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible&lt;/strong&gt; – The modular architecture of Joomla allows for quick adding or swapping of features, letting the CMS grow together with your site. &lt;strong&gt;You can scale without worrying about staying behind the competition&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; – &lt;strong&gt;Security is the area where this content management system shines&lt;/strong&gt;, thanks to features like two-factor authentication, access control levels, and regular security updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built-In Features&lt;/strong&gt; – Thanks to Joomla’s built-in features, &lt;strong&gt;you don’t need to install additional plugins&lt;/strong&gt; to get all the functionalities you need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Great for User Management&lt;/strong&gt; – Joomla &lt;strong&gt;excels in user management&lt;/strong&gt; and offers support for multiple user groups and access levels. This is very useful for community-driven sites or organizations with complex user hierarchies&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2F7vqtkydng5vyv5tc8x8u.webp" 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%2F7vqtkydng5vyv5tc8x8u.webp" alt="Joomla 5 Screenshot" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Kevin’s Guide&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cons of Joomla&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Requires Technical Knowledge&lt;/strong&gt; – Joomla is &lt;strong&gt;less intuitive&lt;/strong&gt; and has a steep learning curve, which can be a barrier for beginners or non-technical users looking for a simple solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fewer Extensions and Templates Compared to Competitors&lt;/strong&gt; – The platform offers a decent selection of extensions and templates, but &lt;strong&gt;the options are somewhat limited&lt;/strong&gt;. It makes finding the exact functionality or design you need harder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Risk of Compatibility Issues&lt;/strong&gt; – The flexibility of Joomla comes with the risk of compatibility problems when using multiple extensions or custom templates, which can be &lt;strong&gt;frustrating, time-consuming, and costly to fix&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Higher Maintenance Requirements&lt;/strong&gt; – Joomla often &lt;strong&gt;requires ongoing maintenance&lt;/strong&gt;. It can be burdensome for those who do not have the technical skills or time to manage regular updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Declining Popularity&lt;/strong&gt; – The &lt;strong&gt;declining popularity of Joomla&lt;/strong&gt; means it has a smaller community and fewer resources compared to more widely used platforms.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Joomla the Best CMS for Me?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;If you’re comfortable with its technical demands and need a scalable CMS, Joomla could be a good fit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Joomla is ideal for a wide range of websites, from blogs to complex corporate sites. It offers strong user management, native multilingual support, and robust security features, making it &lt;strong&gt;suitable for projects requiring scalability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It has a steeper learning curve and fewer extensions and templates compared to other CMS platforms, which may pose challenges for beginners. Regular maintenance and monitoring for &lt;strong&gt;compatibility issues can also be time-consuming&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Drupal CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Drupal remains &lt;strong&gt;the top choice for organizations with strict access control and security needs&lt;/strong&gt;, like governments, universities, or NGOs. Its power lies in its modular architecture and flexibility, but it’s not a novice-friendly platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros of Drupal&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility and Customization&lt;/strong&gt; – Drupal is a CMS that &lt;strong&gt;can adapt to any project requirements&lt;/strong&gt;. Its modular architecture makes it easy to add or remove new features. Developers can use it to create anything they want, be it simple blogs or complex sites.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Great Security&lt;/strong&gt; – This CMS has &lt;strong&gt;strong security features&lt;/strong&gt;, including two-factor authentication and user access controls. With these, your data remains protected from potential attacks, though regular updates and monitoring are still recommended.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User Management&lt;/strong&gt; – Sites with complex user interactions will benefit a lot from Drupal’s &lt;strong&gt;advanced user management&lt;/strong&gt;. Administrators can define roles and permissions in great detail, which helps control access levels for different users or groups.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extensive Library of Modules&lt;/strong&gt; – Drupal’s module library covers features like SEO tools, or e-commerce solutions, &lt;strong&gt;improving the platform’s functionality across all domains&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong Community Support&lt;/strong&gt; – Just like WordPress, this platform has a &lt;strong&gt;dedicated and active community&lt;/strong&gt; that provides valuable resources and support.    &lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fwa502v3i228qj6pl2y7y.webp" 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%2Fwa502v3i228qj6pl2y7y.webp" alt="Drupal View" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: Drupal.org&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cons of Drupal&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Difficult for Beginners&lt;/strong&gt; – Drupal’s features and configuration options require a higher level of technical knowledge. &lt;strong&gt;New users might find it hard to navigate&lt;/strong&gt; its interface and fully explore its capabilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Higher Development Costs&lt;/strong&gt; – Because of its complexity, a Drupal site often requires hiring experienced developers. This can increase development and maintenance costs, especially for businesses without in-house dev teams.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regular Maintenance Requirements&lt;/strong&gt; – To properly maintain a Drupal site, you need &lt;strong&gt;regular updates&lt;/strong&gt; to the core system and modules. It can be time-consuming and &lt;strong&gt;require technical skills&lt;/strong&gt;, which users without a background in web development might lack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Potential Malfunctions&lt;/strong&gt; – Drupal’s flexibility can lead to c*&lt;em&gt;ompatibility issues&lt;/em&gt;*. When using multiple modules or custom themes, you may encounter conflicts between extensions, causing parts of the site to malfunction.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Drupal the Best CMS for Me?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;If you have the technical skills or resources and require a personalized website, Drupal could be it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drupal is great for &lt;strong&gt;creating customizable websites&lt;/strong&gt;. Its strong security measures and user management ensure safety, and modular architecture allows teams to build sites tailor-made for their needs.&lt;/p&gt;

&lt;p&gt;Remember, Drupal is geared towards web developers. &lt;strong&gt;The setup of this CMS may be difficult&lt;/strong&gt;, and hiring skilled developers is pricey.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Umbraco CMS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Umbraco is a flexible, open-source CMS built on the .NET framework. It works &lt;strong&gt;great for organizations that already use Microsoft technologies&lt;/strong&gt;. Developers appreciate its clean codebase, customizable structure, and polished admin UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Pros of Umbraco&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Development Freedom&lt;/strong&gt; – Umbraco provides a lot of freedom in creating websites and web applications, and &lt;strong&gt;can be applied to any type of website&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customization Potential with Microsoft .NET Framework&lt;/strong&gt; – Since it’s built on the Microsoft .NET Framework, Umbraco is a .NET Core CMS and &lt;strong&gt;allows for extensive customization&lt;/strong&gt;. Users with a basic understanding of C# and .NET can even develop their own extensions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;User-Friendly Interface&lt;/strong&gt; – The platform features a user-friendly interface that’s accessible for marketers and editors. The &lt;strong&gt;clear layout and straightforward navigation&lt;/strong&gt; allow for managing website content without technical training.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SEO-Friendly Features&lt;/strong&gt; – Umbraco includes &lt;strong&gt;built-in SEO tools&lt;/strong&gt; that help users optimize their websites for search engines, like customizable URLs, meta tags, and sitemap generation.   &lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fk04ta7s2gnhhw6jeiqq6.webp" 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%2Fk04ta7s2gnhhw6jeiqq6.webp" alt="Umbracol View" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source: our.umbraco.com&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cons of Umbraco&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Steep Learning Curve&lt;/strong&gt; – New users &lt;strong&gt;may find the platform challenging&lt;/strong&gt;, especially when dealing with advanced features or custom development. A solid understanding of .NET and web development principles is often necessary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smaller Ecosystem Compared to Competitors&lt;/strong&gt; – While Umbraco has a dedicated community, &lt;strong&gt;its ecosystem is smaller&lt;/strong&gt; than that of platforms like WordPress. This can result in fewer available plugins, themes, and third-party integrations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Higher Development Costs&lt;/strong&gt; – Due to the need for specialized .NET development skills, building and maintaining an Umbraco site &lt;strong&gt;can be more expensive&lt;/strong&gt; compared to platforms that rely on more commonly available technologies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complex Setup and Configuration&lt;/strong&gt; – Setting up and configuring Umbraco can be difficult, particularly for large or customized projects. A &lt;strong&gt;significant time has to be spent on installation&lt;/strong&gt;, module configuration, and site organization to achieve optimal performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regular Maintenance Requirements&lt;/strong&gt; – Maintaining an Umbraco site involves &lt;strong&gt;regular updates&lt;/strong&gt; to the core system and extensions. It can be time-consuming and may require technical skills.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Potential for Compatibility Issues&lt;/strong&gt; – With various plugins and custom integrations, users may encounter complex &lt;strong&gt;compatibility issues that aren’t easy to fix&lt;/strong&gt; without specific knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Umbraco the Best CMS for Me?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;If you have the necessary resources and want a very personalized CMS, Umbraco could be the ideal CMS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Umbraco’s user-friendly interface allows editors to manage content on your website easily, and built-in SEO tools help &lt;strong&gt;improve search engine visibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the other hand, its &lt;strong&gt;technical requirements&lt;/strong&gt; can be a problem for users who don’t have the necessary knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Which CMS Will Be the Best for Me?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Finding the best CMS can be overwhelming. Each platform has its merits, depending on your needs, skills, and the type of website you’re building. Here’s a quick recap:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;CMS&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Developer Skill Needed&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High (via plugins/themes)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Medium (plugin-dependent)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Low to Medium&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Blogs, content-heavy sites, small businesses, SEO-focused marketing&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Webflow&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Limited (low-code)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Low to Medium (limited logic)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Low&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Landing pages, marketing sites, portfolios, MVPs&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Joomla&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Moderate (built-in features)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Medium to High&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Medium&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Multilingual sites, membership platforms, community-driven projects&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Drupal&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Very High (custom modules)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High (enterprise-ready)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Government, nonprofits, enterprise portals, complex content structures&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Umbraco&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High (custom .NET development)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High (esp. in MS stack)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Medium to High&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Corporate sites, .NET-based platforms, internal tools, enterprise apps&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;WordPress&lt;/strong&gt; is a great choice for most users thanks to its ease of use, huge plugin ecosystem, strong SEO features, and active global community. It’s the most popular open-source CMS in the world and &lt;strong&gt;a&lt;/strong&gt; &lt;strong&gt;reliable solution for everything from blogs to small business websites&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webflow&lt;/strong&gt; is ideal for marketers and designers who want full control over layout and visuals without writing code. It has an intuitive drag-and-drop interface that is &lt;strong&gt;great for creating landing pages, portfolios, and marketing sites&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Joomla&lt;/strong&gt; offers more built-in flexibility than WordPress, especially for multilingual and access-controlled sites. However, it comes with a steeper learning curve and a smaller ecosystem, making it &lt;strong&gt;a better fit for terms with some technical experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal and Umbraco&lt;/strong&gt; are powerful options for developers and enterprises. They shine in projects that require high security, granular user permissions, and full control over structure and functionality, but &lt;strong&gt;both demand serious development resources to implement and maintain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you’re still unsure which traditional CMS might be the best fit for your site, &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;reach out to us&lt;/a&gt;. &lt;strong&gt;Our experts can analyze your setup and point towards the most beneficial option for you.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;F.A.Q&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What Is a Traditional CMS?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A traditional CMS is an all-in-one content management system&lt;/strong&gt; that handles both the backend (where you manage content) and the frontend (how it’s displayed to users). Platforms like WordPress, Joomla, and Drupal fall into this category, offering built-in templates, plugins, and page rendering without needing to separate content and presentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is WordPress Still the Best CMS in 2025?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For many use cases, yes. &lt;strong&gt;WordPress remains the most popular CMS&lt;/strong&gt; due to its ease of use, huge plugin ecosystem, and flexibility. It’s ideal for blogs, small websites, and content-driven platforms — but may not be the best fit for complex or enterprise-grade systems that need custom workflows or advanced scalability.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Which CMS Is Best for Small Businesses?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress is a top choice for small businesses&lt;/strong&gt; thanks to its affordability, wide theme selection, and large support community. Webflow is also a strong option for visually focused marketing sites that don’t require heavy custom development.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What CMS Works with .NET?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Umbraco is the leading .NET-based CMS&lt;/strong&gt;. It’s built on modern .NET Core, supports full customization with C#, and integrates well with Microsoft Azure and enterprise tooling. It’s ideal for companies already using Microsoft technologies.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What’s the Difference Between WordPress and Webflow?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;WordPress is an open-source, plugin-driven CMS with vast flexibility and support for everything from blogging to e-commerce&lt;/strong&gt;. Webflow is a no-code design platform that lets you visually build static and dynamic websites. WordPress offers more extensibility and backend control, while Webflow is faster for launching design-first sites with minimal technical setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sources&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://w3techs.com/technologies/overview/content_management" rel="noopener noreferrer"&gt;Usage Statistics And Market Shares Of Content Management Systems&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/headless-wordpress-cms/" rel="noopener noreferrer"&gt;Headless WordPress CMS – A Perfect Choice For a Marketer?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/best-use-cases-of-sanity/" rel="noopener noreferrer"&gt;Best Use Cases of Sanity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/top-5-best-headless-cms-platforms/" rel="noopener noreferrer"&gt;Top 5 Best Headless CMS Platforms&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>frontend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why Use React for Web Development in 2025: Top 7 Benefits</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Thu, 08 May 2025 11:12:38 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/why-use-react-for-web-development-in-2025-top-7-benefits-7mi</link>
      <guid>https://dev.to/pagepro_agency/why-use-react-for-web-development-in-2025-top-7-benefits-7mi</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Is React a Good Choice in 2025?&lt;/strong&gt; 
&lt;/h2&gt;

&lt;p&gt;Even with over a decade behind it, &lt;strong&gt;React is still leading modern front-end development for scalable&lt;/strong&gt; web applications. However, since alternatives like &lt;strong&gt;Angular or Vue&lt;/strong&gt; are gaining traction, it’s fair to ask why use React in 2025. &lt;/p&gt;

&lt;p&gt;The answer lies in its maturity, flexibility, and ongoing innovation. React’s architecture has stood the test of time, and it’s still evolving to meet modern development needs. At Pagepro, we’re big fans of &lt;a href="https://pagepro.co/services/reactjs-development/" rel="noopener noreferrer"&gt;React development&lt;/a&gt; and continue to recommend it for most web development projects. Today, we’ll share with you 7 reasons why we believe that this library is still &lt;strong&gt;the best choice for web development in 2025&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is React?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React is a JavaScript library for building user interfaces, free and open-source.&lt;/strong&gt; At its core lies the concept of components, small and reusable blocks of UI that manage their state. They can be composed to build entire pages or applications. The inclusion of Virtual DOM lets React efficiently update the browser to improve both speed and responsiveness. &lt;/p&gt;

&lt;p&gt;Facebook released it in 2013, and since then, the library has kept changing. The &lt;a href="https://react.dev/blog/2024/12/05/react-19" rel="noopener noreferrer"&gt;React 19&lt;/a&gt; update arrived in December 2024 and introduced a few important changes to the library: Server Components, Server Actions, and new React hooks for easier state management. It made React &lt;strong&gt;faster and easier to use&lt;/strong&gt; across the client and server.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;React Use Cases&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Many established companies have created sites and web-based React applications due to its unique architecture and flexibility. Since we could write a whole separate article on the topic, instead, we’ve prepared a few prominent examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Facebook&lt;/strong&gt;
&lt;/h3&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%2Frlet2ldxparyh6cjy1yd.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%2Frlet2ldxparyh6cjy1yd.png" alt="Why Use React: Facebook Icon" width="78" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Facebook (now Meta) is the birthplace of React. The company uses the library across its web app development, including the main Facebook platform. React’s component-based architecture helps Facebook create dynamic and responsive interfaces. Its users can enjoy real-time updates from their friends and a great overall experience. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Instagram&lt;/strong&gt;
&lt;/h3&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%2F85v4tax7chj3zbi8tlef.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%2F85v4tax7chj3zbi8tlef.png" alt="Why Use React: Instagram Icon" width="70" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instagram, also a Meta property, uses React for its web interface and features like the feed and direct messaging. Due to React’s modular architecture, the platform can deliver a consistent and interactive experience to users accessing it via browsers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Netflix&lt;/strong&gt;
&lt;/h3&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%2Fyohgkzkevqge1ce9pznj.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%2Fyohgkzkevqge1ce9pznj.png" alt="Why Use React: Netflix Icon" width="70" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Netflix applied React in various parts of its platform, particularly for the user interface of its TV applications. Its role in the company’s web architecture shows the benefits of using React js in building modular and efficient UIs for large-scale applications. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The New York Times&lt;/strong&gt;
&lt;/h3&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%2Frd40y8cvzt84btsquz45.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%2Frd40y8cvzt84btsquz45.png" alt="Why Use React: NYT Icon" width="70" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://open.nytimes.com/enhancing-the-new-york-times-web-performance-with-react-18-d6f91a7c5af8" rel="noopener noreferrer"&gt;New York Times chose React&lt;/a&gt; development because of the interactive features and rich multimedia content on its website. React’s flexibility allows the publication to create dynamic articles, graphics, and updates, making the way readers consume news online more interactive.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;7  Benefits of Using React for Web Development&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;React is a top choice for teams that need performance, flexibility, and long-term maintainability in modern web application development. To prove it, here are our &lt;strong&gt;7 reasons to choose React in 2025.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Performance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In modern web application development, few things are as important as the best performance possible. &lt;strong&gt;React’s Virtual DOM and fine-grained rendering&lt;/strong&gt; guarantee that only the components that do change get re-rendered. Server Components &lt;strong&gt;help large pages load faster and send less JavaScript to the client&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Speed &amp;amp; User Experience&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Responsive experience is the major benefit of React&lt;/strong&gt;. Fast re-rendering and dynamic UIs let you build high-performance web applications that feel native. New hooks like useOptimistic make user interactions smooth, even when data is pending. Pairing it with tools like &lt;strong&gt;React Query or SWR&lt;/strong&gt; lets you manage server state without introducing potential performance blockers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Backward Compatibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Since its launch, &lt;strong&gt;React has been remarkably stable&lt;/strong&gt; and continues to receive support from Meta and its community. What’s more, even major updates have emphasized backward compatibility. Older apps can continue working without full rewrites, making it perfect for large-scale teams that rely on long-term support.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Development Speed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Those who experienced fast-paced development environments or worked on an MVP know just &lt;strong&gt;how valuable quick iteration can be&lt;/strong&gt;. The combination of &lt;strong&gt;component-based structure, hooks, and state management integrations with tools like Redux&lt;/strong&gt; helps React greatly improve the speed of initial builds and maintenance. It supports modern stacks like TypeScript, fast refresh via Vite, and React frameworks like Next.js. Additional extensions like React Developer Tools simplify debugging and state inspection without slowing down the workflow. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Popularity &amp;amp; Community&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The library remains one of the most widely used technologies in web development. It has over &lt;strong&gt;235,000 stars on GitHub&lt;/strong&gt; and a massive global community of developers eager to learn React. Developers building React web applications &lt;strong&gt;can count on fast answers, active forums, and a constant stream of up-to-date resources.&lt;/strong&gt;&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%2Fyhb3fzfj56jc20z86g3x.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%2Fyhb3fzfj56jc20z86g3x.png" alt="React.js on Github" width="316" height="510"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source: React.js&lt;/strong&gt; &lt;a href="https://github.com/facebook/react" rel="noopener noreferrer"&gt;&lt;strong&gt;Github&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A strong community support and a shared pool of knowledge makes it a low-risk option for the development process. Looking at &lt;a href="https://survey.stackoverflow.co/2024/" rel="noopener noreferrer"&gt;&lt;strong&gt;Stack Overflow 2024 survey&lt;/strong&gt;&lt;/a&gt; will show you just how prevalent this library is in development, as it ranked second among web frameworks and technologies, topped only by Node.js.&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%2Fub943nvbelyhwsi5ck7h.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%2Fub943nvbelyhwsi5ck7h.png" alt="Stack Overflow 2024 Survey" width="630" height="1024"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source: Stack Overflow&lt;/strong&gt; &lt;a href="https://survey.stackoverflow.co/2024/technology" rel="noopener noreferrer"&gt;&lt;strong&gt;2024 Developer Survey&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;6. Effective Testing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Thanks to the clear structure and predictable behavior of React components, &lt;strong&gt;testing becomes a natural part of development&lt;/strong&gt; instead of an unpleasant responsibility*&lt;em&gt;.&lt;/em&gt;* Each component can be isolated, rendered, and verified independently, improving quality control throughout the development.&lt;/p&gt;

&lt;p&gt;Moreover, third-party tools like &lt;strong&gt;React Testing Library&lt;/strong&gt; can help teams write tests that mirror real user interactions for their web pages. This improves reliability and maintenance and reduces the risk of getting caught up in implementation details. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;7. Modularity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React scales amazingly across teams and projects &lt;strong&gt;because of its component-based structure&lt;/strong&gt;. Breaking interfaces into small components allows developers to isolate functionality, reduce repetition, and maintain consistency. &lt;strong&gt;The components can then be reused&lt;/strong&gt; no matter their initial purpose and then be tested and improved independently from the entire system.&lt;/p&gt;

&lt;p&gt;While saving time is a big plus, this modularity also helps speed up collaboration. &lt;strong&gt;Teams can maintain shared libraries of reusable UI elements&lt;/strong&gt;, so rolling out design updates or replicating features becomes easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;When React is the Best Fit&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;React performs best in scenarios where performance and reusability matter. Its architecture is tailored for apps needing fast and consistent interfaces on top of dynamic content. Have a look at some examples of projects where it provides the best value for software development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Single-page apps (SPAs) –&lt;/strong&gt; React’s client-side rendering and efficient Virtual DOM work great for SPAs that need smooth navigation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interactive dashboards –&lt;/strong&gt; Dashboards often use dynamic and modular elements to keep users informed.  The component-based structure of React allows features like charts, real-time filters, or modular widgets. to be built and updated independently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time collaboration tools –&lt;/strong&gt; Real-time features like whiteboards or editors are easier to manage with React, since it helps to maintain reactive, synchronized UIs across users without overcomplicating the logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SEO-optimized sites (via Next.js) –&lt;/strong&gt; While React alone isn’t exactly SEO-friendly, frameworks like Next.js solve that by supporting server-side rendering and static site generation. Combined with Server Components,  the library is a strong candidate for marketing sites or content-heavy platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cross-platform development with React Native –&lt;/strong&gt; One of React’s biggest advantages is that its capabilities extend to mobile app development. Teams can build iOS and Android apps with React Native using much of the same logic and tooling. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/ebook/ebook-react-native-apps" rel="noopener noreferrer"&gt;&lt;strong&gt;Download our Ebook: 113 React Native App Examples&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Admin panels and internal tools –&lt;/strong&gt; React is perfect for fast, iterative development of tools like content editors or internal portals. Developers can iterate quickly by reusing elements across multiple screens and roles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Component-based marketing sites –&lt;/strong&gt; This library works very well with headless CMS platforms. Content teams can manage text and media, while developers maintain a consistent design system through reusable components.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;React vs Other Frameworks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In 2025, the most common alternatives to React are Angular and Vue. As you can see below, each has its strengths and trade-offs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;React&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Vue&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Angular&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Learning Curve&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Moderate&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Easy&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Steep&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Unopinionated (build it your way)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Lightweight, mostly unopinionated&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Opinionated, all-in-one framework&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Excellent (especially with Server Components)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Very good&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Good&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Ecosystem&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Extensive (Next.js, React Native, Vite, etc.)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Growing, strong for smaller projects&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Large, but more rigid&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Community Support&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Very large, enterprise-proven&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Passionate&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Solid in enterprise, declining in web apps&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Mobile Development&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;First-class support via &lt;strong&gt;React Native&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Limited via wrappers like NativeScript or Capacitor&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Supported through Ionic (not native performance)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Use in Large Projects&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Widely used (Meta, Shopify, NYT, WhatsApp)&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Gaining traction, often used in smaller teams&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Still strong in some enterprise/government apps&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;High&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Low&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you’re trying to choose the right tool for your team, we’ve written two comparisons, which will help you choose the best tool for your development team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-vs-angular-comparison/" rel="noopener noreferrer"&gt;React vs Angular: Which One Should You Use in 2025?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-vs-vue-comparison/" rel="noopener noreferrer"&gt;React vs Vue: What’s the Best Choice for Your Next Web App?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Should You Use React JS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re deciding which technology to invest in for your next web development project, React JS is still one of the safest choices. It balances performance, stability, and productivity in a way that very few tools do. Businesses looking to create future-proof apps will appreciate its continued innovation and the support it receives both from Meta and its community.&lt;/p&gt;

&lt;p&gt;React is a great choice for teams of all sizes and industries. Regardless of the type of web and mobile applications you want to create, in most cases, it will support your needs better than the alternatives.&lt;/p&gt;

&lt;p&gt;If you need help creating your dream React.js project, we’re here to help you! Don’t hesitate to &lt;a href="https://pagepro.co/contact" rel="noopener noreferrer"&gt;contact us&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;F.A.Q&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why use React instead of other frameworks in 2025?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The library balances speed, flexibility, and scalability better than most tools. It’s ideal for building anything from prototypes to large-scale production apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is Redux still relevant with React?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes. Redux continues to be used in complex apps that require predictable global state. That said, React’s evolving features and newer libraries offer leaner options where Redux might be overkill.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Can I use React for mobile development?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Yes, it’s possible by using React Native. It’s based on the same principles and component model as the library itself. Developers can use it to build cross-platform apps for iOS and Android using JavaScript and React.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Is React still actively maintained?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Very much so. It’s last update launched in December 2024 and introduced major improvements like Server Components and Server Actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/18-tips-for-a-better-react-code-review-ts-js/" rel="noopener noreferrer"&gt;18 Tips For a Better React Code Review (TS/JS)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/how-react-js-can-cut-a-development-cost/" rel="noopener noreferrer"&gt;How React JS Cuts the Development Cost&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/case-studies/toolbox/" rel="noopener noreferrer"&gt;Building a React.js MVP for the Insurance&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/case-studies/colony/" rel="noopener noreferrer"&gt;UX and UI Overhaul of Blockchain’s App with React.js&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Optimizing Vercel Hosting Costs</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 10 Mar 2025 10:10:30 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/optimizing-vercel-hosting-costs-4g7n</link>
      <guid>https://dev.to/pagepro_agency/optimizing-vercel-hosting-costs-4g7n</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Using Vercel is a &lt;strong&gt;popular&lt;/strong&gt; &lt;strong&gt;choice for hosting apps&lt;/strong&gt;, thanks to its ease of use and support for &lt;a href="https://pagepro.co/services/nextjs-development/" rel="noopener noreferrer"&gt;&lt;strong&gt;Next.js framework&lt;/strong&gt;&lt;/a&gt;. This hosting platform can accommodate even large traffic spikes and different use cases. However, as your projects scale their hosting costs can grow as well and have you look elsewhere for a different hosting provider.&lt;/p&gt;

&lt;p&gt;Still, there’s a way to limit how much you’re spending on cloud hosting and make &lt;strong&gt;Vercel support the budget of your Next.js app&lt;/strong&gt;. Even small adjustments to the code, how you configure your project settings, deploy your project, or how often check the dashboard can make a difference.&lt;/p&gt;

&lt;p&gt;In this step-by-step guide I’ll introduce you to &lt;strong&gt;smart strategies&lt;/strong&gt; we’re using to lower hosting expenses, and help you decide when staying on a Pro subscription is the best choice, and when upgrading to Enterprise is necessary.&lt;/p&gt;

&lt;p&gt;Chris Lojniewski and I held a live session on this subject, which included &lt;strong&gt;a live demo of the optimizations&lt;/strong&gt; I’ll be describing in the article. You can watch it &lt;a href="https://www.youtube.com/live/euJe4FCae7M?si=jS_ncdsmtFB4Wy5B" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, let’s start by breaking down &lt;strong&gt;what affects your Vercel hosting bill&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Factors Driving Costs in Vercel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We can divide the factors influencing your costs into &lt;strong&gt;Fixed-Price&lt;/strong&gt; and &lt;strong&gt;Usage-Based&lt;/strong&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Fixed-Price Factors&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;These stay roughly the same each month, as Vercel sets their price for all users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plan Selection&lt;/strong&gt; – When starting a new project, &lt;strong&gt;choosing the right plan matters&lt;/strong&gt;, especially if you’re too big for the generous free tier Vercel offers. Before you start the deployment process, ensure your plan aligns with your expected usage so your project can be deployed quickly and securely. Hobby, Pro, and Enterprise plans &lt;strong&gt;have different pricing structures and limits&lt;/strong&gt;. The Pro plan includes additional resources but charges for overages, while the Enterprise plan offers custom pricing based on usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Number of Seats&lt;/strong&gt; – Vercel charges per seat for users needing access to the dashboard. Make sure that &lt;strong&gt;only necessary team members have access&lt;/strong&gt; to your repository or use automation (e.g., GitLab CI/CD or GitHub Actions for deployment, which I’ll talk about more later).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Usage-Based Factors&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This type of costs &lt;strong&gt;can rise or fall&lt;/strong&gt;, depending on your setup and decisions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Execution Time&lt;/strong&gt; – You’re billed &lt;strong&gt;based on the total time serverless functions take to execute&lt;/strong&gt;. Vercel’s automatic scaling helps optimize performance by adjusting resources based on traffic demand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invocations&lt;/strong&gt; – Each time a serverless function runs, &lt;strong&gt;it becomes an invocation&lt;/strong&gt;. High invocation counts can quickly increase costs, particularly if middleware, API routes, or unnecessary prefetching is triggering multiple function calls. You can avoid this by limiting function calls and caching responses where possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt; – The volume of JavaScript bundles, images, API responses, and any external asset loads transferred between users and the server &lt;strong&gt;contributes to costs&lt;/strong&gt;. Compressing assets, reducing data payloads, and utilizing caching strategies can reduce bandwidth expenses.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fd2h2pirz6le3aal141o8.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%2Fd2h2pirz6le3aal141o8.png" alt="Vercel Hosting Cost Factors" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you become aware of what affects your bill, &lt;strong&gt;you can start working on lowering it&lt;/strong&gt;. To help you, I’ve prepared a list of the code optimizations we’ve been using in our projects, which you can implement as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Lowering Hosting Costs with Code Tweaks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Sometimes smart and strategic choices and taking advantage of Vercel as the easiest way to deploy Next.js applications without breaking the bank. Below are the examples of code-level adjustments we’ve been using in our projects to lower the costs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Choosing the Optimal Rendering Method
&lt;/h4&gt;

&lt;p&gt;Rendering methods play a significant role in shaping your hosting costs. Using &lt;strong&gt;Static Site Generation&lt;/strong&gt; (SSG) is an effective way to minimize execution costs and reduce unnecessary deploying. It lets you shift processing from runtime to build time, a particularly useful feature for content that does not change frequently. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server-Side Rendering&lt;/strong&gt; (SSR) on the other hand, should be used sparingly, as it adds new execution costs with every page request. &lt;strong&gt;Incremental Static Regeneration&lt;/strong&gt; (ISR) balances the two by allowing updates to static content at scheduled intervals. This reduces unnecessary function executions while keeping content fresh.&lt;/p&gt;

&lt;h4&gt;
  
  
  Minimizing Data Transfer
&lt;/h4&gt;

&lt;p&gt;Large API payloads can lead to increased bandwidth usage and &lt;strong&gt;higher costs&lt;/strong&gt;. Efficient query techniques, such as database-level aggregations instead of frontend filtering, can significantly &lt;strong&gt;cut down on data transfer&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;getStaticProps&lt;/code&gt; applied for pre-building pages rather than fetching data at runtime stops users from repeatedly triggering API requests.  This further reduces bandwidth consumption, but limiting the props passed to pages can also decrease data transfer volumes and &lt;strong&gt;improve page load times&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Optimizing Prefetching
&lt;/h4&gt;

&lt;p&gt;Knowing &lt;strong&gt;how to optimize prefetching&lt;/strong&gt; is crucial in controlling function invocations. Next.js prefetches links by default, which &lt;strong&gt;can lead to excessive function executions&lt;/strong&gt; when multiple pages are loaded in advance. While this improves performance, it can also increase costs unnecessarily, a common problem in the modern web development process. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disable prefetching for non-critical pages&lt;/strong&gt; or implement hover-based prefetching to balance top performance and cost efficiency. &lt;/p&gt;

&lt;h4&gt;
  
  
  Function Optimization
&lt;/h4&gt;

&lt;p&gt;Function execution time &lt;strong&gt;directly impacts hosting expenses&lt;/strong&gt;. Optimizing its performance is key to savings. Instead of making multiple sequential API requests, parallelize requests using &lt;code&gt;Promise.all()&lt;/code&gt; to reduce execution time. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database queries should also be optimized&lt;/strong&gt; to minimize expensive calculations within API functions. Offload long-running processes like PDF generation to background jobs outside Vercel and implement caching strategies to limit unnecessary API requests, so frequently accessed data is served efficiently.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reducing Middleware Executions
&lt;/h4&gt;

&lt;p&gt;Badly managed middleware executions can accumulate unnecessary costs. &lt;strong&gt;Implementing route matchers&lt;/strong&gt; makes middleware run only when required, lowering strain on the back-end and preventing excess function executions. Static assets should be excluded from middleware processing to optimize performance and reduce costs. &lt;/p&gt;

&lt;p&gt;Regex filters can further refine when middleware is executed, allowing developers to &lt;strong&gt;fine-tune application behavior&lt;/strong&gt; without incurring excessive execution charges. Here’s how you can do it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/protected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;


 &lt;span class="c1"&gt;// OTHER MIDDLEWARE ACTIONS&lt;/span&gt;


 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/((?!api|_next/static|_next/image|favicon.ico|assets|.*&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.png$).*)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Optimizing Vercel Dashboard&lt;/strong&gt;
&lt;/h2&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%2F912m4nb4b8g8atvylz6r.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%2F912m4nb4b8g8atvylz6r.png" alt="Vercel Dashboard" width="800" height="389"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Vercel Dashboard View&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lot of the savings for your app can be found in the &lt;strong&gt;Vercel dashboard settings&lt;/strong&gt;, depending on how you want to deploy it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setting maximum execution time&lt;/strong&gt; for functions helps prevent excessive processing costs. This ensures that long-running functions do not consume unnecessary resources, avoiding unpredictable costs caused by inefficient execution loops.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Fluid Compute&lt;/strong&gt; feature is another valuable addition Vercel offers. It allocates resources to functions, which helps balance cost and performance by optimizing resource utilization based on demand. Enable it in your app to test the potential gains it might offer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New image optimization pricing&lt;/strong&gt; has changed Vercel’s billing approach. Instead of charging based on the number of images transformed, costs are now tied to transformation actions. However, the platform still supports a variety of optimization strategies. Teams should review their image processing workflows and &lt;strong&gt;limit unnecessary transformations&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performing front-end bundle analysis&lt;/strong&gt; using tools like Lighthouse and Webpack Analyzer helps identify and eliminate unused JavaScript and CSS, reducing page load times and bandwidth consumption. Streamlining bundles ensures assets are delivered without adding to hosting costs. Taking advantage of features of Next.js, such as automatic code splitting and tree-shaking, can help you further optimize performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Remember to allocate only the necessary resources&lt;/strong&gt; for each function. You’ll be able to avoid over-provisioning, reduce execution time expenses, and properly set a custom domain without unnecessary redirects or misconfigurations. Regularly monitoring and fine-tuning these settings will help you match actual usage needs to avoid overpaying.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Alternatives to Vercel Premium Features&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Lowering reliance on Vercel’s premium features like image optimization through alternatives can lower your costs while maintaining a high-performing app. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limiting seats&lt;/strong&gt; using solutions like &lt;strong&gt;GitHub workflows&lt;/strong&gt; is an effective strategy. Instead of granting all team members direct access to the Vercel dashboard, teams can configure GitHub Actions to automate Vercel’s deployment. This removes the need for additional paid seats but also restricts real-time monitoring, debugging, and direct deployment control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Image optimization&lt;/strong&gt; is another area where external solutions can help cut expenses on Vercel. The platform integrates seamlessly with third-party CDNs (Content Delivery Networks) and CMSs (Content Management Systems) which makes it easy to reduce reliance on Vercel’s image handling if you are already using one of these.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built-in analytics tools can also be replaced with third-party solutions like &lt;strong&gt;DebugBear, SpeedCurve, or web.dev.&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For password protection, instead of using Vercel’s built-in feature, you can implement &lt;strong&gt;middleware-based authentication&lt;/strong&gt;. Redirecting users to a custom authentication route lets developers control access without incurring extra Vercel costs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;How to Implement Password Protection with Middleware&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To implement password protection outside of Vercel’s built-in tools, you’ll need to do three things. First is the setting of the middleware, which will check your password. Start by updating your middleware file with this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkForPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;site-access&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;envPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SITE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


 &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;envPassword&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="c1"&gt;// You should use a better hashing algorithm here&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


 &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;hashedPassword&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;envPassword&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rewrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/password-check&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;requested-path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cache-control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-store, must-revalidate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-middleware-cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-cache&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redirectResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;checkForPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


 &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;redirectResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;redirectResponse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;


 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/((?!api|_next/static|_next/image|favicon.ico|assets|.*&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.png$).*)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that this is ready, it’s time to set up the page which will prompt for a password. Create a file in the &lt;code&gt;/app/password-check/page&lt;/code&gt; path and type this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRouter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/navigation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PasswordCheck&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRouter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


 &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FormEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


   &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
     &lt;span class="p"&gt;});&lt;/span&gt;


     &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to validate password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;


     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requestedPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
       &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;
         &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;requested-path&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
         &lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


     &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestedPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid password. Please try again.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;


 &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grid place-items-center min-h-[100vh] bg-gray-50 p-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full max-w-sm space-y-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-3xl font-bold text-center text-gray-900&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="nx"&gt;Access&lt;/span&gt; &lt;span class="nx"&gt;Forbidden&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-sm text-center text-gray-600&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="nx"&gt;This&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="kr"&gt;protected&lt;/span&gt; &lt;span class="nx"&gt;by&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;To&lt;/span&gt; &lt;span class="nx"&gt;access&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;please&lt;/span&gt; &lt;span class="nx"&gt;ask&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt;
         &lt;span class="nx"&gt;administrator&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;it&lt;/span&gt; &lt;span class="nx"&gt;below&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;space-y-4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;
           &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
           &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
           &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
           &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full px-3 py-2 border rounded text-gray-900 placeholder-gray-500 focus:ring-2 focus:ring-indigo-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
           &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Enter password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
         &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;


         &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-red-500 text-sm text-center&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;

         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
           &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
           &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-full py-2 px-4 bg-indigo-600 text-white text-sm font-medium rounded hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
         &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="nx"&gt;Submit&lt;/span&gt;
         &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;       &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;     &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/main&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last step is to create an API request for password verification since client logic doesn’t have access to environment variables. Create a new file in the &lt;code&gt;/api/password/route&lt;/code&gt; path and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SITE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;


   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Password valid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;


   &lt;span class="c1"&gt;// Set secure HTTP-only cookie with base64 encoded password&lt;/span&gt;
   &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
     &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;site-access&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="na"&gt;httpOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;sameSite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;});&lt;/span&gt;


   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error validating password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bear in mind, this is not the perfect solution for apps requiring high security. Companies that need to adhere to strict standards or handle sensitive information might be better off using Vercel’s built-in protections. Speaking of…&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;When Do You Need Vercel Enterprise?&lt;/strong&gt;
&lt;/h2&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%2Fnakmtw5e9rxjfbrtj39u.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%2Fnakmtw5e9rxjfbrtj39u.png" alt="Vercel Plans" width="800" height="574"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://vercel.com/pricing" rel="noopener noreferrer"&gt;&lt;strong&gt;Source: Vercel&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Time to discuss the elephant in the room – &lt;strong&gt;is upgrading to Enterprise necessary for growth&lt;/strong&gt;? The answer depends on what your project requires. &lt;/p&gt;

&lt;p&gt;Vercel Enterprise is designed for businesses that need security, scalability, dedicated support, and advanced features. While the Pro plan is enough for most applications, &lt;strong&gt;Enterprise offers additional features&lt;/strong&gt; for high-traffic, compliance-driven, or mission-critical applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;You’ll Need Enterprise If:&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  More Support is Necessary 
&lt;/h4&gt;

&lt;p&gt;Enterprise customers receive &lt;strong&gt;dedicated customer support with service level agreements&lt;/strong&gt; (SLAs) guaranteeing uptime and response times. This level of support could be a good investment if your app relies heavily on &lt;strong&gt;uptime and fast troubleshooting&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  You’re Constantly Exceeding Pro Plan Limits
&lt;/h4&gt;

&lt;p&gt;In case when a project exceeds Pro plan limits in execution time, bandwidth, or function invocations, &lt;strong&gt;Enterprise can provide a more flexible usage allowance&lt;/strong&gt; with a custom pricing option. This can be &lt;strong&gt;the less expensive option&lt;/strong&gt; compared to paying for overages on the Pro plan.&lt;/p&gt;

&lt;h4&gt;
  
  
  Security and Compliance Are a Must 
&lt;/h4&gt;

&lt;p&gt;Compliance standards like &lt;strong&gt;SOC 2, ISO 27001, and HIPAA&lt;/strong&gt; require strict data handling policies that Enterprise plans support. &lt;strong&gt;Single Sign-On&lt;/strong&gt; (SSO), role-based access control, private networking, and dedicated infrastructure could be needed if your organization handles sensitive data.&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%2Ftam7kn3g3cansajnje77.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%2Ftam7kn3g3cansajnje77.png" alt="Security Measures in Vercel Enterprise" width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://vercel.com/enterprise" rel="noopener noreferrer"&gt;&lt;strong&gt;Source: Vercel&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Advanced Performance Optimization Options Can Help Your App 
&lt;/h4&gt;

&lt;p&gt;Enterprise users have access to additional performance improvements. This includes enhanced CDN configurations, lower cold start times, and priority deployment processing for faster build times.&lt;/p&gt;

&lt;h4&gt;
  
  
  Custom Billing and Procurement is Important to You 
&lt;/h4&gt;

&lt;p&gt;Larger companies often require &lt;strong&gt;flexible billing arrangements&lt;/strong&gt;, invoicing options, and procurement workflows aligning with internal procedures. Vercel Enterprise allows for custom contracts, bulk seat management, and additional auditing capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Enterprise Won’t Be Necessary If:&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  You’re Running a Small to Mid-Sized Project
&lt;/h4&gt;

&lt;p&gt;Vercel supports the hosting and deployment of &lt;strong&gt;a variety of apps&lt;/strong&gt;, from personal projects outgrowing the Free plan, to e-commerce sites. All of them can run efficiently on the Pro plan without requiring the additional features of Enterprise.&lt;/p&gt;

&lt;h4&gt;
  
  
  The App You’re Working on Is Cost-Sensitive 
&lt;/h4&gt;

&lt;p&gt;If budget control is your priority, explore cost optimizations within the Pro plan, like reducing function executions, optimizing data transfer, and limiting seats. It can be a better (and more affordable) solution than upgrading to Enterprise.&lt;/p&gt;

&lt;h4&gt;
  
  
  There Are Alternative Hosting Solutions You Can Pursue
&lt;/h4&gt;

&lt;p&gt;In a situation where Vercel’s pricing becomes unsustainable at scale, you might consider alternative hosting solutions. Self-managed cloud infrastructure (AWS, GCP, Azure) or hybrid deployments that combine Vercel with other providers for cost efficiency can be a good investment.&lt;/p&gt;

&lt;p&gt;Before deciding on upgrading, carefully evaluate your &lt;strong&gt;business requirements, traffic volume, and budget constraints&lt;/strong&gt;. Only then you’ll know if Vercel Enterprise will provide you with a better value than sticking to Pro plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Vercel has evolved over the years to accommodate different Next.js apps in modern development. Keeping it affordable comes down to making smart choices. &lt;strong&gt;Simple tweaks to rendering, function execution, and dashboard settings can save your budget&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It’s important to remember that &lt;strong&gt;your subscription matters&lt;/strong&gt;. For most projects, the Pro plan is enough with the right optimizations, but if security, compliance, or heavy traffic are concerns, Enterprise might be the better, and sometimes even more affordable fit. As long as you understand your usage and align your hosting strategy with business goals, &lt;strong&gt;Vercel makes hosting cost-effective for your Next.js applications&lt;/strong&gt;, whether you’re working on a small project, web application, or a big venture. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/optimizing-next-js-hosting-costs/" rel="noopener noreferrer"&gt;Optimizing Next.js Hosting Costs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/next-js-vs-react/" rel="noopener noreferrer"&gt;Next.js vs React&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/why-choose-next-js-for-order-management-system/" rel="noopener noreferrer"&gt;Why Choose Next.js for Order Management System&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/next-js-pre-rendering-and-data-fetching/" rel="noopener noreferrer"&gt;Next.js Pre-rendering and Data Fetching Methods&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>vercel</category>
      <category>beginners</category>
    </item>
    <item>
      <title>18 Tips For a Better React Code Review (TS/JS)</title>
      <dc:creator>Chris Lojniewski</dc:creator>
      <pubDate>Mon, 03 Mar 2025 08:12:08 +0000</pubDate>
      <link>https://dev.to/pagepro_agency/18-tips-for-a-better-react-code-review-tsjs-1kdg</link>
      <guid>https://dev.to/pagepro_agency/18-tips-for-a-better-react-code-review-tsjs-1kdg</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction to ReactJS Code Review for Developers&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you’ve worked with &lt;a href="https://pagepro.co/services/reactjs-development" rel="noopener noreferrer"&gt;React&lt;/a&gt;, you’re likely familiar with the code review process in frontend. If not, here’s a quick breakdown: &lt;strong&gt;it’s a practice that improves code quality, catches bugs, and keeps the team aligned with project updates&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are a few ways to improve your React code review, and I’ll share them with you. I’ll point out what you should look for during the process and &lt;strong&gt;how to provide useful comments&lt;/strong&gt; instead of non-answers like “change A to B”.&lt;/p&gt;

&lt;p&gt;Before we move on to that, let’s start with a simple question.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Is the Goal of the React Code Review?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Catching bugs and producing high-quality work are important parts of code reviews. However, &lt;strong&gt;the main focus should be on sharing&lt;/strong&gt; &lt;strong&gt;knowledge&lt;/strong&gt; and boosting the confidence of your team.&lt;/p&gt;

&lt;p&gt;Accepting a pull request should be seen as recognition of a job well done, and reinforce a positive team environment. &lt;strong&gt;A good code review should include a showcase of changes made to the project&lt;/strong&gt;, so other devs can stay informed about the ongoing development of React components, along with feedback sessions. These &lt;strong&gt;encourage exploring different approaches&lt;/strong&gt; to problem-solving and help mentor less experienced React devs.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Things to Consider Before a Code Review&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Not all code reviews are the same. &lt;strong&gt;Your approach will depend on how familiar you are with the project&lt;/strong&gt;. If you’re part of the team working on the codebase, you have the advantage of knowing the context, patterns, and potential pitfalls. This makes it easier to catch functional issues, ensure backward compatibility, and improve overall code consistency.&lt;/p&gt;

&lt;p&gt;However, If you’re evaluating a project you haven’t worked on before, don’t stress about missing certain details. You don’t have to know every decision behind the code structure. Focus on asking questions when something isn’t clear. &lt;strong&gt;Curiosity is key to providing meaningful feedback&lt;/strong&gt;. If you spot a problem, great! If not, your role is to ensure the submission is readable, maintainable, and follows best code practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting Rules&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Before jumping into a code review, it helps to establish some basic rules. Having a structured process makes reviews more efficient, reduces frustration, and &lt;strong&gt;ensures that feedback is constructive&lt;/strong&gt;. Here are a few ground rules I’ve set up for myself and my team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lint the Code Before Submission&lt;/strong&gt; – Linting is the process of analyzing code to identify potential errors, coding style violations, and other issues. It helps improve code quality, catch bugs early, and promotes consistent coding standards across the project. If developers actively run linting and fix issues before submitting their code, it makes the review process easier for the team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-Review Before Submitting&lt;/strong&gt; – It’s important for developers should review their code directly on the platform before sharing the link with a reviewer to minimize unnecessary comments, &lt;code&gt;console.log&lt;/code&gt; statements, formatting issues, and other leftovers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Include a Description in the Pull Request&lt;/strong&gt; – A summary helps the reviewer understand the context. It doesn’t need to be overly descriptive, just enough to give context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Attach Screenshots for UI Changes&lt;/strong&gt; – Sometimes it’s a good idea to send some screenshots, so the reviewer doesn’t have to run the project (unless they have to test it).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avoid Large Pull Requests&lt;/strong&gt; – The more files in a PR, the fewer comments it will get, and nobody has time to review hundreds of changes in detail. If a feature is large, create a separate branch for it and break it into smaller sub-branches with focused changes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Best Practices for Code Review&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Beyond just setting rules, a good review requires a thoughtful approach:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Be Communicative&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Like in a real conversation, how and when you deliver your feedback is very important:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Offer Explanations&lt;/strong&gt; – Don’t just demand changes, explain why they’re necessary so the engineer whose code you’re reviewing can learn from the process. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Point Out Good Work&lt;/strong&gt; – Offer praise where it’s due to keep your teammates motivated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mention When You’ll Review the Code&lt;/strong&gt; – Even experienced React developers can have a tendency to wait for feedback before starting other work. Let your teammate know when you’ll be able to take care of it, and if you are too busy for an in-depth check, mention it too.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Categorize Comments&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A good way to keep feedback clear and constructive is to divide comments into three types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Major&lt;/strong&gt; – These are critical issues devs have to fix before merging. They could break the app, cause regressions, or fail to meet requirements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Minor&lt;/strong&gt; – Suggestions for improving readability, reusability, or general code quality. If the developer has a solid reason for their approach, it’s okay to leave things as they are.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optional&lt;/strong&gt; – Small tweaks like formatting or syntax updates that don’t affect functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Stay Organized&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Even if ten other developers are reviewing the same code, it’s still your responsibility to offer it your full attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make Comments Visible&lt;/strong&gt; – While transparency is an important factor in building trust, having everyone up-to-date about suggested changes is just as valuable.  The comments should be visible to everyone involved in the process to avoid feedback loss.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don’t Waste Time on Repeating Styling Issues&lt;/strong&gt; – In my experience, most comments in React code reviews are about styling issues. If you encounter styling concerns throughout the React codebase, address them once, and propose solutions to avoid leaving the same comments on each request.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;18 Tips for a React Code Review – Checklist&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A checklist can make reviews more systematic and prevent common issues from slipping through. Have a look at the overview of what to keep in mind for a better React code review:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pagepro.co/blog/wp-content/uploads/2023/07/Checklist-for-a-better-code-review-.pdf" rel="noopener noreferrer"&gt;Download a checklist for a better code review&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Check if there are any &lt;strong&gt;new &lt;em&gt;npm packages&lt;/em&gt; added&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure there are &lt;strong&gt;no functionality duplicates&lt;/strong&gt; like &lt;code&gt;date-fns + moment&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Look for imports&lt;/strong&gt;. Sometimes tree shaking might not work as expected, and there’s an option to bundle the whole library with a single method:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lodash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//should became more precise import like:&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;uniq&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lodash/uniq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;If your app uses translations, see if all new areas &lt;strong&gt;have also been translated&lt;/strong&gt;. If not, point that out and the developer should be aware of that in the future.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;NewComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      New static text inside new component should be translated!
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check for missing or invalid types&lt;/strong&gt; if you are using TypeScript. All “&lt;strong&gt;ANY&lt;/strong&gt;” types should also be fixed unless you have a really, really good explanation for not doing so. Below we have missing &lt;strong&gt;&lt;em&gt;props types&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;any&lt;/em&gt;&lt;/strong&gt; in the method.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;NewComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getItemId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;getItemId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;See &lt;strong&gt;variables, functions, and naming conventions.&lt;/strong&gt; They should all declare their name and function&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For boolean values, &lt;strong&gt;use prefixes&lt;/strong&gt; is/are/should to declare their behaviour &lt;code&gt;(visible =&amp;gt; isVisible)&lt;/code&gt; so they won’t be treated as HTML properties.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make sure functions declare their purpose&lt;/strong&gt;; if they return anything, name them accordingly. For example, if they manipulate data: updateUsers =&amp;gt; addUniqId, parseData =&amp;gt; parseToAPIFormat, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Look for weird logic patterns&lt;/strong&gt;. Sometimes when a dev spends too much time on a task, they get creative with the code and develop methods or flows that have no sense and can affect the project structure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are &lt;strong&gt;code chunks&lt;/strong&gt; too complicated? If someone is adding an ID into an array using 20 lines of code instead of 1, let them know why they shouldn’t do that.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you can’t understand what a specific chunk of code is doing, &lt;strong&gt;request an explanation from the developer&lt;/strong&gt; to clear out any potential confusion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Avoid hard-coded values&lt;/strong&gt;. Check for hardcoded names, paths, and values in the code. Instead of embedding them directly, store them in constants or configuration files so they can be updated in one place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintain backward compatibility&lt;/strong&gt;. Keep an eye out for changes that could break existing functionality, such as making optional props required or modifying function parameters. In TypeScript, these issues trigger compilation errors, but in JavaScript, they must be tracked manually to prevent unexpected failures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ensure there’s no code repetition&lt;/strong&gt;. If you’ve seen the same/similar logic in multiple places, point that out. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check for &lt;strong&gt;missing form validations&lt;/strong&gt; or incorrect form validations. I’ve never seen React apps that have a form without field validation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be aware of &lt;strong&gt;missing error handlers&lt;/strong&gt; from API responses to provide appropriate feedback to users. Pay attention to try/catch blocks and their handling in catch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimize async methods&lt;/strong&gt;. Decide whether async methods can run in parallel or need to execute in sequence, making sure that required data is properly awaited.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Learn from your mistakes&lt;/strong&gt;. Mistakes are part of the process, but they don’t have to be repeated. If you spot something you’ve struggled with before, use that knowledge to steer things in the right direction.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In the dev community, the reviewing process should be treated as &lt;strong&gt;a&lt;/strong&gt; &lt;strong&gt;great way to provide general coding knowledge&lt;/strong&gt;.  A structured review process improves code quality, encourages insight sharing, and strengthens relationships in the team. While it does help provide feedback, &lt;strong&gt;it shouldn’t focus on pointing out issues&lt;/strong&gt;, but on suggesting solutions and keeping the process productive. Explaining why something needs to change helps developers improve faster, and small wording tweaks can make feedback more constructive. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Read More&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/how-react-js-can-cut-a-development-cost/" rel="noopener noreferrer"&gt;How React JS Cuts the Development Cost&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/jquery-vs-react-which-one-is-better-for-your-project/" rel="noopener noreferrer"&gt;jQuery vs React – Which One Is Better For Your Project?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pagepro.co/blog/react-vs-react-native/" rel="noopener noreferrer"&gt;React vs React Native&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>beginners</category>
      <category>codereview</category>
    </item>
  </channel>
</rss>
