<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Vadorequest</title>
    <description>The latest articles on Forem by Vadorequest (@vadorequest).</description>
    <link>https://forem.com/vadorequest</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%2F160502%2F47473e61-1b78-449b-98eb-bc1593b02692.png</url>
      <title>Forem: Vadorequest</title>
      <link>https://forem.com/vadorequest</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vadorequest"/>
    <language>en</language>
    <item>
      <title>SendGrid is deceptive about "Opened emails" statistic</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Sat, 26 Nov 2022 18:02:08 +0000</pubDate>
      <link>https://forem.com/vadorequest/sendgrid-is-deceptive-about-opened-emails-statistic-21e0</link>
      <guid>https://forem.com/vadorequest/sendgrid-is-deceptive-about-opened-emails-statistic-21e0</guid>
      <description>&lt;h3&gt;
  
  
  After in-depth analysis of SendGrid system, I came to the following conclusions:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Their "open" event is not accurate, as it can be trigger by either a BOT or a human&lt;/li&gt;
&lt;li&gt;They know this &lt;em&gt;(and have built their analytics dashboard, knowingly or unknowingly, so that it doesn't reflect this issue)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5grdxxih3wrdcesxhob3.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5grdxxih3wrdcesxhob3.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
On the above screenshot, you can see that 46 emails are being opened within 100 seconds exactly. There were 96 recipients in total, so that'd mean about 50% opened the email right away?&lt;br&gt;
That's odd, isn't?&lt;/p&gt;

&lt;h3&gt;
  
  
  But let's do more testing:
&lt;/h3&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwupljr9g6yizgyl6xvj.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwupljr9g6yizgyl6xvj.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
On this batch, we got even better numbers!&lt;br&gt;
66 recipients, 52 of them opened the email within 40 seconds. 🎉&lt;/p&gt;

&lt;p&gt;Our marketing team must be awesome, and our product terrific for such quick enthusiasm!&lt;br&gt;
Well, except the "click" rate is ... 1%. Odd, isn't?&lt;/p&gt;

&lt;h3&gt;
  
  
  But how does that "open" event works, by the way?
&lt;/h3&gt;

&lt;p&gt;It's simple. SendGrid adds a "pixel" in the email, basically an image which points to a script. Whenever that script is being downloaded, it means the email has been opened. Simple!&lt;br&gt;
&lt;em&gt;This might not be 100% accurate, but you get the big picture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;👉 SendGrid doesn't know that you've opened the email by actually clicking on it, &lt;strong&gt;they only know that it has been opened&lt;/strong&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  And what else could open our emails? 🤔
&lt;/h3&gt;

&lt;p&gt;Well, you guessed it (probably): SPAM checkers, and any other "AI" that would read the email content (like Gmail, to know whether to store it into your "Promotion" inbox and all of that).&lt;/p&gt;

&lt;p&gt;In conclusion, SendGrid cannot make the difference between an email opened by an actual human, or by a bot!&lt;/p&gt;

&lt;p&gt;And that would be fine, it they weren't trying to hide it. (or at least, make it obvious that this information is not 100% accurate!)&lt;/p&gt;

&lt;p&gt;Companies use KPIs to run a business, and sometimes, those KPIs are "how many people are reading our newsletter?". Well, when you make strategic decisions like that based on deceptive information, it can hurt.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Following this analysis, I've contacted the "Trust &amp;amp; safety" team at SendGrid with a few advices on how to be more transparent about this fact, and decided to write a public article about it. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I believe companies should put transparency over growth.&lt;br&gt;
Don't just hide your problems, but fix it instead, or at least tell us about it.&lt;/p&gt;

&lt;p&gt;N.B: I bet other "Email delivery providers" have the exact same issue, and are deceptive, too.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S: I hope nobody got fired "for doing a bad job" because their email campaign had a 1% clicks out of 80% reads. But, murphy law, right?&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A 2021 guide about structuring your Next.js project in a flexible and efficient way</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Thu, 21 Jan 2021 14:15:27 +0000</pubDate>
      <link>https://forem.com/vadorequest/a-2021-guide-about-structuring-your-next-js-project-in-a-flexible-and-efficient-way-472</link>
      <guid>https://forem.com/vadorequest/a-2021-guide-about-structuring-your-next-js-project-in-a-flexible-and-efficient-way-472</guid>
      <description>&lt;h1&gt;
  
  
  Next.js
&lt;/h1&gt;

&lt;p&gt;Next.js is very unopinionated about how to structure your Next.js project. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The only thing you must really be careful about is to not have anything under &lt;code&gt;pages&lt;/code&gt; that aren't actual pages (e.g: tests, components, etc.), because there is no way to ignore them and Next will bundle and deploy them as actual pages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can choose to have your code at the root level (&lt;code&gt;/pages&lt;/code&gt;) or under &lt;code&gt;src&lt;/code&gt; (&lt;code&gt;/src/pages&lt;/code&gt;). We prefer the latter, because it makes it more obvious what is actual app-related code and what isn't. &lt;/p&gt;

&lt;h1&gt;
  
  
  The usual folder structure
&lt;/h1&gt;

&lt;p&gt;Most people will organize their project using a folder structure such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/public
    favicon.ico
/src
    /components
        /elements
            /auth
                AuthForm.tsx
                AuthForm.test.ts
            /[Name]
                [Name].tsx
                [Name].test.ts
    /hooks
    /types
    /utils
    /test
        /api
            authAPI.test.js
            [name]API.test.js
        /pages
            index.test.js

    /pages
        /api
          /authAPI
              authAPI.js
          /[name]API
              [name]API.js
        _app.tsx
        _document.tsx
        index.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This design pattern is very common, and it's great for small project because it makes it obvious where your files should be located. They're grouped by "kind of files". It's very similar to the MVC design pattern many developers are familiar with.&lt;/p&gt;

&lt;p&gt;The main issue with this design pattern is its lack of scalability. &lt;/p&gt;

&lt;p&gt;While it's great at the beginning, &lt;em&gt;and can be a good fit depending on the size of your project&lt;/em&gt;, you'll realize a some point you'd find your files faster if they were grouped together by "&lt;strong&gt;module&lt;/strong&gt;".&lt;/p&gt;

&lt;p&gt;Once you reach 6-10 unrelated features, you'll wish to have the components files close to the utilities and to the TS type that are specific to your UI components, or even maybe your data model.&lt;/p&gt;

&lt;p&gt;Also, you might prefer having all files related to a particular 3rd party within the same folder, as a module. (e.g: Sentry, Amplitude, etc.)&lt;/p&gt;

&lt;p&gt;At some point, splitting files based on their kind will not be good enough. &lt;strong&gt;That's where you'll need modules&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  The flexible and "modular" folder structure
&lt;/h1&gt;

&lt;p&gt;Another way to organize things is to introduce &lt;strong&gt;modules&lt;/strong&gt;.&lt;br&gt;
Modules help group together code that is related to each other. They're not a replacement for what's common.&lt;/p&gt;

&lt;p&gt;Here is how we might convert our previous folder structure to something a bit more modular:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/public
    favicon.ico
/src
    /common
        /components
            /elements
                /[Name]
                    [Name].tsx
                    [Name].test.ts
        /hooks
        /types
        /utils
    /modules
        /auth
            /api
                AuthAPI.js
                AuthAPI.test.js
            /components
                AuthForm.tsx
                AuthForm.test.ts
            auth.js
    /pages
        /api
          /authAPI
              authAPI.js
          /[Name]API
              [Name]API.js
        _app.tsx
        _document.tsx
        index.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We added a new &lt;code&gt;src/modules/&lt;/code&gt; folder where we group all files related to the same feature (here, the authentication as "auth"), instead of splitting the "auth" code everywhere, it is now centralized into a single folder.&lt;/p&gt;

&lt;p&gt;You might have noticed the only thing that hasn't changed is the &lt;code&gt;src/pages/&lt;/code&gt; directory. I'll repeat myself, but you must not have anything there that isn't either a page or an API endpoint.&lt;/p&gt;

&lt;p&gt;Everything related to the authentication is now in &lt;code&gt;/src/modules/auth&lt;/code&gt;, it's much easier/faster to understand the code being used to authenticate now!&lt;/p&gt;

&lt;p&gt;But, you don't want to always use modules, right? Sometimes you're writing some kind of utility that doesn't really fit in any module, something you'll want to write some code quickly and be done with it. &lt;/p&gt;

&lt;p&gt;Modules introduce "thoughts complexity", because now you have a conscious choice to make about where your file should be. It was easier before to make this decision, because grouping files by kind is effortless, it's a choice that has an actual answer to it. Moving a component to the &lt;code&gt;hooks&lt;/code&gt; folder is wrong, while moving it to the &lt;code&gt;components&lt;/code&gt; is correct. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's easy to know you did it right.&lt;/strong&gt; (or wrong)&lt;/p&gt;

&lt;p&gt;But, with modules, there is no right/wrong answer! Making it harder to make decisions. Sometimes you won't know, it won't be obvious at first (it may never be). Sometimes you'll figure it out afterwards ("oh, that's actually a module").&lt;/p&gt;

&lt;p&gt;And because modules aren't the universal solution to this problem, &lt;strong&gt;the key is to allow both&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;common&lt;/code&gt; directory should be used for everything that isn't a module, while the &lt;code&gt;modules&lt;/code&gt; directory should be used by everything you feel should be a "module".&lt;/p&gt;

&lt;p&gt;This way, you get the best of both worlds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ability to &lt;strong&gt;quickly&lt;/strong&gt; add code &lt;strong&gt;without thinking&lt;/strong&gt; much about where it should be (&lt;code&gt;common&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The ability to organize &lt;strong&gt;at your own pace&lt;/strong&gt; when you feel like that thing has grown too big and all those pieces of code should be brought together (converting from &lt;code&gt;common&lt;/code&gt; to &lt;code&gt;modules&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The ability to &lt;strong&gt;quickly find your code&lt;/strong&gt; in your existing modules and to have an &lt;strong&gt;overview&lt;/strong&gt; of how big a module is. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm the author of &lt;a href="https://github.com/UnlyEd/next-right-now"&gt;Next Right Now&lt;/a&gt;, a Next.js production-ready boilerplate, and the above folder structure is what we're using since January 20, 2021. It is the result of &lt;a href="https://github.com/UnlyEd/next-right-now/discussions/183"&gt;feedbacks from the NRN community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Alongside this new folder structure, Next Right Now has also migrated to "&lt;a href="https://unlyed.github.io/next-right-now/reference/module-path-aliases"&gt;Module path aliases&lt;/a&gt;", which uses absolute paths instead of relative paths for importing modules. (e.g: &lt;code&gt;import ('@/common/hooks/useStuff')&lt;/code&gt; instead of &lt;code&gt;import ('../../../common/hooks/useStuff')&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you want to learn more on the topic, read the &lt;a href="https://unlyed.github.io/next-right-now/reference/folder-structure"&gt;NRN folder structure documentation&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>project</category>
      <category>react</category>
    </item>
    <item>
      <title>Migrating Next.js (+Jest/Storybook/Cypress) to use module path aliases, instead of relative paths</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Mon, 18 Jan 2021 12:20:27 +0000</pubDate>
      <link>https://forem.com/vadorequest/migrating-next-js-jest-storybook-cypress-to-use-module-path-aliases-instead-of-relative-paths-d9a</link>
      <guid>https://forem.com/vadorequest/migrating-next-js-jest-storybook-cypress-to-use-module-path-aliases-instead-of-relative-paths-d9a</guid>
      <description>&lt;p&gt;Most projects use the well-known relative paths to resolve files and modules. For instance: &lt;code&gt;import '../config.ts';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Sometimes, especially on big project, it becomes this:&lt;br&gt;
&lt;code&gt;import { NRN_DEFAULT_THEME } from '../../common/constants';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But, did you know you can convert to something like this:&lt;br&gt;
&lt;code&gt;import { NRN_DEFAULT_THEME } from '@/common/constants';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is a &lt;a href="https://nextjs.org/docs/advanced-features/module-path-aliases"&gt;"module path alias"&lt;/a&gt;, and Next.js has support for those &lt;a href="https://nextjs.org/blog/next-9-4#absolute-imports-and-aliases"&gt;since 9.4&lt;/a&gt; (May, 2020).&lt;/p&gt;

&lt;p&gt;The main advantages to module path aliases are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoids "../" spaghetti code&lt;/li&gt;
&lt;li&gt;Avoid breaking your imports when moving them around (sure, IDE help but when you move a lot of files around, they get confused too)&lt;/li&gt;
&lt;li&gt;Avoid changing the file content when moving the file around, which in turn leads to avoiding Git conflicts! (this is, by far, the main advantage, IMHO)&lt;/li&gt;
&lt;li&gt;You can copy/paste your code, and it'll work as-it, even if you pasted it into a file on another folder level (and that's great)&lt;/li&gt;
&lt;li&gt;You can still use relative imports if you want, it's not a lock-in!&lt;/li&gt;
&lt;li&gt;Do you see more?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, why not using them? Why don't we see that more often?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It requires configuration in several tools (babel, webpack)&lt;/li&gt;
&lt;li&gt;It affects all tools in your project, because all file loaders must be compatible, and configured properly (this is, by far, the main reason why it's so complicated to get right)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use a very simple Next.js project, you can simply change your &lt;code&gt;tsconfig.json&lt;/code&gt; to something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;compilerOptions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;baseUrl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;paths&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/common/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/common/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/components/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/common/components/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/utils/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/common/utils/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/modules/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;src/modules/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The above mapping is what &lt;a href="https://github.com/UnlyEd/next-right-now/discussions/183"&gt;we're thinking of using in Next Right Now&lt;/a&gt;, but you probably want something specific to your app and way of doing things!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using a mapping as described above will be enough for Next.js to use &lt;code&gt;import { NRN_DEFAULT_THEME } from '@/common/constants';&lt;/code&gt; properly!&lt;/p&gt;

&lt;h2&gt;
  
  
  How to convert all relative paths to module paths?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;relative-to-alias&lt;/code&gt; NPM module helped us a ton. &lt;/p&gt;

&lt;p&gt;It was hard to configure properly because it wasn't doing anything at first (due to a misconfiguration on our side), but we eventually managed to make it work.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx relative-to-alias --src 'src' --alias '@/common' --alias-path './src/common' --extensions 'ts,tsx'  --language 'typescript'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Running this replaced all relative paths to &lt;code&gt;@/common/...&lt;/code&gt;. We eventually &lt;a href="https://github.com/UnlyEd/next-right-now/blob/5cd7a3cc1470a0dac5ffb0f34530a5d7b3ceb69a/package.json#L84-L87"&gt;wrote a script for this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a quick and easy way to migrate an existing project. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure to commit all changes before running the  &lt;code&gt;codemod:module-path-aliases&lt;/code&gt;! It'll change lots of files and should be done in a dedicated commit/PR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Is that it?
&lt;/h2&gt;

&lt;p&gt;Depending on how big your project is, it might... But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you're using Jest (you probably are)&lt;/li&gt;
&lt;li&gt;If you're using Cypress&lt;/li&gt;
&lt;li&gt;If you're using Storybook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, you'll need to configure them, so they understand what &lt;code&gt;@/&lt;/code&gt; means!&lt;/p&gt;

&lt;p&gt;And, unfortunately, that's the most complicated part to figure out by yourself... Because they all use a different way of doing so. They don't all rely on &lt;code&gt;tsconfig.json&lt;/code&gt;, and you don't necessarily only use TypeScript, but JavaScript as well!&lt;/p&gt;

&lt;p&gt;Here is an overview of where you'll need to make changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/UnlyEd/next-right-now/pull/265/files#diff-b55cdbef4907b7045f32cc5360d48d262cca5f94062e353089f189f4460039e0"&gt;&lt;code&gt;tsconfig.json&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UnlyEd/next-right-now/pull/265/files#diff-1e058ca1442e46581b13571fb8d261f9e1f5657e26c96634d4c1072f0f0347f1"&gt;&lt;code&gt;jest.config.js&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UnlyEd/next-right-now/pull/265/files#diff-7c73a5b98f30e40574b7149a83a19e335c5ee48b8c9c58e4e6cbfe6a07777037"&gt;&lt;code&gt;cypress/tsconfig.json&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UnlyEd/next-right-now/pull/265/files#diff-88916def1b0ce362d14fad4ff9e7ef8a93dc5eb184c798aac06a4564a9ac4ec9"&gt;&lt;code&gt;.storybook/jsconfig.json&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UnlyEd/next-right-now/pull/265/files#diff-962be72e9a91e7a94e8a2eb9ecb637f7e4a399fbf80b2a55c623ee477c632715"&gt;&lt;code&gt;cypress/jsconfig.json&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UnlyEd/next-right-now/pull/265/files#diff-cafe2123a72c4ce3a9f7e9ee4b0e188256eb02d7ec1e54fa2cadfac99b22f92b"&gt;&lt;code&gt;.storybook/main.js:webpackFinal&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UnlyEd/next-right-now/pull/265/files#diff-1e058ca1442e46581b13571fb8d261f9e1f5657e26c96634d4c1072f0f0347f1"&gt;&lt;code&gt;jest.config.js:moduleNameMapper&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;jsconfig.json&lt;/code&gt; are necessary for WebStorm to resolve the aliases used within &lt;code&gt;.js&lt;/code&gt; files. (Otherwise, it compiles but WebStorm displays "Module not found")&lt;/p&gt;

&lt;p&gt;Jest has a particular way to understand aliases. Storybook doesn't have tsconfig.json and it must be configured via their Webpack override.&lt;/p&gt;




&lt;p&gt;In conclusion, it can be quite complicated (with a lot of duplicated configuration) to make Module aliases work on a whole project. It takes some time to understand how each 3rd party needs to be configured. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;At this time, I don't have any feedback experience regarding actual usage. This is still &lt;a href="https://github.com/UnlyEd/next-right-now/pull/265"&gt;under peer-review&lt;/a&gt;, and it might take a while until we get familiar with those new paths.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also, it is &lt;strong&gt;concerning how complicated the configuration is&lt;/strong&gt;. It's being &lt;strong&gt;duplicated&lt;/strong&gt; in no less than &lt;strong&gt;7 different files&lt;/strong&gt;! And one might be concerned about what'd happen if it ever breaks.&lt;/p&gt;

&lt;p&gt;But, in such event, I guess we can solve it with another codemod that converts all module aliases back to relative paths! &lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>webpack</category>
      <category>cypress</category>
    </item>
    <item>
      <title>Using Storybook 6.1 with Next.js and Emotion 11 - Advanced usage and best practices</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Sun, 17 Jan 2021 14:11:30 +0000</pubDate>
      <link>https://forem.com/vadorequest/using-storybook-6-1-with-next-js-and-emotion-11-advanced-usage-and-best-practices-263h</link>
      <guid>https://forem.com/vadorequest/using-storybook-6-1-with-next-js-and-emotion-11-advanced-usage-and-best-practices-263h</guid>
      <description>&lt;p&gt;The &lt;a href="https://github.com/UnlyEd/next-right-now"&gt;Next Right Now&lt;/a&gt; boilerplate recently got an interesting upgrade!&lt;/p&gt;

&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;We've added Storybook side-by-side with our Next.js application. It took us about 4 days of intensive work.&lt;/p&gt;

&lt;p&gt;We had never used Storybook in the past, and we were looking for a Design System to help our designers and developers build components in a better way, with proper documentation, functional testing, accessibility testing, and interact with our components. Storybook helped us achieve all of that - and even a bit more.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While this work has been done on Next Right Now, any Next.js project can benefit from it.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/UnlyEd/next-right-now/pull/251"&gt;Pull Request&lt;/a&gt; and &lt;a href="https://unlyed.github.io/next-right-now/guides/storybook/"&gt;documentation&lt;/a&gt; to learn more about it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check out the result on our &lt;a href="https://nrn-v2-mst-aptd-at-lcz-sty-storybook.vercel.app/?path=/story/next-right-now-welcome-to-nrn--page"&gt;Storybook demo&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Main features
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Compatible with TypeScript&lt;/li&gt;
&lt;li&gt;Compatible with Emotion 10/11, useful if you use Emotion yourself, or libs using Emotion&lt;/li&gt;
&lt;li&gt;Next.js router (decorator)&lt;/li&gt;
&lt;li&gt;Compatible with Sentry&lt;/li&gt;
&lt;li&gt;Compatible with node-related libs&lt;/li&gt;
&lt;li&gt;Compatible with CSS Modules&lt;/li&gt;
&lt;li&gt;Static site automatically deployed on Vercel, using GitHub Actions&lt;/li&gt;
&lt;li&gt;Automated tests using Cypress, to make sure you get warned if you accidenly break your static site&lt;/li&gt;
&lt;li&gt;Support for i18next and Locize provider (fetched and cached upon build)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Methodology and learnings
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Initial configuration
&lt;/h2&gt;

&lt;p&gt;It wasn't easy. The most difficult part was Emotion/Node.js, because it required some Webpack/Babel tricks with solutions and workarounds splattered all over the web. Emotion was quite a pain in particular, because their TS types clash between v10 and v11. Next Right Now had been upgraded to v11 last week, but some libraries we use are still using v10, which creates a few inconsistencies, even after configuring Webpack and Babel as recommended. &lt;/p&gt;

&lt;p&gt;Definitely not something easy to do. It took us about one and half day of work to get it right. Also, we directly integrated automated deployments (CI/CD) using Vercel and GitHub Actions. That part was easy because we have quite a lot of experience with those already.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a solid Storybook foundation
&lt;/h2&gt;

&lt;p&gt;Once all the pieces had been properly configured, we started looking at the Storybook ecosystem. We wasted 2 good hours trying to use &lt;code&gt;knobs&lt;/code&gt; before we figured it wasn't the recommended way to do things anymore. (Replaced by &lt;code&gt;controls&lt;/code&gt; in v6)&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://storybook.js.org/addons/"&gt;https://storybook.js.org/addons/&lt;/a&gt; was great to get an overview of all existing addons, and we went through the whole list, to look at all those that were promising. Eventually, we selected 8 officials and 5 community-maintained. Checking all of them took us another day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    // Officials
    "@storybook/addon-a11y": "6.1.14",
    "@storybook/addon-actions": "6.1.14",
    "@storybook/addon-console": "1.2.2",
    "@storybook/addon-essentials": "6.1.14",
    "@storybook/addon-google-analytics": "6.1.14",
    "@storybook/addon-jest": "6.1.14",
    "@storybook/addon-links": "6.1.14",
    "@storybook/addon-storysource": "6.1.14",

    // Community
    "storybook-addon-designs": "5.4.3",
    "storybook-addon-next-router": "2.0.3",
    "storybook-addon-performance": "0.14.0",
    "storybook-css-modules-preset": "1.0.5",
    "storybook-mobile": "0.1.29",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We documented them all in the &lt;a href="https://github.com/UnlyEd/next-right-now/blob/e5aba8eaf02918d9506008ee1f11c38954fedc86/.storybook/main.js#L53-L196"&gt;&lt;code&gt;.storybook/main.js&lt;/code&gt; file&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those addons were "must-haves" to us. Eventually, we disabled &lt;code&gt;storysource&lt;/code&gt; and we don't actually use &lt;code&gt;performance&lt;/code&gt; much yet, but it looks promising.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Storybook has a special &lt;code&gt;essentials&lt;/code&gt; package regrouping all the &lt;a href="https://storybook.js.org/addons/essentials"&gt;"essential" features&lt;/a&gt;, it definitely helped us! &lt;em&gt;(but we're greedy and wanted more!)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Mock our app behavior
&lt;/h2&gt;

&lt;p&gt;And then, we had to mock stuff around, using Decorators, configuring i18n with Locize so our components could behave in Storybook the same way they behave in Next Right Now. Overall, it wasn't so hard, but &lt;a href="https://github.com/UnlyEd/next-right-now/blob/e5aba8eaf02918d9506008ee1f11c38954fedc86/.storybook/preview.js"&gt;took time to get right&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing actual component Stories
&lt;/h2&gt;

&lt;p&gt;Once we were done with the configuration part (around 2.5 days in total), it was time to do the actual work: &lt;strong&gt;Write stories for ALL our components&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And... it was hard. We had written a few stories during the configuration (of course!) and we knew the basics, but it wasn't obvious what were the "Best practices" really. Also, looking at stuff on the web didn't help and was quite confusing, as they were plenty of examples using v4 or v5, and not many using v6 (which is still quite new!).&lt;/p&gt;

&lt;p&gt;At some point, we figured how we'd write our components in such a way we'd avoid code duplication (within stories). But it took us much longer than we wished to.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To be honest, we don't really know if our way is "the" way. It's one that makes sense, avoids code duplication, is simple to maintain and extend. &lt;/p&gt;

&lt;p&gt;Is it good? &lt;em&gt;Definitely&lt;/em&gt;. &lt;br&gt;
It is the best? &lt;strong&gt;You tell me&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eventually, we managed to write stories for all our components. It took us about 2.5 days.&lt;/p&gt;

&lt;h1&gt;
  
  
  Caveats and pains
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Babel/Webpack are real pains. They're like a double edge sword, either you figure out how to configure stuff or you don't. If you do, great, you can now work on the real stuff. If you don't, well, &lt;em&gt;you suck&lt;/em&gt;. Or that's actually what &lt;em&gt;it feels like&lt;/em&gt;. Personally, I hate configuring Babel/Webpack, because I'm not familiar with them, and I don't want to learn them either. They're too complicated for my taste, and they evolve with breaking changes too often, too. I don't know why it was so complicated, it just was, and it could have been avoided.&lt;/li&gt;
&lt;li&gt;Storybook documentation is good, but it's not great yet. We got lost several times about how to write our components, met a few bugs that made us feel dumb (&lt;em&gt;hello &lt;code&gt;.storybook/manager.js&lt;/code&gt; with your broken cache&lt;/em&gt;), had to go around and around the documentation to find how to configure default stories, override stories, how to disable controls for properties (we eventually wrote &lt;a href="https://github.com/UnlyEd/next-right-now/blob/e5aba8eaf0/src/stories/shared/hocs/withPropMock.tsx%20to%20simplify%20the%20usage%20of%20%7B%%20raw%20%%7D%60children%60%7B%%20endraw%20%%7D%20through%20a%20mock%20prop"&gt;a &lt;code&gt;withPropMock&lt;/code&gt; HOC&lt;/a&gt; for this). TS helps a ton, but there are yet quite a bit of uncovered documentation. They're &lt;a href="https://github.com/storybookjs/storybook/issues/13499"&gt;working on it&lt;/a&gt;, and we've seen far worse. Overall, we had a good experience, but it can improve!&lt;/li&gt;
&lt;li&gt;Some stuff that should be simple (like sharing CSS for all stories) was quite complicated and really not developer-friendly.&lt;/li&gt;
&lt;li&gt;We ended up re-writing our stories completely several times, until we found the "right" way.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Final words
&lt;/h1&gt;

&lt;p&gt;Adding Storybook was exciting, a bit needlessly complicated, but &lt;a href="https://nrn-v2-mst-aptd-at-lcz-sty-storybook.vercel.app/"&gt;the result is great&lt;/a&gt;. It's going to be tremendously helpful for our Product Owner,  Designers and Developers to collaborate at &lt;a href="https://github.com/UnlyEd"&gt;Unly&lt;/a&gt;, and the team is very excited to benefit from this update once we'll ship it into our private Next Right Now forks!&lt;/p&gt;

&lt;p&gt;Having experienced a bit of Storybook v5 and v6, the v6 provides a much better developer experience, great job to the team, it's lovely to see OSS building such great products!&lt;/p&gt;

</description>
      <category>storybook</category>
      <category>nextjs</category>
      <category>react</category>
      <category>vercel</category>
    </item>
    <item>
      <title>Next Right Now in 2020 - Most flexible and production-ready boilerplate for Next.js</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Sat, 09 Jan 2021 19:20:52 +0000</pubDate>
      <link>https://forem.com/vadorequest/next-right-now-in-2020-most-flexible-and-production-ready-boilerplate-for-next-js-3hkk</link>
      <guid>https://forem.com/vadorequest/next-right-now-in-2020-most-flexible-and-production-ready-boilerplate-for-next-js-3hkk</guid>
      <description>&lt;p&gt;&lt;a href="https://unlyed.github.io/next-right-now/"&gt;Next Right Now&lt;/a&gt; is a production-ready boilerplate for Next.js.&lt;/p&gt;

&lt;p&gt;Authored by &lt;a href="http://unly.org/"&gt;Unly&lt;/a&gt; less than a year ago, it has recently reached 500 GitHub stars, with more than 1000 unique visitors in December 2020 alone!&lt;/p&gt;

&lt;p&gt;Our main motivation by releasing our internal framework as open-source software, was to share it with the community, hoping the quality would increase.&lt;/p&gt;

&lt;p&gt;And it did! In 2O2O, Next Right Now was visited by people from 139 different countries, for a total of ~6k unique visitors!&lt;/p&gt;

&lt;p&gt;Open-source takes time, it really does. But it's part of our core at Unly, our goal is to help students access higher education, and open-source is naturally on the way!&lt;/p&gt;

&lt;h1&gt;
  
  
  2020 statistics
&lt;/h1&gt;

&lt;p&gt;Unsurprisingly, most visitors were from the United States.&lt;br&gt;
What was more surprising through, is that India is ranked 2nd!&lt;br&gt;
And France is 3rd, that was also a great surprise considering we're a French company ourselves!&lt;/p&gt;

&lt;p&gt;Chrome was used by 80% of the developers reading the NRN documentation, Safari comes second (10%), then Firefox (6%) and Edge (3%). Nothing astounding here.&lt;/p&gt;

&lt;p&gt;Bounce rate was around 50%, which isn't bad. There were more than 35k page views in total, with an average session duration of 2:36mn.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NFd3aQsB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/58nn4xpwm70qjxv470s9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NFd3aQsB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/58nn4xpwm70qjxv470s9.png" alt="Greenshot 2021-01-09 19.58.52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those statistics are interesting and show us developers come back and spend even more time on the documentation, which is a great sign for conversion. That means people like what they see, and they come back for more.&lt;/p&gt;

&lt;p&gt;And more, we've got!&lt;/p&gt;

&lt;h1&gt;
  
  
  2020 features
&lt;/h1&gt;

&lt;p&gt;There have been some incredible features implemented in 2020, thanks to the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger a GitHub Action workflow remotely (workflow dispatch), we've used this to trigger Vercel deployments from our Stacker app and from GitHub Actions UI itself!&lt;/li&gt;
&lt;li&gt;A Vercel deployment &lt;a href="https://unlyed.github.io/next-right-now/guides/api-endpoints/"&gt;webhook&lt;/a&gt; was added in December 2020, making it possible to get notified when a Vercel deployment is completed. We've used this to update our Airtable dataset automatically, works very great!&lt;/li&gt;
&lt;li&gt;We've released &lt;a href="https://github.com/UnlyEd/github-action-await-vercel"&gt;our first GitHub Action&lt;/a&gt; less than 2 weeks ago (awaits for a Vercel deployment to be completed) and we're already &lt;a href="https://github.com/UnlyEd/github-action-store-variable"&gt;working on a new one&lt;/a&gt;! (share GitHub Action variables between jobs) and &lt;a href="https://github.com/UnlyEd/next-right-now/pull/239"&gt;it's being beta-tested at the moment&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;We've recently updated the Next Right Now documentation, and explained in-depth all our &lt;a href="https://unlyed.github.io/next-right-now/guides/scripts-and-utilities/#scripts"&gt;built-in scripts&lt;/a&gt; and &lt;a href="https://unlyed.github.io/next-right-now/guides/scripts-and-utilities/#utilities"&gt;built-in utilities&lt;/a&gt;, among many other things.&lt;/li&gt;
&lt;li&gt;Automated versioning, using the Git commit history.&lt;/li&gt;
&lt;li&gt;Automated releasing, using GitHub Actions! (we've added quite a lot of automations this last month alone!)&lt;/li&gt;
&lt;li&gt;Auto-aliasing of Vercel custom domains, for production but also preview! (which is a paid feature on Vercel, and quite an expensive one, too)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What about 2021?
&lt;/h1&gt;

&lt;p&gt;We have many things planned for 2021, and we're very excited by the recent Vercel/Next.js announcements. 2021 looks promising already!&lt;/p&gt;

&lt;p&gt;Also, we're gonna start a new big open-source project! It might just become the most flexible Chatbot out there ;) &lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>vercel</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How would you keep the same Python 2.7 app running for years to come?</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Mon, 13 Jul 2020 10:53:47 +0000</pubDate>
      <link>https://forem.com/vadorequest/how-would-you-keep-the-same-python-2-7-app-running-for-years-to-come-2bj</link>
      <guid>https://forem.com/vadorequest/how-would-you-keep-the-same-python-2-7-app-running-for-years-to-come-2bj</guid>
      <description>&lt;p&gt;I've recently came across a new interesting challenge.&lt;/p&gt;

&lt;p&gt;One of the app I'm working on is an old app written in 2016 using Python 2.7. It's basically a website/web platform where people can do stuff.&lt;/p&gt;

&lt;p&gt;The platform is going to be discontinued soon, but needs to process data for the next 5-8 years nevertheless. The business context led to the decision of disabling new sign-ups and only allow existing users to sign in, so that they can access their data for years to come.&lt;/p&gt;

&lt;p&gt;Not only the project is being discontinued, but the staff behind it too. Resources are scarce to say the least.&lt;/p&gt;

&lt;p&gt;The goal now is to keep the platform in an operational condition, without making any changes to it. (or, as little as possible)&lt;/p&gt;

&lt;p&gt;As you probably know, Python 2 is completely outdated and support is being dropped on many tools, such as &lt;a href="https://pip.pypa.io/en/latest/development/release-process/#python-2-support"&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/a&gt; which will drop support in January 2021, 6 months from now.&lt;/p&gt;

&lt;p&gt;The challenge at hand here is to find a way to keep such a project in operational condition and keep it running for all those years to come. &lt;/p&gt;

&lt;p&gt;But, I know it will eventually break. At some point, running &lt;code&gt;pip install&lt;/code&gt; will not work anymore, whether due to pip itself or one of the thousands of the project's dependencies.&lt;/p&gt;

&lt;p&gt;I've spent a good deal of time on this challenge already, and eventually chose to keep our current hosting provider for now (fully managed). &lt;/p&gt;

&lt;p&gt;I also considered making a Docker instance so that the whole infrastructure gets "frozen", but even though I'm not sure the underlying provider (AWS, etc.) wouldn't deprecate such instances within 5-8 years of time and force us to move it to something different, which may lead to issues when reinstalling everything years later, with a different staff unfamiliar with the project.&lt;/p&gt;

&lt;p&gt;Of course, rewriting the whole app is not an option, due to time/budget constraints. Also, the project being discontinued, it'd really not make any sense, financially wise.&lt;/p&gt;

&lt;p&gt;So, I'm not asking for a magical solution. But I'm interested in similar experiences and feedback about what to do and not to do from peers who've known such a challenge. Would love to hear your story! &lt;/p&gt;

</description>
      <category>python</category>
    </item>
    <item>
      <title>Next Right Now v2 - Play around with Next.js v9.4 using SSG/SSR, incremental builds, fallback builds, preview mode and more!</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Mon, 01 Jun 2020 21:06:08 +0000</pubDate>
      <link>https://forem.com/vadorequest/next-right-now-v2-play-around-with-next-js-v9-4-using-ssg-ssr-incremental-builds-fallback-builds-preview-mode-and-more-ood</link>
      <guid>https://forem.com/vadorequest/next-right-now-v2-play-around-with-next-js-v9-4-using-ssg-ssr-incremental-builds-fallback-builds-preview-mode-and-more-ood</guid>
      <description>&lt;p&gt;Hello &lt;strong&gt;React&lt;/strong&gt; lovers.&lt;/p&gt;

&lt;p&gt;We recently released NRN v2, which features building web apps using &lt;strong&gt;Next.js&lt;/strong&gt; framework (9.4) and GraphQL/&lt;strong&gt;GraphCMS&lt;/strong&gt;. 🎉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Next Right Now (NRN) is meant to help you build production-grade projects using the Next.js framework. It can be used as a boilerplate to &lt;strong&gt;start a new project&lt;/strong&gt;, or as an &lt;strong&gt;educational resource&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The v2 version brings the following features out of the box&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSG: Static pages (per-page configuration SSG/SSR)&lt;/li&gt;
&lt;li&gt;Preview mode: Preview dynamic content on “static” pages&lt;/li&gt;
&lt;li&gt;Incremental rebuild: Rebuild part of your app incrementally (per-page configuration) to automatically keep static content up-to-date&lt;/li&gt;
&lt;li&gt;Partial pre-build: Use fallback option to build your pages on-demand, and have them statically served afterwards&lt;/li&gt;
&lt;li&gt;Full TS support&lt;/li&gt;
&lt;li&gt;Hosted on Vercel&lt;/li&gt;
&lt;li&gt;Advanced stages and secrets configuration&lt;/li&gt;
&lt;li&gt;SaaS B2B advanced support (monorepo design)&lt;/li&gt;
&lt;li&gt;I18n/Localisation&lt;/li&gt;
&lt;li&gt;Automated deployments (CI/CD) using Github Actions&lt;/li&gt;
&lt;li&gt;Monitoring, testing and analytics&lt;/li&gt;
&lt;li&gt;Integrated documentation website using Jekyll and GitHub Pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;: &lt;a href="https://nrn-v2-mst-aptd-gcms-lcz-sty-c1.now.sh"&gt;https://nrn-v2-mst-aptd-gcms-lcz-sty-c1.now.sh&lt;/a&gt; (play around with SSG/SSG, incremental builds, fallback builds, preview mode and more!)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/UnlyEd/next-right-now"&gt;https://github.com/UnlyEd/next-right-now&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NRN next preset will be an Airtable integration (instead of GraphCMS), to showcase how to consume a REST-ish API&lt;/p&gt;




&lt;p&gt;&lt;em&gt;NRN is officially recommended by &lt;a href="https://react.i18next.com/latest/ssr"&gt;React i18next&lt;/a&gt; for internationalising Next.js apps&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nrn</category>
      <category>nextjs</category>
      <category>ssg</category>
      <category>react</category>
    </item>
    <item>
      <title>Looking for a multi-tenants CMS </title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Sun, 29 Mar 2020 21:51:35 +0000</pubDate>
      <link>https://forem.com/vadorequest/looking-for-a-multi-tenants-cms-4dpj</link>
      <guid>https://forem.com/vadorequest/looking-for-a-multi-tenants-cms-4dpj</guid>
      <description>&lt;p&gt;I'm looking for a CMS/BackOffice/Admin site to help me manage my multiple B2B customers.&lt;/p&gt;

&lt;p&gt;Our needs are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Providing a backoffice to our customers, where each user can connect to its own tenant and access its tenant's data only.&lt;/li&gt;
&lt;li&gt;The backoffice must be generated automatically from a data structure (db schema for instance)&lt;/li&gt;
&lt;li&gt;An API must be generated automatically from the data structure (allows to consume the data from web apps, mobiles, etc.)&lt;/li&gt;
&lt;li&gt;Ideally, this API would be a GraphQL server because that's what we use already. &lt;/li&gt;
&lt;li&gt;Advanced permissions and roles for internal users, basically need to configure who can view which tables, or has update/delete permissions on which tables. It must be flexible and non-blocking for our business evolution/future needs&lt;/li&gt;
&lt;li&gt;The backoffice needs to be flexible about UI components/views so that we can create our own workflows, views and components.&lt;/li&gt;
&lt;li&gt;Theming capabilities of the backoffice, per tenant, would nice to have.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've been looking for quite some time but none of my findings were satisfying.&lt;/p&gt;

&lt;p&gt;Strapi is close but doesn't support anything related to multi tenancy, also permissions aren't as flexible as what we're looking for.&lt;/p&gt;

&lt;p&gt;Any suggestion?&lt;/p&gt;

</description>
      <category>tenancy</category>
      <category>multitenancy</category>
      <category>cms</category>
      <category>backoffice</category>
    </item>
    <item>
      <title>Next Right Now - Flexible production-grade boilerplate for building web apps (monorepo), with Next.js, Zeit and TypeScript</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Tue, 03 Mar 2020 14:27:17 +0000</pubDate>
      <link>https://forem.com/vadorequest/next-right-now-flexible-production-grade-boilerplate-for-building-web-apps-monorepo-with-next-js-zeit-and-typescript-2ich</link>
      <guid>https://forem.com/vadorequest/next-right-now-flexible-production-grade-boilerplate-for-building-web-apps-monorepo-with-next-js-zeit-and-typescript-2ich</guid>
      <description>&lt;p&gt;Building a web app is hard. Building a production-grade app with a high Developer Experience is even harder. Configuring all must-needed frameworks and libraries is quite a challenge, and takes weeks, if not months of hard work.&lt;/p&gt;

&lt;p&gt;Monitoring, analytics, reusable styles (css-in-js), graphql, i18n, testing, end-to-end testing, deployment pipeline (CI/CD), typescript, serverless... All these things are must-haves in 2020, and making them all work together is another challenge.&lt;/p&gt;

&lt;p&gt;That's why we released &lt;a href="https://github.com/UnlyEd/next-right-now"&gt;https://github.com/UnlyEd/next-right-now&lt;/a&gt;, a boilerplate to help get started with all that. Though opinionated, it's flexible enough to adapt to your own needs. The goal is to get started with a production-grade setup in a couple of hours, instead of a couple of weeks (at the very least).&lt;/p&gt;

&lt;p&gt;There are so many tools in the JS ecosystem now that one must have an opinion on what's good-enough and what isn't. It takes time to compare all css-in-js libraries, and that's just one tiny choice one must do to build isomorphic/universal web applications nowadays.&lt;/p&gt;

&lt;p&gt;Next Right Now will help you get started quickly, and can also be used as a great learning resource, because we've documented about everything.&lt;/p&gt;

&lt;p&gt;You want to build your own blog? An e-commerce website? Some showcase web app? NRN can help, from development to production.&lt;/p&gt;

&lt;p&gt;And, it's flexible. Because you will not agree with all our opinions, and that's fine. Just get rid of what you don't like, as simple as that.&lt;/p&gt;

&lt;p&gt;Let us know what you like/dislike!&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>nextjs</category>
      <category>zeit</category>
      <category>monorepo</category>
    </item>
    <item>
      <title>What technologies can help building an interactive map of nodes, that may be linked to each other (JS)</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Sun, 19 Jan 2020 11:00:27 +0000</pubDate>
      <link>https://forem.com/vadorequest/what-technologies-can-help-building-an-interactive-map-of-nodes-that-may-be-linked-to-each-other-js-10ko</link>
      <guid>https://forem.com/vadorequest/what-technologies-can-help-building-an-interactive-map-of-nodes-that-may-be-linked-to-each-other-js-10ko</guid>
      <description>&lt;p&gt;I'm looking for any tool (software, SaaS, open source libraries, etc.) that could help represent an interactive list of nodes that may be connected to each other, using javascript.&lt;/p&gt;

&lt;p&gt;Here are a few requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Renders in a browser environment (canvas, webGL, svg, etc.)&lt;/li&gt;
&lt;li&gt;Compatible desktop and mobile&lt;/li&gt;
&lt;li&gt;Interactive (detection of hovering, click event, etc.) on both nodes and connections&lt;/li&gt;
&lt;li&gt;Interconnected (node can be linked to other(s), through connections)&lt;/li&gt;
&lt;li&gt;Concept of proximity between nodes (some may be further away than other, depending on some criteria)&lt;/li&gt;
&lt;li&gt;Allows for visual customisation of the nodes/connections representation (CSS, etc.), to replace a "dot" with an image, for instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is a visual that shows what it &lt;strong&gt;&lt;em&gt;could&lt;/em&gt;&lt;/strong&gt; look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.stack.imgur.com/Y8zj8.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nHt2Xg7Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.stack.imgur.com/Y8zj8.png" alt="enter image description here"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few considerations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'm not looking for "the best" tool, but for any tool that matches those requirements.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;I'm not sure if the term "map" is the best one, don't hesitate to propose a better term.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Optionally, a demo featuring the technology would be a great addition. &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>Airtable backups made simpler with AWS Lambda &amp; S3!</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Sat, 11 Jan 2020 21:12:17 +0000</pubDate>
      <link>https://forem.com/vadorequest/airtable-backups-made-simpler-with-aws-lambda-s3-20ga</link>
      <guid>https://forem.com/vadorequest/airtable-backups-made-simpler-with-aws-lambda-s3-20ga</guid>
      <description>&lt;p&gt;Today, we released as OSS our boilerplate project &lt;a href="https://github.com/UnlyEd/airtable-backups-boilerplate"&gt;https://github.com/UnlyEd/airtable-backups-boilerplate&lt;/a&gt; which is meant to manage Airtable backups lifecycle for you.&lt;/p&gt;

&lt;p&gt;See our announcement on the Airtable forum: &lt;a href="https://community.airtable.com/t/unly-releases-an-open-source-software-for-airtable-managed-backups/26752"&gt;https://community.airtable.com/t/unly-releases-an-open-source-software-for-airtable-managed-backups/26752&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Share the OSS love!&lt;/p&gt;

</description>
      <category>airtable</category>
      <category>aws</category>
      <category>opensource</category>
    </item>
    <item>
      <title>[JS] Universal language detector</title>
      <dc:creator>Vadorequest</dc:creator>
      <pubDate>Mon, 30 Dec 2019 03:27:13 +0000</pubDate>
      <link>https://forem.com/vadorequest/js-universal-language-detector-344i</link>
      <guid>https://forem.com/vadorequest/js-universal-language-detector-344i</guid>
      <description>&lt;p&gt;We've been working with i18n (internationalization) for a few months, and we couldn't find any easy way of knowing what's the user's language that works both on the browser and on the server.&lt;/p&gt;

&lt;p&gt;There are tons of libs out there, but none that are working universally. So, we decided to outsource our proprietary implementation and release it under MIT license.&lt;/p&gt;

&lt;p&gt;Also, because we're fans of the Next.js framework, we've made an integration example with a demo available there:&lt;br&gt;
&lt;a href="https://universal-language-detector.now.sh/"&gt;https://universal-language-detector.now.sh/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/UnlyEd/universal-language-detector"&gt;https://github.com/UnlyEd/universal-language-detector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Did you get stuck too with a similar issue when implementing i18n? How did you sort it out? Does this lib help? Let us know! :)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>universal</category>
      <category>languagedetector</category>
      <category>i18n</category>
    </item>
  </channel>
</rss>
