<?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: hix.dev</title>
    <description>The latest articles on DEV Community by hix.dev (@hixdev).</description>
    <link>https://dev.to/hixdev</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%2Forganization%2Fprofile_image%2F6790%2F51dc6a0d-2a79-485d-9c2c-ea10878895cd.png</url>
      <title>DEV Community: hix.dev</title>
      <link>https://dev.to/hixdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hixdev"/>
    <language>en</language>
    <item>
      <title>Demo Title</title>
      <dc:creator>Wiktor Plaga</dc:creator>
      <pubDate>Mon, 22 Jan 2024 10:23:53 +0000</pubDate>
      <link>https://dev.to/hixdev/demo-title-4i0d</link>
      <guid>https://dev.to/hixdev/demo-title-4i0d</guid>
      <description>&lt;p&gt;Hey, it's &lt;a href="https://x.com/viktorplaga"&gt;Vik&lt;/a&gt; here. This is a half rant, half self-promoting article of my &lt;a href="https://hix.dev/new/javascript/react-next-js"&gt;freemium Next.js boilerplate&lt;/a&gt;. The one that will put an end to other boilerplates, eventually.&lt;/p&gt;

&lt;p&gt;Are you one of the boilerplate haters? Read on.&lt;/p&gt;




&lt;p&gt;If you're developing in Next.js like I do, you have most likely seen a lot of new boilerplates in the last few months.&lt;/p&gt;

&lt;p&gt;There's even a guy who compiled &lt;a href="https://www.reddit.com/r/nextjs/comments/18riglc/all_133_nextjs_boilerplates_starters/"&gt;a list of &lt;strong&gt;133&lt;/strong&gt; of them&lt;/a&gt; and posted it on Reddit:&lt;/p&gt;

</description>
      <category>api</category>
      <category>archlinux</category>
    </item>
    <item>
      <title>453 Ways to Configure Your New Next.js Project</title>
      <dc:creator>Wiktor Plaga</dc:creator>
      <pubDate>Thu, 04 Jan 2024 17:35:32 +0000</pubDate>
      <link>https://dev.to/hixdev/453-ways-to-configure-your-new-nextjs-project-514p</link>
      <guid>https://dev.to/hixdev/453-ways-to-configure-your-new-nextjs-project-514p</guid>
      <description>&lt;p&gt;Hey, Viktor here. This is a half rant, half self-promoting article of my &lt;a href="https://hix.dev/new/javascript/react-next-js"&gt;freemium Next.js boilerplate&lt;/a&gt;. The one that will put an end to all other boilerplates, eventually.&lt;/p&gt;

&lt;p&gt;Are you one of the boilerplate haters? Read on.&lt;/p&gt;




&lt;p&gt;If you're developing in Next.js like I do, you have most likely seen a lot of new boilerplates in the last few months.&lt;/p&gt;

&lt;p&gt;There's even a guy who compiled &lt;a href="https://www.reddit.com/r/nextjs/comments/18riglc/all_133_nextjs_boilerplates_starters/"&gt;a list of &lt;strong&gt;133&lt;/strong&gt; of them&lt;/a&gt; and posted it on Reddit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BaOO5ICH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A8sIQ1VRe-5lorfCUYs9sPQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BaOO5ICH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A8sIQ1VRe-5lorfCUYs9sPQ.gif" alt="A list of 133 Next.js boilerplates" title="A list of 133 Next.js boilerplates" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's me scrolling through them. Yikes.&lt;/p&gt;

&lt;p&gt;Now, let me tell you how and why I am going to make them all obsolete.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main pain point of all the boilerplates
&lt;/h2&gt;

&lt;p&gt;Behind every one of 13/133 Next.js boilerplates I have tried so far, and 133/133 I have reviewed (yawn), there's a single common pain point: &lt;strong&gt;the opinions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boilerplates are opinionated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The moment you decide to use a boilerplate, you either: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply yourself and go along with its approach to do certain things.&lt;/li&gt;
&lt;li&gt;Refactor parts of the code to your own preference.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both cost time. The benefits still heavily outweigh this cost, but there's A LOT of room for improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The so-so DX of Next.js boilerplates
&lt;/h2&gt;

&lt;p&gt;Most of the time there's a single person who wants to get the job done and just implement this authentication, payments, or whatever module, and be done with them. And then, sell the implementations.&lt;/p&gt;

