{"id":29411,"date":"2023-06-07T07:00:00","date_gmt":"2023-06-07T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=29411"},"modified":"2024-05-26T04:12:37","modified_gmt":"2024-05-26T11:12:37","slug":"improving-performance-cloudinary-blog","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog","title":{"rendered":"Improving the Performance of the Cloudinary Blog"},"content":{"rendered":"\n<p>Cloudinary is a performance-focused company, so when my <a href=\"https:\/\/cloudfour.com\" target=\"_blank\" rel=\"noreferrer noopener\">Cloud Four<\/a> colleagues and I were asked to rebuild their blog using WordPress, we also set our sights on improving the blog\u2019s performance.<\/p>\n\n\n\n<p>The rebuilt blog was significantly faster than the old one, but there was still room for improvement. We performed multiple rounds of performance analysis and optimization. The results? <strong>We improved our median Lighthouse performance score from 78 to 88<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img width=\"1024\" height=\"633\" data-public-id=\"Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_633,c_scale\/f_auto,q_auto\/v1686075367\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1.png?_i=AA\" alt=\"Before image of distribution of overall performance scores\" class=\"wp-post-29411 wp-image-29461\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1686075367\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075367\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1.png?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075367\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075367\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_1.png?_i=AA 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Before<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img width=\"1200\" height=\"742\" data-public-id=\"Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1200,h_742,c_scale\/f_auto,q_auto\/v1686075363\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2.png?_i=AA\" alt=\"After image of distribution of overall performance scores\" class=\"wp-post-29411 wp-image-29462\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1686075363\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075363\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2.png?_i=AA 1200w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075363\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075363\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075363\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_2.png?_i=AA 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><figcaption class=\"wp-element-caption\">After<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Focusing on Web Vitals<\/strong><\/h2>\n\n\n\n<p>Many factors influence web performance and it can be hard to decide which metric to start with. For a content-based site like the Cloudinary blog, the most important concern is site load speed. Google\u2019s <a href=\"https:\/\/web.dev\/vitals\/\">Web Vitals<\/a> metrics are a helpful tool for approximating and understanding the page-loading experience for readers.<\/p>\n\n\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>Google splits its Web Vitals into two main categories:<\/p>\n<p><a href=\"https:\/\/web.dev\/vitals\/#core-web-vitals\">Core Web Vitals<\/a> are the most important for end users and affect search rankings.<\/p>\n<p><a href=\"https:\/\/web.dev\/vitals\/#other-web-vitals\">Other Web Vitals<\/a> measure other performance characteristics that significantly impact the Core Web Vitals.<\/p>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Tools to Measure Web Vitals<\/strong><\/h2>\n\n\n\n<p>We used a few different tools to determine how the Cloudinary blog was performing:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/pagespeed.web.dev\/\"><strong>Page<\/strong><\/a><strong><a href=\"https:\/\/pagespeed.web.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\"> <\/a><\/strong><a href=\"https:\/\/pagespeed.web.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Speed Insights<\/strong><\/a> allows you to measure Web Vitals and experience what actual Chrome users are experiencing. Note: User metrics are tracked over 28 days, so it takes nearly a month to see the impact of changes on real users.<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.chrome.com\/docs\/lighthouse\/overview\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Lighthouse<\/strong><\/a> is an open-source, automated tool that can be run locally using Chrome to diagnose issues with web pages. You can run it against any web page, public or requiring authentication. It has audits for performance, accessibility, progressive web apps, SEO, and more. (Be aware that its output is affected by the speed of your device, and you can only test one URL at a time.)<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudfour.com\/thinks\/big-picture-performance-analysis-using-lighthouse-parade\/\"><strong>Lighthouse Parade<\/strong><\/a> is an open-source tool built by Cloud Four that allows you to run Lighthouse on every page of your website and review the results in a spreadsheet.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.webpagetest.org\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>WebPageTest<\/strong><\/a> digs deeper into the performance of a single page and determines what is affecting page loading speed.<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/GoogleChrome\/web-vitals\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>web-vitals<\/strong><\/a> is a JavaScript library that allows you to log and record real user\u2019s web vitals scores in real-time. (This adds more JavaScript to your site so works best on a development server or as a last resort.)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding and Tracking Web Vitals<\/h2>\n\n\n\n<p>To assess the&nbsp;pre-optimized blog\u2019s performance, identify issues, and track improvements, we followed a process of measurement, analysis, and experimentation:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Run Lighthouse Parade to gauge the site\u2019s overall performance.<\/li>\n\n\n\n<li>Identify low-performing pages to analyze more thoroughly using WebPageTest.<\/li>\n\n\n\n<li>Create a hypothesis for how these pages\u2019 performance could be improved.<\/li>\n\n\n\n<li>Deploy the required changes.<\/li>\n\n\n\n<li>Run Lighthouse Parade again to measure the impact of our changes.<\/li>\n\n\n\n<li>Review the \u201cReal User Metrics\u201d exposed by Google to check for issues that Lighthouse may not expose.<\/li>\n\n\n\n<li>Repeat from Step 2.<\/li>\n<\/ol>\n\n\n<div class='c-callout  c-callout--warning'><strong class='c-callout__title'>Heads Up: Watch Out For Device Variability!<\/strong> <p>Lighthouse and Lighthouse Parade scores can <a href=\"https:\/\/developers.google.com\/web\/tools\/lighthouse\/variability\">differ significantly based on how powerful the computer running the performance analysis is<\/a>. More powerful computers are likely to get higher scores than less powerful computers.<\/p>\n<p>When comparing Lighthouse Parade tests over time, it\u2019s crucial to run the tests from the same device to measure the impact of your changes without the metrics being influenced by the different devices.<\/p>\n<p>Lighthouse tests run on powerful devices may also not catch performance issues that are present on less powerful devices.<\/p>\n<\/div>\n\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>For this article, we used a 2020 MacBook Pro. Results may not be representative of the average end-user experience.<\/p>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Time to First Byte<\/h2>\n\n\n\n<p><a href=\"https:\/\/web.dev\/ttfb\/\" target=\"_blank\" rel=\"noreferrer noopener\">Time to first byte (TTFB)<\/a> measures how long it takes for a web server to return the first byte of a requested web page. This is an important metric because it affects all other web vitals. The browser can\u2019t start building the web page or downloading other resources until the server responds.<\/p>\n\n\n\n<p>We had a few things going for us when it came to TTFB:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Our content was being served from a dedicated <a href=\"https:\/\/cloudinary.com\/glossary\/hosting\">hosting<\/a> environment.<\/li>\n\n\n\n<li>Our content was being distributed by a global CDN.<\/li>\n<\/ul>\n\n\n\n<p>However, we noticed some unusually slow TTFB scores when we tested Cloudinary\u2019s updated blog pages.<\/p>\n\n\n\n<p>We dug into this to find ways to optimize TTFB speed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Since it\u2019s a blog, the content doesn\u2019t change often and can be cached for a long time. However, our host had a default page cache duration of five minutes. We updated this so that pages are cached for longer. This improves the chance that a page is served from the <a href=\"https:\/\/cloudinary.com\/glossary\/caching-images\">CDN cache<\/a> instead of being rebuilt on the server.<\/li>\n\n\n\n<li>Some of our pages rely on external API calls to <a href=\"https:\/\/cloudinary.com\/blog\/introducing_intelligent_responsive_image_breakpoints_solutions\" target=\"_blank\" rel=\"noreferrer noopener\">generate responsive breakpoints<\/a> or Cloudinary SDK snippets. We were already caching the results of these API calls, but we increased the cache duration to reduce how often those calls were made.<\/li>\n\n\n\n<li>We\u2019re using <a href=\"https:\/\/timber.github.io\/docs\/\" target=\"_blank\" rel=\"noreferrer noopener\">Timber<\/a> to render <a href=\"http:\/\/twig.sensiolabs.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Twig<\/a> templates to generate our pages. We enabled <a href=\"https:\/\/timber.github.io\/docs\/guides\/performance\/\" target=\"_blank\" rel=\"noreferrer noopener\">Timber\u2019s caching options <\/a>to avoid re-running that logic more than necessary.<\/li>\n\n\n\n<li>We used PHP performance analysis tools to identify slow code on our listings pages and are in the process of optimizing this code.<\/li>\n<\/ul>\n\n\n\n<p>These changes made big improvements to our <a href=\"https:\/\/cloudinary.com\/glossary\/time-to-first-byte\">TTFB<\/a> speed and helped us to pass our core web vitals metrics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Largest Contentful Paint<\/h2>\n\n\n\n<p>The next metric we focused on was <a href=\"https:\/\/web.dev\/lcp\/\" target=\"_blank\" rel=\"noreferrer noopener\">Largest Contentful Paint (LCP)<\/a>. LCP measures how long it takes to render the largest element in the user\u2019s viewport. Or, how long does it take before users can view the most important content on the page?<\/p>\n\n\n\n<p>For the Cloudinary blog, the LCP image is typically a blog post\u2019s cover image, so we needed to optimize image load time.&nbsp;Again, we already had a few things going for us:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The images were hosted via Cloudinary, so we could easily <a href=\"https:\/\/cloudinary.com\/documentation\/image_optimization\" target=\"_blank\" rel=\"noreferrer noopener\">optimize<\/a> and <a href=\"https:\/\/cloudinary.com\/documentation\/resizing_and_cropping\" target=\"_blank\" rel=\"noreferrer noopener\">resize<\/a> images, <a href=\"https:\/\/cloudinary.com\/blog\/image_formats_getting_it_right#automatic_format_selection\" target=\"_blank\" rel=\"noreferrer noopener\">serve images in modern image formats<\/a>, and distribute the images via <a href=\"https:\/\/cloudinary.com\/documentation\/image_delivery_options\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudinary\u2019s global CDN<\/a>.<\/li>\n\n\n\n<li>We were using <a href=\"https:\/\/cloudfour.com\/thinks\/responsive-images-the-simple-way\/\" target=\"_blank\" rel=\"noreferrer noopener\">responsive images<\/a> to ensure there were appropriate image sizes for all devices and that users weren\u2019t downloading giant images for tiny screens.<\/li>\n<\/ol>\n\n\n\n<p>There were further opportunities for us to improve the LCP speed. In addition to the size and delivery of the cover images, there were a few other things impacting LCP:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/web.dev\/render-blocking-resources\/\" target=\"_blank\" rel=\"noreferrer noopener\">Render-blocking assets<\/a> like web fonts, CSS, and JavaScript can delay rendering the page until they\u2019re loaded. To avoid this, we <a href=\"https:\/\/www.filamentgroup.com\/lab\/load-css-simpler\/\" target=\"_blank\" rel=\"noreferrer noopener\">loaded web fonts asynchronously<\/a>, <a href=\"https:\/\/www.wearediagram.com\/blog\/heres-why-you-should-inline-critical-css-to-reduce-load-time\" target=\"_blank\" rel=\"noreferrer noopener\">inlined critical CSS<\/a>, and JavaScript, and loaded the rest asynchronously.<\/li>\n\n\n\n<li>The browser has to read the HTML response to find the URL for the LCP image, and it may not know to prioritize loading that image.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<ul class=\"wp-block-list\">\n<li>We used <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Link_types\/preload\" target=\"_blank\" rel=\"noreferrer noopener\"><code>preload<\/code><\/a> and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Link_types\/preconnect\" target=\"_blank\" rel=\"noreferrer noopener\"><code>preconnect<\/code><\/a> to instruct browsers to begin connecting to the image CDN and downloading the LCP image earlier.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>We stored this information in <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Link\" target=\"_blank\" rel=\"noreferrer noopener\">an HTTP \u201cLink\u201d header<\/a> so the browser would receive this information before it started reading the HTML response.<\/li>\n\n\n\n<li>We added <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/HTMLImageElement\/fetchPriority\" target=\"_blank\" rel=\"noreferrer noopener\"><code>fetchpriority=\"high\"<\/code><\/a> to the LCP image markup to tell browsers to prioritize downloading it.<\/li>\n\n\n\n<li>In the future, we\u2019d like to use<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Status\/103\" target=\"_blank\" rel=\"noreferrer noopener\"> early hints<\/a> to prompt the browser to download the image sooner.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>By avoiding render-blocking assets and instructing the browser to prioritize downloading our LCP image, we were able to drastically improve our LCP speeds. Our average LCP Lighthouse score increased from 70 to 77. (The median score increased from 85 to 91.)<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img width=\"1024\" height=\"633\" data-public-id=\"Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_633,c_scale\/f_auto,q_auto\/v1686075444\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3.png?_i=AA\" alt=\"Before image of largest Contentful paint scores\" class=\"wp-post-29411 wp-image-29466\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1686075444\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075444\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3.png?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075444\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075444\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_3.png?_i=AA 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Before<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img width=\"1200\" height=\"742\" data-public-id=\"Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1200,h_742,c_scale\/f_auto,q_auto\/v1686075440\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4.png?_i=AA\" alt=\"After image of largest Contentful paint scores\" class=\"wp-post-29411 wp-image-29467\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1686075440\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075440\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4.png?_i=AA 1200w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075440\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075440\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1686075440\/Web_Assets\/blog\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4\/Blog_Improving-the-Performance-of-the-Cloudinary-Blog_4.png?_i=AA 1024w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><figcaption class=\"wp-element-caption\">After<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">First Input Delay<\/h2>\n\n\n\n<p><a href=\"https:\/\/web.dev\/fid\/\" target=\"_blank\" rel=\"noreferrer noopener\">First Input Delay (FID)<\/a> represents how long it takes for a web page to respond to a user\u2019s first interaction. For example, how long does it take for the page to respond if a user clicks a link or button?<\/p>\n\n\n\n<p>Input delays are caused when the browser\u2019s <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Glossary\/Main_thread\" target=\"_blank\" rel=\"noreferrer noopener\">main thread<\/a> is busy processing tasks and can\u2019t respond to the user\u2019s action. This is usually triggered by large amounts of JavaScript being parsed and run on a web page. This can be avoided by reducing the amount of JavaScript on a page and moving as much JavaScript as possible to separate <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Web_Workers_API\/Using_web_workers\" target=\"_blank\" rel=\"noreferrer noopener\">worker threads<\/a> that don\u2019t block the main thread.<\/p>\n\n\n\n<p>FID requires a user to interact with the page, so it can only be extrapolated from real user data. You can\u2019t test FID with automated tools. However, there are a couple of metrics that can be tested automatically and serve as helpful stand-ins:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/web.dev\/lighthouse-max-potential-fid\/\" target=\"_blank\" rel=\"noreferrer noopener\">Max Potential First Input Delay<\/a> measures the worst-case input delay for users. If you can improve the worst-case scenario, you\u2019re likely improving real user experiences.<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.chrome.com\/docs\/lighthouse\/performance\/lighthouse-total-blocking-time\/\" target=\"_blank\" rel=\"noreferrer noopener\">Total Blocking Time<\/a> measures how long the main thread is blocked during page loading.<\/li>\n<\/ul>\n\n\n\n<p>The blog\u2019s <a href=\"https:\/\/cloudinary.com\/glossary\/content-review-process\">content<\/a> is generated server-side and doesn\u2019t rely on a client-side framework to render or hydrate, so the site can render without running JavaScript on the main thread. However, we were still seeing some slow Max Potential First Input Delay scores.<\/p>\n\n\n\n<p>We reviewed some heavy third-party libraries we were embedding on the site to see if we could reduce their impact:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>We were using <strong>Marketo<\/strong> to embed a subscription sign-up form. This was not being used by many visitors but loaded a ton of JavaScript. After some discussion we decided to remove it.<\/li>\n\n\n\n<li>We were using a <strong>Google Custom Search<\/strong> integration to power a web search across all of Cloudinary\u2019s websites. This was loaded on every page. We switched to only loading it on a special search page.<\/li>\n\n\n\n<li>We\u2019re using <strong>Google Tag Manager<\/strong> to allow the marketing team to embed scripts. We\u2019re able to run this on a worker thread to avoid blocking the main thread using a tool called <a href=\"https:\/\/partytown.builder.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Partytown<\/a>. (We\u2019ve temporarily disabled this on the site while we <a href=\"https:\/\/partytown.builder.io\/proxying-requests\" target=\"_blank\" rel=\"noreferrer noopener\">set up a proxy<\/a> for a cookie consent service.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">The FID Rabbit Hole<\/h3>\n\n\n\n<p>We were hopeful that these changes would make a big impact on FID. But, when we reviewed our real-user data using the Google Search Console, it told another story: Our average FID was over 200 milliseconds on mobile devices. This meant a portion of our mobile users were experiencing sub-par performance. Resolving this turned out to be a long, and sometimes frustrating process.<\/p>\n\n\n\n<p>In general, the first step in understanding a performance problem is being able to reproduce it yourself. From there you can test changes and quickly determine whether they resolve the issue for you. But, try as we might, we could not reproduce the slow FID times ourselves, even when testing on a wide variety of devices.<\/p>\n\n\n\n<p>Our only insight into the slow FID scores was Google\u2019s Real User Metrics data, but this was frustratingly short on details. We added the <a href=\"https:\/\/github.com\/GoogleChrome\/web-vitals\" target=\"_blank\" rel=\"noreferrer noopener\">web-vitals<\/a> library in an attempt to glean more information. By combining this with our analytics we could get more information about who was experiencing slow FID scores and on what pages.&nbsp;<\/p>\n\n\n\n<p>We learned that our FID average score was being skewed by a handful of very long FID times. Some users were experiencing <em>over a second<\/em> of input delay. We also learned that these users tended to be on older, less powerful devices in areas with slower network speeds. But our data didn\u2019t tell us why they were experiencing input delays, or what actions were triggering them. We were back where we started, without a clear path forward.&nbsp;<\/p>\n\n\n\n<p>We knew something on the blog was causing input delays and should be optimized or removed, but it wasn\u2019t clear what. We did a number of trial-and-error experiments, optimizing different areas of the site and waiting to see their impact. We optimized how CodePens were loaded, changed how scripts were loaded, and tweaked many other aspects of the site, but nothing moved the needle.<\/p>\n\n\n\n<p>We brainstormed with our friends at Cloudinary and they suggested taking a closer look at event listeners on the site. (Thanks Nadin!) We zeroed in on a couple areas of our site that added touch or scroll event listeners. We removed <a href=\"https:\/\/github.com\/FL3NKEY\/scroll-lock\" target=\"_blank\" rel=\"noreferrer noopener\">a third-party library that added touch event listeners<\/a> and refactored some custom code that relied on listening for scroll events.&nbsp;<\/p>\n\n\n\n<p>Finally, some good news! After deploying these changes our average mobile FID score dropped from over 200 milliseconds, down to around 50! FID can be frustrating to debug since it can\u2019t be tested using tools like Lighthouse, and is often device-specific. But, it\u2019s a helpful metric to let us know what real users are experiencing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Putting It All Together<\/h2>\n\n\n\n<p>We saw significant improvements in our web vital scores by dedicating time and resources to improving them. Using tools like Lighthouse Parade and WebPageTest allowed us to identify opportunities for improvement, make changes, and track our progress. Focusing on web vitals helped us understand both the experience our blog readers have and how technical choices impact their experiences. There\u2019s still more we plan to do to improve performance because everyone deserves a great experience.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cloudinary is a performance-focused company, so when my Cloud Four colleagues and I were asked to rebuild their blog using WordPress, we also set our sights on improving the blog\u2019s performance. The rebuilt blog was significantly faster than the old one, but there was still room for improvement. We performed multiple rounds of performance analysis [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":29420,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,374,324],"class_list":["post-29411","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-performance","tag-website-speed"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Improving the Performance of the Cloudinary Blog<\/title>\n<meta name=\"description\" content=\"Cloudinary is a performance-focused company, so when my Cloud Four colleagues and I were asked to rebuild their blog using WordPress, we also set our\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Improving the Performance of the Cloudinary Blog\" \/>\n<meta property=\"og:description\" content=\"Cloudinary is a performance-focused company, so when my Cloud Four colleagues and I were asked to rebuild their blog using WordPress, we also set our\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-07T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-26T11:12:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Improving the Performance of the Cloudinary Blog\",\"datePublished\":\"2023-06-07T14:00:00+00:00\",\"dateModified\":\"2024-05-26T11:12:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog\"},\"wordCount\":1966,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA\",\"keywords\":[\"Guest Post\",\"Performance\",\"Website Speed\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2023\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog\",\"name\":\"Improving the Performance of the Cloudinary Blog\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA\",\"datePublished\":\"2023-06-07T14:00:00+00:00\",\"dateModified\":\"2024-05-26T11:12:37+00:00\",\"description\":\"Cloudinary is a performance-focused company, so when my Cloud Four colleagues and I were asked to rebuild their blog using WordPress, we also set our\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Improving the Performance of the Cloudinary Blog\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Improving the Performance of the Cloudinary Blog","description":"Cloudinary is a performance-focused company, so when my Cloud Four colleagues and I were asked to rebuild their blog using WordPress, we also set our","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog","og_locale":"en_US","og_type":"article","og_title":"Improving the Performance of the Cloudinary Blog","og_description":"Cloudinary is a performance-focused company, so when my Cloud Four colleagues and I were asked to rebuild their blog using WordPress, we also set our","og_url":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog","og_site_name":"Cloudinary Blog","article_published_time":"2023-06-07T14:00:00+00:00","article_modified_time":"2024-05-26T11:12:37+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization-jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Improving the Performance of the Cloudinary Blog","datePublished":"2023-06-07T14:00:00+00:00","dateModified":"2024-05-26T11:12:37+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog"},"wordCount":1966,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA","keywords":["Guest Post","Performance","Website Speed"],"inLanguage":"en-US","copyrightYear":"2023","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog","url":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog","name":"Improving the Performance of the Cloudinary Blog","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA","datePublished":"2023-06-07T14:00:00+00:00","dateModified":"2024-05-26T11:12:37+00:00","description":"Cloudinary is a performance-focused company, so when my Cloud Four colleagues and I were asked to rebuild their blog using WordPress, we also set our","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/improving-performance-cloudinary-blog#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Improving the Performance of the Cloudinary Blog"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1685137254\/Blog-performance-optimization\/Blog-performance-optimization.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/29411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=29411"}],"version-history":[{"count":28,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/29411\/revisions"}],"predecessor-version":[{"id":33855,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/29411\/revisions\/33855"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/29420"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=29411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=29411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=29411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}