<?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: drew.tech</title>
    <description>The latest articles on DEV Community by drew.tech (@dbredvick).</description>
    <link>https://dev.to/dbredvick</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%2F199220%2Fe4a6dd4b-c6c5-42a4-a029-afa312e337f6.jpg</url>
      <title>DEV Community: drew.tech</title>
      <link>https://dev.to/dbredvick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dbredvick"/>
    <language>en</language>
    <item>
      <title>Hey CTO — A Core Web Vitals Strategy for your business.
</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Tue, 30 Mar 2021 17:13:00 +0000</pubDate>
      <link>https://dev.to/dbredvick/hey-cto-a-core-web-vitals-strategy-for-your-business-94a</link>
      <guid>https://dev.to/dbredvick/hey-cto-a-core-web-vitals-strategy-for-your-business-94a</guid>
      <description>&lt;h2&gt;
  
  
  Hey there, CTO!
&lt;/h2&gt;

&lt;p&gt;Hope your Q1 is wrapping up nicely and those burn-down charts are looking burnt.&lt;/p&gt;

&lt;p&gt;How’s your Q2 roadmap planning going?&lt;/p&gt;

&lt;p&gt;Gotcha — lots of new features and a little bit of time for tech debt.&lt;/p&gt;

&lt;p&gt;Ahh, and the SEO team says you need to work on “improving our web vitals”?&lt;/p&gt;

&lt;p&gt;Do you have a plan for how you’re going to tackle them? It’s kind of a whole shift in performance measurement.&lt;/p&gt;

&lt;p&gt;No? And you have a meeting tomorrow about it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Okay, you can copy mine. Just make sure you change some stuff up so we don't get caught.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here it is 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  How might we...
&lt;/h2&gt;

&lt;p&gt;How might we track Core Web Vitals effectively at our company so that &lt;strong&gt;engineering is consistently on top of performance&lt;/strong&gt;, &lt;strong&gt;users experience a fast site&lt;/strong&gt;, and &lt;strong&gt;Google ranks our content highly&lt;/strong&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  First, &lt;strong&gt;what are Web Vitals?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://web.dev/vitals"&gt;Core Web Vitals&lt;/a&gt; is an initiative from Google to create clarity on what metrics matter most to users and for SEO.&lt;/p&gt;

&lt;p&gt;Here's what Google has to say about Vitals:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Web Vitals is an initiative by Google to provide unified guidance for quality signals that are essential to delivering a great user experience on the web. - web.dev/vitals&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Core&lt;/strong&gt; Web Vitals are a subset of Web Vitals. Google has picked out three as the core main focus. If you get these three right, the rest of the metrics should naturally fall into place.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Cumulative Layout Shift (CLS)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Avoiding shifting the page around as it loads is very important in giving your users a positive experience.&lt;/p&gt;

&lt;p&gt;Cumulative Layout Shift is the metric that measures these shifts.&lt;/p&gt;

&lt;p&gt;Check out this recording Google showed to emphasize the importance of CLS:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How is CLS measured?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Anytime an element changes size and causes the start position of other elements to change, you've contributed to the CLS.&lt;/p&gt;

&lt;p&gt;Below are the ranges for CLS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y_GLo2zr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fitvitals.dev/blog/cls_range.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y_GLo2zr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fitvitals.dev/blog/cls_range.jpg" width="768" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more info, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/cls"&gt;web.dev/cls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.fitvitals.dev/metrics/cls"&gt;learn.fitvitals.dev/metrics/cls&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Largest Contentful Paint (LCP)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The perceived performance of your site is probably one of the most important metrics – Largest Contentful Paint tries to measure just that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Largest Contentful Paint (LCP) metric reports the render time of the largest &lt;a href="https://web.dev/lcp/#what-elements-are-considered"&gt;image or text block&lt;/a&gt; visible within the viewport. - &lt;a href="https://web.dev/lcp"&gt;web.dev/lcp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How is LCP measured?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The paint time is saved for each of the elements in your initial viewport.&lt;/p&gt;

&lt;p&gt;The following qualify for LCP measurement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Images of all types&lt;/li&gt;
&lt;li&gt;Videos&lt;/li&gt;
&lt;li&gt;Background images loaded via CSS&lt;/li&gt;
&lt;li&gt;All text blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means any of these elements that take up a lot of space in the initial viewport should load &lt;em&gt;very&lt;/em&gt; quickly.&lt;/p&gt;

&lt;p&gt;Below are the ranges for LCP:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ld0Xqs-R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fitvitals.dev/blog/lcp-range.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ld0Xqs-R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fitvitals.dev/blog/lcp-range.jpg" width="768" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more info, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/lcp"&gt;web.dev/lcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.fitvitals.dev/metrics/lcp"&gt;learn.fitvitals.dev/metrics/lcp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;First Input Delay (FID)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Responding to user input quickly is critical to a positive user experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The First Input Delay (FID) metric helps measure your user's first impression of your site's interactivity and responsiveness. - &lt;a href="https://web.dev/fid"&gt;web.dev/fid&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This encourages a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shipping the minimum amount of required HTML/CSS/JS&lt;/li&gt;
&lt;li&gt;Lazy loading where possible&lt;/li&gt;
&lt;li&gt;Keeping the main thread less busy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How is FID measured?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First Input Delay measures the time between when a user interacts with an input and when the event handler actually starts to process that input.&lt;/p&gt;

&lt;p&gt;Below are the ranges for FID:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ROBvCqc0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fitvitals.dev/blog/fid-range.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ROBvCqc0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://fitvitals.dev/blog/fid-range.jpg" width="768" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more info, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/fid"&gt;web.dev/fid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.fitvitals.dev/metrics/fid"&gt;learn.fitvitals.dev/metrics/fid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why are Web Vitals important?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;site performance&lt;/li&gt;
&lt;li&gt;user experience&lt;/li&gt;
&lt;li&gt;SEO (soon)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Site performance&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Because Web Vitals are measured in the field, they represent the &lt;em&gt;real experience&lt;/em&gt; your users are having.&lt;/p&gt;

&lt;p&gt;Lighthouse audits are great, but they don't represent what it's really like to visit your site in the wild.&lt;/p&gt;