&lt;p&gt;The thing is, people who once got something done rarely want to reimplement it using different tools (and I do happily, so if you came here for the &lt;strong&gt;TLDR&lt;/strong&gt;, that's basically it).&lt;/p&gt;

&lt;p&gt;This is how &lt;strong&gt;boilerplates become opinionated&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the main pain point of any type of code boilerplate:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The boilerplate's author and all other programmers who use the framework rarely use the same tech stack.&lt;/p&gt;

&lt;p&gt;me, today&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The difference can be huge and affect most of the project's files, such as the UI kit choice:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gOcZQpKd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AHUlNPSk-Lfb9FgIP2oy9vA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gOcZQpKd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AHUlNPSk-Lfb9FgIP2oy9vA.gif" alt="UI kit choices" title="UI Kits for Next.js" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;or relatively small, like a library to handle dates:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IqyPhF-F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2ApOiHu709XDdRd98j92R7tQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IqyPhF-F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2ApOiHu709XDdRd98j92R7tQ.jpeg" alt="Javascript Date-Time libraries" title="Javascript Date-Time libraries" width="624" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nevertheless, an opinion is always there.&lt;/p&gt;

&lt;p&gt;Hidden, under all the amazing features a  boilerplate gives you, lays the inconvenience of adapting a new approach to a problem  you've already solved at some point using your preferred, different tool.&lt;/p&gt;

&lt;p&gt;This is not good enough, or at least it was not for me. &lt;/p&gt;

&lt;h2&gt;
  
  
  The least opinionated Next.js boilerplate
&lt;/h2&gt;

&lt;p&gt;Let me start by telling you this: &lt;strong&gt;it is still heavily opinionated&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are conventions I introduce knowingly, and I'm sure there are some I'm not even aware of.&lt;/p&gt;

&lt;p&gt;The difference is this: I'm constantly on the lookout for different ways to approach problems. I group those into higher-level categories (UI Kits, Date-Time libraries, and so on) and aim to &lt;strong&gt;offer a choice&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I believe that this &lt;strong&gt;developer-experience-first approach&lt;/strong&gt; is The Way to deliver  products for developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next.js boilerplate with your own tech stack
&lt;/h2&gt;

&lt;p&gt;Let's take a look at the categories and their available choices. &lt;/p&gt;

&lt;p&gt;I defined &lt;strong&gt;43&lt;/strong&gt; of them so far and I have &lt;strong&gt;5&lt;/strong&gt; more in my backlog (not on this list).&lt;/p&gt;

&lt;p&gt;I gotta tell you, I enjoy the hell out of it. I truly love organizing stuff, I have endless lists with their sublists that have sublists with their own sublists, and that's just a hobby of mine.&lt;/p&gt;

&lt;p&gt;I get this weird itch when categorizing, grouping, and organizing things, and am the standing joke among my real-life friends when it comes to using a Google Calendar.&lt;/p&gt;

&lt;p&gt;Right, back to it: there are lots and lots of varying tech stacks. A multitude of combinations of different tools intertwined and often depend on one another. &lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;that's a good thing&lt;/strong&gt; if you think about it: it lets us vary our choice on  different criteria, often leading to the discovery of a better tool in the particular use case.&lt;/p&gt;

&lt;p&gt;However, at the same time, it requires a well-crafted, modular approach to keep sane when organizing those into the project structure. Let's see why.&lt;/p&gt;

&lt;h2&gt;
  
  
  453 ways to configure your Next.js project
&lt;/h2&gt;

&lt;p&gt;Currently, there are &lt;strong&gt;110&lt;/strong&gt; out of &lt;strong&gt;453&lt;/strong&gt; choices available in total (~24.28%).&lt;/p&gt;

&lt;p&gt;Now, I'm going to paste those 43 categories below, with their current implementation progress status, just to show you how much are we talking about.&lt;/p&gt;

&lt;p&gt;Don't read it tho, just scroll through.&lt;/p&gt;

&lt;p&gt;Here's the lexically sorted overview of the categories. It goes like this: &lt;strong&gt;Category: {Available Choices} / {Total Choices}&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API: 2/4&lt;/li&gt;
&lt;li&gt;Affiliation: 0/8&lt;/li&gt;
&lt;li&gt;Analytics: 7/13&lt;/li&gt;
&lt;li&gt;Animations: 1/4&lt;/li&gt;
&lt;li&gt;Authentication: 1/12&lt;/li&gt;
&lt;li&gt;Authorization: 1/3&lt;/li&gt;
&lt;li&gt;Backend: 1/9&lt;/li&gt;
&lt;li&gt;CSS Classes: 1/2&lt;/li&gt;
&lt;li&gt;Charts: 0/7&lt;/li&gt;
&lt;li&gt;Components: 1/6&lt;/li&gt;
&lt;li&gt;Configuration: 1/7&lt;/li&gt;
&lt;li&gt;Content Management System: 1/28&lt;/li&gt;
&lt;li&gt;Continuous Delivery: 2/8&lt;/li&gt;
&lt;li&gt;Cookies Consent: 0/9&lt;/li&gt;
&lt;li&gt;Data Format: 3/4&lt;/li&gt;
&lt;li&gt;Date &amp;amp; Time: 3/3&lt;/li&gt;
&lt;li&gt;Deployment: 1/12&lt;/li&gt;
&lt;li&gt;Developer Experience: 5/15&lt;/li&gt;
&lt;li&gt;E-commerce: 0/4&lt;/li&gt;
&lt;li&gt;Email Newsletter: 1/13&lt;/li&gt;
&lt;li&gt;End-to-end Tests: 1/3&lt;/li&gt;
&lt;li&gt;Environment: 1/1&lt;/li&gt;
&lt;li&gt;Feature Flags: 0/26&lt;/li&gt;
&lt;li&gt;Feedback: 0/8&lt;/li&gt;
&lt;li&gt;File Storage: 1/6&lt;/li&gt;
&lt;li&gt;Footer: 2/2&lt;/li&gt;
&lt;li&gt;Forms: 1/9&lt;/li&gt;
&lt;li&gt;Icons: 10/28&lt;/li&gt;
&lt;li&gt;Integrations: 0/7&lt;/li&gt;
&lt;li&gt;Internationalization: 1/3&lt;/li&gt;
&lt;li&gt;Language: 1/14&lt;/li&gt;
&lt;li&gt;Monitoring: 1/10&lt;/li&gt;
&lt;li&gt;Multi-Tenancy: 1/1&lt;/li&gt;
&lt;li&gt;Navigation: 3/4&lt;/li&gt;
&lt;li&gt;Notifications: 1/3&lt;/li&gt;
&lt;li&gt;Object Relational Mapper: 0/3&lt;/li&gt;
&lt;li&gt;Package Manager: 4/4&lt;/li&gt;
&lt;li&gt;Pages: 9/13&lt;/li&gt;
&lt;li&gt;Payments: 1/5&lt;/li&gt;
&lt;li&gt;Rich-Text Editor: 0/6&lt;/li&gt;
&lt;li&gt;Search Engines Optimization: 7/7&lt;/li&gt;
&lt;li&gt;Search: 0/3&lt;/li&gt;
&lt;li&gt;Social Media: 15/15&lt;/li&gt;
&lt;li&gt;Social Sharing: 1/6&lt;/li&gt;
&lt;li&gt;State Management: 1/11&lt;/li&gt;
&lt;li&gt;Transactional Emails: 1/7&lt;/li&gt;
&lt;li&gt;Translations: 1/14&lt;/li&gt;
&lt;li&gt;Type Check: 1/3&lt;/li&gt;
&lt;li&gt;Unit Tests: 1/3&lt;/li&gt;
&lt;li&gt;User Interface: 1/38&lt;/li&gt;
&lt;li&gt;Utilities: 1/8&lt;/li&gt;
&lt;li&gt;Validation: 1/2&lt;/li&gt;
&lt;li&gt;Version Control: 9/9&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First of all, I am sure that there are many, many missing. One or two might be misplaced, I'll decide and reorganize when implementing them. Some of those present are quick to add, easy wins, and fun to implement.&lt;/p&gt;

&lt;p&gt;Others affect lots and lots of project files and take much more time to add and test.&lt;/p&gt;

&lt;p&gt;And of course, those already implemented can be further improved.&lt;/p&gt;

&lt;p&gt;Again, &lt;em&gt;453&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I know, from talking to my friends, of some people who feel that it is crazy to organize and categorize this.&lt;/p&gt;

&lt;p&gt;I know from my analytics tools that lots of people are too lazy to even scroll through it. Let alone read it.&lt;/p&gt;

&lt;p&gt;All I get is the aforementioned weird itch to categorize it properly and to the best of my knowledge. Might need to get tested at some point, it is most likely an OCD. &lt;/p&gt;

&lt;h2&gt;
  
  
  The well-established Next.js boilerplate
&lt;/h2&gt;

&lt;p&gt;So, 110 things combined and supposedly working together, and 343 more to come - right. This sounds bonkers to maintain and upgrade.&lt;/p&gt;

&lt;p&gt;I'm going to tell you why it works because I'd doubt it myself if someone told me it does.&lt;/p&gt;

&lt;p&gt;Here's a quick story behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  My motivation behind the Next.js boilerplate
&lt;/h3&gt;

&lt;p&gt;After validating the initial PoC in late 2019, building the MVP over the next 2 months, and making a low but stable and slowly increasing income for another 6 months, I realized I was onto something.&lt;/p&gt;

&lt;p&gt;At this point, I decided to basically break every rule of  indiehacking-solopreneurship-saas venture. The rules I broke:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build and launch ASAP.&lt;/li&gt;
&lt;li&gt;Offer preorders / sell a promise of delivery and not an actual product.&lt;/li&gt;
&lt;li&gt;Build multiple half-assed products.&lt;/li&gt;
&lt;li&gt;Quickly move on to the next venture after the previous one did not bring tons of money.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach was never going to work with what I had in mind - the system behind it is simply too large.&lt;/p&gt;

&lt;p&gt;I was never one of those reel-spawning thread-posting social-media superstars that are going to hook you up with whatever made you waste time scrolling these nonsense apps.&lt;br&gt;
It is fair to say at this point tho that I disciplined myself to maintain 𝕩 presence anyway - we'll see how it goes.&lt;/p&gt;

&lt;p&gt;Knowing this about myself, on top of having a valid idea and the whole system in mind, I decided to keep my low-effort &amp;amp; well-paid job for as long as I could, and just build it as a side project.&lt;/p&gt;

&lt;p&gt;I'm pretty sure I could be considerably rich right now, maintaining an AI wrapper to talk to your PDFs or analyzing your iMessage texts to tell you that your GF is a bitch.&lt;/p&gt;

&lt;p&gt;But I am simply not enough into any of those.&lt;/p&gt;

&lt;p&gt;I'm in for the long game, into the project I truly value. Making money on the  aforementioned stuff seems a little boring and too easy in technical terms, anyway.&lt;/p&gt;

&lt;p&gt;Right, I digress too much. Back to it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Next.js project generator, and not the Next.js boilerplate
&lt;/h3&gt;

&lt;p&gt;I decided to double-down on building the boilerplate that's not a git repo with a double-digit number of branches implementing varying tools.&lt;/p&gt;

&lt;p&gt;I'd rather have a system to spin up a series of Next.js projects whenever there's an update to any of the NPM packages used in it.&lt;/p&gt;

&lt;p&gt;I came up with this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cfZ4Qro3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AGxLHs6mE1LNcf21LUtU-aA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cfZ4Qro3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AGxLHs6mE1LNcf21LUtU-aA.jpeg" alt="Auto-Update UML" title="Auto-Update UML" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I poll all dependencies from their sources (Github, NPM, and so on) in scheduled jobs and whenever there's a new version, I build a predefined amount of Next.js projects on my servers and run a battery of tests on them.&lt;/p&gt;

&lt;p&gt;What does it mean that I build those, exactly? You can see this for yourself: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://hix.dev/new/javascript/react-next-js"&gt;the Next.js project starter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;Select&lt;/strong&gt; button under the &lt;strong&gt;Basic&lt;/strong&gt; bundle. &lt;strong&gt;It is free&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the yellow &lt;strong&gt;Proceed&lt;/strong&gt; button underneath.&lt;/li&gt;
&lt;li&gt;Create an account. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You don't need to verify it&lt;/strong&gt;, so it can be any fake, whatever. I don't use those emails anyway, so I don't care.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deep dive into generating a Next.js project
&lt;/h2&gt;

&lt;p&gt;After you proceed, you'll see a version of this, with a real-time build log:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WAZ4-XR_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A5dbFqQFoKed5cn5w5FbTGg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WAZ4-XR_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A5dbFqQFoKed5cn5w5FbTGg.gif" alt="Next.js project's" title="Next.js project's build log" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When it is done building after a few minutes, you download the project it built.&lt;/p&gt;

&lt;p&gt;Let's talk about the build log itself first.&lt;/p&gt;
&lt;h3&gt;
  
  
  Rendering Next.js project files
&lt;/h3&gt;

&lt;p&gt;A lot is happening. Here's a first slice of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[06:37:06.849] start: 2024-01-03
[06:37:06.868] run: git init
[06:37:06.890] Initialized empty Git repository in /opt/app/tmp/d6ea4cbe-4801-4290-85b5-bcb0adda1e49/wonderful_teeth/.git/
[06:37:06.927] [main (root-commit) 9977a72] Initial commit
[06:37:06.929] render: template files
[06:37:06.951]       create app/(json)/manifest.json/route.ts
[06:37:06.967]       create app/(json)/utils/stringify.ts
[06:37:07.009]       create app/(xml)/rss.xml/route.ts
[06:37:07.040]       create app/(xml)/sitemap.xml/route.ts
[06:37:07.058]       create app/(xml)/utils/stringify.ts
...
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we see here is basically a series of files being rendered into our new project. In this case, the &lt;em&gt;manifest.json&lt;/em&gt;, &lt;em&gt;rss.xml&lt;/em&gt;, and &lt;em&gt;sitemap.xml&lt;/em&gt;, later served at the root of the Next.js project's domain, and then some utilities to handle both formats.&lt;/p&gt;

&lt;p&gt;So what is happening? There's a process on my server that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Takes an input from the form you've submitted when generating the project, &lt;/li&gt;
&lt;li&gt;Renders files based on this input.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, one of the fun little things I can do thanks to this approach is further project customization based on the developer's preferences.&lt;/p&gt;

&lt;p&gt;Consider this opinionated and somehow useful configuration option that is available in Next.js:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oMF6cXHl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AFJMCqiO9j_QUFBteAot2qQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oMF6cXHl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AFJMCqiO9j_QUFBteAot2qQ.jpeg" alt="Use Next.js private dir naming" title="Use Next.js private dir naming" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A little explanation, as I don't know if you're aware of what it means. Doing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── about
│   ├── components ← w/o underscore prefix
│   │   ├── page.tsx
│   │   └── DearDiary.tsx
│   └── page.tsx
└── api
    └── (xml)
        └── utils ← w/o underscore prefix
            └── route.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;results in an HTTP endpoint &lt;em&gt;/utils&lt;/em&gt; and a page &lt;em&gt;/about/components&lt;/em&gt; being exposed while using the underscore prefix in the &lt;code&gt;_components&lt;/code&gt; and &lt;code&gt;_utils&lt;/code&gt; directories, 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;├── about
│   ├── _components ← w/ underscore prefix
│   │   ├── page.tsx
│   │   └── DearDiary.tsx
│   └── page.tsx
└── api
    └── (xml)
        └── _utils ← w/ underscore prefix
            └── route.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prevents that from happening. The same thing applies to any directory under the &lt;code&gt;app&lt;/code&gt; root.&lt;/p&gt;

&lt;p&gt;Now, not everyone likes the &lt;code&gt;_&lt;/code&gt; prefixes and Next.js does not force you to use them - it simply introduces an opinionated, optional convention that addresses a particular use case.&lt;/p&gt;

&lt;p&gt;Let's say we want this configured. If we select this configuration option and proceed with generating the project, the build log renders this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[06:37:06.929] render: template files
[06:37:06.951]       create app/(json)/manifest.json/route.ts
[06:37:06.967]       create app/(json)/_utils/stringify.ts ← here
[06:37:07.009]       create app/(xml)/rss.xml/route.ts
[06:37:07.040]       create app/(xml)/sitemap.xml/route.ts
[06:37:07.058]       create app/(xml)/_utils/stringify.ts ← here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All the relevant directories are now rendered with the &lt;code&gt;_&lt;/code&gt; prefix, simple as that.&lt;/p&gt;

&lt;p&gt;Now consider all the manual labor that's included in renaming those directories if you decide you want the prefixes in a boilerplate that doesn't offer them.&lt;/p&gt;

&lt;p&gt;I'd probably live without them, because who cares, right? Everybody will surely just remember to never create &lt;em&gt;utils/error.ts&lt;/em&gt; anywhere under the &lt;em&gt;app&lt;/em&gt; dir, that's easy.&lt;/p&gt;

&lt;p&gt;OK, I think I made my point.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formatting and linting Next.js project files
&lt;/h3&gt;

&lt;p&gt;Let's see what happens further down the logs. After the long list of created template files, there are those entries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[06:37:15.540] install: template scripts
[06:37:15.541] run: prettier
[06:37:21.226] run: eslint
[06:37:46.651] run: stylelint
[06:37:48.451] run: sqlfluff
[06:37:49.316] ==== finding fixable violations ====
[06:37:49.317] FORCE MODE: Attempting fixes...
[06:37:52.942] ==== no fixable linting violations found ====
[06:37:52.944] All Finished!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It means that all the generated code is formatted and then checked against every linter's violations. This runs with the least verbosity possible because logs were endless otherwise.&lt;/p&gt;

&lt;p&gt;At this point, the formatting and linting configuration is default-only (yet minimal), but I'm going to allow the further setup of every linter in the next iterations.&lt;/p&gt;

&lt;p&gt;Pretty straightforward, moving on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing the Next.js project dependencies
&lt;/h3&gt;

&lt;p&gt;What we see further down the logs is the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[06:37:53.162] run: npm install
[06:39:27.746] 
[06:39:27.758] added 682 packages, and audited 683 packages in 2m
[06:39:27.759] 
[06:39:27.760] 271 packages are looking for funding
[06:39:27.761]   run `npm fund` for details
[06:39:27.762] 
[06:39:27.763] found 0 vulnerabilities
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build process installs all the predefined dependencies using the package manager of our choice:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H-WD6f0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A0fq5LsrFt1my_nGHWb5AOA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H-WD6f0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A0fq5LsrFt1my_nGHWb5AOA.jpeg" alt="Node Package Managers" title="Node Package Managers" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see it is NPM in this case. Anyway, this here is one crucial step and I'm going to dive a little deeper into it.&lt;/p&gt;

&lt;p&gt;Right now most of the versions of dependencies defined in the Next.js project's &lt;em&gt;package.json&lt;/em&gt; file are prefixed with the tilde &lt;code&gt;~&lt;/code&gt;. What does it mean?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tilde (~) notation: It is used to match the most recent patch version.&lt;/p&gt;

&lt;p&gt;npmjs.org&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So if we have &lt;code&gt;"pkg": "~1.2.3"&lt;/code&gt; and there's &lt;code&gt;1.3.0&lt;/code&gt; available, it won't be installed, but the &lt;code&gt;1.2.4&lt;/code&gt; will be.&lt;/p&gt;

&lt;p&gt;Side note, if you're wondering: using a caret &lt;code&gt;^&lt;/code&gt; prefix in place of the &lt;code&gt;~&lt;/code&gt; tilde makes it install minor updates such as &lt;code&gt;1.3.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You might have noticed that &lt;em&gt;"most of the versions"&lt;/em&gt; 4 paragraphs before. Not all are  defined like that: for example, the &lt;code&gt;next&lt;/code&gt; package is locked without any prefix. This makes the most sense for sane boilerplate updates.&lt;/p&gt;

&lt;p&gt;Thanks to this approach, I can now build a multitude of separate projects where only the chosen dependencies are bumped up.&lt;/p&gt;

&lt;p&gt;Here comes the aforementioned build-and-test automation: &lt;/p&gt;

&lt;p&gt;Whenever a new version of any of the dependencies is released and fetched by my backend, I simply schedule a series of project builds that, other than the new version, maintain the currently available boilerplate setup.&lt;/p&gt;

&lt;p&gt;This obviously depends on the dependency, but effectively comes down to 15-25 projects per update. I'm telling you, it is building a lot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing the newly created Next.js project
&lt;/h3&gt;

&lt;p&gt;If you configure the new project with any testing library, the test suite that comes with the boilerplate is run for good measure, once all the previous steps are complete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[06:40:13.368] run: npm run test:unit:run
[06:40:13.525] 
[06:40:13.526] &amp;gt; wonderful_teeth@1.0.0 test:unit:run
[06:40:13.527] &amp;gt; DOTENV_CONFIG_PATH=.env.test vitest run
[06:40:13.863] 
[06:40:13.864]  RUN  v0.34.6 wonderful_teeth
[06:40:13.865] 
[06:40:13.855]  ✓ tests/lib/url.test.ts  (3 tests) 3ms
[06:40:13.904]  ✓ tests/lib/cms.test.ts  (9 tests) 194ms
[06:40:13.919] 
[06:40:13.921]  Test Files  2 passed (2)
[06:40:13.922]       Tests  12 passed (12)
[06:40:13.923]    Start at  01:02:31
[06:40:13.925]    Duration  2.06s (transform 655ms, setup 64ms, collect 991ms, tests 197ms, environment 649ms, prepare 184ms)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially useful for maintenance purposes and I am defining more tests with almost every new boilerplate choice added.&lt;/p&gt;

&lt;p&gt;Now, if you're into indiehackers/buildinpublic realm, you are probably familiar with opinions / "pro tips" like this one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--snZNqkbE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AetUIZoU-aX0sXqjM0Cj6zQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--snZNqkbE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AetUIZoU-aX0sXqjM0Cj6zQ.jpeg" alt="Skip the tests...?" title="Skip the tests...?" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While I do agree with the general "move fast" approach when we're talking product-market fit validation, I'm pretty sure that nothing will ever change my mind about being able to write a quick test to make sure that my code works, especially when it comes to more complex business logic.&lt;/p&gt;

&lt;p&gt;Side note: the above is coming from an author of I think &lt;a href="https://boringcashcow.com/post/boring-business-showcase-making-a-living-by-selling-saas-boilerplates#shipfast-32kmonth"&gt;the most profitable Next.js boilerplate&lt;/a&gt; available. I have a great respect for what this person has done business-wise.&lt;/p&gt;

&lt;p&gt;Imagine selling access to some half-assed-no-tests-3-static-pages Github repository to 1.3k+ developers, &amp;gt;$100 each, calling your product way too close to "sh!t fast", making it live up to the name by not including any tests and then bragging about it in the newsletter they subscribe to.&lt;/p&gt;

&lt;p&gt;It is sometimes hard for me to convey a non-sarcastic message in the written word, but the one above is 100% serious: I really respect what he did, and am following this unbelievable l'événement closely. I'm pretty sure I can learn a lot from this guy when it comes to sales.&lt;/p&gt;

&lt;p&gt;Here, I digressed again. Sorry, wake up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The current state of my Next.js boilerplate
&lt;/h2&gt;

&lt;p&gt;Lots of ranting and little-to-no substance so far. Yup, that's me. Time to see what's inside my boilerplate at the moment of writing this.&lt;/p&gt;

&lt;p&gt;The simplest way to do that is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visiting the &lt;a href="https://hix.dev/new/javascript/react-next-js"&gt;Next.js Boilerplate page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Playing around the &lt;a href="https://nextjs-bootstrap-hix.vercel.app"&gt;Next.js Boilerplate demo&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But, as some people would rather read it here for unknown reasons, others avoid clicking some random outgoing links out of either paranoia or only scanning the headings, and it is very beneficial for SEO, I'm going to present some of my Next.js boilerplate's features below.&lt;/p&gt;

&lt;h3&gt;
  
  
  4 out of 8 predefined Next.js boilerplate bundles
&lt;/h3&gt;

&lt;p&gt;Going through both the &lt;a href="https://vercel.com/templates"&gt;Vercel Website Templates&lt;/a&gt; and the &lt;a href="https://github.com/vercel/next.js/tree/canary/examples"&gt;Next.js repository examples&lt;/a&gt; I have defined 8 types of projects most commonly built with Next.js:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Static Page&lt;/li&gt;
&lt;li&gt;Blog&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Software as a Service&lt;/li&gt;
&lt;li&gt;E-commerce&lt;/li&gt;
&lt;li&gt;Portfolio&lt;/li&gt;
&lt;li&gt;Real-time App&lt;/li&gt;
&lt;li&gt;Tutorials&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;at this point, the first 4 of them are available in my boilerplate, &lt;strong&gt;the first one being completely free&lt;/strong&gt;. I'll explain more of that further down.&lt;/p&gt;

&lt;p&gt;So if you &lt;strong&gt;Select&lt;/strong&gt; any of the bundles below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rv9jATjx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AuL24SjPDWdc7oipXLeIlKQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rv9jATjx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AuL24SjPDWdc7oipXLeIlKQ.gif" alt="Predefined Bundles" title="Predefined Bundles" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;the boilerplate configuration form below is prepopulated with choices that make it possible to build the selected kind of project.&lt;/p&gt;

&lt;p&gt;One more thing: &lt;strong&gt;you can pick more than one&lt;/strong&gt;. Select it, deselect it, click like a madman, and possibly break something. Just refresh the page if (when?) you do.&lt;/p&gt;

&lt;p&gt;All it does is select products in the form below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Naming the Next.js project
&lt;/h3&gt;

&lt;p&gt;I have seriously watched Hotjar sessions recording people clicking the &lt;code&gt;random()&lt;/code&gt; name generator more than 15 times, and then leaving the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y9nK-dPJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2ABFrtFXWyff7JnM5F62itnw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y9nK-dPJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2ABFrtFXWyff7JnM5F62itnw.gif" alt="Random Project Name Generator" title="Random Project Name Generator" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is also my sister's favorite feature. Have at it. Or type yours, if you're that boring.&lt;/p&gt;

&lt;h3&gt;
  
  
  Next.js configuration categories and their choices
&lt;/h3&gt;

&lt;p&gt;The next part is the whole essence of my project generator. These are the aforementioned choices grouped under the categories they belong to.&lt;/p&gt;

&lt;p&gt;There are two types of those categories, the first being a single-choice category:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OQGI14Na--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A8kBtwQU8cKOVxyOCcu_9SQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OQGI14Na--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A8kBtwQU8cKOVxyOCcu_9SQ.gif" alt="Single-Choice Category" title="Single-Choice Category" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and the other type is a multiple-choice category:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yPGkss2M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A2g9cjf02Uz8Yo-2GvCijrA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yPGkss2M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A2g9cjf02Uz8Yo-2GvCijrA.gif" alt="Multiple-Choice Category" title="Multiple-Choice Category" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, it is &lt;strong&gt;obviously&lt;/strong&gt; almost always possible to configure multiple products of the single-choice category in any project. There's just very little reason to do so.&lt;/p&gt;

&lt;p&gt;Even worse, it might lead to unnecessary and disadvantageous misunderstandings or even bugs.&lt;/p&gt;

&lt;p&gt;You gotta love it when one dev runs &lt;code&gt;bun install&lt;/code&gt; and the second one does &lt;code&gt;pnpm install&lt;/code&gt;, while running &lt;code&gt;npm start&lt;/code&gt; on production, right?&lt;/p&gt;

&lt;p&gt;Yeah, right. Moving on: these single choices have some links to them, like Github stars, package(s) license(s), and their versions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b0bexnwm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AKI7YPSO1facFrqisjbDFAg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b0bexnwm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AKI7YPSO1facFrqisjbDFAg.jpeg" alt="Choice Stars, License and Version" title="Choice Stars, License and Version" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the very right of the choice tile, there's also an &lt;strong&gt;Info&lt;/strong&gt; tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XdjhyEBe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2ATVYWm8kLGAKJV0ssVZAjmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XdjhyEBe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2ATVYWm8kLGAKJV0ssVZAjmg.png" alt="Choice Expandable Info" title="Choice Expandable Info" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;that expands into a list of all the packages installed directly into the &lt;em&gt;package.json&lt;/em&gt; file, along with their licenses, versions, and release dates:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tTfbq13p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AVprSIPuUxuDGZME0yEMBgw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tTfbq13p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AVprSIPuUxuDGZME0yEMBgw.jpeg" alt="Choice Expanded" title="Choice Expanded" width="800" height="996"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below, there's a short summary of the choice implementation and what selecting it does exactly.&lt;/p&gt;

&lt;p&gt;As I have mentioned previously, a lot of those choices are depending on each other. If you pick one that does, it is clearly indicated with an instant feedback:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wi9eaxbs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2APgWIIfd5rlH0uUcJUVVMyw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wi9eaxbs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2APgWIIfd5rlH0uUcJUVVMyw.jpeg" alt="Choice Requirements" title="Choice Requirements" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So when this pops up, simply click the link and you're redirected to the required choice. It is also visible in the left-hand side menu at all times.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vPyQ6b3n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A69ia00v0hx2oCMR-ads1Tw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vPyQ6b3n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A69ia00v0hx2oCMR-ads1Tw.jpeg" alt="Generator navigation" title="Generator navigation" width="624" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every group of choices comes with the *&lt;em&gt;Suggest changes&lt;/em&gt; button at the bottom, and most of them also have an expandable list of packages that are yet to be implemented:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zsM8_xgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AP2txKCRd5RNg_O5HHilFTA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zsM8_xgn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AP2txKCRd5RNg_O5HHilFTA.gif" alt="Unavailable Packages" title="Unavailable Packages" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that wraps it up at this point, I think.&lt;/p&gt;

&lt;h3&gt;
  
  
  The available Next.js boilerplate configuration choices
&lt;/h3&gt;

&lt;p&gt;Being a good boilerplate maker, I started out with a minimal project configuration that implements the choices that I know best.&lt;/p&gt;

&lt;p&gt;Now, there are lots and lots of configurable categories, and nothing good would do listing them all here. I'd rather mention a few that are kinda big ones and affect lots of other code. Some of those are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UI Kit: &lt;a href="https://getbootstrap.com/"&gt;Bootstrap&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;API: &lt;a href="https://ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm"&gt;REST API&lt;/a&gt; and &lt;a href="https://nextjs.org/docs/app/api-reference/functions/server-actions"&gt;Next.js Server Actions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Backend as a Service: &lt;a href="https://supabase.com/"&gt;Supabase&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Forms: &lt;a href="https://react-hook-form.com/"&gt;React Hook Form&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Internationalization: &lt;a href="https://next-intl-docs.vercel.app/"&gt;Next intl&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those aren't all the choices, obviously, but it gives a rough idea of what's inside.&lt;/p&gt;

&lt;p&gt;Now, this was a v0.0.0, the very first release that some of my friends were kind enough to try out and critique. I slowly expand the available choices every day.&lt;/p&gt;

&lt;p&gt;But first, &lt;strong&gt;what does selecting one of those choices mean exactly?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me explain, as some of the very impolite and uneducated in giving constructive feedback people I met so far thought that I charge money for &lt;code&gt;npm install react-hook-forms&lt;/code&gt; 💔.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8QWY5_oC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AEnUTrFcJ9JLWwxTrBqeB3Q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8QWY5_oC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AEnUTrFcJ9JLWwxTrBqeB3Q.jpeg" alt="Gotta love people" title="Gotta love people" width="508" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gotta love the Internet tho. But seriously, downvote this guy when you meet him, for a good measure - thanks. Just kidding, my army of bots did enough already.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--orNE92Yv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AtTyKLl97jUF5UWL7xOuQpg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--orNE92Yv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AtTyKLl97jUF5UWL7xOuQpg.jpeg" alt="Forms / React Hook Form" title="Forms / React Hook Form" width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What does it mean then to select the React Hook Form choice in the Forms category? It means that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every form other than authentication forms uses it.&lt;/li&gt;
&lt;li&gt;Input fields are predefined to use it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you for example choose anything from the Newsletter or the Payments categories, what you get are fully functioning newsletter subscription and checkout forms configured with the React Hook Form package.&lt;/p&gt;

&lt;p&gt;The same thing applies to all team managements forms, an image upload form, as well as a user credentials form.&lt;/p&gt;

&lt;p&gt;And then, at the very minimum, if you don't select any of the above, you still get the basic input components configured to just work with the React Hook Form package, styled with the UI Kit of your choice and optionally strong-typed if you chose anything from the Type Check category.&lt;/p&gt;

&lt;p&gt;All of the above come w/o any extra charge. If you can cross-configure these in time that's worth less than $1.99 - good for you, you're officially allowed not to use my boilerplate.&lt;/p&gt;

&lt;p&gt;But hey, the forms are an example that's pretty easy to explain. Forms are used very often and understandably some might consider charging money for configuring them.&lt;/p&gt;

&lt;p&gt;And what about the paid configuration of all the free icon libraries?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n-TRP3_D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A9dVu9aTfx_R51cKGauwAIA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n-TRP3_D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A9dVu9aTfx_R51cKGauwAIA.jpeg" alt="Free icons libraries" title="Free icons libraries" width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why do I pay $0.99 for those, you ask. Isn't &lt;strong&gt;this&lt;/strong&gt; selling the &lt;code&gt;npm install&lt;/code&gt;, you ask. Well, it is not.&lt;/p&gt;

&lt;p&gt;You get a ready-to-use &lt;code&gt;&amp;lt;Icon /&amp;gt;&lt;/code&gt; component that maps most of the website interactions to an icon from the chosen library. This is easiest to understand by looking at the Navbar links:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZYQ6i29Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AKhn31qmyEp6bXaI7HFQMug.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZYQ6i29Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AKhn31qmyEp6bXaI7HFQMug.jpeg" alt="Navbar links with icons" title="Navbar links with icons" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and the Footer links:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N9B4gdIf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AeB-UF5Ux9uUAcXa8D5AIMg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N9B4gdIf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AeB-UF5Ux9uUAcXa8D5AIMg.jpeg" alt="Footer links with icons" title="Footer links with icons" width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are some more, such as &lt;strong&gt;Accept&lt;/strong&gt; and &lt;strong&gt;Delete&lt;/strong&gt; options, with &lt;strong&gt;36&lt;/strong&gt; actions mapped in total.&lt;/p&gt;

&lt;p&gt;Here's the full list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.About /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Blog /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Check /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ChevronDown /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ChevronLeft /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ChevronLeftDouble /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ChevronRight /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ChevronRightDouble /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ChevronUp /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Close /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Contact /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Delete /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Docs /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Dots /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Email /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Info /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Link /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Locale /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Mailing /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Menu /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ModeDark /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ModeLight /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.ModeSystem /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Money /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.News /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Phone /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Privacy /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Security /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Settings /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.SideNav /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.SignIn /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.SignOut /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.SignUp /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Team /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Icon.Terms /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good luck doing these for $0.99 - but again, if you can, or simply feel that it is not worth the money, you know what the beauty of my Next.js boilerplate is?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can simply skip the choice&lt;/strong&gt;, &lt;code&gt;npm install&lt;/code&gt; it manually, grab your $0.99, and go get yourself a Red Bull to create all those 36 components by hand a little bit faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  Further plans for my Next.js boilerplate
&lt;/h3&gt;

&lt;p&gt;There's a big fat chance that 100% of your favorite tech stack is not supported by my Next.js boilerplate as of today.&lt;/p&gt;

&lt;p&gt;Tbh, I'd be happily surprised if 50% of it was supported.&lt;/p&gt;

&lt;p&gt;The choices that are inside and available at the moment grow constantly. I develop the product daily.&lt;/p&gt;

&lt;p&gt;It does not mean that I release one new choice a day. Those are interdependent on many levels, and I like to take my time to carefully implement them to work together smoothly.&lt;/p&gt;

&lt;p&gt;My primary focus right now is implementing more UI Kits. So what I'm doing now is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Bootstrap&lt;/strong&gt; → &lt;strong&gt;⬛ DaisyUI&lt;/strong&gt; → &lt;strong&gt;⬛ ShadcnUI&lt;/strong&gt; → &lt;strong&gt;⬛ MaterialUI&lt;/strong&gt; → &lt;strong&gt;⬛ MantineUI&lt;/strong&gt; → &lt;strong&gt;⬛ NextUI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is the current high-level priority, and I'm more than halfway through adding the DaisyUI. I chose it, despite being less popular than Shadcn, because it has more ready-to-use components, and I got lots of feedback that people want anything with TailwindCSS.&lt;/p&gt;

&lt;p&gt;Speaking of ShadcnUI, there's one super-cool feature that I plan to roll out along with it: if you used it, you probably know that there's a variation to how you initialize it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Selecting a so-called &lt;strong&gt;style&lt;/strong&gt;, between the &lt;strong&gt;Default&lt;/strong&gt; and &lt;strong&gt;New York&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Selecting a &lt;strong&gt;base color&lt;/strong&gt; from a list of &lt;strong&gt;Slate&lt;/strong&gt;, &lt;strong&gt;Gray&lt;/strong&gt;, &lt;strong&gt;Zinc&lt;/strong&gt;, &lt;strong&gt;Neutral&lt;/strong&gt;, and &lt;strong&gt;Stone&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's what it looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4hHegJVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AvPhJrtkIrWzxe9AL2EAwNw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4hHegJVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2AvPhJrtkIrWzxe9AL2EAwNw.gif" alt="ShadcnUI initialization" title="ShadcnUI initialization" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(This is actually very similar to what my PoC was back in 2019, &lt;a href="https://www.youtube.com/watch?v=yNVN7bFjrOs"&gt;see it on YouTube&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I am going to have an ability to further configure the selected choice, providing sane defaults at the same time.&lt;/p&gt;

&lt;p&gt;There's a backend in place to do that already, as I decided I need it during researching choices for my initial generators, it's just not exposed to my UI as of yet.&lt;/p&gt;




&lt;p&gt;Obviously, to not go crazy styling the UI, I'm adding some of the simpler choices from time to time.&lt;/p&gt;

&lt;p&gt;But still, I reckon that adding more UI frameworks opens my boilerplate to the widest number of developers, as well as doubles down on an unfair advantage that I have over any other Next.js boilerplate that I know of.&lt;/p&gt;

&lt;p&gt;I'm not going all-in for the low-hanging fruits either. My goal is to distribute my time evenly between both the hard and the easy to implement categories.&lt;/p&gt;

&lt;p&gt;Ultimately, I aim to keep delivering new choices in many categories somehow evenly.&lt;/p&gt;

&lt;p&gt;This means that I most likely won't sit down one day and add all the Affiliation services integrations - I'd rather take 10 fairly easy-to-implement categories and add a single choice from each one of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Purchasing a Next.js boilerplate
&lt;/h2&gt;

&lt;p&gt;Most of the Next.js boilerplates I've seen so far have what looks like a pretty generous licensing model: Pay once, get Unlimited Lifetime Access.&lt;/p&gt;

&lt;p&gt;Big, big words. Let's now read into an example of the Terms of Service behind one of those licenses:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This license entails a straightforward and flexible arrangement, exempting users from recurring fees or subscriptions. However, it is important to acknowledge that &lt;strong&gt;the licensor retains the right to terminate the license without conditions or prerequisites&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gotta love the &lt;strong&gt;Unlimited&lt;/strong&gt; and &lt;strong&gt;Lifetime&lt;/strong&gt;, right? Talk about a bus factor, too.&lt;/p&gt;




&lt;p&gt;Next comes the price: other than open-source that's obviously free to use, I don't think that any premium boilerplate I saw starts below $100.&lt;/p&gt;

&lt;p&gt;This is probably a fair price for the money if you're building a project that is going to make it, or if you consider how long would it take to do that yourself.&lt;/p&gt;

&lt;p&gt;But I still think it would benefit other types of projects a lot if it were cheaper, and I don't need that much to run it and be profitable, anyway.&lt;/p&gt;

&lt;p&gt;So here's what I came up with:&lt;/p&gt;

&lt;h3&gt;
  
  
  Free options
&lt;/h3&gt;

&lt;p&gt;I decided to make some choices always available &lt;strong&gt;for free&lt;/strong&gt;. These are for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI kits: Bootstrap, DaisyUI, ShadcnUI, and the like,&lt;/li&gt;
&lt;li&gt;API implementation: REST, Server Actions, GraphQL, tRPC,&lt;/li&gt;
&lt;li&gt;Most of the static code analysis tools: Prettier, ESLint, Editorconfig.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've been developing in Next.js long enough, you have definitely visited the &lt;a href="https://github.com/vercel/next.js/tree/canary/examples"&gt;Next.js examples&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6QPgCzu3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A4_xRPAtNDPjogJjlanrGDQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6QPgCzu3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/proxy/1%2A4_xRPAtNDPjogJjlanrGDQ.jpeg" alt="Next.js repository examples" title="Next.js repository examples" width="624" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a so-so-maintained directory of the smallest Next.js applications implementing various single integrations.&lt;/p&gt;

&lt;p&gt;The problem with those: combining those is not guaranteed to work. Or more likely guaranteed not to work, in most cases.&lt;/p&gt;

&lt;p&gt;With my free plan, I aim to make it much less painful to try out some of those. I keep a part of the generator always free and plan to expand it to more free choices once I reach enough subscribers to fully support the ongoing maintenance and my cheap lifestyle.&lt;/p&gt;

&lt;h3&gt;
  
  
  One-time payments
&lt;/h3&gt;

&lt;p&gt;If you build a single project and do know what you want to use, this is the way to go. Selecting a choice under every paid category available right now costs exactly &lt;strong&gt;$63.26&lt;/strong&gt;. This is still close to 2x cheaper than most of the competition.&lt;/p&gt;

&lt;p&gt;However, if you do go above the &lt;strong&gt;$24.99&lt;/strong&gt; (the subscription cost), simply subscribe and cancel instead.&lt;/p&gt;

&lt;p&gt;Some people don't, and I still can't figure out why. Might have something to do with my broken Stripe Billing Portal link. Just kidding, I remember fixing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subscriptions
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;Building a lot of products,&lt;/li&gt;
&lt;li&gt;Learning Next.js and want to try out various stuff,&lt;/li&gt;
&lt;li&gt;Deciding on your tech-stack,&lt;/li&gt;
&lt;li&gt;Choosing above &lt;strong&gt;$24.99&lt;/strong&gt; in the &lt;strong&gt;One-time payment&lt;/strong&gt; configuration,&lt;/li&gt;
&lt;li&gt;Loving my generator and want to support it while occasionally using it,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this is the way to go. It is 4x cheaper than the $100 I've never seen previously. And of course, nothing stops you from canceling it at any time.&lt;/p&gt;

&lt;p&gt;I am also planning to later research and introduce a location-based payment system to further discount low-income countries and make it more affordable there.&lt;/p&gt;

&lt;p&gt;So stay tuned to exploit it using your VPN.&lt;/p&gt;

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

&lt;p&gt;That's it: my boilerplate to render all existing Next.js boilerplates obsolete. I kinda hope you enjoyed my way-too-long rant at least half as much as I enjoyed writing it. I doubt it tho.&lt;/p&gt;

&lt;p&gt;Time for my final words:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I don't give to Fs about the so popular indie-hacking-public-building approach of short feedback loops and will not abandon this particular project, short of the Next.js/Internet/Poland apocalypse.&lt;/li&gt;
&lt;li&gt;I build it for my 5th year in a row now. I don't care if it's worth my time in terms of money, because its main priority for me is a technical challenge it presents that I can approach in the most elegant way I can.&lt;/li&gt;
&lt;li&gt;I care for and crave constructive feedback. Seriously, rip me a new one. However, if you're disrespectful/impolite the way the &lt;a href="https://www.reddit.com/user/Aromatic_Cap_4021"&gt;u/Aromatic_Cap_4021&lt;/a&gt; was to me on Reddit, you might read about it in the next 4.5k+ words long rant sometime in the future. Before wasting your time, please be aware that it will not make me stop building this tool, and that I will smear you back.&lt;/li&gt;
&lt;li&gt;If you read this, it is safe to say that you know by now how amazing I am with people. Despite that, I challenged myself in this New Year of 2024 to build a steady Internet presence. Right now, it comes down to posting 5 medium-to-high-quality posts and the same amount of comments daily. Today it took me 25 minutes, I think I can get it down to 15 - it is only my second week. Anyway, I do it, against my better judgment, mostly to grow my boilerplate. &lt;a href="https://x.com/viktorplaga"&gt;Let's connect on 𝕏&lt;/a&gt;, if you're OK with me telling what I think of your messages without any type of lubricant and not thinking twice before eventually unfollowing you when bored/annoyed/ridiculed by your content.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here goes. I felt for a moment like I should write some kind of "sorry" for this way too long whatever. But then, I'm not. See you again someday.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>My new draft</title>
      <dc:creator>Wiktor Plaga</dc:creator>
      <pubDate>Sun, 31 Dec 2023 07:01:04 +0000</pubDate>
      <link>https://dev.to/hixdev/my-new-draft-4j8</link>
      <guid>https://dev.to/hixdev/my-new-draft-4j8</guid>
      <description>&lt;p&gt;My new draft&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Software Project Checklist</title>
      <dc:creator>Wiktor Plaga</dc:creator>
      <pubDate>Sat, 25 Mar 2023 14:25:01 +0000</pubDate>
      <link>https://dev.to/hixdev/software-project-checklist-4chb</link>
      <guid>https://dev.to/hixdev/software-project-checklist-4chb</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you are about to start a new software project or wish to improve the maintainability of an already existing one, this checklist might be just the resource you need.&lt;/p&gt;

&lt;p&gt;How you set up your project will have a considerable effect on how easy it will be to maintain one as time goes on.&lt;/p&gt;

&lt;p&gt;With all the new frameworks and libraries popping up on Github on almost a daily basis, it's hard to wrap your head around what exactly are the essential steps and tools you need to pick to have a healthy project for both you as a developer and your users.&lt;/p&gt;

&lt;p&gt;This article lists all that as a checklist so that you can always come back to it and check if you are missing any opportunities for an easier time with your project.&lt;/p&gt;

&lt;p&gt;In case you'd like to have a more visual representation of this checklist, along with a deeper explanation of options, check out this &lt;a href="https://hix.dev/new/ruby/ruby-on-rails"&gt;project builder&lt;/a&gt; I have made as a part of &lt;a href="https://hix.dev/"&gt;Hix&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;It's currently available only for Ruby on Rails, but it will help you get a general idea, which is more or less the same for every other programming framework.&lt;/p&gt;

&lt;p&gt;Let's roll.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;
Every project

&lt;ul&gt;
&lt;li&gt;Version Control&lt;/li&gt;
&lt;li&gt;Unit Tests&lt;/li&gt;
&lt;li&gt;Integration Tests&lt;/li&gt;
&lt;li&gt;End-to-end Tests&lt;/li&gt;
&lt;li&gt;Code Test Coverage&lt;/li&gt;
&lt;li&gt;Static Code Analysis&lt;/li&gt;
&lt;li&gt;Runtime Code Analysis&lt;/li&gt;
&lt;li&gt;Dependency Analysis&lt;/li&gt;
&lt;li&gt;Monitoring Errors &lt;/li&gt;
&lt;li&gt;Monitoring Performance&lt;/li&gt;
&lt;li&gt;Environment Management&lt;/li&gt;
&lt;li&gt;Feature Flags&lt;/li&gt;
&lt;li&gt;Development Environment Setup&lt;/li&gt;
&lt;li&gt;Pre-commit Configuration&lt;/li&gt;
&lt;li&gt;Continuous Integration&lt;/li&gt;
&lt;li&gt;Continuous Deployment&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Packages and Libraries

&lt;ul&gt;
&lt;li&gt;Multiple Language Versions&lt;/li&gt;
&lt;li&gt;Multiple OS&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Back-end Projects

&lt;ul&gt;
&lt;li&gt;HTTP Server&lt;/li&gt;
&lt;li&gt;Web Sockets&lt;/li&gt;
&lt;li&gt;Data Storage&lt;/li&gt;
&lt;li&gt;File Storage&lt;/li&gt;
&lt;li&gt;Data Serialization&lt;/li&gt;
&lt;li&gt;Searching&lt;/li&gt;
&lt;li&gt;Server-Side Validation&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Authorization&lt;/li&gt;
&lt;li&gt;Administration&lt;/li&gt;
&lt;li&gt;Multi-Tenancy&lt;/li&gt;
&lt;li&gt;Background Jobs&lt;/li&gt;
&lt;li&gt;Emails&lt;/li&gt;
&lt;li&gt;File-Templating&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;
&lt;li&gt;Payment Processing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Front-end Projects

&lt;ul&gt;
&lt;li&gt;UI Kit&lt;/li&gt;
&lt;li&gt;State Management&lt;/li&gt;
&lt;li&gt;Inputs&lt;/li&gt;
&lt;li&gt;Rich-Text Editors&lt;/li&gt;
&lt;li&gt;Forms&lt;/li&gt;
&lt;li&gt;Client-Side Validation&lt;/li&gt;
&lt;li&gt;Translations&lt;/li&gt;
&lt;li&gt;Animations&lt;/li&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Quick Summary&lt;/li&gt;
&lt;li&gt;Current State of Things&lt;/li&gt;
&lt;li&gt;The Future&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Every project
&lt;/h2&gt;

&lt;p&gt;The following applies to every programming project, no matter if it's an open-source NPM package or an internal FastAPI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version Control
&lt;/h3&gt;

&lt;p&gt;Version control is a system that tracks and manages changes to files or code, enabling multiple users to collaborate and revert to previous versions if necessary.&lt;/p&gt;

&lt;p&gt;Thankfully, it already became the standard in the software industry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unit Tests
&lt;/h3&gt;

&lt;p&gt;The code is written in units and unit tests are meant to test those units. Those units can be for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functions,&lt;/li&gt;
&lt;li&gt;classes,&lt;/li&gt;
&lt;li&gt;modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're talking about code that's sole purpose is to make sure our other code works.&lt;/p&gt;

&lt;p&gt;If you write a piece of code and do not write tests to it, it instantly becomes legacy code.&lt;/p&gt;

&lt;p&gt;While at it, it's also good to address common requirements such as mocking or recording HTTP requests, or testing time-related code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration Tests
&lt;/h3&gt;

&lt;p&gt;Combined units of code compose programs, and programs' purpose is to execute often complex procedures.&lt;/p&gt;

&lt;p&gt;The way to test the code across multiple units is called integration testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  End-to-end Tests
&lt;/h3&gt;

&lt;p&gt;End-to-end testing is a software testing approach that validates the entire application's functionality, communication, and integration with external systems, ensuring it performs as expected from start to finish.&lt;/p&gt;

&lt;p&gt;Its purpose is to check if the program works as a whole.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Test Coverage
&lt;/h3&gt;

&lt;p&gt;It tells you how much percent of your code has executed during the test run.&lt;/p&gt;

&lt;p&gt;While 100% test coverage is a pain to achieve and does not guarantee there won't be any errors, it gives you an idea of the code's ease of maintainability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Code Analysis
&lt;/h3&gt;

&lt;p&gt;When there's a code, you can also expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naming conventions,&lt;/li&gt;
&lt;li&gt;formatting styles,&lt;/li&gt;
&lt;li&gt;file and directory structures,&lt;/li&gt;
&lt;li&gt;known performance issues,&lt;/li&gt;
&lt;li&gt;known security vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Static code analysis tools help address those problems, help to avoid bikeshedding, prevent security breaches from happening, and inform of potential bottlenecks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runtime Code Analysis
&lt;/h3&gt;

&lt;p&gt;The advantages of using those tools are similar to Static Code Analysis. The difference is that it happens during the code execution.&lt;/p&gt;

&lt;p&gt;One example of this is avoiding N+1 SQL queries using the Bullet gem in Ruby on Rails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency Analysis
&lt;/h3&gt;

&lt;p&gt;Nowadays there's plenty of code that already does stuff for us on the low level.&lt;/p&gt;

&lt;p&gt;It comes in libraries and packages, and those are often developed independently of our code base.&lt;/p&gt;

&lt;p&gt;While it's a good thing, we still need a way to easily check if there are new versions of the dependencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring Errors
&lt;/h3&gt;

&lt;p&gt;With all the tests and static code analysis tools in place, there are still going to be errors in your code.&lt;/p&gt;

&lt;p&gt;It is crucial to see when they happen, so you can address them.&lt;/p&gt;

&lt;p&gt;There are multiple easy-to-integrate tools to do that, that comes with user-friendly admin dashboards.&lt;/p&gt;

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

&lt;p&gt;Application Performance Monitoring (APM) is the process of tracking and analyzing an application's performance, responsiveness, and resource usage to optimize the user experience and identify potential issues.&lt;/p&gt;

&lt;p&gt;This allows you to observe how your code performs in the production environment and pinpoint the bottlenecks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Environment Management
&lt;/h3&gt;

&lt;p&gt;At the very minimum, there are development and production environments, and some of their settings vary.&lt;/p&gt;

&lt;p&gt;You need a way to define those, per environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature Flags
&lt;/h3&gt;

&lt;p&gt;Using Feature Flags, also known as Feature Toggles, is a powerful technique, that allows developers to modify system behavior without changing code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Development environment setup
&lt;/h3&gt;

&lt;p&gt;Ideally, you want a single command to set up the whole development environment for newcomers, once they download the code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pre-commit configuration
&lt;/h3&gt;

&lt;p&gt;It's nice to have a way to locally (and optionally) run all the tests and static code analysis tools once we add stuff to the code base.&lt;/p&gt;

&lt;p&gt;Adding stuff to the code base usually means &lt;code&gt;git commit -m '...'&lt;/code&gt;, and there are certain ways to hook into what happens before the commit is created.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous Integration
&lt;/h3&gt;

&lt;p&gt;When there's a new code integrated into the main code-base, you want to at the very least see if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;all the tests pass,&lt;/li&gt;
&lt;li&gt;code analysis tools checks pass,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is often tightly coupled with your chosen version control system and falls into the established git workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous Deployment
&lt;/h3&gt;

&lt;p&gt;Anything that's automated helps to avoid human error.&lt;/p&gt;

&lt;p&gt;You don't want errors when deploying new code to the production environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Packages and Libraries
&lt;/h2&gt;

&lt;p&gt;It is a very good practice to extract parts of complex systems into smaller packages.&lt;/p&gt;

&lt;p&gt;While they're easier to test and understand, the best benefit of doing that is their re-usability.&lt;/p&gt;

&lt;p&gt;This way we can keep very different code-bases DRY.&lt;/p&gt;

&lt;p&gt;The following is a short list of common requirements while developing a package or library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple language versions
&lt;/h3&gt;

&lt;p&gt;The established practice is for the package to work with the lowest maintained version of the programming language it is written for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple OS
&lt;/h3&gt;

&lt;p&gt;This does not necessarily apply to every package but is nowadays still good to test - especially when using the underlying native OS libraries under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back-end Projects
&lt;/h2&gt;

&lt;p&gt;Building an API, or a Back-end, is a common requirement while developing software.&lt;/p&gt;

&lt;p&gt;We've identified the following common requirements while developing APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTTP Server
&lt;/h3&gt;

&lt;p&gt;The way to expose your code to be requested via HTTP protocol by either the whole outside world or defined clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Sockets
&lt;/h3&gt;

&lt;p&gt;Next to the simple request-response cycle, there's often a need to enable a real-time, bidirectional data exchange over a single, persistent connection established between the client and the server.&lt;/p&gt;

&lt;p&gt;This is what Web Sockets are for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Storage
&lt;/h3&gt;

&lt;p&gt;A common API requirement is to use a database or other type of data store.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Storage
&lt;/h3&gt;

&lt;p&gt;Next to storing plain data, we often need a way to store whole files in various formats, such as PDFs or images.&lt;/p&gt;

&lt;p&gt;It is not necessarily related to storing the aforementioned data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Serialization
&lt;/h3&gt;

&lt;p&gt;A common need to present the selected response data is addressed via data-serialization libraries.&lt;/p&gt;

&lt;p&gt;It means controlling what we respond with (vs what we store) and the format we respond in, such as JSON, XML, CSV, or more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Searching
&lt;/h3&gt;

&lt;p&gt;A quite common requirement when reading the data by API client is to search through it.&lt;/p&gt;

&lt;p&gt;There are well-established approaches to solving this problem that helps us avoid reinventing this particularly complex wheel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server-Side Validation
&lt;/h3&gt;

&lt;p&gt;If you receive data, you need to confirm it is valid and inform the client if it is not.&lt;/p&gt;

&lt;p&gt;Establishing a common error structure comes a long way, allowing clients to consume and present errors easily, as well as making it much simpler to test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;A way to manage users accessing your API. This means storing some kind of credentials that only they can prove of being true.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authorization
&lt;/h3&gt;

&lt;p&gt;The way to define access policies to the various parts of your system is based on the user's roles or other criteria required to be met.&lt;/p&gt;

&lt;h3&gt;
  
  
  Administration
&lt;/h3&gt;

&lt;p&gt;Tightly coupled with authentication and authorization, the administration is a way for the application admins to perform various operations on the API system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Tenancy
&lt;/h3&gt;

&lt;p&gt;Multi-tenancy is an architecture that allows a single instance of a software application to serve multiple customers, or tenants while keeping their data separate and secure.&lt;/p&gt;

&lt;p&gt;A way for the users to group their data under many shareable accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background Jobs
&lt;/h3&gt;

&lt;p&gt;The way to execute certain parts of the code in the background.&lt;/p&gt;

&lt;p&gt;This means asynchronously executing code in the background to provide optimal performance for the end users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Emails
&lt;/h3&gt;

&lt;p&gt;Today's standard of communicating with users. We're used to receiving emails when certain things happen, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating an account,&lt;/li&gt;
&lt;li&gt;completing orders.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's also good to out-front handle working with emails in the development environment.&lt;/p&gt;

&lt;p&gt;Another email-related common requirement is processing incoming emails, better known as working with Mail-Transfer Agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  File-Templating
&lt;/h3&gt;

&lt;p&gt;A way to apply programming paradigms to rendering files' content, such as conditionals and loops.&lt;/p&gt;

&lt;p&gt;Best known to for example conditionally render parts of HTML websites.&lt;/p&gt;

&lt;h3&gt;
  
  
  Internationalization
&lt;/h3&gt;

&lt;p&gt;It's a common requirement to handle responding in different languages based on clients' requests.&lt;/p&gt;

&lt;p&gt;There are plenty ready to use ways to both translate and maintain translations in APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Payment Processing
&lt;/h3&gt;

&lt;p&gt;Most of the time it all comes down to making money, right? &lt;/p&gt;

&lt;p&gt;This is a very common requirement to charge users for various functionalities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Front-end Projects
&lt;/h2&gt;

&lt;p&gt;Building a Front-end can mean many different things, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web page&lt;/li&gt;
&lt;li&gt;Browser application&lt;/li&gt;
&lt;li&gt;Mobile application&lt;/li&gt;
&lt;li&gt;Native system application&lt;/li&gt;
&lt;li&gt;Browser extension&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And following are common requirements when building various front-ends.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI Kit
&lt;/h3&gt;

&lt;p&gt;A UI Kit is a collection of pre-designed user interface components, such as buttons, forms, and navigation elements, that developers and designers can utilize to create consistent and visually appealing applications.&lt;/p&gt;

&lt;p&gt;All kinds of front-end building blocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  State Management
&lt;/h3&gt;

&lt;p&gt;State management in frontend development refers to the organization, storage, and manipulation of an application's dynamic data and its user interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inputs
&lt;/h3&gt;

&lt;p&gt;Various inputs often come with chosen UI Kit, but there are also several commonly required other types of inputs, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;currency input,&lt;/li&gt;
&lt;li&gt;country select,&lt;/li&gt;
&lt;li&gt;language select,&lt;/li&gt;
&lt;li&gt;image input with edit capabilities,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and many many more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rich-Text Editors
&lt;/h3&gt;

&lt;p&gt;A special type of input, a &lt;code&gt;&amp;lt;textarea /&amp;gt;&lt;/code&gt; replacement that allows to easily format long text, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;headers,&lt;/li&gt;
&lt;li&gt;lists,&lt;/li&gt;
&lt;li&gt;quotes,&lt;/li&gt;
&lt;li&gt;links,&lt;/li&gt;
&lt;li&gt;embeds,&lt;/li&gt;
&lt;li&gt;images,&lt;/li&gt;
&lt;li&gt;tables,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and many, many more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forms
&lt;/h3&gt;

&lt;p&gt;It is good to have a single consistent way to handle the way users manipulate data provided in the frontend application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client-Side Validation
&lt;/h3&gt;

&lt;p&gt;Next to the aforementioned server-side validation, it is nice to validate what's possible on the client side.&lt;/p&gt;

&lt;p&gt;It means a better user experience as happens in flight and not after the form submission.&lt;/p&gt;

&lt;h3&gt;
  
  
  Translations
&lt;/h3&gt;

&lt;p&gt;Same as in the back-end APIs, there's often a need to present content in a language selected by the end-user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Animations
&lt;/h3&gt;

&lt;p&gt;Animations are visual effects that create the illusion of motion by displaying a sequence of images or transforming elements over time, enhancing user experience and engagement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;Tracking users' engagement and the ways they use the frontend application is crucial to better understanding their needs and problems.&lt;/p&gt;

&lt;p&gt;Do not confuse errors and performance monitoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Summary
&lt;/h2&gt;

&lt;p&gt;That's a handful, right?&lt;/p&gt;

&lt;p&gt;Of course, we could make it even more granular - one example would be splitting the Static Code Analysis tools into three categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Style checks&lt;/li&gt;
&lt;li&gt;Security checks&lt;/li&gt;
&lt;li&gt;Performance checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it might be useful to think of them in this way, especially when searching for ready-to-use solutions for your existing projects.&lt;/p&gt;

&lt;p&gt;Anyway, I'm not saying we shouldn't do that and any suggestions on doing so are welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current State of Things
&lt;/h2&gt;

&lt;p&gt;To this day, there isn't a single go-to solution that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Covers all of those requirements.&lt;/li&gt;
&lt;li&gt;Leave you the choice of tools you want to use to do so.&lt;/li&gt;
&lt;li&gt;Stays up to date.&lt;/li&gt;
&lt;li&gt;Does not enforce particular conventions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most often, "project starters" lack particular requirements coverage or, even worse, are left unmaintained. &lt;/p&gt;

&lt;p&gt;The reason for it is simple: the complexity of maintaining such starter is really big, and it is not used often enough to bother.&lt;/p&gt;

&lt;p&gt;If there is a solution worth considering, it decides on using an opinionated approach to address those requirements.&lt;/p&gt;

&lt;p&gt;It is not necessarily a bad thing (still might be), but with this much of requirements, it most likely means time spent on either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning how to use a new tool,&lt;/li&gt;
&lt;li&gt;Replacing the tool with one of our choices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This might still make sense, but obviously is a trade-off.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future
&lt;/h2&gt;

&lt;p&gt;I have identified common requirements for various project types.&lt;/p&gt;

&lt;p&gt;When there's so much repetition (we're talking about EVERY project), there's room for automation.&lt;/p&gt;

&lt;p&gt;I believe we can also agree that there is a need to do that.&lt;/p&gt;

&lt;p&gt;When you, as a programmer/entrepreneur, think of starting a new project, you don't want to focus on running your code linter in the continuous integration pipeline.&lt;/p&gt;

&lt;p&gt;Or most of the other mentioned stuff, for that matter.&lt;/p&gt;

&lt;p&gt;You want to focus on the business logic and need all that working out of the box, so implementing it goes smoothly, and maintaining it is bliss.&lt;/p&gt;

&lt;p&gt;This is what I'm doing at &lt;a href="https://hix.dev"&gt;hix.dev&lt;/a&gt; currently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hix.dev/new/ruby/ruby-on-rails"&gt;creating it for Ruby on Rails&lt;/a&gt;, &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hix.dev/new/javascript/react-next-js"&gt;preparing to create it for Next.js&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;have a system in place to launch and maintain other frameworks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's early days, still much work to do, but my approach makes it easy to maintain and further develop.&lt;/p&gt;

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

&lt;p&gt;It takes a lot of setup and configuration to create a code-base that is pleasant to work with, maintain and further develop.&lt;/p&gt;

&lt;p&gt;Still, it is very much worth it, and the sooner you do that, the less tech debt will pile-up.&lt;/p&gt;

&lt;p&gt;I truly hope that this list can help both improve the existing projects, as well as give an overview to start the new ones.&lt;/p&gt;

&lt;p&gt;I'm looking forward to your comments on this - thanks for reading!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>codequality</category>
      <category>architecture</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