&lt;p&gt;This means metrics are representative of your audience as well (at least the ones &lt;a href="https://developers.google.com/web/tools/chrome-user-experience-report"&gt;using Chrome&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Think of these new Vitals as mini-Lighthouse audits that each visitor runs locally and reports the results.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;User experience&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Google made sure that the Core Web Vitals measure user-centric outcomes. CLS, LCP, and FID all impact UX and are generally safe from the &lt;a href="https://www.nngroup.com/articles/vanity-metrics/"&gt;vanity metric&lt;/a&gt; problem.&lt;/p&gt;

&lt;p&gt;CLS is arguably entirely focused on creating a positive UX.&lt;/p&gt;

&lt;p&gt;Designers – please don't let your engineers forget about loading states.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;SEO (soon)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Google has announced they will rank you based on your Core Web Vitals, &lt;em&gt;just not yet&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When will the switch happen? &lt;strong&gt;May 2021&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Google said in &lt;a href="https://webmasters.googleblog.com/2020/05/evaluating-page-experience.html"&gt;a recent blogpost&lt;/a&gt; that they won't switch to the new ranking until 2021.&lt;/p&gt;

&lt;p&gt;So do you need to start fixing these issues now?&lt;/p&gt;

&lt;p&gt;Not technically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But here's why you should:&lt;/strong&gt; &lt;strong&gt;each Core Web Vital is impacted by many metrics Google already ranks you on.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time to first byte (TTFB) greatly impacts Largest Contentful Paint (LCP)&lt;/li&gt;
&lt;li&gt;First Contentful Paint (FCP) pretty closely mirrors LCP&lt;/li&gt;
&lt;li&gt;Total Blocking Time (TBT) looks quite a bit like First Input Delay (FID)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;How to Track Web Vitals&lt;/strong&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Lighthouse &amp;amp; PageSpeed Insights&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can track your Web Vitals in Lighthouse audits, but only to an extent. To have a complete picture of your Core Web Vitals, you must track data both in &lt;strong&gt;the lab&lt;/strong&gt; and in &lt;strong&gt;the field&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Local Lighthouse audits will point you in the right direction, but are only lab-based results.&lt;/p&gt;

&lt;p&gt;To measure Core Web Vitals in the field, Google pulls data from the &lt;a href="https://developers.google.com/web/tools/chrome-user-experience-report"&gt;Chrome User Experience report&lt;/a&gt;. This is data from real users.&lt;/p&gt;

&lt;p&gt;By running a &lt;a href="https://developers.google.com/speed/pagespeed/insights/"&gt;PageSpeed Insight report&lt;/a&gt;, you can look at both lab and field data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y2Kso76---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/pagespeed-insights-field-data-vs-lab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y2Kso76---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/pagespeed-insights-field-data-vs-lab.png" alt="https://learn.fitvitals.dev/pagespeed-insights-field-data-vs-lab.png" width="880" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Chrome Extension&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Google team has made an extension that helps track Core Web Vitals as you browse and develop your site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A0i5af02--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/web-vitals-brave-browser-extension.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A0i5af02--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/web-vitals-brave-browser-extension.png" alt="https://learn.fitvitals.dev/web-vitals-brave-browser-extension.png" width="880" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension works in any Chromium-based browser. I've used it in both Chrome and Brave. It's a great addition to my developer workflow.&lt;/p&gt;

&lt;p&gt;You can download it &lt;a href="https://chrome.google.com/webstore/detail/web-vitals/ahfhijdlegdabablpippeagghigmibma"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Google Search Console&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Part of the reason Google introduced Web Vitals was to standardize metrics across all their tools, developer and marketing alike.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--01jC02kS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/core-web-vitals-gsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--01jC02kS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/core-web-vitals-gsc.png" alt="https://learn.fitvitals.dev/core-web-vitals-gsc.png" width="880" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Google Search Console (GSC), the metrics are grouped into both &lt;strong&gt;Mobile&lt;/strong&gt; and &lt;strong&gt;Desktop&lt;/strong&gt;. These reports will highlight areas for improvement and even point you to the specific pages with issues.&lt;/p&gt;

&lt;p&gt;While Google Search Console is normally not part of the developer workflow, GSC is currently the best tool for finding and fixing Core Web Vital issues. I highly recommend getting access to your site's console.&lt;/p&gt;

&lt;h3&gt;
  
  
  CrUX API
&lt;/h3&gt;

&lt;p&gt;Google gets its Core Web Vital data from visitors to your site that are using Chrome. By using Chrome, these users are unwittingly contributing to Google's Real User Monitoring (RUM) data set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/web/tools/chrome-user-experience-report/api/reference"&gt;https://developers.google.com/web/tools/chrome-user-experience-report/api/reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This API has two options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Report the entire origin&lt;/li&gt;
&lt;li&gt;Report on a specific page&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is useful for tracking a single page, but makes tracking groups of pages difficult. The path forward for tracking with this API is as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find representative pages for each section of the site&lt;/li&gt;
&lt;li&gt;Identify the highest and lowest traffic pages for that site section&lt;/li&gt;
&lt;li&gt;Track those pages (cache hit test, cache miss test)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This ensures that we have covered our &lt;strong&gt;most important&lt;/strong&gt; &lt;strong&gt;pages&lt;/strong&gt; and our &lt;strong&gt;slowest edge cases&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;DIY Tracking (send to GA)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While it is more effort, you can setup a DIY solution to measuring, collecting, and analyzing the Core Web Vitals for your site.&lt;/p&gt;

&lt;p&gt;It is possible to track Vitals and get them into Google Analytics. We are currently near our event limit and adding four events per page load would push us significantly over our current tier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sitemap based or traffic based
&lt;/h3&gt;

&lt;p&gt;The CrUX API above uses a traffic-based approach for tracking Vitals. This means that the reported scores account for the density of our traffic on each page. This weighted score represents closer to what our average user experiences.&lt;/p&gt;

&lt;p&gt;The other approach is Sitemap-based. Google Search Console displays your Vitals that correlate with each page, having no difference between our most popular page and the least popular page.&lt;/p&gt;

&lt;p&gt;The second approach ensures there are no bad pages, whereas the first page ensures most users get a good experience most of the time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--01jC02kS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/core-web-vitals-gsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--01jC02kS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://learn.fitvitals.dev/core-web-vitals-gsc.png" alt="https://learn.fitvitals.dev/core-web-vitals-gsc.png" width="880" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;per URL approach&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/Untitled.png" class="article-body-image-wrapper"&gt;&lt;img src="/blog/Untitled.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;percentage of traffic based approach (data from CrUX API)&lt;/p&gt;

&lt;h2&gt;
  
  
  How can we Monitor our scores?
&lt;/h2&gt;

&lt;p&gt;The best way for us to stay on top of this is to get our Vitals scores into Slack*.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;unless Slack is down&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Google has created a few sources we can query on a regular basis and send to our chat alerts channel, but it would take quite a bit of dev work to do.&lt;/p&gt;

&lt;p&gt;Once a week, we could send a snapshot of Core Web Vital performance to each squad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build vs. Buy?
&lt;/h3&gt;

&lt;p&gt;Well, we could totally build this internally. We'd have to decide if we want to use Google's data as the source of truth or collect our Core Web Vitals ourselves. We could integrate with &lt;a href="https://developers.google.com/web/tools/chrome-user-experience-report/api/reference"&gt;the CRuX API&lt;/a&gt; mentioned above and get a good 28-day average view of individual pages and our site as a whole.&lt;/p&gt;



&lt;h3&gt;
  
  
  A basic version
&lt;/h3&gt;

&lt;p&gt;The goal of this product would be to keep the engineering team in the loop on our vital scores. It should ideally integrate with Microsoft Teams or Slack. We should know how different sections of our site are doing on a weekly, monthly, and quarterly basis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;would take at least a sprint or two to build (medium to large t-shirt size)&lt;/li&gt;
&lt;li&gt;would take teams off of feature work&lt;/li&gt;
&lt;li&gt;we could open source it eventually&lt;/li&gt;
&lt;li&gt;more flexible and custom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Buy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;would likely cost at least $100/mo&lt;/li&gt;
&lt;li&gt;would free up engineering time so they can remain focused&lt;/li&gt;
&lt;li&gt;solution would improve over time and keep up with Google's changes "for free"&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;
  
  
  A complex version
&lt;/h3&gt;

&lt;p&gt;Vitals are very powerful, and we could build a very advanced monitoring suite around them. If we sample our visitors and collect vitals for some percentage of them, we could know our site's performance in near real-time. This system would be much more complex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;would take &lt;em&gt;a long&lt;/em&gt; time to build (three sprints minimum) and maintenance would be more here&lt;/li&gt;
&lt;li&gt;would take one whole squad off of feature work &amp;amp; likely some of the DevOps team's time&lt;/li&gt;
&lt;li&gt;would be costly to run (cost grows as our site gets more traffic)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Buy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;would likely cost $400+ a month depending on volume&lt;/li&gt;
&lt;li&gt;would free up a ton of time building + maintenance&lt;/li&gt;
&lt;li&gt;solution would improve over time and keep up with Google's changes "for free"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final recommendation
&lt;/h3&gt;

&lt;p&gt;I think the smartest path forward is to start with the &lt;a href="https://fitvitals.dev/blog/a-core-web-vitals-strategy-for-the-cto#basic-version"&gt;basic version&lt;/a&gt; and see if building/buying a more advanced tool is worth it.&lt;/p&gt;

&lt;p&gt;We could either spend a sprint or two ramping up and engineer on the project or go buy something off of the shelf and spend a day or two integrating it.&lt;/p&gt;

&lt;p&gt;With how much feature work we're trying to get done this quarter, I'd say let's opt for the "buy" option here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The end
&lt;/h2&gt;

&lt;p&gt;I could give you a detailed rundown of all the competitors in the space (hint: there aren't many), but that seems like a great topic for a new blog post 🙂&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this a problem your company is having?
&lt;/h3&gt;

&lt;p&gt;If so, I'd love to talk with you about Core Web Vitals and making FitVitals the &lt;a href="https://fitvitals.dev"&gt;best tool for monitoring Core Web Vitals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://savvycal.com/drew-b/chat"&gt;&lt;strong&gt;Book a time&lt;/strong&gt;&lt;/a&gt; and let's chat.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>performance</category>
      <category>seo</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>How to declare Twitter DM bankruptcy</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Mon, 29 Mar 2021 13:57:03 +0000</pubDate>
      <link>https://dev.to/dbredvick/how-to-declare-twitter-dm-bankruptcy-3m91</link>
      <guid>https://dev.to/dbredvick/how-to-declare-twitter-dm-bankruptcy-3m91</guid>
      <description>&lt;p&gt;Look, we get it. You have too many messages and it's easier to lock down your DMs than respond to all of them. But is that the solution?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why declare DM bankruptcy
&lt;/h2&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qDU_aVgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/tweet_video_thumb/Ev_W3svXAAEd5IV.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--_gPSz8Ha--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1273615233018482688/7yvtWlBt_normal.jpg" alt="Kelly Vaughn 🐞 profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Kelly Vaughn 🐞
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @kvlly
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      I have so many unread DMs from the past week or so that I am officially declaring DM bankruptcy.&lt;br&gt;&lt;br&gt;I'm sorry if I missed your DM. I promise it was nothing personal.&lt;br&gt;&lt;br&gt;The good news is I do actually check my email and have a public email where I'm easier to access: &lt;br&gt;&lt;br&gt;✉️kelly@hey.com 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      22:15 PM - 08 Mar 2021
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1369049078152232963" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1369049078152232963" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1369049078152232963" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;First off, congrats! You are popular on Twitter, popular enough to get a lot of the benefits that come from having a larger audience.&lt;/p&gt;

&lt;p&gt;You can ask questions out into a void and actually get responses. When you tweet out a link to a project you're working on, people &lt;em&gt;actually&lt;/em&gt; give you feedback. Amazing!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But what about the downsides?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Well, first off — sorry about the reply-guys. We can't fix those.&lt;/p&gt;

&lt;p&gt;The Twitter DM UX is not great, but you probably already knew that. But on the bright side, some of the DMs you get are super awesome. Thoughtful internet strangers are the best type of strangers.&lt;/p&gt;

&lt;p&gt;So how do you handle the bad DM UX?&lt;/p&gt;

&lt;p&gt;One option is to declare DM bankruptcy and funnel all well-meaning followers to contact you via email. Even though your email is still public, this extra step often stops most junk but allows for incoming messages if the sender cares enough.&lt;/p&gt;

&lt;p&gt;Decided you want to declare DM bankruptcy? Okay, let's get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  The steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Write a tweet
&lt;/h3&gt;

&lt;p&gt;Filing for Twitter bankruptcy is considerably easier than the real thing. First, write a tweet as Kelly did above, letting your followers know that you won't be responding to their DMs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be sure to include your email.&lt;/strong&gt; Bonus points for using an email provider like &lt;a href="https://www.hey.com"&gt;Hey.com&lt;/a&gt;, which lets you control who can and cannot message you.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pin your bankruptcy tweet
&lt;/h3&gt;

&lt;p&gt;Next, pin your bankruptcy tweet to your Twitter profile. Only a fraction of your followers see the bankruptcy tweet when you post it, so pinning it to your profile is important to keep all your followers in the loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create an automated DM with Twitter's API (optional)
&lt;/h3&gt;

&lt;p&gt;Okay, so now we're getting into the really cool part. This is the problem &lt;a href="https://plzdm.me"&gt;PlzDM.me&lt;/a&gt; solves, but I'm going to show you how to do it using Twitter's API instead.&lt;/p&gt;

&lt;h4&gt;
  
  
  First, what's a Twitter welcome message?
&lt;/h4&gt;

&lt;p&gt;So Twitter created welcome messages to help brands deal with the large influx of DMs they get. They just never rolled it out to you and me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But, it's in their API docs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let's use it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Set up Twurl
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/twitter/twurl"&gt;Twurl&lt;/a&gt; is a lot like &lt;code&gt;curl&lt;/code&gt;, except it's specifically for querying the Twitter API. Configure it once for auth and you're good to go.&lt;/p&gt;

&lt;p&gt;Okay, so we're going to be using RubyGems to install Twurl.&lt;/p&gt;

&lt;p&gt;First, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;twurl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Apply for Twitter developer access
&lt;/h4&gt;

&lt;p&gt;The next step is to apply for access to the API. Do that here: &lt;a href="https://developer.twitter.com/en/apply-for-access"&gt;https://developer.twitter.com/en/apply-for-access&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Generate tokens
&lt;/h4&gt;

&lt;p&gt;After you've been accepted (which should happen rather quickly), you'll need to generate and set up your tokens for Twurl.&lt;/p&gt;

&lt;p&gt;To do that, head to the portal here: &lt;a href="https://developer.twitter.com/en/portal/projects-and-apps"&gt;https://developer.twitter.com/en/portal/projects-and-apps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HOEuqt8Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.plzdm.me/twitter-dev-portal-standalone-apps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HOEuqt8Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.plzdm.me/twitter-dev-portal-standalone-apps.png" alt="" width="805" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've already got a few apps, but this section will be empty for you. &lt;strong&gt;Click the "Create App" button.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Name that app whatever you're feeling like (but it does have to be unique globally).&lt;/p&gt;
&lt;h4&gt;
  
  
  Authorize Twurl
&lt;/h4&gt;

&lt;p&gt;Next, you need to configure Twurl to pass your secrets that you just created on the last step, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;twurl authorize &lt;span class="nt"&gt;--consumer-key&lt;/span&gt; key       &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="nt"&gt;--consumer-secret&lt;/span&gt; secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test out Twurl to be sure it's working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;twurl /1.1/statuses/home_timeline.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Create your welcome message
&lt;/h4&gt;

&lt;p&gt;Now that we're configured, let's start creating your automated welcome message.&lt;/p&gt;

&lt;p&gt;Head over to &lt;a href="https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/welcome-messages/api-reference/new-welcome-message"&gt;the Twitter docs&lt;/a&gt; if you'd like a more detailed explanation of what we're doing.&lt;/p&gt;

&lt;p&gt;Each page of Twitter API documentation normally comes with a copy-and-paste ready Twurl example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;twurl &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; /1.1/direct_messages/welcome_messages/new.json &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "simple_welcome-message 01", "welcome_message": {"message_data": {"text": "Your welcome message goes here!"}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"welcome_message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1375945329892278289"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"created_timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1616885905131"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message_data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your welcome message goes here!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hashtags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symbols"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"user_mentions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"urls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source_app_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"19958039"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"19958039"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"19958039"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Twurl Drew Local"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you create it, be sure to take note of the welcome message &lt;code&gt;id&lt;/code&gt;, you'll need this later.&lt;/p&gt;

&lt;h4&gt;
  
  
  Creating a welcome message rule
&lt;/h4&gt;

&lt;p&gt;Welcome message rules are what makes Twitter automatically show someone a welcome message when they message you for the first time.&lt;/p&gt;

&lt;p&gt;Be sure to use the &lt;code&gt;id&lt;/code&gt; from the last step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;twurl &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s1"&gt;'Content-type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST /1.1/direct_messages/welcome_messages/rules/new.json &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"welcome_message_rule": {"welcome_message_id": "YOUR_ID_FROM_LAST_STEP"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when someone new messages you, they'll see this message automatically directing them to email you instead. Now you don't have to use that precious pinned tweet space to inform people you're not checking your DMs!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HLHv7DhT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://blog.plzdm.me/welcome-message.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HLHv7DhT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://blog.plzdm.me/welcome-message.gif" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Is there an easier option?
&lt;/h2&gt;

&lt;p&gt;Sometimes mucking around with the API isn't fun, I get that. That's why I've been building a tool to help everyone create these Twitter Welcome messages.&lt;/p&gt;

&lt;p&gt;We're building PlzDM.me to help make declaring &lt;a href="https://plzdm.me/"&gt;Twitter bankruptcy&lt;/a&gt; as easy as possible.&lt;/p&gt;

&lt;p&gt;The ability to create Twitter welcome messages is on our free tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment on this post and I'll reach out to you when we launch later this week.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GGhfY9l6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.plzdm.me/glad-you-asked.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GGhfY9l6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.plzdm.me/glad-you-asked.jpeg" alt="" width="225" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>twitter</category>
      <category>showdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I built a Next.js job board with Next. Find your Next JS dream job!</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Sun, 22 Nov 2020 01:34:49 +0000</pubDate>
      <link>https://dev.to/dbredvick/i-built-a-next-js-job-board-with-next-find-your-next-js-dream-job-33n4</link>
      <guid>https://dev.to/dbredvick/i-built-a-next-js-job-board-with-next-find-your-next-js-dream-job-33n4</guid>
      <description>&lt;p&gt;&lt;em&gt;UPDATE: this job board is no longer active. Please check out the hiring section of the &lt;a href="https://discord.com/invite/KNKF84E" rel="noopener noreferrer"&gt;Next.js Discord&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I attended Next.js Conf last month and was impressed by the high quality content, updates, and virtual conference setup (yay global pandemics).&lt;/p&gt;

&lt;p&gt;It even inspired me to build a new product, &lt;a href="https://jobs.nextjsnotes.com" rel="noopener noreferrer"&gt;Next.js Jobs&lt;/a&gt; – but more on that below.&lt;/p&gt;

&lt;h2&gt;
  
  
  The content, updates, and setup
&lt;/h2&gt;

&lt;p&gt;The production level of this conference was &lt;em&gt;waay&lt;/em&gt; better than I was anticipating.&lt;/p&gt;

&lt;p&gt;The keynote along with each of the individual presentations showed a level of polish while still feeling like a conference talk. I think this was accomplished by pre-recording talks, but requiring a "one-take" policy, meaning the video had to be recorded in one sitting with no edits.&lt;/p&gt;

&lt;p&gt;Next.js 10 is great, and so are its accompanying features from Vercel. Check out my post on the &lt;a href="https://nextjsnotes.com/next-js-conf-highlights-2020/" rel="noopener noreferrer"&gt;highlights of Next.js Conf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All of this happened on an awesome YouTube-powered live streaming conference setup with multiple "stages". Cool stuff.&lt;/p&gt;

&lt;h3&gt;
  
  
  The community
&lt;/h3&gt;

&lt;p&gt;But what I was mostly impressed with was the &lt;strong&gt;community&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tons of people registered, over 75k. And about half of them actually showed up!&lt;br&gt;&lt;br&gt;
I joined the community Discord server and was overwhelmed by the volume of channels and messages.&lt;/p&gt;

&lt;p&gt;Check out just how many "job" channels there were:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F11%2Fjobs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F11%2Fjobs.png" alt="Your Next JS dream job"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the way, you can totally still join the Discord if you're interested: &lt;a href="https://discord.gg/KNKF84E" rel="noopener noreferrer"&gt;https://discord.gg/KNKF84E&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The realization
&lt;/h2&gt;

&lt;p&gt;And then after the conference, all of those extra job channels got cleaned up. That left me thinking, where are all these job posts going to go? I searched around, but there was really home for them.&lt;/p&gt;

&lt;p&gt;Current job boards barely treat Next.js as a first class citizen, but rather emphasize React. That's probably fine for most cases for the hiring mangers, as a good React dev can be taught Next.js.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But what about the developers looking for Next.js jobs?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's not much outside of the single "#jobs" channel in the Discord now, which is very noisy. It's full of job seekers trying to find a job that uses Next.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  The product
&lt;/h2&gt;

&lt;p&gt;That's why I created Next.js Jobs – a job board for Next.js enthusiasts. A job board that helps developers find their Next(.js) job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F11%2Fnextjs-jobs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F11%2Fnextjs-jobs.png" alt="Your Next JS dream job"&gt;&lt;/a&gt;&lt;a href="https://jobs.nextjsnotes.com" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://jobs.nextjsnotes.com" rel="noopener noreferrer"&gt;https://jobs.nextjsnotes.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How does it work?&lt;/p&gt;

&lt;p&gt;If you're looking for a job:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jobs.nextjsnotes.com/" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; with your email &lt;em&gt;(If you're already subscribed to NextjsNotes, you're on the list)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Companies submit jobs that use Next.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I manually moderate the job post and make sure they actually use Next.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each Tuesday, an automated email goes out with links to each job and their descriptions&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're submitting a job:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jobs.nextjsnotes.com/submit-a-job" rel="noopener noreferrer"&gt;Submit a job&lt;/a&gt; on the site&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I'll moderate it and reach out to you with any questions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If approved, your job post will be sent out to developers the following Tuesday morning&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The future&lt;/p&gt;

&lt;p&gt;There are &lt;em&gt;a lot&lt;/em&gt; of missing features right now, but rather than build them, I want to validate there is actually market demand here.So test it out, let me know what you think!&lt;/p&gt;

&lt;p&gt;I'm not planning on monetizing this until it's a self-sustainable platform. Right now I'm manually finding Next.js jobs and adding them to the site. In the future, I hope to charge about &lt;strong&gt;$99/mo&lt;/strong&gt; for a job posting. Well under what LinkedIn is asking, and generally in line with what I've seen in terms of "standard pricing" for job boards.&lt;/p&gt;




&lt;p&gt;I hope I can help you find your Next JS dream job! (pun totally intended)&lt;/p&gt;

&lt;p&gt;See you on the other side,&lt;/p&gt;

&lt;p&gt;Drew&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>showdev</category>
      <category>career</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Next.js Conf Highlights</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Thu, 29 Oct 2020 02:47:00 +0000</pubDate>
      <link>https://dev.to/dbredvick/next-js-conf-highlights-fpk</link>
      <guid>https://dev.to/dbredvick/next-js-conf-highlights-fpk</guid>
      <description>&lt;p&gt;Next.js Conf was streamed all around the world by over 34,500 viewers on a custom platform this week on Tuesday. It was full of great news for the Next.js framework and ecosystem.&lt;/p&gt;

&lt;p&gt;We'll do a deep dive of some Next.js 10.0 features later, but for now, this update includes a short overview of each.&lt;/p&gt;

&lt;p&gt;Here's the keynote:&lt;/p&gt;

&lt;p&gt;So that keynote covered quite a few releases. Next 10 is out, Next.js Analytics launched, and Next.js starter kits were introduced with Commerce being the first.&lt;/p&gt;

&lt;p&gt;Let's briefly get into these.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next.js 10.0
&lt;/h2&gt;

&lt;p&gt;This announcement was somewhat expected. There were lots of indicators pointing to Next.js 10 being released at this conference. Coordinating planned secretive launches while working on open-source software in public is nearly impossible.&lt;/p&gt;

&lt;p&gt;What I was surprised by was how many updates were included in Next 10.&lt;/p&gt;

&lt;p&gt;They introduced &lt;strong&gt;20 new features&lt;/strong&gt; while reducing the bundle size &lt;strong&gt;by 16%&lt;/strong&gt; 🤯&lt;/p&gt;

&lt;p&gt;Let's talk about the feature 👇&lt;/p&gt;

&lt;h4&gt;
  
  
  Next.js Image optimization
&lt;/h4&gt;

&lt;p&gt;According to the Next.js 10 release &lt;a href="https://nextjs.org/blog/next-10#built-in-image-component-and-automatic-image-optimization" rel="noopener noreferrer"&gt;blog post&lt;/a&gt;, images take up 50% of the total bytes on web pages.&lt;/p&gt;

&lt;p&gt;When looking for performance optimizations, the first place I generally look is the images:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are images properly sized?&lt;/li&gt;
&lt;li&gt;Are images served with modern formats?&lt;/li&gt;
&lt;li&gt;Are we serving images using a CDN?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Next.js Image Component takes care of a lot of that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Next.js image component is exactly what we have been wanting for images in React.  &lt;/p&gt;

&lt;p&gt;Pass it a path - local or remote - and it just works. Specify sizes, formats or Image services (cloudinary, imgix...)   &lt;/p&gt;

&lt;p&gt;this is so awesome! &lt;a href="https://t.co/PN7yytFF1T" rel="noopener noreferrer"&gt;pic.twitter.com/PN7yytFF1T&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Wes Bos (&lt;a class="mentioned-user" href="https://dev.to/wesbos"&gt;@wesbos&lt;/a&gt;) &lt;a href="https://twitter.com/wesbos/status/1321491776520278017?ref_src=twsrc%5Etfw" rel="noopener noreferrer"&gt;October 28, 2020&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Next.js team, with help from the Chrome team at Google, came up with an RFC for the component only 55 days ago:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vercel/next.js/discussions/16832" rel="noopener noreferrer"&gt;[RFC] Image Component for Next.js · Discussion #16832 · vercel/next.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think of the Image component as mostly a drop-in replacement for the existing HTML element.&lt;/p&gt;

&lt;p&gt;Read more about it on the &lt;a href="https://nextjs.org/blog/next-10#nextjs-image-component" rel="noopener noreferrer"&gt;release blog post&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Next.js Internationalization
&lt;/h4&gt;

&lt;p&gt;One of the most common use cases for needing a custom server (opting out of the "Pit of success" of Next.js) is internationalization.&lt;/p&gt;

&lt;p&gt;Translating your site into multiple languages is critical to many business' success, yet it's often treated as an afterthought.&lt;/p&gt;

&lt;p&gt;This release of Next.js makes internationalization a first-class citizen.&lt;/p&gt;

&lt;p&gt;Now, you won't need to create a custom server to handle i18n routing, content, etc.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/vercel/next.js/discussions/17078" rel="noopener noreferrer"&gt;RFC&lt;/a&gt;, &lt;a href="https://nextjs.org/blog/next-10#internationalized-routing" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;, and &lt;a href="https://nextjs.org/docs/advanced-features/i18n-routing" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;h4&gt;
  
  
  Next.js Analytics
&lt;/h4&gt;

&lt;p&gt;I'm probably most excited about this added feature. Core Web Vitals are going to be a &lt;a href="https://drew.tech/the-ripple-of-web-vitals" rel="noopener noreferrer"&gt;big deal&lt;/a&gt; &amp;amp; making it easy for developers to track them is a huge win.&lt;/p&gt;

&lt;p&gt;Vercel launched &lt;a href="https://nextjs.org/analytics" rel="noopener noreferrer"&gt;Next.js Analytics&lt;/a&gt; yesterday, which are built right into both Next.js and the Vercel platform.&lt;/p&gt;

&lt;p&gt;Right now, you can enable Next.js Analytics on any app that's on version 10.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F10%2Fenable-nextjs-analytics-vercel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F10%2Fenable-nextjs-analytics-vercel.png" alt="Next.js Conf Highlights"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a catch though; you only get &lt;strong&gt;one app per Hobby account.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This makes tons of sense, though. Recording and processing all of this real-time data is very hard, both in terms of processing and storage.&lt;/p&gt;

&lt;p&gt;To have an unlimited collection of Core Web Vitals, you'll likely have to be on one of the higher paying tiers at Vercel.&lt;/p&gt;

&lt;p&gt;A few quick questions below 👇&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this feature Vercel only?&lt;/strong&gt; For now, yes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a limit on how much data I can collect?&lt;/strong&gt; Yes. Right now, only a single day view exists on Hobby tiers. I'd assume that limit is larger for paid plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I track Core Web Vitals some other way?&lt;/strong&gt; Totally! Under the hood, it's very likely this feature uses the existing &lt;code&gt;reportWebVitals&lt;/code&gt; function that I wrote about a while back:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F09%2Fnext-vitals-lighthouse-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F09%2Fnext-vitals-lighthouse-1.png" alt="Next.js Conf Highlights"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjsnotes.com/how-to-monitor-core-web-vitals-in-next-js/" rel="noopener noreferrer"&gt;Monitoring performance in Next.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm excited to see where Next.js Analytics goes!&lt;/p&gt;

&lt;h4&gt;
  
  
  Next.js Commerce
&lt;/h4&gt;

&lt;p&gt;Next.js Commerce is borrowing the idea of headless CMS sites and applying it to ecommerce.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/commerce" rel="noopener noreferrer"&gt;Next.js Commerce&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The all-in-one starter kit for high-performance ecommerce sites.&lt;/p&gt;

&lt;p&gt;This is a great option for people who want a custom front end with the performance and reliability of a platform like Shopify or BigCommerce&lt;/p&gt;

&lt;p&gt;BigCommerce is the first to partner with the Next.js team and right now you can configure a headless BigCommerce deployment with a custom Next.js site with just a few clicks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F10%2Fnextjs-commerce-partners.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F10%2Fnextjs-commerce-partners.png" alt="Next.js Conf Highlights"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I believe this will become the de facto starting point when building brand new Next.js ecommerce sites in the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other updates
&lt;/h3&gt;

&lt;p&gt;Below are some notable updates that tackle performance and improving developer experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React 17 support was added&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;as&lt;/code&gt; properties no longer needed on &lt;code&gt;href&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/blog/next-10#importing-css-from-third-party-react-components" rel="noopener noreferrer"&gt;Improved CSS&lt;/a&gt; loading for 3rd party components&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/docs/basic-features/data-fetching#fallback-true" rel="noopener noreferrer"&gt;Blocking mode&lt;/a&gt; for &lt;code&gt;getStaticPaths&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/docs/advanced-features/codemods" rel="noopener noreferrer"&gt;Codemod CLI&lt;/a&gt; (expect one soon for the Image Component)&lt;/li&gt;
&lt;li&gt;Fast Refresh enabled for &lt;code&gt;.mdx&lt;/code&gt; files &lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Q: Can I view the talks online yet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; &lt;del&gt;Not yet, they're working on getting them all uploaded to their&lt;/del&gt; Some of them are uploaded now. Check out their &lt;a href="https://www.youtube.com/c/ZEITHQ/videos" rel="noopener noreferrer"&gt;YouTube channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: I heard there was swag. Where can I get it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; You can grab any remaining swag at &lt;a href="https://nextjs.org/give" rel="noopener noreferrer"&gt;nextjs.org/give&lt;/a&gt;. I'm personally hyped about these clogs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F10%2Fvercel-shoes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F10%2Fvercel-shoes.png" alt="Next.js Conf Highlights"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S. - They're donating the profit to some great charities (check at the bottom of the /give page).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What was the theme of this release of Next.js?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; I'd say it's pretty clear the Next.js team cares &lt;em&gt;a lot&lt;/em&gt; about performance. Almost every feature ties back to performance in some way.&lt;/p&gt;

&lt;p&gt;While the Commerce launch doesn't explicitly talk about performance, they did mention how important page speed is for conversion rates on ecommerce sites.&lt;/p&gt;

&lt;p&gt;Not only were features added in Next.js 10, but the overall bundle size decreased as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: I heard there is a Next.js Discord. Where can I join?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Here's an invite link: &lt;a href="https://discord.gg/KNKF84E" rel="noopener noreferrer"&gt;https://discord.gg/KNKF84E&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Where can I get more info on Next.js Analytics/Commerce/Image Component?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Hey, glad you asked! I'm doing a deep dive into each of these features in the coming weeks. If you're not already, subscribe at the bottom of the page to get notified when they go out.&lt;/p&gt;

&lt;p&gt;For now, the Next.js docs do a pretty good job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/basic-features/image-optimization" rel="noopener noreferrer"&gt;Image component&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/commerce" rel="noopener noreferrer"&gt;Commerce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/analytics" rel="noopener noreferrer"&gt;Analytics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Overall, I'd say it's a great time to be a Next.js developer. The ecosystem is growing quite rapidly &amp;amp; the folks at Vercel seem to have the backing of quite a few tech giants (AWS, Google, Shopify, and Facebook to name a few).&lt;/p&gt;

&lt;p&gt;Next.js has a lot of momentum right now – I'm excited to see what happens next (pun intended).&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Monitoring performance in Next.js</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Tue, 08 Sep 2020 15:35:00 +0000</pubDate>
      <link>https://dev.to/dbredvick/monitoring-performance-in-next-js-59gd</link>
      <guid>https://dev.to/dbredvick/monitoring-performance-in-next-js-59gd</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xTg12llq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/next-vitals-lighthouse-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xTg12llq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/next-vitals-lighthouse-1.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we jump into how to measure performance, let me convince you that it's worth it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Already convinced you should be measuring performance? Jump to the "In the lab" implementation section below.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Each 100ms decrease in homepage load speed increases session conversion by 1.11%
&lt;/h2&gt;

&lt;p&gt;At least, that was the case for &lt;a href="https://web.dev/why-speed-matters/#performance-is-about-improving-conversions"&gt;Mobify&lt;/a&gt;. Quite a few sites saw dramatic increases in conversion by improving performance.&lt;/p&gt;

&lt;p&gt;The team at Google came up with a list of reasons that performance matters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://web.dev/why-speed-matters"&gt;https://web.dev/why-speed-matters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Their reasoning can be broken up into these four categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Money
&lt;/h3&gt;

&lt;p&gt;Let's say improving performance increases your conversion rate &lt;strong&gt;one percent&lt;/strong&gt;. How big of an impact might that have on your profit?  &lt;/p&gt;

&lt;p&gt;Return on ad spend (ROAS) is a very important metric when doing any paid marketing. It's basically the measure of how efficient your ad spend is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kvn4L4VT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/CleanShot-2020-09-07-at-15.35.56.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kvn4L4VT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/CleanShot-2020-09-07-at-15.35.56.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;a href="https://docs.google.com/spreadsheets/d/11UwZ3o55u_B-bjKZyc7XIz3otk0B7Cq6YzIKGW-jklA/edit?usp=sharing"&gt;&lt;/a&gt;&lt;a href="https://docs.google.com/spreadsheets/d/11UwZ3o55u_B-bjKZyc7XIz3otk0B7Cq6YzIKGW-jklA/edit?usp=sharing"&gt;https://docs.google.com/spreadsheets/d/11UwZ3o55u_B-bjKZyc7XIz3otk0B7Cq6YzIKGW-jklA/edit?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have a budget of $4000 and a conversion rate of 5%, you're dramatically outperforming your competition with double the budget if their conversion rate is 1%.&lt;/p&gt;

&lt;p&gt;High conversion rates are the difference between success and failure, especially in low-margin businesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. UX
&lt;/h3&gt;

&lt;p&gt;Ever browsed a slow, jumpy, and bloated site?&lt;/p&gt;

&lt;p&gt;Did you have a good time?&lt;/p&gt;

&lt;p&gt;Exactly.&lt;/p&gt;

&lt;p&gt;Core Web Vitals encourage prioritizing visual and technical accessibility across teams.&lt;/p&gt;

&lt;p&gt;User experience is not solely the responsibility of the Design and UX team, it's something we all contribute to.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. SEO
&lt;/h3&gt;

&lt;p&gt;It's always been a bit of a secret how much Google thinks performance matters for search rank.&lt;/p&gt;

&lt;p&gt;With the recent release of Core Web Vitals, I think they are making their stance more clear. Performance matters &lt;strong&gt;and&lt;/strong&gt; will mater more and more over time.&lt;/p&gt;

&lt;p&gt;Google has been signaling these metrics are very important.&lt;/p&gt;

&lt;p&gt;Core Web Vitals are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built into all Google tools&lt;/li&gt;
&lt;li&gt;Documented very thoroughly on web.dev&lt;/li&gt;
&lt;li&gt;Prominently displayed in Google Search Console&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://webmasters.googleblog.com/2020/05/evaluating-page-experience.html"&gt;Delayed launching Vitals&lt;/a&gt; due to COVID-19&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To that last point, the delay: why would they need to delay the launch if it wasn't going to make a big impact?&lt;/p&gt;

&lt;p&gt;While much of this is speculation, I think the signals are showing that Google is going to skew rankings heavily based on Vitals.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Tech debt
&lt;/h3&gt;

&lt;p&gt;I'm assuming this audience is pretty aware of what tech debt is.&lt;/p&gt;

&lt;p&gt;While having good performance isn't a great indicator of no tech debt, bad performance usually means there's some form of tech debt hanging around.&lt;/p&gt;

&lt;p&gt;Are you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loading your images in a really weird way that none of your developers understand? &lt;/li&gt;
&lt;li&gt;Using a complicated architecture so measuring and thinking about performance is tricky for a single developer to think about?&lt;/li&gt;
&lt;li&gt;Relying on old tech and not updating to newer standards?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building a culture that continuously improves performance will have the highest ROI over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitoring Core Web Vitals in Next.js
&lt;/h2&gt;

&lt;p&gt;If you aren't familiar with Core Web Vitals, they're a new set of metrics Google released to update their guidance on what a quality website performs like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjsnotes.com/how-to-improve-core-web-vitals-in-a-next-js-app/"&gt;Intro to Core Web Vitals&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  In the lab
&lt;/h3&gt;

&lt;p&gt;Front end performance monitoring and Lighthouse audits have been inseparable for quite some time.&lt;/p&gt;

&lt;p&gt;Lighthouse is an open-source tool for monitoring performance and finding areas of opportunity in your site.&lt;/p&gt;

&lt;p&gt;A screenshot of the green circles has become the goal of many engineering teams around the world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--suKhY07t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/CleanShot-2020-09-07-at-14.04.46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--suKhY07t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/CleanShot-2020-09-07-at-14.04.46.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These audits are a form of &lt;strong&gt;lab testing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lab testing is exactly what it sounds like: testing in controlled conditions.&lt;/p&gt;

&lt;p&gt;The approach a lot of teams are taking to solve performance woes is to run more audits.&lt;/p&gt;

&lt;p&gt;Common options include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frequent local audits in Chrome&lt;/li&gt;
&lt;li&gt;paying for a SaaS monitoring tool&lt;/li&gt;
&lt;li&gt;as a step in the CI/CD process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are all a step in the right direction. As I said earlier, the highest ROI fix is simply to change the engineering culture around performance.&lt;/p&gt;

&lt;p&gt;I see lab testing as the &lt;strong&gt;low-hanging fruit&lt;/strong&gt; for most engineering teams.&lt;/p&gt;

&lt;p&gt;It gets developers thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;front end performance&lt;/li&gt;
&lt;li&gt;keeping payloads smaller&lt;/li&gt;
&lt;li&gt;back end request response times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While not perfect, consistent Lighthouse audits can get you 80% of the way to a performant site.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setting up automated Lighthouse audits
&lt;/h4&gt;

&lt;p&gt;If you're hosting on Vercel, it's as simple as adding the Lighthouse integration to your site:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9LWczQgv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/vercel-lighthouse-audits.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9LWczQgv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/vercel-lighthouse-audits.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The integration automatically audits each deploy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S2IYkjgI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/lighthouse-audit-history-vercel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S2IYkjgI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/lighthouse-audit-history-vercel.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're not hosting in Vercel, you can use a step in your CI process (GitHub Actions).&lt;/p&gt;

&lt;p&gt;This &lt;a href="https://github.com/marketplace/actions/lighthouse-check"&gt;action&lt;/a&gt; provides many options for configuring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pull request comments&lt;/li&gt;
&lt;li&gt;Slack alerts&lt;/li&gt;
&lt;li&gt;failing a build on too low of scores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simply add the action to the repo you'd like to test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u4sJYDLw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/CleanShot-2020-09-07-at-16.40.19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u4sJYDLw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/CleanShot-2020-09-07-at-16.40.19.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't want to manage all this yourself, there are good paid SaaS solutions that get the job done. I'm currently using &lt;a href="https://calibreapp.com/"&gt;Calibre&lt;/a&gt; at my day job, and we've had success with that.&lt;/p&gt;

&lt;h4&gt;
  
  
  What's the catch?
&lt;/h4&gt;

&lt;p&gt;Earlier I mentioned that Lighthouse audits aren't perfect. Why?&lt;/p&gt;

&lt;p&gt;Well, lab data isn't representative. The map is not the territory.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"It works on my machine" is the perfect example of why lab data isn't the best solution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a visitor of your site that lives in another country, far away from the AWS region you chose. Is their experience captured in your Lighthouse audit?&lt;/p&gt;

&lt;h3&gt;
  
  
  In the field
&lt;/h3&gt;

&lt;p&gt;So say you're doing pretty well on your Lighthouse audits. How might you upgrade your performance monitoring game?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Field data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Core Web Vitals will change the way we think about performance monitoring, specifically in the field.&lt;/p&gt;

&lt;p&gt;I wrote about it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://drew.tech/the-ripple-of-web-vitals"&gt;The Ripple of Web Vitals&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Collecting performance data from real users is more representative than lab audits.&lt;/p&gt;

&lt;p&gt;Thankfully, &lt;strong&gt;Next supports collecting Core Web Vitals&lt;/strong&gt; in the field directly in the framework.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setting up field tracking of Core Web Vitals in Next
&lt;/h4&gt;

&lt;p&gt;Google Analytics is a very simple place to send Core Web Vitals.&lt;/p&gt;

&lt;p&gt;You can use the added metrics to see how performance impacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conversion rate&lt;/li&gt;
&lt;li&gt;Bounce rate&lt;/li&gt;
&lt;li&gt;Time on site&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and confirm the importance of performance for yourself.&lt;/p&gt;

&lt;p&gt;You can even create custom alerts that will warn you each day/week/month if you've exceeded your performance budget.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setup a Google Analytics property
&lt;/h4&gt;

&lt;p&gt;Head to &lt;a href="https://analytics.google.com/"&gt;analytics.google.com&lt;/a&gt; and click the "admin" button in the bottom left.&lt;/p&gt;

&lt;p&gt;Then click "Create property" to get started.&lt;/p&gt;

&lt;p&gt;Select "Web property".&lt;/p&gt;

&lt;p&gt;Add your production URL and set your timezone.&lt;/p&gt;

&lt;p&gt;After creating your property, it will give you a &lt;code&gt;Property Id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It should look something like &lt;code&gt;UA-73089861-6&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install &lt;code&gt;analytics&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;To interact with Google Analytics in our Next.js app, I like to use &lt;code&gt;analytics&lt;/code&gt;, an open-source library that supports tons of analytics providers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getanalytics.io/"&gt;https://getanalytics.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to install it into our app as well as the Google Analytics plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install analytics @analytics/google-analytics --save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Configure analytics
&lt;/h4&gt;

&lt;p&gt;Now we need to configure &lt;code&gt;analytics&lt;/code&gt; and import it into our app.&lt;/p&gt;

&lt;p&gt;First, create a file named &lt;code&gt;analytics.js&lt;/code&gt; and configure it with your property Id.&lt;/p&gt;

&lt;p&gt;It should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Analytics from 'analytics';
import googleAnalyticsPlugin from '@analytics/google-analytics';
import Router from 'next/router';

// Initialize analytics and plugins
// Documentation: https://getanalytics.io
const analytics = Analytics({
  debug: process.env.NODE_ENV === 'production',
  plugins: [
    googleAnalyticsPlugin({
      trackingId: 'UA-73089861-6', // use your trackingId
    }),
  ],
});

// Track initial pageview
if (typeof window !== 'undefined') {
  analytics.page();
}

// Track pageview on route change
Router.events.on('routeChangeComplete', (url) =&amp;gt; {
  analytics.page();
});

export default analytics;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/fit-vitals/nextjs-core-web-vital-google-analytics-example/blob/main/util/analytics.js"&gt;GitHub source link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(P.s. - that snippet is borrowed from Divjoy, a React code generator that is totally worth buying &lt;a href="https://drew.tech/divjoy-is-it-worth-it"&gt;in my opinion&lt;/a&gt;)&lt;/p&gt;

&lt;h4&gt;
  
  
  Configuring _app.js
&lt;/h4&gt;

&lt;p&gt;In order to get this snippet to load on every page, we need to add it to our custom &lt;code&gt;_app.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We also need to add the Core Web Vital reporting function, &lt;code&gt;reportWebVitals&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That leaves us with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import '../styles/globals.css';
import analytics from '../util/analytics';

function MyApp({ Component, pageProps }) {
  return &amp;lt;Component {...pageProps} /&amp;gt;;
}

export function reportWebVitals({ id, name, label, value }) {
  analytics.track(name, {
    category: label === 'web-vital' ? 'Web Vitals' : 'Next.js custom metric',
    value: Math.round(name === 'CLS' ? value * 1000 : value), // values must be integers
    label: id, // id unique to current page load
    nonInteraction: true, // avoids affecting bounce rate.
  });
}

export default MyApp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/fit-vitals/nextjs-core-web-vital-google-analytics-example/blob/main/pages/_app.js"&gt;GitHub source link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't want to use the &lt;code&gt;analytics&lt;/code&gt; library, the Next team great &lt;a href="https://nextjs.org/docs/advanced-features/measuring-performance"&gt;has documentation&lt;/a&gt; for that.&lt;/p&gt;

&lt;h4&gt;
  
  
  Success?
&lt;/h4&gt;

&lt;p&gt;Time to test it out!&lt;/p&gt;

&lt;p&gt;Deploy your code, or switch the &lt;code&gt;debug&lt;/code&gt; value in &lt;code&gt;analytics.js&lt;/code&gt; to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;debug: process.env.NODE_ENV !== 'production',
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, when you visit pages you should be firing events to Google Analytics.&lt;/p&gt;

&lt;p&gt;Hop over to &lt;strong&gt;Reports&lt;/strong&gt; , &lt;strong&gt;Realtime&lt;/strong&gt; , and &lt;strong&gt;Events&lt;/strong&gt; to see if it's working.&lt;/p&gt;

&lt;p&gt;To view historical data, go to &lt;strong&gt;Behavior&lt;/strong&gt; , &lt;strong&gt;Events&lt;/strong&gt; , &lt;strong&gt;Top Events&lt;/strong&gt; and select Event Action as the primary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dStcDjhw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/core-web-vitals-in-google-analytics.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dStcDjhw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/core-web-vitals-in-google-analytics.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Optional: set up alerts
&lt;/h4&gt;

&lt;p&gt;If you want to set up daily email alerts for your Vitals in Google Analytics, head to &lt;strong&gt;Admin&lt;/strong&gt; , &lt;strong&gt;Custom Alerts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Set it up like so:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S1pweNYU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/core-web-vital-alert.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S1pweNYU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/09/core-web-vital-alert.png" alt="Monitoring performance in Next.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I'll get alerted anytime my CLS goes above 0.1 on a daily basis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;While I'd recommend the field performance monitoring approach, my ultimate recommendation is to &lt;strong&gt;simply start&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Don’t let the perfect be the enemy of the good&lt;/p&gt;

&lt;p&gt;Both options provide ample information to start improving your performance today.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn more
&lt;/h3&gt;

&lt;p&gt;If you're interested in Core Web Vitals, performance monitoring, or everything Next.js, sign up to get new articles like this one delivered to your inbox &lt;a href="https://nextjsnotes.com/signup/"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also tweet &lt;a href="https://twitter.com/DBredvick"&gt;@dbredvick&lt;/a&gt; on Twitter. Feel free to DM me or email me at &lt;a href="mailto:drewb@hey.com"&gt;drewb@hey.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>react</category>
      <category>seo</category>
    </item>
    <item>
      <title>Rome wasn't built in a day, and neither was my SaaS app</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Tue, 18 Aug 2020 14:27:07 +0000</pubDate>
      <link>https://dev.to/dbredvick/rome-wasn-t-built-in-a-day-and-neither-was-my-saas-app-16nn</link>
      <guid>https://dev.to/dbredvick/rome-wasn-t-built-in-a-day-and-neither-was-my-saas-app-16nn</guid>
      <description>&lt;p&gt;&lt;em&gt;We overestimate what we can do in a week and underestimate what we can do in a year.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Rome
&lt;/h2&gt;

&lt;p&gt;I took a week of vacation to work on my side project, &lt;a href="https://fitvitals.dev"&gt;Fit Vitals&lt;/a&gt;. I set out with the goal of "being able to onboard my first customer".&lt;/p&gt;

&lt;p&gt;While that's &lt;em&gt;technically&lt;/em&gt; possible right now, the product is no where near where I want it to be.&lt;/p&gt;

&lt;p&gt;This is partially because the problem Fit Vitals solves is more complex than I originally thought. Fit Vitals enables engineers and marketers to monitor and alert on &lt;a href="https://learn.fitvitals.dev/"&gt;Core Web Vitals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While that idea is simple, the complexity comes from the sheer amount of data involved.&lt;/p&gt;

&lt;p&gt;Each pageview creates at minimum two API calls. While solving this for small sites is simple, sites that get a million views a day are more complicated.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Aaannd&lt;/em&gt; guess who has the budget to afford this SaaS? That's right. Sites with millions of views.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I'm no where near finished yet.
&lt;/h2&gt;

&lt;p&gt;And I'm learning that it's okay for things to take awhile.&lt;/p&gt;

&lt;p&gt;I made progress that I'm proud of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I have a great looking brand (thanks to my fiancée)&lt;/li&gt;
&lt;li&gt;I'm able to process data in real time in Kinesis&lt;/li&gt;
&lt;li&gt;Configured auth and a GraphQL API with AWS Amplify&lt;/li&gt;
&lt;li&gt;Built an API with API Gateway&lt;/li&gt;
&lt;li&gt;Prototyped an npm module for sending the analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's good enough as long as I continue making progress.&lt;/p&gt;

&lt;p&gt;I think many of us are familiar with the phrase "Rome wasn't built in a day", but James Clear added a clause to the end that makes it even more powerful.&lt;/p&gt;

&lt;p&gt;"Rome wasn't built in a day, but they were laying bricks every hour."&lt;/p&gt;

&lt;p&gt;In his blog post, &lt;a href="https://jamesclear.com/lay-a-brick"&gt;Lay a Brick&lt;/a&gt;, Clear warns about using the phrase to warrant delaying action.&lt;/p&gt;

&lt;p&gt;It's more important to lay the next brick than it is to think of the ideal finished state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;While we do solve a lot of technical problems, I'd argue our biggest challenges are mental. At least for me they are.&lt;/p&gt;

&lt;p&gt;Here's how I'm thinking about my motivation and mental headspace while building.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stair Step Approach
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://robwalling.com/2015/03/26/the-stairstep-approach-to-bootstrapping/"&gt;Stair Step Approach to Bootstrapping&lt;/a&gt; is a framework made popular by Rob Walling back in 2015.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zg7ADgnz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fepmcqkvk3er26xbb87n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zg7ADgnz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fepmcqkvk3er26xbb87n.png" alt="stairstepping" width="768" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think this framework solves a very important problem in the bootstrapper world – &lt;strong&gt;motivation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By building a SaaS app right off of the bat, I'm trying to start on Step 3.&lt;/p&gt;

&lt;p&gt;I'll need to be extra patient if I want to succeed.&lt;/p&gt;

&lt;p&gt;I'm also on the lookout for a one-time product involving Core Web Vitals to help build momentum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start small, or at least be patient with yourself if you start big.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Building in public
&lt;/h3&gt;

&lt;p&gt;I'm building Fit Vitals in public on &lt;a href="https://www.indiehackers.com/product/fit-vitals"&gt;IndieHackers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lf8m0am3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c8w388p4ld1cnl8isw6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lf8m0am3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c8w388p4ld1cnl8isw6q.png" alt="indiehackers post" width="880" height="454"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://www.indiehackers.com/post/a-week-of-vacation-to-work-on-my-side-project-e77adbe8fa"&gt;https://www.indiehackers.com/post/a-week-of-vacation-to-work-on-my-side-project-e77adbe8fa&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Posting about my product and getting feedback from other IndieHackers is very motivating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build in public, it's worth it.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Scratching your own itch
&lt;/h3&gt;

&lt;p&gt;At work, I've been looking into performance monitoring for the last two months. Fit Vitals was born out of endless hours of research looking for a Web Vitals monitoring tool and finding nothing.&lt;/p&gt;

&lt;p&gt;The first customer for this product is me.&lt;/p&gt;

&lt;p&gt;If I make a great solution and it fixes my issues I'll be happy. Anything else is upside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build for yourself.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;p&gt;I'm excited to continue building a profitable SaaS product in the performance monitoring space.&lt;/p&gt;

&lt;p&gt;Instead of focusing on perfection, I'm going to work on "laying a brick" every day.&lt;/p&gt;

&lt;p&gt;I'll be shifting my focus to starting small, building in public, and continuing to scratch my own itch.&lt;/p&gt;




&lt;p&gt;I share almost everything I learn &lt;a href="https://twitter.com/dbredvick"&gt;on Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm also documenting the more business-type pieces &lt;a href="https://www.indiehackers.com/dbredvick"&gt;on IndieHackers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'll post my technical findings here.&lt;/p&gt;

&lt;p&gt;If you prefer email you can sign up on &lt;a href="https://drew.tech"&gt;my blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;See you on the other side,&lt;/p&gt;

&lt;p&gt;Drew&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Intro to Core Web Vitals</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Sun, 26 Jul 2020 23:30:00 +0000</pubDate>
      <link>https://dev.to/dbredvick/intro-to-core-web-vitals-1888</link>
      <guid>https://dev.to/dbredvick/intro-to-core-web-vitals-1888</guid>
      <description>&lt;h2&gt;
  
  
  What are Web Vitals?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q04BcsOY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/what-are-web-vitals.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q04BcsOY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/what-are-web-vitals.png" alt="Intro to Core Web Vitals"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://web.dev/vitals"&gt;Core Web Vitals&lt;/a&gt; is an initiative from Google to create clarity on what metrics matter most to users and for SEO.&lt;/p&gt;

&lt;p&gt;Google says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Web Vitals is an initiative by Google to provide &lt;strong&gt;unified guidance&lt;/strong&gt; for quality signals that are essential to delivering a &lt;strong&gt;great user experience&lt;/strong&gt; on the web. - &lt;a href="https://web.dev/vitals"&gt;web.dev/vitals&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Core&lt;/strong&gt; Web Vitals are a subset of Web Vitals. Google has picked out three as the core main focus. &lt;/p&gt;

&lt;p&gt;If you get these three right, the rest of the metrics should naturally fall into place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cumulative Layout Shift (CLS)
&lt;/h2&gt;

&lt;p&gt;Avoiding shifting the page around as it loads is very important in giving your users a positive experience.&lt;/p&gt;

&lt;p&gt;Cumulative Layout Shift is the metric that measures these shifts.&lt;/p&gt;

&lt;p&gt;Check out this recording Google showed to emphasize the importance of CLS:&lt;/p&gt;

&lt;h3&gt;
  
  
  How is CLS measured?
&lt;/h3&gt;

&lt;p&gt;Anytime an element changes size and causes the start position of other elements to change, you've contributed to the CLS.&lt;/p&gt;

&lt;p&gt;Below are the ranges for CLS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Cfc_hzBE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/cls_range.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cfc_hzBE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/cls_range.jpg" alt="Intro to Core Web Vitals"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more info, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/cls"&gt;web.dev/cls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitals.guide/metrics/cls"&gt;vitals.guide/metrics/cls&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Largest Contentful Paint (LCP)
&lt;/h2&gt;

&lt;p&gt;The perceived performance of your site is probably one of the most important metrics. &lt;/p&gt;

&lt;p&gt;Largest Contentful Paint tries to measure just that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Largest Contentful Paint (LCP) metric reports the render time of the largest &lt;a href="https://web.dev/lcp/#what-elements-are-considered"&gt;image or text block&lt;/a&gt; visible within the viewport. - &lt;a href="https://web.dev/lcp"&gt;web.dev/lcp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How is LCP measured?
&lt;/h3&gt;

&lt;p&gt;The paint time is saved for each of the elements in your intial viewport.&lt;/p&gt;

&lt;p&gt;The following qualify for LCP measurement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Images of all types&lt;/li&gt;
&lt;li&gt;Videos&lt;/li&gt;
&lt;li&gt;Background images loaded via CSS&lt;/li&gt;
&lt;li&gt;All text blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means any of these elements that take up a lot of space in the initial viewport should load &lt;em&gt;very&lt;/em&gt; quickly.&lt;/p&gt;

&lt;p&gt;Below are the ranges for LCP:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--994UWFA0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/lcp-range.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--994UWFA0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/lcp-range.jpg" alt="Intro to Core Web Vitals"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more info, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/lcp"&gt;web.dev/lcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitals.guide/metrics/lcp"&gt;vitals.guide/metrics/lcp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  First Input Delay (FID)
&lt;/h2&gt;

&lt;p&gt;Responding to user input quickly is critical to a positive user experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The First Input Delay (FID) metric helps measure your user's first impression of your site's interactivity and responsiveness. - &lt;a href="https://web.dev/fid"&gt;web.dev/fid&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This encourages a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shipping the minimum amount of required HTML/CSS/JS&lt;/li&gt;
&lt;li&gt;Lazy loading where possible&lt;/li&gt;
&lt;li&gt;Keeping the main thread less busy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How is FID measured?
&lt;/h3&gt;

&lt;p&gt;First Input Delay measures the time between when a user interacts with an input and when the event handler actually starts to process that input.&lt;/p&gt;

&lt;p&gt;Below are the ranges for FID:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2bMg-6mA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/fid-range.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2bMg-6mA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/2020/07/fid-range.jpg" alt="Intro to Core Web Vitals"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more info, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://web.dev/fid"&gt;web.dev/fid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitals.guide/metrics/fid"&gt;vitals.guide/metrics/fid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why are they important?
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;site performance&lt;/li&gt;
&lt;li&gt;user experience&lt;/li&gt;
&lt;li&gt;SEO (soon)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Site performance
&lt;/h3&gt;

&lt;p&gt;Because Web Vitals are measured in the field, they represent the &lt;em&gt;real experience&lt;/em&gt; your users are having.&lt;/p&gt;

&lt;p&gt;Lighthouse audits are great, but they don't represent what it's really like to visit your site in the wild.&lt;/p&gt;

&lt;p&gt;This means metrics are representative of your audience as well (at least the ones &lt;a href="https://developers.google.com/web/tools/chrome-user-experience-report"&gt;using Chrome&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Think of these new Vitals as mini-Lighthouse audits that each visitor runs locally and reports the results.&lt;/p&gt;

&lt;h3&gt;
  
  
  User experience
&lt;/h3&gt;

&lt;p&gt;Google made sure that the Core Web Vitals measure user-centric outcomes. CLS, LCP, and FID all impact UX and are generally safe from the &lt;a href="https://www.nngroup.com/articles/vanity-metrics/"&gt;vanity metric&lt;/a&gt; problem.&lt;/p&gt;

&lt;p&gt;CLS is arguably entirely focused on creating a positive UX.&lt;/p&gt;

&lt;p&gt;Designers – please don't let your engineers forget about loading states.&lt;/p&gt;

&lt;h3&gt;
  
  
  SEO (soon)
&lt;/h3&gt;

&lt;p&gt;Google has announced they will rank you based on your Core Web Vitals, &lt;em&gt;just not yet&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When will the switch happen? It's too early to say.&lt;/p&gt;

&lt;p&gt;Google said in &lt;a href="https://webmasters.googleblog.com/2020/05/evaluating-page-experience.html"&gt;a recent blogpost&lt;/a&gt; that they won't switch to the new ranking until next year. They will provide at least &lt;strong&gt;six months&lt;/strong&gt; of lead time after making an official statement.&lt;/p&gt;

&lt;p&gt;So do you need to start fixing these issues now?&lt;/p&gt;

&lt;p&gt;Not technically.&lt;/p&gt;

&lt;p&gt;But here's why you should: each Core Web Vital is impacted by many metrics Google already ranks you on.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time to first byte (TTFB) greatly impacts Largest Contentful Paint (LCP) &lt;/li&gt;
&lt;li&gt;First Contentful Paint (FCP) pretty closely mirrors LCP&lt;/li&gt;
&lt;li&gt;Total Blocking Time (TBT) looks quite a bit like First Input Delay (FID)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Get started today&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;If you're looking for more information on Core Web Vitals, check out Google's educational site: &lt;a href="https://web.dev/vitals"&gt;web.dev/vitals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm making a guide to help developers with practical Vitals issues like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://vitals.guide/tracking-core-web-vitals"&gt;How to track Core Web Vitals&lt;/a&gt; (Next, Nuxt, &amp;amp; Gatsby)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitals.guide/metrics/cls"&gt;Quick fixes for CLS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitals.guide/metrics/lcp"&gt;Quick fixes for LCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vitals.guide/metrics/fid"&gt;Quick fixes for FID&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll be building tools and documenting what I learn about Web Vitals over the next few months.&lt;/p&gt;

&lt;p&gt;Consider following me here or on Twitter &lt;a href="https://twitter.com/dbredvick"&gt;@dbredvick&lt;/a&gt; you're interested in learning more. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you measuring your Core Web Vitals yet?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webvitals</category>
      <category>nextjs</category>
      <category>analytics</category>
      <category>react</category>
    </item>
    <item>
      <title>3,000+ words on why you should use Next.js</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Wed, 01 Jul 2020 21:20:00 +0000</pubDate>
      <link>https://dev.to/dbredvick/why-next-js-2b20</link>
      <guid>https://dev.to/dbredvick/why-next-js-2b20</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; in this article, I claim it's best for folks who know React to start with Next.js from the beginning. We also get into why it would be a sound financial decision. Disclaimer: not everyone has to use React/Next.js nor does it fit every use case. Enjoy the article&lt;/em&gt; 🙂&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I originally published this essay at &lt;a href="https://nextjsnotes.com/why-nextjs/" rel="noopener noreferrer"&gt;https://nextjsnotes.com/why-nextjs/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Next.js is a fast-growing React framework that is used by almost &lt;strong&gt;100,000&lt;/strong&gt; repositories now [&lt;a href="https://github.com/vercel/next.js/network/dependents?package_id=UGFja2FnZS0xNDIzMDMwOA%3D%3D" rel="noopener noreferrer"&gt;source&lt;/a&gt;]. Next.js has a broad set of features that both &lt;strong&gt;IndieHackers&lt;/strong&gt; and &lt;strong&gt;Fortune 500&lt;/strong&gt; companies love. Check out the large number of sites in their &lt;a href="https://nextjs.org/showcase" rel="noopener noreferrer"&gt;showcase&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This post is an investigation that attempts to answer the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why React?&lt;/li&gt;
&lt;li&gt;What has made Next.js successful?&lt;/li&gt;
&lt;li&gt;What are the pros and cons of Next.js?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  First, why React?
&lt;/h2&gt;

&lt;p&gt;To understand the success of Next.js, we need to first look at the success of React.&lt;/p&gt;

&lt;h3&gt;
  
  
  The numbers
&lt;/h3&gt;

&lt;p&gt;Is React &lt;em&gt;really&lt;/em&gt; that popular? Let's check out some data points.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installs
&lt;/h4&gt;

&lt;p&gt;As of this writing, React gets about &lt;strong&gt;7.75 million&lt;/strong&gt; weekly installs and is a dependency to over &lt;strong&gt;3.9 million&lt;/strong&gt; GitHub repositories [&lt;a href="https://www.npmjs.com/package/react" rel="noopener noreferrer"&gt;installs source&lt;/a&gt;, &lt;a href="https://github.com/facebook/react/network/dependents" rel="noopener noreferrer"&gt;dependencies source&lt;/a&gt;].&lt;/p&gt;

&lt;p&gt;That's a lot of &lt;code&gt;npm install react@latest&lt;/code&gt; going on.&lt;/p&gt;

&lt;p&gt;If we look historically at this weekly download metric on &lt;a href="https://www.npmtrends.com/react-vs-vue-vs-angular-vs-@angular/core" rel="noopener noreferrer"&gt;npmtrends.com&lt;/a&gt;, the lead React has is staggering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Freact-vs-vue-vs-angular.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Freact-vs-vue-vs-angular.png" alt="Why Next.js?"&gt;&lt;/a&gt;React compared to Vue, Angular, and Angular core from &lt;a href="https://www.npmtrends.com/react-vs-vue-vs-angular-vs-@angular/core" rel="noopener noreferrer"&gt;npmtrends&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Three notes from this graph:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WOW, things really shut down in December.&lt;/li&gt;
&lt;li&gt;GitHub stars mean less than you think they do.&lt;/li&gt;
&lt;li&gt;Angular is hard to measure because of the split (&lt;a href="https://www.simplilearn.com/angularjs-vs-angular-2-vs-angular-4-differences-article" rel="noopener noreferrer"&gt;angular.js vs angular explanation&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I started building applications using React in late 2017. It wasn't until mid-2018 that my job fully embraced React and started building a shareable internal component library.&lt;/p&gt;

&lt;p&gt;Speaking of work, let's talk about employment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Jobs
&lt;/h4&gt;

&lt;p&gt;Another proxy for popularity is the number of jobs associated with a framework.&lt;/p&gt;

&lt;p&gt;"jobs, jobs, jobs" - every politician, ever.&lt;/p&gt;

&lt;p&gt;Searching for "React jobs" on Google yields tons of results: 293,000,000 as of this writing.&lt;/p&gt;

&lt;p&gt;Pull up LinkedIn, Indeed, and a few other job boards to get a sense of how many options are out there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Flinkedin-react-jobs-count.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Flinkedin-react-jobs-count.png" alt="Why Next.js?"&gt;&lt;/a&gt;LinkedIn has about 42,091 jobs for the search "react" in the United States&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Findeed-react-jobs-count.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Findeed-react-jobs-count.png" alt="Why Next.js?"&gt;&lt;/a&gt;Indeed has about the same job count: 43,315 for the search term "react" in the US.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Fziprecruiter-remote-react-jobs-count.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Fziprecruiter-remote-react-jobs-count.png" alt="Why Next.js?"&gt;&lt;/a&gt;ZipRecruiter was showing over 850 remote "react" jobs.&lt;/p&gt;

&lt;p&gt;So why do the job numbers matter?&lt;/p&gt;

&lt;p&gt;It shows there is &lt;strong&gt;demand&lt;/strong&gt;. Demand ensures that in five years, you'll be able to hire developers that know the framework.&lt;/p&gt;

&lt;p&gt;While this might not be important to you, businesses need to consider the ability to hire.&lt;/p&gt;

&lt;p&gt;We should consider the number of jobs AND the happiness of the people using the framework frequently.&lt;/p&gt;

&lt;p&gt;According to the &lt;a href="https://insights.stackoverflow.com/survey/2019#development-practices" rel="noopener noreferrer"&gt;2019 Stack Overflow Developer Survey&lt;/a&gt;, React ranked highest for "Most Loved Web Framework".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Freact-next-most-loved.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Freact-next-most-loved.png" alt="Why Next.js?"&gt;&lt;/a&gt;"... jQuery are most dreaded"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Fframeworks-would-use-again.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Fframeworks-would-use-again.png" alt="Why Next.js?"&gt;&lt;/a&gt;2019 State of JS developer survey front end frameworks section&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://2019.stateofjs.com/" rel="noopener noreferrer"&gt;State of JS 2019 survey&lt;/a&gt; shows that a ton of people are using React and wouldn't mind using it again, though there are a few detractors.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;The numbers show that React is a dominant player in the web framework landscape. Developers are eager to learn React and generally stick with it, either because of the job market or its technical fundamentals.&lt;/p&gt;

&lt;h3&gt;
  
  
  The tech
&lt;/h3&gt;

&lt;p&gt;We can't talk about a framework without mentioning a few of the key aspects of its technical fundamentals and how they contribute to its success.&lt;/p&gt;

&lt;p&gt;React:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;focuses on one thing (the view layer)&lt;/li&gt;
&lt;li&gt;supports componentized thinking &amp;amp; sharing&lt;/li&gt;
&lt;li&gt;simplifies data flows&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Do one thing and do it well
&lt;/h4&gt;

&lt;p&gt;Part of the equation of React's success is doing one thing and doing it exceptionally well. React's focus is printed on their &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;homepage&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A JavaScript library for building user interfaces&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That may sound simple, but it's critical.&lt;/p&gt;

&lt;p&gt;By focusing on &lt;strong&gt;one thing&lt;/strong&gt; , React has been able to iterate on its core mission relentlessly.&lt;/p&gt;

&lt;p&gt;React does not focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data fetching (axios, fetch, superagent, SWR)&lt;/li&gt;
&lt;li&gt;Advanced state management (redux, recoil, react-query)&lt;/li&gt;
&lt;li&gt;Handle styling (styled-components, styled-jsx)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;React only focuses on the view layer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That lets the framework excel at building user interfaces while ignoring all other problems.&lt;/p&gt;

&lt;h4&gt;
  
  
  Open-source community
&lt;/h4&gt;

&lt;p&gt;By ignoring a lot of problems, React created a void. Developers happily filled the void with their solutions and contributed them back to the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2FCleanShot-2020-06-23-at-18.41.27.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2FCleanShot-2020-06-23-at-18.41.27.gif" alt="Why Next.js?"&gt;&lt;/a&gt;npm has 127951 packages when searching &lt;code&gt;react-&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Many companies intentionally do this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Salesforce could add all the features their users are requesting, &lt;em&gt;or&lt;/em&gt; they could continue to let third-party developers build those solutions. &lt;/li&gt;
&lt;li&gt;Shopify could add all of the necessary features to run any store you can think of, &lt;em&gt;or&lt;/em&gt; they could let third-party developers build a robust ecosystem around them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The open-source software around React is a natural moat. (&lt;a href="https://www.investopedia.com/ask/answers/05/economicmoat.asp" rel="noopener noreferrer"&gt;What's an economic moat?&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;As a developer, it helps me get my job done faster (and likely with higher quality). Each open-source package is a few hundred lines of code not written or maintained by my team, yet we benefit from its vast list of contributors.&lt;/p&gt;

&lt;h4&gt;
  
  
  One-way binding vs. two-way binding
&lt;/h4&gt;

&lt;p&gt;I've built single-page applications (SPAs) in Knockout, Angular, and React. The way React thinks about your data and DOM is entirely different.&lt;/p&gt;

&lt;p&gt;React uses a one-way data bindings, whereas Knockout and Angular take a two-way data binding approach.&lt;/p&gt;

&lt;p&gt;One-way data bindings make thinking about how data flows through your application much more straightforward.  &lt;/p&gt;

&lt;p&gt;The documentation from the React team will explain it far better than I ever could 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Freactjs.org%2Flogo-og.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Freactjs.org%2Flogo-og.png" alt="Why Next.js?"&gt;&lt;/a&gt;&lt;br&gt;
(&lt;a href="https://reactjs.org/docs/hello-world.html" rel="noopener noreferrer"&gt;https://reactjs.org/docs/hello-world.html&lt;/a&gt;)&lt;/p&gt;

&lt;h4&gt;
  
  
  Other tech reasons
&lt;/h4&gt;

&lt;p&gt;There are a lot of other factors that make React a great framework choice. We're not digging into those in this post.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's a business decision
&lt;/h3&gt;

&lt;p&gt;Patrick McKenzie (&lt;a href="https://twitter.com/patio11" rel="noopener noreferrer"&gt;@patio11&lt;/a&gt;) put it best in a 2011 essay called &lt;a href="https://www.kalzumeus.com/2011/10/28/dont-call-yourself-a-programmer/" rel="noopener noreferrer"&gt;"Don't Call Yourself A Programmer, And Other Career Advice"&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Engineers are hired to create business value, not to program things&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;React provides plenty of value to businesses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are plenty of React devs in the job market&lt;/li&gt;
&lt;li&gt;The community support and ecosystem make things simpler for my team&lt;/li&gt;
&lt;li&gt;It's likely to be around for a long time (in the time scale of JS frameworks lifespans)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It just makes business sense.&lt;/p&gt;

&lt;p&gt;Said another way, &lt;strong&gt;it's a financially sound decision to use React&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  I know it
&lt;/h4&gt;

&lt;p&gt;What matters is &lt;strong&gt;your team's efficiency&lt;/strong&gt;. On side projects, I am a team of one. So my final answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I use React for projects because I know it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;React was my gateway to Next.js.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evolution of Next.js
&lt;/h2&gt;

&lt;h3&gt;
  
  
  I have an idea for an app
&lt;/h3&gt;

&lt;p&gt;Let's start a new project together as an example of why frameworks like Next.js and Gatsby are needed.&lt;/p&gt;

&lt;p&gt;Here's our project brief:&lt;/p&gt;

&lt;p&gt;Build a website that calculates if you should buy a house or not based on your current finances and the house price.&lt;/p&gt;

&lt;p&gt;The app needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;take in user data&lt;/li&gt;
&lt;li&gt;calculate a result&lt;/li&gt;
&lt;li&gt;make a shareable results page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our requirements sounds pretty simple overall, so we start with &lt;a href="https://github.com/facebook/create-react-app" rel="noopener noreferrer"&gt;create-react-app&lt;/a&gt; – the easiest way to start building with React.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Fcreate-react-app-terminal.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnextjsnotes.com%2Fcontent%2Fimages%2F2020%2F06%2Fcreate-react-app-terminal.svg" alt="Why Next.js?"&gt;&lt;/a&gt;&lt;a href="https://github.com/facebook/create-react-app" rel="noopener noreferrer"&gt;create-react-app&lt;/a&gt; is a great way to get started with React&lt;/p&gt;

&lt;p&gt;We launch our app, and it's a massive success on Product Hunt 🎉&lt;/p&gt;

&lt;p&gt;As a result, we decide to double down on our growth and try to market the product a little bit more. So how do we do that? Well, our Lighthouse audits are &lt;em&gt;pretty bad&lt;/em&gt;. We also don't have any content pages. Google doesn't know what our site is about because we're not providing any extra content. Fixing those might improve our SEO. Maybe if we do all that, Google might send more traffic our way.&lt;/p&gt;

&lt;p&gt;We only have one end goal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make the site appear as fast as possible to our users and Google&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We start with the basic performance tweaks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cache as many assets as possible&lt;/li&gt;
&lt;li&gt;serve assets from the edge via a CDN&lt;/li&gt;
&lt;li&gt;remove bloat from &lt;code&gt;node_modules&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;lazy load images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These improvements get us part of the way there but don't solve the problem of modern web development: &lt;strong&gt;our bundle is too big&lt;/strong&gt;. Slower computers and mobile phones have a hard time processing all of the JavaScript.&lt;/p&gt;

&lt;h4&gt;
  
  
  SSR
&lt;/h4&gt;

&lt;p&gt;One solution? Simply process the JavaScript on the server and deliver the HTML/CSS. This is server-side rendering (SSR).&lt;/p&gt;

&lt;p&gt;Once the client receives this payload, we can hydrate our React app state in the background. The user (human or Googlebot) sees a faster response and can more easily navigate the page.&lt;/p&gt;

&lt;p&gt;If we throw a cache (using Cloudflare or some other provider) in front of our server, we can dramatically improve performance for users who have a cache-hit.&lt;/p&gt;

&lt;p&gt;Slowly, people got fed up with implementing SSR. Next.js evolved to fill this pain point.&lt;/p&gt;

&lt;h4&gt;
  
  
  SSG
&lt;/h4&gt;

&lt;p&gt;Another option is to simply process the JavaScript at build time and only send the client a smaller amount of data. This approach is called static site generation (SSG).&lt;/p&gt;

&lt;p&gt;SSG requires a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;all data needs to be present at build time&lt;/li&gt;
&lt;li&gt;changing the site means regenerating it&lt;/li&gt;
&lt;li&gt;longer build times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on the site you're building, these requirements are very doable.  &lt;/p&gt;

&lt;p&gt;As with SSR, the SSG crowd did not enjoy doing this work, yet it was very essential development. &lt;a href="https://www.gatsbyjs.org/" rel="noopener noreferrer"&gt;Gatsby&lt;/a&gt; evolved to fill this niche.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: with getStaticProps, getStaticPaths, Next.js has ventured into SSG + SSR&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  (Almost) my first Next app
&lt;/h4&gt;

&lt;p&gt;Back in 2018, I was working at &lt;a href="https://www.wearespreetail.com/" rel="noopener noreferrer"&gt;Spreetail&lt;/a&gt;. The company was building its own ecommerce experience (instead of its usual B2B focus).&lt;/p&gt;

&lt;p&gt;At the beginning of the project, we had decided the Next.js framework was "too green" and didn't pick it (around version &lt;a href="https://nextjs.org/blog/next-5-1" rel="noopener noreferrer"&gt;5.1&lt;/a&gt;). One engineer was convinced it was the right path, and we (me) didn't listen to him. Sorry, Michael.&lt;/p&gt;

&lt;p&gt;My previous co-worker, Stephen, wrote up his heroic effort to migrate months of React development to SSR.&lt;/p&gt;

&lt;p&gt;It was &lt;em&gt;a lot&lt;/em&gt; of work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/spreetail-engineering/approaching-server-side-rendering-in-an-existing-react-redux-application-2c403819a231" rel="noopener noreferrer"&gt;Approaching Server Side Rendering in an Existing React/Redux Application&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/spreetail-engineering/approaching-server-side-rendering-in-an-existing-react-redux-application-2c403819a231" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1041%2F1%2AE7Csl7m6mBfL-gLuzmtV8A.png" alt="Why Next.js?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"We decided to go with a React/Redux application built off of &lt;a href="https://github.com/react-boilerplate/react-boilerplate" rel="noopener noreferrer"&gt;react-boilerplate&lt;/a&gt;. Development had already started when I signed on, but I know we considered &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; instead and ended up choosing not to use it. Looking back, it is much easier to use a framework that already handles server-side rendering. &lt;strong&gt;I would bias toward using those frameworks in the future&lt;/strong&gt;."&lt;/p&gt;

&lt;p&gt;I respect Stephen's opinion quite a bit, which led me to investigate Next.js for both work &amp;amp; side projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I have used Next.js on every greenfield project since.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Pros of Next.js
&lt;/h2&gt;

&lt;p&gt;Let's dive into some of my favorite parts of Next.js and why it's my go-to framework at work and on side projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  User (developer) obsession
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Listening to pain points
&lt;/h4&gt;

&lt;p&gt;The pull requests in Next.js frequently included links to tweets. I think that's a great sign. It shows they're listening to their customers.&lt;/p&gt;

&lt;p&gt;Have a problem with a new version of Next? Tweet at the team. You'll likely get a detailed reply and steps to troubleshoot your issues. Still not working? The dev you were tweeting with will most likely file a Github issue and link to your Twitter thread.&lt;/p&gt;

&lt;p&gt;That's phenomenal customer service on FREE software (more on OSS perks later).&lt;/p&gt;

&lt;h4&gt;
  
  
  Detailed examples
&lt;/h4&gt;

&lt;p&gt;At this writing, there are &lt;strong&gt;231&lt;/strong&gt; high-quality Next.js examples in the &lt;a href="https://github.com/vercel/next.js/tree/canary/examples" rel="noopener noreferrer"&gt;repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From Auth0 to XState, they've got everything you can think of. See something they're missing? Perfect. Next.js is an open-source repository. Commit your example and have the community help you improve it over time.&lt;/p&gt;

&lt;p&gt;These examples have saved me countless hours.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Static === speed
&lt;/h4&gt;

&lt;p&gt;With Next.js adding &lt;code&gt;getStaticProps&lt;/code&gt;, &lt;code&gt;getStaticPaths&lt;/code&gt;, and creating Incremental Static Regeneration (ISR), Next is becoming an incredible framework for static sites.&lt;/p&gt;

&lt;p&gt;I talked about this in the last edition of the newsletter, &lt;a href="https://nextjsnotes.com/nextjs-should-be-static/" rel="noopener noreferrer"&gt;Next Sites Should Be Static&lt;/a&gt;, quite a bit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjsnotes.com/nextjs-should-be-static/" rel="noopener noreferrer"&gt;HEY – let’s talk about static sites&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjsnotes.com/nextjs-should-be-static/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1581349437898-cebbe9831942%3Fixlib%3Drb-1.2.1%26q%3D80%26fm%3Djpg%26crop%3Dentropy%26cs%3Dtinysrgb%26w%3D2000%26fit%3Dmax%26ixid%3DeyJhcHBfaWQiOjExNzczfQ" alt="Why Next.js?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: ISR takes a little bit of configuration and doesn't work by default on all hosting providers. Consider hosting on Vercel if you're interested in this feature.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  SSR can be fast (with a cache)
&lt;/h4&gt;

&lt;p&gt;If you're server-side rendering your app, it's likely going to be very fast for your users.&lt;/p&gt;

&lt;p&gt;In the example we talked about above, SSR provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faster &lt;a href="https://web.dev/fcp/" rel="noopener noreferrer"&gt;FCP&lt;/a&gt; via smaller initial payload(first contentful paint)&lt;/li&gt;
&lt;li&gt;better overall page load speed&lt;/li&gt;
&lt;li&gt;improved SEO via shipping parseable HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A downside of SSR is that it can take the server a while to render the page and respond.&lt;/p&gt;

&lt;p&gt;By inserting &lt;a href="https://support.cloudflare.com/hc/en-us/articles/360023040812-Best-Practice-Caching-Everything-While-Ignoring-Query-Strings" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt; (or some other cache) in-between your server and your users, you can lower the chance your users have to wait on the server.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this works best for marketing pages and content that doesn't change from user to user&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Business value
&lt;/h3&gt;

&lt;h4&gt;
  
  
  SEO
&lt;/h4&gt;

&lt;p&gt;Considering Next.js enables both SSG and SSR (two key methods for improving SEO), Next is a great candidate if SEO is a significant concern for you.&lt;/p&gt;

&lt;p&gt;P.s. - If you're building a business, SEO is a significant concern for you.&lt;/p&gt;

&lt;h4&gt;
  
  
  Developer velocity
&lt;/h4&gt;

&lt;p&gt;Similar to all prior frameworks, Next.js has opinions. Those opinions (good or bad) are baked into the way we use the tool. That might initially sound bad, but I would argue it's great.&lt;/p&gt;

&lt;p&gt;By being opinionated, Next.js saves us from implementing basic things and wasting time on the problems that don't matter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to implement SSR&lt;/li&gt;
&lt;li&gt;How routing should work&lt;/li&gt;
&lt;li&gt;What's the best way to split this JS bundle&lt;/li&gt;
&lt;li&gt;How should app config work&lt;/li&gt;
&lt;li&gt;How to build the site at build time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next.js has answers to all of these questions.&lt;/p&gt;

&lt;p&gt;That means, as developers, we get to focus on the problems related to the project domain. &lt;strong&gt;Opinionated frameworks enable us to focus on the product&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Overall, this saves our developers time, our company money, and our brains from decision fatigue.&lt;/p&gt;

&lt;h4&gt;
  
  
  Continuous improvement (via open source)
&lt;/h4&gt;

&lt;p&gt;Because Next.js is open-source, we benefit from the improvements each individual or company makes to the framework.&lt;/p&gt;

&lt;p&gt;Rather than explain the perks of open source software myself, I'll let this Explain Like I'm Five (ELI5) Reddit thread explain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway is this:&lt;/strong&gt; together, we can multiply our efforts to build much better software than we could alone.&lt;/p&gt;

&lt;p&gt;Read the full comment below 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/explainlikeimfive/comments/21ik6j/eli5_what_is_open_source_software_and_why_is_it/" rel="noopener noreferrer"&gt;r/explainlikeimfive - ELI5: What is open source software and why is it such a big deal?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/explainlikeimfive/comments/21ik6j/eli5_what_is_open_source_software_and_why_is_it/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.redditstatic.com%2Fdesktop2x%2Fimg%2FrenderTimingPixel.png" alt="Why Next.js?"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Cons of Next.js
&lt;/h2&gt;

&lt;p&gt;If you're new to the Next.js ecosystem, you likely will not find these as controversial as they once were. If you've been here for a while, let's take a trip down memory lane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Framework whiplash
&lt;/h3&gt;

&lt;p&gt;With a team that listens takes developer feedback quite literally, there are bound to be some changes.&lt;/p&gt;

&lt;p&gt;A few notable changes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pivoting from SSR first to SSG&lt;/li&gt;
&lt;li&gt;removing hosting support for custom servers&lt;/li&gt;
&lt;li&gt;adding &lt;code&gt;api&lt;/code&gt; functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Next.js team added these changes after listening to developer feedback. The problem is, some developers had already come up with bandaids to deal with these problems. Years later, these devs are dealing with bandaids leftover from the early days of the framework (AKA tech debt).&lt;/p&gt;

&lt;p&gt;Framework whiplash is a common problem for all fast-moving frameworks, which Next.js definitely is.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some dislike file-based routing (or some other opinion)
&lt;/h3&gt;

&lt;p&gt;One of the gaps that React left was routing. Since they focus purely on the "V" (view) part of MVC, many different options appeared for dealing with routing.&lt;/p&gt;

&lt;p&gt;Not supporting &lt;a href="https://reacttraining.com/react-router/" rel="noopener noreferrer"&gt;React Router&lt;/a&gt; out of the box was a controversial stance Next took in the beginning.&lt;/p&gt;

&lt;p&gt;While there are plenty of great routers out there for React, I think Next Router is a great choice. File-based routing is simple to understand for both new developers and Next.js experts.&lt;/p&gt;

&lt;p&gt;As I said earlier, Next.js having opinions saves us time and stops us from debating the minutia.&lt;/p&gt;

&lt;h3&gt;
  
  
  getInitialProps can be tricky
&lt;/h3&gt;

&lt;p&gt;There are quite a few convenience methods that Next.js adds to the React paradigm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;getInitialProps&lt;/li&gt;
&lt;li&gt;getStaticProps&lt;/li&gt;
&lt;li&gt;getStaticPaths&lt;/li&gt;
&lt;li&gt;getServerSideProps&lt;/li&gt;
&lt;li&gt;reportWebVitals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I agree that they can be hard to learn. I 100% think they are worth learning anyway. They will greatly improve your productivity and the team has put together amazing supporting documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  What about?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gatsby
&lt;/h3&gt;

&lt;p&gt;Gatsby is a great tool – my personal site with my essays was created with it. The reason I still choose Next.js on most products is Next can handle both SSG and SSR.&lt;/p&gt;

&lt;p&gt;When would I still pick Gatsby? If I was building a content site and found a Gatsby theme I really liked. The theme and plugin ecosystem in Gatsby is great. I created my personal site with the help of a Gatsby theme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/narative/gatsby-theme-novela" rel="noopener noreferrer"&gt;narative/gatsby-theme-novela&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/narative/gatsby-theme-novela" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Frepository-images.githubusercontent.com%2F199974509%2F3aa96a80-b3d8-11e9-90f2-48e6064882f2" alt="Why Next.js?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Vue and Nuxt
&lt;/h3&gt;

&lt;p&gt;I hear amazing things about Vue and Nuxt. I'll certainly be exploring them in the future. I would love to hear about your experience with Nuxt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create React App
&lt;/h3&gt;

&lt;p&gt;Time to answer the age-old question: can't I just use create-react-app?&lt;/p&gt;

&lt;p&gt;Yes, feel free. Create-react-app is a great tool.&lt;/p&gt;

&lt;p&gt;Re-read the "I have an idea for an app" section of this post before venturing too far down this path. If you think you will need SSR or SSG at any point in your project, I would encourage you to start with Next.js first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Next.js is an excellent framework for React developers building static or server-side rendered sites. The popularity of React helped boost Next. The Next.js team solves common problems with elegant solutions that are almost indistinguishable from magic.&lt;/p&gt;

&lt;p&gt;What a time to be a developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Newsletter plug
&lt;/h3&gt;

&lt;p&gt;I hope you enjoyed this analysis. I do a longer post like this once a month and send out more brief updates about Next.js on the other weeks.&lt;/p&gt;

&lt;p&gt;Here is last week's:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjsnotes.com/nextjs-should-be-static/" rel="noopener noreferrer"&gt;HEY – let’s talk about static sites&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let’s dive into all the releases since Next.js 9.4.0 including canary commits. This post also features JAMstack Functions, a useful resource while building a Next.js app.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nextjsnotes.com/nextjs-should-be-static/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1581349437898-cebbe9831942%3Fixlib%3Drb-1.2.1%26q%3D80%26fm%3Djpg%26crop%3Dentropy%26cs%3Dtinysrgb%26w%3D2000%26fit%3Dmax%26ixid%3DeyJhcHBfaWQiOjExNzczfQ" alt="Why Next.js?"&gt;&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Sent my first NextJS Newsletter (v 9.4 overview) </title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Mon, 15 Jun 2020 22:40:50 +0000</pubDate>
      <link>https://dev.to/dbredvick/sent-my-first-nextjs-newsletter-v-9-4-overview-30oj</link>
      <guid>https://dev.to/dbredvick/sent-my-first-nextjs-newsletter-v-9-4-overview-30oj</guid>
      <description>&lt;p&gt;I've been wanting to start a newsletter about NextJS and finally did it this weekend.&lt;/p&gt;

&lt;p&gt;I'm using &lt;a href="https://ghost.org"&gt;ghost&lt;/a&gt; to host the site, it's a super awesome tool. V3 even has support for "membership" which is what I'm using.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ghost.org/members/"&gt;https://ghost.org/members/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I send out emails the morning the newsletter goes out. At the same time, the blog post goes live. It's seriously awesome. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'd encourage all devs to think about using no-code tools to run content-heavy sites.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the newsletter I cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summaries of framework changes&lt;/li&gt;
&lt;li&gt;cool new projects that use/integrate with NextJS&lt;/li&gt;
&lt;li&gt;high-quality blog posts from the community&lt;/li&gt;
&lt;li&gt;useful NPM packages&lt;/li&gt;
&lt;li&gt;??? still looking for more content categories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My first post is archived &lt;a href="https://nextjsnotes.com/nextjs-9-4-overview/"&gt;here&lt;/a&gt; but I'm putting the content below as well.&lt;/p&gt;




&lt;h2&gt;
  
  
  NextJS 9.4 overview
&lt;/h2&gt;

&lt;p&gt;Welcome to the first edition of NextJS Notes!&lt;/p&gt;

&lt;p&gt;The last big change to the NextJS framework happened on May 11th. Version 9.4 was released and included amazing features mostly focused at improving developer experience.&lt;/p&gt;

&lt;p&gt;Before we get started, here's a quick reminder on a somewhat recent security vulnerability.&lt;/p&gt;

&lt;p&gt;If you are: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;using a version below 9.3.2&lt;/li&gt;
&lt;li&gt;not targeting serverless &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;You need to update to &amp;gt; 9.3.2 as soon as possible. Check out the security warning &lt;a href="https://github.com/vercel/next.js/security/advisories/GHSA-fq77-7p7r-83rj"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As a starting point for this newsletter, let's dig into the changes 9.4 brings.&lt;/p&gt;

&lt;h3&gt;
  
  
  NextJS 9.4 overview
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;React Fast Refresh&lt;/strong&gt;&lt;br&gt;
When you make a change in your editor, you keep &lt;strong&gt;application state&lt;/strong&gt;. No more scrolling down to the correct spot on the page after fixing a typo. &lt;br&gt;
An interesting point on Fast Refresh is that it took a lot of community support to make it happen. The NextJS team helped, as well as contributors from React and Webpack. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xcTemmis--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://nextjsnotes.com/content/images/2020/06/fash-refresh-gif.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xcTemmis--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://nextjsnotes.com/content/images/2020/06/fash-refresh-gif.gif" alt="fast refresh" width="600" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better environment variables configuration&lt;/strong&gt;&lt;br&gt;
I'm very excited for these updates. NextJS environment variables have been the cause of much pain (myself included).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You no longer have to add a next.config.js and add the env key to expose these variables. - NextJS 9.4 Blog Post&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Want your vars exposed to the browser? Prefix them with &lt;code&gt;NEXT_PUBLIC_&lt;/code&gt;.&lt;br&gt;
Automatic .env support - no need to pull in dotenv into every NextJS project anymore 🎉&lt;br&gt;
Read more about the environment variable changes here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incremental Static Regeneration (beta)&lt;/strong&gt;&lt;br&gt;
Incremental static regeneration is a game-changer. It's joining beta at the moment, so don't throw it in production yet (or do 🙂).&lt;/p&gt;

&lt;p&gt;How does incremental regeneration work?&lt;/p&gt;

&lt;p&gt;Imagine if each of your server-side-rendered (SSR) pages was statically output to a CDN and served each time (given that the request doesn't change). That is basically incremental static regeneration (ISR).&lt;/p&gt;

&lt;p&gt;It's going to change the way you create your site. &lt;strong&gt;Most importantly, it's going to change the performance of your site.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Speaking of performance, let's dig into Web Vitals 👇&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Vitals reporting&lt;/strong&gt;&lt;br&gt;
What are web vitals? Google is creating a new set of standards for how pages should behave. Vitals are similar to Lighthouse audits but focus on slightly different targets. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ED1hcrYJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/size/w2400/2020/06/CleanShot-2020-06-12-at-22.41.42%402x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ED1hcrYJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/size/w2400/2020/06/CleanShot-2020-06-12-at-22.41.42%402x.png" alt="web vitals" width="880" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Given Google's recent dedication to these metrics, I wouldn't be surprised if they are already playing a big part in their search algorithm. Better get to fixing these to maximize your SEO!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in fetch support&lt;/strong&gt;&lt;br&gt;
If you upgrade to NextJS 9.4, be sure to throw out those fetch polyfills for the front end. Create your &lt;code&gt;TECH DEBT&lt;/code&gt; Jira ticket tomorrow as NextJS includes them by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Absolute import aliases&lt;/strong&gt;&lt;br&gt;
Cleaner code is better code. Absolute paths are a great way to handle super long import paths. You don't have to use this feature, but if you set it up, expect to clean up some of those really long relative import paths.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
The best use case I can think of is a utility file (&lt;code&gt;/utils/foo-helper.js&lt;/code&gt;) that needs to be imported deep in the components folder (&lt;code&gt;/components/.../Component.js&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This feature will clean that up nicely. Read more about it &lt;a href="https://nextjs.org/docs/advanced-features/module-path-aliases"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better logging&lt;/strong&gt;&lt;br&gt;
The dev console gets way less noisy. Here's a before and after:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rjLnokW2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/size/w2400/2020/06/before.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rjLnokW2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/size/w2400/2020/06/before.png" alt="before" width="880" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hk5ngyrY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/size/w2400/2020/06/after.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hk5ngyrY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nextjsnotes.com/content/images/size/w2400/2020/06/after.png" alt="after" width="880" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated CMS examples&lt;/strong&gt;&lt;br&gt;
The NextJS team updated some of the CMS examples more clearly explaining how to statically generate content against the individual CMS APIs.&lt;br&gt;
Great news for you if you use any of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contentful&lt;/li&gt;
&lt;li&gt;DatoCMS&lt;/li&gt;
&lt;li&gt;Prismic&lt;/li&gt;
&lt;li&gt;Sanity &lt;/li&gt;
&lt;li&gt;TakeShape&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deep dive&lt;/strong&gt;&lt;br&gt;
Incremental static site regeneration is awesome, but it can be a little hard to wrap your mind around.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://static-tweet.now.sh/"&gt;Static tweet example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luis Alvarez (&lt;a href="https://twitter.com/luis_fades"&gt;@luis_fades&lt;/a&gt;) put together the above example that shows its benefits.&lt;br&gt;
The first sentence of the RFC makes the goal of ISR clear.&lt;br&gt;
Fully automatic re-rendering of statically exported pages without a full rebuild. &lt;br&gt;
This means a couple of things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To use ISR, your page needs to be static&lt;/li&gt;
&lt;li&gt;ISR saves on rebuilds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're tired of waiting on your CMS change to rebuild your entire app, this feature is for you.&lt;/p&gt;

&lt;p&gt;Want to learn more? Check out the RFC and docs below 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vercel/next.js/discussions/11552"&gt;RFC&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So do you think you understand ISR? Arunoda Susiripala (&lt;a href="https://twitter.com/arunoda"&gt;@arunoda&lt;/a&gt;) made a blog post explaining it that even has quiz questions! Check it out below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://arunoda.me/blog/what-is-nextjs-issg"&gt;What is incremental static (re)generation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Useful package of the week&lt;/strong&gt;&lt;br&gt;
The new Web Vitals reporting function in NextJS uses an open-source package from the Google team that reports web vitals (&lt;a href="https://github.com/GoogleChrome/web-vitals/"&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This package is not limited to NextJS apps and can even send the data to your analytics provider (Google Analytics in this case).&lt;br&gt;
&lt;a href="https://nextjs.org/docs/advanced-features/measuring-performance#sending-results-to-analytics"&gt;NextJS analytics example&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/GoogleChrome/web-vitals#send-the-results-to-google-analytics"&gt;Other app analytics example&lt;/a&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  This is the end of the newsletter
&lt;/h3&gt;

&lt;p&gt;If you enjoyed it, consider signing up &lt;a href="https://nextjsnotes.com/initial-commit/"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to build your own blog in 2020 today</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Thu, 23 Jan 2020 19:55:08 +0000</pubDate>
      <link>https://dev.to/dbredvick/how-to-build-your-own-blog-in-2020-today-2p4p</link>
      <guid>https://dev.to/dbredvick/how-to-build-your-own-blog-in-2020-today-2p4p</guid>
      <description>&lt;h2&gt;
  
  
  Why I'm blogging
&lt;/h2&gt;

&lt;p&gt;I'm blogging to improve my writing, increase the clarity of my thoughts, and show what I'm working on.&lt;/p&gt;

&lt;p&gt;With each blog post, I feel like a slightly better communicator and better teacher.&lt;/p&gt;

&lt;p&gt;The compounding effect of continuously improving is staggering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jamesclear.com/continuous-improvement"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kNhfUett--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://jamesclear.com/wp-content/uploads/2015/08/tiny-gains-graph.jpg" alt="tiny gains" width="880" height="880"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trick to seeing these gains is consistency and playing for the long term.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The purpose isn't to please the critics. The purpose is to make your work better. - &lt;a href="https://seths.blog/2016/03/show-your-work/"&gt;Show Your Work, Seth Godin&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  So which platform do I use?
&lt;/h2&gt;

&lt;p&gt;I've started a &lt;code&gt;Blogger&lt;/code&gt; blog (this was &lt;em&gt;before&lt;/em&gt; Google bought them). Remember &lt;code&gt;.blogspot.com&lt;/code&gt; domains?&lt;/p&gt;

&lt;p&gt;I built a couple different WordPress blogs, both free and self hosted.&lt;/p&gt;

&lt;p&gt;I've started company engineering blogs, internal and external.&lt;/p&gt;

&lt;p&gt;I tried building my blog from scratch.&lt;/p&gt;

&lt;p&gt;Medium, Confluence, Twitter, LinkedIn, Blogger, Dev.to, WordPress, self-hosted, doesn't matter.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pick a tech stack and platform that you will help you write consistently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The trick is getting posts out there, improving over time, and staying in the game.&lt;/p&gt;

&lt;p&gt;Using my experience and following principles from James Clear, Tim Ferriss, and more, I've come up with a few rules for starting a blog as a developer in 2020.&lt;/p&gt;

&lt;p&gt;I'm building my own blog that uses GatsbyJS hosted over at &lt;a href="https://drew.tech?ref=dev"&gt;drew.tech&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Principles
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Stick with what you know
&lt;/h2&gt;

&lt;p&gt;We need blogging to be one of those habits we &lt;em&gt;actually&lt;/em&gt; stick with. In order to do that, we need to make it&lt;br&gt;
as simple as possible.&lt;/p&gt;

&lt;p&gt;To remove friction in the process, we should stick with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a platform we know&lt;/li&gt;
&lt;li&gt;a familiar tech stack&lt;/li&gt;
&lt;li&gt;content you're &lt;em&gt;somewhat&lt;/em&gt; familiar with&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;

&lt;p&gt;I'm comfortable in React, JavaScript, and markdown. I've built a GatsbyJS site and am familiar with GraphQL.&lt;br&gt;
I'm not great at styling, so this blog is a Gatsby theme called &lt;a href="https://novela.narative.co/"&gt;Novela&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Counterpoint
&lt;/h4&gt;

&lt;p&gt;Want to use your blog as a project to learn some new tech? Want to explore new topics you know nearly nothing about?&lt;br&gt;
&lt;strong&gt;That is okay&lt;/strong&gt;. Just know that it's likely blogging won't be a sustainable habit for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Easy deploys
&lt;/h2&gt;

&lt;p&gt;This one sounds really simple, but it can make a big difference on if you are or aren't going to post regularly.&lt;/p&gt;

&lt;p&gt;Deploying needs to be simple. If it's not, you won't post. Dragging files to an S3 bucket does not count as easy.&lt;/p&gt;

&lt;p&gt;You might think I am lazy because of this. Trust your instincts.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;

&lt;p&gt;I can deploy all of my side projects via pushing or merging changes to the &lt;code&gt;master&lt;/code&gt; branch in GitHub (I commit on &lt;code&gt;master&lt;/code&gt; frequently 🤠). Each time I push, a new version gets deployed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zeit.co/home"&gt;Zeit Now&lt;/a&gt; and &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt; take care of a lot of the hastle that is devops.&lt;/p&gt;

&lt;p&gt;I use Zeit Now for all &lt;a href="https://nextjs.org/"&gt;NextJS&lt;/a&gt; and Netlify for all my &lt;a href="https://www.gatsbyjs.org/"&gt;GatsbyJS&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Counterpoint
&lt;/h4&gt;

&lt;p&gt;There are no excuses for bad CI/CD 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Don't build from scratch
&lt;/h2&gt;

&lt;p&gt;Starting from scratch can seem tempting; don't.&lt;/p&gt;

&lt;p&gt;Lean on existing frameworks like NextJS and GatsbyJS that get you started with built in routing, performance optimization, and a plugin ecosystem.&lt;/p&gt;

&lt;p&gt;These things will help you spend more time writing, and less time tweaking code. I'm all for tweaking code, but you're here to create a successful blog,&lt;br&gt;
not to fiddle with code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;

&lt;p&gt;This blog relies heavily on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GatsbyJS&lt;/li&gt;
&lt;li&gt;Gatsby Theme &lt;a href="https://novela.narative.co/"&gt;Novela&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;gatsby-plugin-google-tagmanager&lt;/li&gt;
&lt;li&gt;gatsby-plugin-twitter&lt;/li&gt;
&lt;li&gt;gatsby-plugin-sitemap&lt;/li&gt;
&lt;li&gt;gatsby-plugin-mailchimp&lt;/li&gt;
&lt;li&gt;gatsby-plugin-feed&lt;/li&gt;
&lt;li&gt;[ConvertKit](&lt;a href="https://app.convertkit.com/users/signup?plan=free-limited&amp;amp;lmref=l_QK4w"&gt;https://app.convertkit.com/users/signup?plan=free-limited&amp;amp;lmref=l_QK4w&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;) (get started for free)&lt;/p&gt;

&lt;p&gt;That's a lot of coding hours saved that I can use directly on writing.&lt;/p&gt;

&lt;h4&gt;
  
  
  Counterpoint
&lt;/h4&gt;

&lt;p&gt;Like I've said before, feel free to use your blog as a playground for learning.&lt;br&gt;
If that is your goal, &lt;strong&gt;that is okay&lt;/strong&gt;. It isn't the best approach for creating a&lt;br&gt;
consistent writing habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Collect blog topic ideas
&lt;/h2&gt;

&lt;p&gt;In order to write a blog post, you need topic ideas. Instead of sitting down and thinking "what do I want to write about?",&lt;br&gt;
pull up your list of ideas and write about what you're most inspired by at that moment.&lt;/p&gt;

&lt;p&gt;Here's how I've built my list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Googled something and couldn't find the answer&lt;/li&gt;
&lt;li&gt;Found an answer, but it was buried &lt;em&gt;deeeeep&lt;/em&gt; in a forum&lt;/li&gt;
&lt;li&gt;Notes from a good book or podcast&lt;/li&gt;
&lt;li&gt;Predictions&lt;/li&gt;
&lt;li&gt;Learning in public and documenting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This list is different for everyone and depends on what type of content you want to share.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Less is more
&lt;/h2&gt;

&lt;p&gt;I had a different UI on my previous blog. It had a lot going on. I removed all the distractions and "features" as a test.&lt;br&gt;
People actually spent more time on my site the fewer "features" there were.&lt;/p&gt;

&lt;p&gt;By not creating extra features on your blog, you free up yourself to spend more time writing content.&lt;/p&gt;

&lt;p&gt;And you know what they say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Content is king.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Ready to get started?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7dhTDFT4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/static/10a318341a01337ce5fc7ce72ac382f4/1b494/gatsby-theme-novela-hero.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7dhTDFT4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/static/10a318341a01337ce5fc7ce72ac382f4/1b494/gatsby-theme-novela-hero.jpg" alt="novela theme" width="880" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;code&gt;Deploy on Netlify&lt;/code&gt; button below&lt;/li&gt;
&lt;li&gt;Connect your GitHub account&lt;/li&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;li&gt;Celebrate 🎉&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://app.netlify.com/start/deploy?repository=https://github.com/narative/gatsby-starter-novela"&gt;&lt;br&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gq_bfuxi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.netlify.com/img/deploy/button.svg" width="146" height="32"&gt;&lt;br&gt;
  &lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
      <category>gatsby</category>
    </item>
    <item>
      <title>CCPA: Are you making changes?</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Fri, 17 Jan 2020 00:42:14 +0000</pubDate>
      <link>https://dev.to/dbredvick/ccpa-are-you-making-changes-45g7</link>
      <guid>https://dev.to/dbredvick/ccpa-are-you-making-changes-45g7</guid>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/California_Consumer_Privacy_Act"&gt;CCPA&lt;/a&gt; went into effect January 1 for California residents.&lt;/p&gt;

&lt;p&gt;Are you / your company doing anything about it?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How to Create a Cron Job with Next.js and Vercel</title>
      <dc:creator>drew.tech</dc:creator>
      <pubDate>Sun, 05 Jan 2020 12:00:00 +0000</pubDate>
      <link>https://dev.to/dbredvick/how-to-create-a-cron-job-with-nextjs-and-now-42c9</link>
      <guid>https://dev.to/dbredvick/how-to-create-a-cron-job-with-nextjs-and-now-42c9</guid>
      <description>&lt;h3&gt;
  
  
  I want to remind myself of my New Year's resolution every day via text.
&lt;/h3&gt;

&lt;p&gt;Why? None of those productivity apps have ever worked for me. I don't open them. I want to be reminded in an app I use every day, iMessage. Let's solve this with cron jobs, a Twilio API call, and Vercel hosting.&lt;/p&gt;

&lt;p&gt;Lot's of apps use cron jobs. In the past, I've setup &lt;a href="https://opensource.com/article/17/11/how-use-cron-linux"&gt;cron jobs on linux&lt;/a&gt; servers to process orders, send notification emails, and run expensive SQL queries. Think of it as a list of tasks your server needs to run and the frequency to run them. It's pretty simple to setup and is even shipped with Mac OS &amp;amp; Linux (check out &lt;code&gt;crontab&lt;/code&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But how do we run cron jobs in Vercel deploys? - You, right now, in your Google query&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are five quick steps you need to run cron jobs in a Vercel NextJS app.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start your project
&lt;/h2&gt;

&lt;p&gt;To create a quick NextJS project, I used &lt;code&gt;create-next-app&lt;/code&gt; mentioned in the &lt;a href="https://github.com/zeit/next.js#quick-start"&gt;NextJS docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You'll want to make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;code&gt;pages&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;an &lt;code&gt;api&lt;/code&gt; folder inside the &lt;code&gt;pages&lt;/code&gt; folder&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Add your logic
&lt;/h2&gt;

&lt;p&gt;Then, make sure you have a &lt;code&gt;/pages/api/text.js&lt;/code&gt; (or do it in TypeScript for bonus points 😎).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: there's no need to follow the rest of this step, unless you're building a resolution reminder app just like me.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's what mine looks like: &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Cbi8bz95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/twilio-typescript-nextjs-example.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cbi8bz95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/twilio-typescript-nextjs-example.png" alt="typescript-nextjs-twilio-example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're going to use TypeScript, follow the &lt;a href="https://nextjs.org/blog/next-9#built-in-zero-config-typescript-support"&gt;NextJS guide&lt;/a&gt; to converting the initial project to TS.&lt;/p&gt;

&lt;p&gt;Here's the link to the example code: &lt;a href="https://gist.github.com/dbredvick/602e398b61ac960e326fdd45dab67f3d"&gt;text.ts&lt;/a&gt;. You will need to install the following packages as well: &lt;a href="https://gist.github.com/dbredvick/f2beb92070789b662849b8dc82092c21"&gt;package.json&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Add some security &amp;amp; deploy
&lt;/h2&gt;

&lt;p&gt;Every project needs a little security. For this project, let's make sure our API route is requiring some auth. See the part where we are checking for &lt;code&gt;superSecretAPIKey&lt;/code&gt;? You should come up with your own secret and save it for later. We're going to be using that in step number five.&lt;/p&gt;

&lt;p&gt;To deploy to Now, follow &lt;a href="https://zeit.co/docs#installing-now-cli"&gt;this guide&lt;/a&gt; to deploy with the CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Create a cron job
&lt;/h2&gt;

&lt;p&gt;This isn't truly going to be a cron job. We're going to be using &lt;a href="https://easycron.com?ref=156527"&gt;EasyCron.com&lt;/a&gt;. They have a free tier that's sufficient if you're fine with not adding security (you can't change headers in their free plan).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;note: these EasyCron links are referral links. Here is a non-affiliate link - &lt;a href="https://easycron.com"&gt;https://easycron.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3g59ITn_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/easycron-create.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3g59ITn_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/easycron-create.png" alt="cron job setup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what we are trying to achieve:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CXB-o0b1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/EasyCron-demo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CXB-o0b1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/EasyCron-demo.png" alt="EasyCron NextJS Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Finish the security (optional)
&lt;/h2&gt;

&lt;p&gt;Like I said, every app needs some security. In order to be secure with &lt;a href="https://easycron.com?ref=156527"&gt;EasyCron&lt;/a&gt;, I recommend adding authorization headers to your HTTP call from within the UI.&lt;/p&gt;

&lt;p&gt;Add an &lt;code&gt;Authorization&lt;/code&gt; header to your call with the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kqSM31md--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/easycron-security.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kqSM31md--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://developerspin.com/images/easycron-security.png" alt="easycron nextjs security"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is adding some security, but is not the best option. If you need to &lt;em&gt;really&lt;/em&gt; secure your endpoint, I would recommend different approaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  And that's it!
&lt;/h2&gt;

&lt;p&gt;Congrats, you setup cron jobs inside of a serverless NextJS app hosted with Vercel. Please let me know if you ran into any problems!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/DBredvick?ref_src=twsrc%5Etfw"&gt;Follow @DBredvick&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good luck on those resolutions  💪💯&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
